1. 内核启动问题
2. 解决方案
2.1 ramdisk(比如initrd)
2.2 tmpfs(比如initramfs)
2.3 ramdisk vs ramfs
2.4 临时文件系统
2.4.1 观察tmpfs
2.4.2 Initramfs
2.4.3 查看initramfs
2.4.4 创建initramfs
2.5 Linux系统中的initramfs
2.6 cpio归档文件
3. 高级用户
3.1 制作自己的initramfs
3.2 Initramfs编程
3.3 使用更新的工具
用户程序存在于文件系统中,因此Linux内核必须找到并挂载第一个(或“根”)文件系统才能成功启动。
通常,可用的文件系统列在文件 /etc/fstab 中,通过 mount 程序可以找到它们。但是 /etc/fstab 本身就是一个存储在文件系统中的文件。
找到第一个文件系统是鸡和蛋的问题,为了解决这个问题,内核开发人员创建了内核命令行选项“root =”,以指定根文件系统所在的设备。
二十年前,“root =”很容易解释。它可能是软盘驱动器,也可能是硬盘驱动器上的分区。(可用硬件设备及文件系统非常少,很容易指定)
现在,根文件系统可以在几十种不同类型的硬件上,文件系统也有几十种,甚至可以在RAID中分布在其中的几种硬件上。压缩,加密,环回挂载,存在与网络上等等情况。
新的硬件,新的文件系统,新的压缩,加密方法还会越来越多。
到2.6版本时期,Linus在缓存周围写了一个名为“ramfs”的小包装器,Ramfs是一个非常简单的文件系统,它将Linux的磁盘缓存机制(页面缓存和dentry缓存)导出为可动态调整大小的基于RAM的文件系统。
ramfs的一个缺点是你可以继续写入数据直到你填满所有内存,而VM无法释放它,因为VM认为文件应该写入后备存储(而不是交换空间),但是ramfs没有任何后备存储。
因此,只允许root(或可信用户)对ramfs mount进行写访问。
其他内核开发人员创建了一个名为“tmpfs”的改进版本.tmpfs(以前称为shmfs)基于启动时使用的ramfs代码,,但与ramfs不同,它支持交换较少使用的页面以交换空间以及文件系统大小和inode限制以防止内存不足的情况(默认为物理RAM的一半和RAM页面的一半)。
2. 解决方案
2.1 ramdisk(比如initrd)
2.2 tmpfs(比如initramfs)
2.3 ramdisk vs ramfs
2.4 临时文件系统
2.4.1 观察tmpfs
2.4.2 Initramfs
2.4.3 查看initramfs
2.4.4 创建initramfs
2.5 Linux系统中的initramfs
2.6 cpio归档文件
3. 高级用户
3.1 制作自己的initramfs
3.2 Initramfs编程
3.3 使用更新的工具
1. 内核启动问题
当Linux内核引导系统时,它必须找到并运行第一个用户程序,通常称为“init”。(大多数较新的版本使用systemd作为默认init)用户程序存在于文件系统中,因此Linux内核必须找到并挂载第一个(或“根”)文件系统才能成功启动。
通常,可用的文件系统列在文件 /etc/fstab 中,通过 mount 程序可以找到它们。但是 /etc/fstab 本身就是一个存储在文件系统中的文件。
找到第一个文件系统是鸡和蛋的问题,为了解决这个问题,内核开发人员创建了内核命令行选项“root =”,以指定根文件系统所在的设备。
二十年前,“root =”很容易解释。它可能是软盘驱动器,也可能是硬盘驱动器上的分区。(可用硬件设备及文件系统非常少,很容易指定)
现在,根文件系统可以在几十种不同类型的硬件上,文件系统也有几十种,甚至可以在RAID中分布在其中的几种硬件上。压缩,加密,环回挂载,存在与网络上等等情况。
新的硬件,新的文件系统,新的压缩,加密方法还会越来越多。
2. 解决方案
为了避免将如此多的特殊情况硬编码到内核中,使用了具有临时根文件系统的初始启动阶段 - 现在称为早期用户空间。此根文件系统可以包含用户空间帮助程序,它们执行硬件检测,模块加载和设备发现,以便安装真正的根文件系统。2.1 ramdisk(比如initrd)
在2.4及更早版本上,主要使用ramdisk(比如initrd), 基于ram的块设备, 但由于模仿块设备,导致它是固定大小的内存块,需要像磁盘一样进行格式化和安装,(操作工具mke2fs,losetup)。需要文件系统驱动。这造成额外的开销,资源的浪费。固定的大小还不能扩展。2.2 tmpfs(比如initramfs)
Rootfs是ramfs(或tmpfs,如果已启用)的特殊实例,具体表现比如Initramfs文件。到2.6版本时期,Linus在缓存周围写了一个名为“ramfs”的小包装器,Ramfs是一个非常简单的文件系统,它将Linux的磁盘缓存机制(页面缓存和dentry缓存)导出为可动态调整大小的基于RAM的文件系统。
ramfs的一个缺点是你可以继续写入数据直到你填满所有内存,而VM无法释放它,因为VM认为文件应该写入后备存储(而不是交换空间),但是ramfs没有任何后备存储。
因此,只允许root(或可信用户)对ramfs mount进行写访问。
其他内核开发人员创建了一个名为“tmpfs”的改进版本.tmpfs(以前称为shmfs)基于启动时使用的ramfs代码,,但与ramfs不同,它支持交换较少使用的页面以交换空间以及文件系统大小和inode限制以防止内存不足的情况(默认为物理RAM的一半和RAM页面的一半)。