Lession 11Ramfs文件系统: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(对于目录项),导致内存浪费
4. tmpfs
ramfs的一个缺点是它可能不停的动态增长直到耗尽系统的全部内存,所以只有root或授权用户允许使用ramfs。
增加了容量大小的限制 + 允许把数据写入交换分区
由于增加了这两个特性,tmpfs允许普通用户使用。

二、initrd与initramfs
过渡根文件系统机制:将加载真正的根文件系统需要的设备驱动、工具以及初始化程序先加载到内存运行。

1. initrd: initial Ramdisk
	/linuxrc文件
	基于ramdisk技术
	文件系统(ext2等)镜像文件 ————> cpio格式镜像文件
	在内核启动完成后把它复制到/dev/ram块设备中, 作为内核加载真正根文件系统的过渡根文件系统

2. initramfs: initial RAM file system
	init文件
	cpio格式镜像文件
	在内核启动完成后把它复制到rootfs中,作为内核初始的根文件系统,完成挂载系统真正的根文件系统

三、initramfs使用
1. init程序文件: hello world
#include <stdio.h>

	int main(int argc, char *argv[])
	{
	  printf("Hello world Initramfs!\n");
	  sleep(999999999);
	}
	交叉编译:arm-linux-gcc -static hello.c -o hello
	修改命名:mv hello 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

总结:
Linux内核 ————> initrd/initramfs(包含根文件系统的设备驱动等) ————> Real Root Filesystem
详细官方的描述文档:内核源码树下 Documentation/filesystems/ramfs-rootfs-initramfs.txt

10-05 18:45