initramfs文件系統


Linux內核加載根文件系統執行/sbin/init程序前,需要找到根設備位置,如果根設備需要驅動的支持,內核有可能無能為力,通過提供一個過渡的臨時根文件系統可以使得內核的設計更靈活簡單.通常過渡的臨時根文件系統基本上是內存文件系統.

常見的內存文件系統有:

rootfs,ramfs,ramdisk,tmpfs

1. rootfs:內核啟動的初始始根文件系統,大部分linux系統正常運行后都會安裝另外的文件系統,然后忽略rootfs

2. ramfs:基於內存的文件系統.ramfs文件系統沒有容量大小的限制,它可以根據需要動態增加容量.直接利用了內核的磁盤高速緩存

3. ramdisk:基於ram的塊設備,占據一塊固定的內存,事先要使用特定的工具比如mke2fs格式化,還需要一個文件系統驅動來讀寫其上的文件空間固定導致容量有限,要想裝入更多的文件需要重新格式化.Linux的塊設備緩沖特性, ram disk上的數據被拷貝到page cache(對於文件數據)和dentry cache(對於目錄項),導致內存浪費,它可能不停的動態增長直到耗盡系統的全部內存,所以只有root或授權用戶允許使用ramfs

4. tmpfs:增加了容量大小的限制 + 允許把數據寫入交換分區.由於增加了這兩個特性,tmpfs允許普通用戶使用

 

過渡根文件系統機制:將加載真正的根文件系統需要的設備驅動、工具以及初始化程序先加載到內存運行.

1. initrd: initial Ramdisk
/linuxrc文件,基於ramdisk技術,文件系統(ext2等)鏡像文件 ————> cpio格式鏡像文件
在內核啟動完成后把它復制到/dev/ram塊設備中, 作為內核加載真正根文件系統的過渡根文件系統

2. initramfs: initial RAM file system
init文件,cpio格式鏡像文件
在內核啟動完成后把它復制到rootfs中,作為內核初始的根文件系統,完成掛載系統真正的根文件系統

 

initramfs制作與使用:

我們學習都是從輸出一個hello world開始的,所以這里就用過渡根文件系統輸出hello world來說明.

1.編寫程序

#include <stdio.h>

int main(int argc, char *argv[])
{
printf("Hello world Initramfs!\n");
sleep(999999999);
}
交叉編譯:arm-linux-gcc -static hello.c -o init

2. 打包initramfs鏡像
find .|cpio -o -H newc|gzip > ~/myinitramfs.cpio.gz
在內核中選擇使用: 注意選擇initramfs的壓縮格式

3. 解包initramfs鏡像
cpio -i -F myinitramfs.cpio --no-absolute-filenames
zcat myinitramfs.cpio.gz | cpio -i -d -H newc --no-absolute-filenames

4. 內核initramfs的構建
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/rootfs_dir) Initramfs source file(s)
Built-in initramfs compression mode (None) ---> [] None [] GZIP

然后燒錄的時候將文件系統燒錄即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM