內(nèi)核掛載文件系統(tǒng)的幾種方式
一、內(nèi)核掛載文件系統(tǒng)的幾種方式
1、initramfs : (內(nèi)核+cpio包編譯在一起然后一起進(jìn)行內(nèi)核壓縮)
內(nèi)核文件包含了的一個cpio歸檔文件,該歸檔文件可能被外部的一個cpio包替換由initramfs里的/init 掛真實(shí)的根文件并啟動init進(jìn)程/sbin/init initramfs和cpio-initrd的區(qū)別, initramfs是將cpio rootfs編譯進(jìn)內(nèi)核一起壓縮,而 cpio-initrd中cpio rootfs是不編譯入內(nèi)核,是外部的
2、initrd : 分cpio-initrd和 image-initrd cpio initrd (cpio包的gzip壓縮文件) 內(nèi)核將cpio initrd(由bootloader 將cpio initrd加載到內(nèi)存) 釋放到rootfs(/),結(jié)束內(nèi)核對cpio initrd的操作 cpio initrd : bios->grub-kernel>cpio initrd(加載訪問real rootfs的必備驅(qū)動等)->/init 腳本(加載real rootfs,并啟動了init進(jìn)程(/sbin/init))
image initrd (塊設(shè)備 gzip壓縮文件) 內(nèi)核將image initrd 保存在rootfs(/) 下的initrd.image中, 并將其讀入/dev/ram0中,根據(jù)root是否等于/dev/ram0做不同的處理 root != /dev/ram0 bios->grub->kernel->image initrd(加載訪問real rootfs的必備驅(qū)動) -> /linuxrc 腳本(加載real rootfs),內(nèi)核卸載/dev/ram0,釋放initrd內(nèi)存,最后內(nèi)核啟動init進(jìn)程(/sbin/init) root = /dev/ram0 bios->grub->kernel->image initrd 直接將/dev/ram0作為根文件系統(tǒng), 內(nèi)核啟動init進(jìn)程/sbin/init
3、普通塊設(shè)備掛載方式 root = /dev/mtdxxx noinitrd方式,mtd,ubi etc..直接在內(nèi)核中(根據(jù)root=xxx)掛根,并有內(nèi)核啟動init進(jìn)程/sbin/init
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項目及代碼)? ??


?
二、initramfs文件系統(tǒng)掛載分析
1、制作cpio包,不做gzip壓縮 2、將rootfs.cpio和內(nèi)核打在一起壓縮,做成initramfs方式 相關(guān)內(nèi)核選項 CONFIG_BLK_DEV_INITRD: CONFIG_INITRAMFS_SOURCE rootfs.cpio
3、uboot下環(huán)境參數(shù),不需要特別的參數(shù)
4、分析initramfs掛載( 內(nèi)核+cpio包編譯在一起然后一起進(jìn)行內(nèi)核壓縮的方式) 一、boot loader 把內(nèi)核(包含rootfs.cpio) 加載到內(nèi)存中,并解壓內(nèi)核
二、建立rootfs文件系統(tǒng)
start_kernel ->-vfs_caches_init --->mnt_init ---->init_rootfs ---->init_mount_tree
三、將initrd-cpio釋放到rootfs中
kernel_init->kernel_init_freeable()--->do_basic_setup(); /執(zhí)行驅(qū)動模塊、 rootfs_initcall(populate_rootfs); init/initramfs.c /* 將initrd釋放到rootfs中 */
initramfs直接解壓到rootfs中
char err = unpack_to_rootfs(__initramfs_start,__initramfs_end - __initramfs_start); / initramfs, 直接將cpio包編譯進(jìn)內(nèi)核,一起做壓縮 */
__initramfs_start/__initramfs_end 在內(nèi)核編譯的過程中生成,定義在vmlinux.lds.S SECTIONS { #ifdef CONFIG_BLK_DEV_INITRD . = ALIGN(32); __initramfs_start = .; usr/built-in.o(.init.ramfs) __initramfs_end = .; #endif } cat System.map | grep _initramfsc0025b00 T __initramfs_start c0442f00 T __initramfs_end
S3C2440內(nèi)核啟動時打印出來的值如下 __initramfs_end : 0xc0442f00 __initramfs_start :0xc0025b00 0x41D400 = 4314112
-rwxrwxrwx 1 smb smb 4314112 2月 27 10:58 rootfs.cpio
三、直接執(zhí)行/init
注:initramfs以及cpio-initrd都不會走kernel_init --> prepare_namespace() --> initrd_load() /* image-initrd和普通塊設(shè)備會走prepare_namespace */
未確認(rèn)的問題
1、initramfs 中cpio包是否有大小限制
2、系統(tǒng)起來后往rootfs下拷入數(shù)據(jù),rootfs內(nèi)存的增長方式
