天天看點

Linux核心子產品(一)

Linux核心元件主要包括:

·    檔案系統子產品(VFS)

主要負責檔案系統的管理,在2.6核心中,支援ext2、ext3、ext4、ocfs2、jfs、xfs、reiserfs、gfs及網絡檔案系統nfs、cifs等。

此類源碼檔案位于/usr/src/kernels/$(uname -r)/fs/目錄下

·    記憶體管理子產品

主要負責實體記憶體和虛拟記憶體的資源配置設定

源碼檔案位于/usr/src/kernels/$(uname -r)/mm/和/usr/src/kernels/$(uname -r)/arch/*/mm/目錄下

·    程序管理子產品

主要負責程序的資源配置設定協調管理

源碼檔案位于/usr/src/kernels/$(uname -r)/arch/和/usr/src/kernels/$(uname -r)/include/*/arch/目錄下

·    程序間通信子產品

主要負責協調程序之間的資源配置設定關系以及程序資源的競争配置設定

·    網絡接口子產品(非必選子產品)

核心源碼        :/usr/src/kernels/$(uname -r)/                               (預設不安裝)

核心子產品        :/lib/modules/$(uname -r)/kernel/

核心引導檔案      :/boot/vmlinuz-$(uname -r)

RAM Disk        :/boot/initrd-$(uname -r).img、/boot/initramfs-$(rname -r).img

核心子產品配置檔案:/boot/config-$(uname -r)

核心符号清單檔案:/boot/System.map-$(uname -r)

核心參數配置檔案:/etc/modprobe.conf、/etc/modprobe.d/modprobe.conf

Linux的子產品化配置:将公版部分(常用的)編譯到核心中,個性化部分(不常用的/驅動程式)獨立出來編譯成子產品在使用者空間中進行加載所需的子產品到核心中

[root@rhel6 ~]# ls /lib/modules/$(uname -r)/kernel  

arch    crypto  drivers fs      kernel      lib     mm      net     sound  

arch    :與硬體平台有關的項目,大部分指的是 CPU 的類别,例如 x86, x86_64, Xen 虛拟支援等;  

crypto  :核心所支援的加密的技術,例如 md5 或者是 des 等等;  

drivers :一些硬體的驅動程式,例如顯示卡、網絡卡、PCI 相關硬體等等;  

fs      :核心所支援的 filesystems ,例如 vfat, reiserfs, nfs 等等;  

kernel  :定義核心的程式、核心狀态、運作緒、程式的排程 (schedule)、程式的訊号 (signle) 等  

lib     :一些函數庫;  

mm   :與記憶體單元有關的各項資料,包括 swap 與虛拟記憶體等;  

net     :與網絡有關的各項協定資料,還有防火牆子產品 (net/ipv4/netfilter/*) 等等;  

sound   :與音效有關的各項子產品;  

●vmlinuz-$(uname -r) 核心引導檔案  

vmlinuz是可引導的、壓縮的核心,在核心編譯過程中建立,也可以使用make zImage(小核心)或make bzImage(大核心)來建立。其中vm表示"Virtual Memory".Linux能夠使用硬碟空間作為虛拟記憶體,不像老的作業系統比如DOS有640KB記憶體的限制。  

[root@rhel5 ~]# file /boot/vmlinuz-2.6.18-194.el5   

/boot/vmlinuz-2.6.18-194.el5: ELF 64-bit LSB shared object, AMD x86-64, version 1, stripped  

[root@rhel6 ~]# file /boot/vmlinuz-2.6.32-220.el6.x86_64   

/boot/vmlinuz-2.6.32-220.el6.x86_64: Linux kernel x86 boot executable bzImage, version 2.6.32-220.el6.x86_64 (mockbuil, RO-rootFS, root_dev 0x901, swap_dev 0x3, Normal VGA  

●initrd-$(uname -r).img、initramfs-$(uname -r).img檔案  

initrd.img是一個核心映像檔案,即"initrd RAM Disk".對vmlinuz核心檔案解壓之後,在真正的rootfs(根檔案系統)啟動之前被加載到記憶體中。是在系統引導過程中挂載的一個臨時rootfs,用來支援兩階段的引導過程。initrd檔案中包含了各種可執行程式和驅動程式,它們可以用來挂載真正的rootfs,然後再将這個 initrd RAM Disk 解除安裝,并釋放記憶體。在很多嵌入式Linux 系統中,initrd 就是最終的rootfs。  

其實裝入本地linux系統時可以不用initrd,隻要在kernel參數中加入root參數就可以了。  

在boot loader加載kernel後, kernel需要執行系統中的/sbin/init, 讀取這個檔案就必須先mount rootfs。早期是通過啟動時在kernel參數中加入root參數就告訴核心rootfs在哪個裝置上。但随着硬體和技術的發展,現在rootfs可能位于一個網絡存儲如NFS上, 可能由于RAID而散布于多個裝置上, 可能位于一個加密裝置上需要提供使用者名和密碼,這時root參數就顯得不夠了。  

為了應付這種局面, 先後出現兩種機制來作為boot loader裝載kernel到真正的/sbin/init執行這個啟動過程的橋梁:initrd和initramfs。  

2.6版以前除了核心vmlinuz之外還有一個獨立的initrd.img映像檔案,核心在初始化後會mount initrd.img作為一個臨時的rootfs到記憶體中,而init程序就是在initrd.img裡的,然後init程序會挂載真正的rootfs,然後umount initrd.img。但2.6之後采用initramfs,它是一個cpio格式的記憶體檔案系統(可直接通過lsinitrd指令檢視).兩者有類似的地方,比如都是由核心執行其中的某個程式(initrd是/linuxrc, initramfs是/init)來加載驅動(如rootfs位于U盤上必須先加載U盤的驅動)并加載真正的rootfs。  

dracut 是下一代的 initramfs 系統,是在RHEL6/CentOS6和Fedora11以上的版本才出現的。和前一代 initramfs 系統的不同點在于,dracut 設計上就考慮到了映像尺寸的問題,盡量避免寫死,以提高生成的 cpio 映像載入記憶體的速度; 實作上,由于initramfs 的唯一作用就是挂載rootfs(是以不需要把一堆無用的都裝進去),它主要依賴 udev 去擷取 rootfs 的裝置節點,一旦 rootfs 節點出現則立刻切換過去。另外它采用了子產品化的方式,使用者可自由在 %{_libdir}/dracut/modules.d 下建立他需要的特殊子產品,可擴充性很強。最後它的使用方式和 mkinitrd 非常接近,遷移成本較低。  

[root@rhel6 ~]# dracut [--hostonly] initramfs-$(uname -r).img $(uname -r)  

--hostonly  :生成的 initramfs 映像隻能在本機使用,既不能把硬碟移到別的機器上引導,也不能調整根分區  

[root@rhel5 ~]# file /boot/initrd-2.6.18-194.el5.img   

/boot/initrd-2.6.18-194.el5.img: gzip compressed data, from Unix, last modified: Tue Dec 18 21:15:30 2012, max compression  

[root@rhel6 ~]# file /boot/initramfs-2.6.32-220.el6.x86_64.img   

initramfs-2.6.32-220.el6.x86_64.img: gzip compressed data, from Unix, last modified: Sat Dec  1 19:19:41 2012, max compression  

●config-$(uname -r)  

config為目前Linux核心的子產品配置檔案,即在目前Linux核心中,系統已啟動了哪些子產品,哪些内容已編譯到Linux核心等等,都可通過此檔案來檢視  

在編譯核心時,由make menuconfig、make xconfig、make gconfig指令生成".cofig"檔案。可将其複制到/boot/目錄下,重命名為config-$(uname -r)  

[root@rhel6 ~]# cat /boot/config-2.6.32-220.el6.x86_64  

# File systems  

CONFIG_EXT4_FS=m                                "m"表示編譯為一個子產品  

CONFIG_EXT4_FS_XATTR=y                          "y"表示編譯到核心  

CONFIG_EXT4_FS_POSIX_ACL=y  

CONFIG_EXT4_FS_SECURITY=y  

# DOS/FAT/NT Filesystems  

CONFIG_FAT_FS=m  

CONFIG_MSDOS_FS=m  

CONFIG_VFAT_FS=m  

CONFIG_FAT_DEFAULT_CODEPAGE=437 

CONFIG_FAT_DEFAULT_IOCHARSET="ascii" 

# CONFIG_NTFS_FS is not set                     "not set"表示沒有編譯到核心,即核心不支援NTFS檔案系統  

●System.map-$(uname -r)  

在Linux核心編譯完成後,一般會在/boot/目錄下生成一個以system.map-*的檔案  

●核心子產品參數的配置檔案  

RHEL5:/etc/modprobe.conf  

RHEL6:/etc/modprobe.d/modprobe.conf  

[root@rhel5 ~]# cat /etc/modprobe.conf  

alias eth0 e1000                                設定網卡驅動子產品别名為eth0  

alias eth1 e1000                                添加網卡驅動子產品别名為eth1  

alias bond0 bonding                             添加bonding驅動子產品别名為bond0  

options bonding miimon=100 mode=0               添加bonding子產品選項  

alias scsi_hostadapter1 mptspi                  設定SCSI主機卡裝置  

alias snd-card-0 snd-hda-intel                  設定聲霸卡别名  

options snd-card-0 index=0                      設定聲霸卡選項  

options snd-hda-intel index=0                                 

remove snd-hda-intel { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-hda-intel                      配置聲霸卡選項  

     本文轉自Vnimos51CTO部落格,原文連結:http://blog.51cto.com/vnimos/1101694,如需轉載請自行聯系原作者

繼續閱讀