(對於內核的知識以爲了解不夠,等學習完LFS再來詳細整理下這方面的知識)linux
內核:系統上面的一個文件,這個文件包含了驅動主機各項硬件的檢測程序和驅動模塊。sql
計算機真正工做的是硬件,內核是用來控制這些硬件工做的(主要經過硬件驅動),若是咱們須要硬件來完成某項工做時須要內核的幫助才能完成vim
內核模塊:編譯成模塊的驅動程序。既然內核中已經包括了驅動程序,那麼爲何須要驅動模塊呢?由於硬件發展很快,若是一有新的硬件出現,就須要從新編譯內核就會很麻煩,所以將部分驅動編譯成內核模塊,在內核須要的時候加載,這樣就既能夠保證新硬件的使用,也能夠保證內核不會一出現新硬件就從新編譯緩存
對於硬件驅動程序存在如下兩種處理方式ide
1. 編譯到內核學習
2. 編譯成內核模塊,內核須要時候進行加載ui
對於內核來講越簡單越好,一些不經常使用的驅動能夠獨立成內核模塊spa
1. 解壓縮內核文件blog
[root@localhost shared]# tar -jxvf linux-3.12.2.tar.bz2-C /usr/src/kernels/ip
2. 打開內核配置菜單,開始配置內核
[root@localhost linux-3.12.2]# make menuconfig
配置項主要分爲3中選擇類型
<>:不參加編譯
<*>參加編譯
<M>之內核模塊形式參加編譯
3. 配置完畢後,會生成一個.config文件保存剛纔的配置信息
[root@localhost linux-3.12.2]# ll -a -rw-r--r-- 1 root root 107133 04-03 15:08 .config
4. 清理上一次緩衝後開始編譯內核
[root@localhost linux-3.12.2]# make clean [root@localhost linux-3.12.2]# make bzImage Setup is 15704 bytes (padded to 15872 bytes). System is 2890 kB CRC 4dc9f3fc Kernel: arch/x86/boot/bzImage is ready (#1) [root@localhost linux-3.12.2]# ll ./arch/x86/boot/bzImage -rw-r--r-- 1 root root 2974816 04-03 16:15 ./arch/x86/boot/bzImage
5.編譯在第2步選擇的內核模塊
[root@localhost linux-3.12.2]# make modules [root@localhost ~]# ll /lib/modules/ drwxr-xr-x 3 root root 4096 04-03 12:57 2.6.30.3 =>編譯完成內核模塊但未安裝,因此在/lib/modules/下並未產生任何內核模塊
6.安裝內核模塊,在/lib/modules/會產生對應版本的內核模塊庫
[root@localhost ~]# make modules_install [root@localhost linux-3.12.2]# ll /lib/modules/ drwxr-xr-x 3 root root 4096 04-03 16:54 3.12.2 =>處處爲止內核與內核模塊已經編譯安裝完畢
7.利用GRUB作一個多重引導,新的引導加載剛編好的內核
[root@localhost ~]# cp /usr/src/kernels/linux-3.12.2/arch/x86/boot/bzImage /boot/vmlinuz-3.12.2
8.建立虛擬文件系統
[root@localhost ~]# mkinitrd -v /boot/initrd-3.12.2.img 3.12.2 [root@localhost ~]# ll /boot/initrd-3.12.2.img /boot/vmlinuz-3.12.2 -rw------- 1 root root 2752740 04-04 08:53 /boot/initrd-3.12.2.img -rw-r--r-- 1 root root 2974816 04-04 08:52 /boot/vmlinuz-3.12.2
9. 將內核配置信息保存以便下回使用
[root@localhost kernels]# cp /usr/src/kernels/linux-3.12.2/.config /boot/config-3.12.2
10. 編輯menu.lst 添加新的指向新內核的引導
[root@localhost ~]# vim /boot/grub/menu.lst title CentOS (3.12.2) root (hd0,0) kernel /vmlinuz-3.12.2 ro root=LABEL=/ rhgb quiet rgb=0x317 initrd /initrd-3.12.2.img
11.重啓以後查看內核版本
[root@localhost ~]# uname -r 3.12.2.3 =>已是最新的內核了
總結起來編譯內核主要分爲這麼幾步
1. 配置內核make menuconfig
2. 清除緩存make clean
3. 編譯內核make bzImage
4. 編譯內核模塊make modules
5. 安裝內核模塊make modules_install
在內核編譯的時候咱們能夠經過內核菜單選擇內核模塊進行編譯。但若是內核已經編譯完成,此時有新的硬件產生,可是內核菜單並無此新硬件對應的驅動,那怎麼編譯其對應的內核模塊,即便內核菜單存在此驅動,難道還須要從新編譯內核?這就須要進行獨立內核模塊的編譯來解決了。
簡單的說,獨立內核模塊編譯,就是單獨編譯一個內核模塊,並將內核模塊添加到內核管理器。這樣內核就可使用新增長內核模塊而不須要從新編譯了
[root@bogon shared]# tar -jxvf r8168-8.038.00.tar.bz2 =>解壓縮內核模塊 [root@bogon shared]# ll drwxrwxrwx 1 root root 0 01-08 16:56 r8168-8.038.00 -rwxrwxrwx 1 root root 74460 04-08 21:07 r8168-8.038.00.tar.bz2 [root@localhost r8168-8.038.00]# make clean [root@localhost r8168-8.038.00]# make modules =>編譯內核模塊 [root@localhost r8168-8.038.00]# make install =>安裝內核模塊 make -C src/ install make[1]: Entering directory `/mnt/hgfs/shared/r8168-8.038.00/src' make -C /lib/modules/2.6.18-371.el5/build SUBDIRS=/mnt/hgfs/shared/r8168-8.038.00/src INSTALL_MOD_DIR=kernel/drivers/net modules_install make[2]: Entering directory `/usr/src/kernels/2.6.18-371.el5-i686' INSTALL /mnt/hgfs/shared/r8168-8.038.00/src/r8168.ko DEPMOD 2.6.18-371.el5 make[2]: Leaving directory `/usr/src/kernels/2.6.18-371.el5-i686' make[1]: Leaving directory `/mnt/hgfs/shared/r8168-8.038.00/src' [root@localhost ~]# ll /lib/modules/2.6.18-371.el5/kernel/drivers/net/r8168.ko -rwxr-xr-x 1 root root 1083997 04-09 14:44 /lib/modules/2.6.18-371.el5/kernel/drivers/net/r8168.ko =>內核模塊已經安裝成功 [root@localhost ~]# depmod –a =>創建內核模塊依賴關係 [root@localhost ~]# ll /lib/modules/2.6.18-371.el5/modules.dep -rw-r--r-- 1 root root 228487 04-09 14:54 /lib/modules/2.6.18-371.el5/modules.dep => modules.dep已經被修改
總結起來編譯獨立內核模塊主要分爲這麼幾步
1. 清除緩存make clean
2. 編譯內核模塊make modules
3. 安裝內核模塊 make install
4. 創建依賴關係depmod –a
說明:上面只是將內核模塊編譯與安裝,還未將內核模塊加載到內核,所以還需使用insmod進行內核模塊的加載
內核模塊存放在/lib/modules/$(uname –r)/kernel當中,其中內核模塊一直是存在依賴性的。這些依賴關係記錄在/lib/modules/$(uname –r)/modules.dep當咱們增長會減小內核模塊時就要修改內核模塊之間的依賴關係。依賴關係的修改能夠經過depmod命令來進行
語法:depmod
depmod [-Anea]
選項與參數:
不加參數:分析目前全部內核,模塊並重寫寫入
-A:只分析比modules.dep記錄還新的內核模塊。纔會更新
-n: 不寫入modules.dep只輸出到聘僱
-e: 顯示目前已經加載的不可執行的模塊名稱
-a:分析全部可用模塊
查看全部內核模塊
lsmod
查看指定名稱的內核模塊
modinfo 模塊名稱
[root@bogon kernels]# lsmod Module Size Used by ppdev 12613 0 autofs4 28997 3 hidp 22977 2 => Used by表明此內核模塊被其餘內核模塊所使用 [root@localhost ~]# modinfo r8168 filename: /lib/modules/2.6.18-371.el5/kernel/drivers/net/r8168.ko version: 8.038.00-NAPI license: GPL description: RealTek RTL-8168 Gigabit Ethernet driver ……. depends: vermagic: 2.6.18-371.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
內核模塊加載
Insmod 內核模塊絕對路徑
[root@localhost 2.6.18-371.el5-i686]# insmod /lib/modules/2.6.18-371.el5/kernel/drivers/net/r8168.ko [root@localhost 2.6.18-371.el5-i686]# lsmod|grep r8168 r8168 248428 0
內核模塊刪除
rmmod 內核模塊絕對路徑
[root@localhost ~]# rmmod /lib/modules/2.6.18-371.el5/kernel/drivers/net/r8168.ko [root@localhost ~]# lsmod|grep r8168
使用上面的方法能夠管理內核模塊,可是須要指定內核模塊的完整路徑,同時若是要刪除某個內核模塊時若是存在依賴關係,則沒法刪除成功。使用modprobe能夠避免此問題
Modprobe去modules.dep中尋找內核模塊所以不須要指定絕對路徑(前提咱們已經使用的depmod將依賴關係寫入該文件)
語法:modprobe[-lfr] 內核模塊名稱
選項與參數:
-l:列出全部內核模塊
-f:強制加載內核模塊
-r:刪除內核模塊
舉例:
[root@localhost ~]# modprobe vfat =>加載內核模塊 [root@localhost ~]# lsmod |grep vfat vfat 15937 0 [root@localhost ~]# modprobe -r vfat =>刪除內核模塊