标签:
问题:
当Linux内核启动时,必须找到并执行第一个用户程序,通常是init。用户程序存放在文件系统,故Linux必须找到并挂载第一个文件系统。
通常,可用的文件系统都列在/etc/fstab,所以mount可以找到它们。但是/etc/fstab本身存在与文件系统中。因此,这类似鸡生蛋蛋生鸡的问题。
为解决该问题,内核开发者建立了内核命令列表选项root=,用来制定root文件系统存在于哪个设备上。
之前root通常位于软盘和硬盘上的分区。如今root文件系统可存在于各种不同类型的硬件中,如flash等等。同时root文件系统也可能被进行各种形式的压缩,加密等等。
如果在内核中加入所有这些特殊案例,可以做到,但是就像用汇编语言写web软件。
解决方法
Linux2.6将一个小的ram-based initial root filesystem (initramfs)包进内核,如果这个文件系统包含一个init程序,内核将执行它。寻找其他文件系统并执行其他程序不再是内核的事情,而是新程序的工作。
Initramfs不需要很多功能。
Ramdisk
是一个基于ram的block device,是一个大小固定的内存块,可像disk一样格式化和挂载。Ramdisk像所有的block device一样,它需要一个文件系统驱动。此外还有一些弊端,比如如果ramdisk没有满,那么它占有的额外内存不能被使用;如果满了,那么不能进行扩展。
由于caching,ramdisk浪费了更多的内存。Linux设计为缓存所有从block device中读取或写入的文件和目录,ramdisk(实际上也是在内存里)和caching一起,浪费很多内存。
Initrd
Boot loader Init Ram disk缩写,是一种机制,装载一个临时根文件系统到内存中,作为Linux startup process的一部分,为实际根文件系统的加载做准备。
对于2.4或更早的kernel来说,使用的是该方法。
Ramfs
后续Linus Torvalds有一个巧妙的想法:Linux的缓存是否可以被挂载为一个文件系统,只要保持文件在缓存中,且不将它们清除,直到它们被删除或系统重启。Linus写了一小段程序将缓存包起来,称为ramfs,其他kernel的开发者建立一个加强版本称为 tmpfs(它可以写数据到 swap,及限制挂载点的大小),initramfs 就是 tmpfs 的一个实例。
Initramfs
Init ramfs缩写,是一种机制,装载一个临时根文件系统到内存中,作为Linux startup process的一部分,为实际根文件系统的加载做准备。
比较:
(1)initrd 通常是一个单独的文件,initramfs通常和linux kernel映像在一起。
(2)Initrd进行了gzip压缩,有文件系统格式,比如ext2,需要kernel包含对于的驱动。然而initramfs是一个gzip cpio压缩,类似tar不过更简单。内核的cpio提取代码非常小。
(3)Initrd中的init会做一些设置,然后返回到kernel。Initramfs中的init不会返回到kernel,它可能通过exec转到其他根文件系统。
(4)当转到其他根设备时,initrd将pivot_root然后umount ramdisk。但是initramfs是rootfs,记不需要pivot_root,又不需要umount,只需要释放所有空间,然后转到其他rootfs即可。
总之,initrd使用了ramdisk,initramfs使用了ramfs。Initramfs机制比initrd机制要优越,是一种新的实现方式,我PC用的Ubuntu14.04 Linux 3.16,按道理用的是initramfs,但是名字是initrd.img。
参考:
http://stackoverflow.com/questions/10603104/the-difference-between-initrd-and-initramfs
http://blog.csdn.net/future_fighter/article/details/3866073
https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
ramdisk initrd ramfs initramfs区别与联系
标签:
原文地址:http://blog.csdn.net/fickyou/article/details/51331911