`

ramfs, rootfs, initrd and initramfs

 
阅读更多

ramfs, rootfs, initrd and initramfs

-------------------------------------------------------------------------------
什么是ramfs?

ramfs是空间规模动态变化的RAM文件系统。它非常简单,用来实现Linux缓存机制(缓存page cache and dentry cache)的文件系统。

通常情况下,Linux的所有文件在内存中都有缓存。需要读取的数据页从支撑存储设备(block device)中读取后,缓存于内存。在支撑存储设备中的数据页执行marked as clean操作。当虚拟文件系统需要支撑存储设备中的数据页内存时,可以释放。基于同样的机制,支撑存储设备的写入操作(写入文件然后写回支撑存储设 备,marked as clean)后,也可以释放占用的数据页内存。对于文件目录占用的缓存(dentry: directory entry),也存在同样的机制。

但是,ramfs中不需要支撑存储设备(没有支撑缓存,但是有缓存)。也就是说,写入ramfs的文件可以正常的分配page cache and dentry cache,但是不能写入支撑存储设备。这些page cache and dentry cache不能被VM释放、回收。

由于ramfs可以基于现有的Linux的文件系统结构,用于实现ramfs的代码很小。一般而言,支撑存储设备的缓存被安装为一个文件系统。所以,ramfs不能通过menuconfig选择,是必然进入内核的。

在ramfs的下面可以一直写入数据,直到写满内存为止。由于VM(Vitual Memory)认为文件应该被写回支撑存储设备,而不是交换空间(swap space),所以VM不能释放ramfs分配的内存。从而,只有root用户(or trusted user)才能进行ramfs写操作。
-------------------------------------------------------------------------------
什么是ram disk?

"ram disk"是一种实现文件系统的支撑存储的、过时的机制(2.6不用了),就是在RAM上面开辟的综合块设备(synthetic block device)。ram disk的大小是固定的,安装的文件系统大小(不是ramfs)也是固定的。ram disk的使用需要从这个假的块设备到page cache之间拷贝内存,生成和销毁dentry,而且需要文件系统的驱动格式化和解释上面的数据,所以ram disk的机制不再使用。

与ramfs相比,ram disk浪费了内存,也浪费了内存总线的带宽。同时,ram disk还为CPU加重了不必要的负担,污染了CPU的cache(尽管有避免污染的方法,但是非常耗费资源)。ramfs机制非常自然,因为文件访问可 以通过page cache and dentry cache。ram disk被弃用的另外一个原因是环回设备(loopback)引入。环回设备提供了一种更加灵活、方便的从文件而不是从内存块中创建综合块设备的方法。
-------------------------------------------------------------------------------
什么是tmpfs?

tmpfs是ramfs的衍生物,用来限制缓存大小、向swap空间写入数据。它是用来保存VM所有文件的文件系统。tmpfs中缓存的内容全部是临时 的。一旦卸载,所有的内容都会遗失。它把所有的缓存置于内核,它的规模随着文件的规模同步变化。但是它规模有大小限制,可以修改。它可以把当前不再需要的 页写入到swap空间。
-------------------------------------------------------------------------------
什么是rootfs?

rootfs是ramfs的特殊实例,在2.6的内核中必然存在。rootfs不能被卸载(与其添加特殊代码用来维护空的链表,不如把rootfs节点始 终加入,因此便于kernel维护:简单、精炼。rootfs是ramfs的一个空实例,占用空间极小)。大部分其他的文件系统安装于rootfs之上。
-------------------------------------------------------------------------------
什么是initramfs?

2.6的Linux内核包含有gzip压缩的cpio格式的文档,可以在内核引导的时候解压缩为rootfs。在解压缩后,kernel将检查 rootfs中是否包含init文件。如果init文件存在,内核就会执行这个文件,并且赋予PID=1的进程号。这个init程序将整个系统引导起来, 包括定位并且安装真正的root设备。如果在cpio文档解压缩后的rootfs中没有init程序(init文件),内核执行旧的代码,定位并且安装 root分区,执行/sbin/init程序。
-------------------------------------------------------------------------------
initramfs与initrd的区别

1. initrd是一个单独的文件;initramfs和Linux内核链接在一起(/usr目录下的程序负责生成initramfs文档)。

2. initrd是一个压缩的文件系统映像(可以是ext2等,需要内核的驱动);initramfs是类似tar的cpio压缩文档。内核中的cpio解压缩代码很小,而且init数据在boot后可以丢弃。

3. initrd运行的程序(initd,不是init)进行部分setup后返回内核;initramfs执行的init程序不返回内核(如果/init需要向内核传递控制权,可以再次安装在/目录下一个新的root设备并且启动一个新的init程序)。

4. 切换到另一个root设备时,initrd执行pivot_root后,卸载ramdisk;initramfs是rootfs,既不能 pivot_root,也不能卸载。initramfs会删掉rootfs的所有内容(find -xdev / -exec rm '{}' ';'),再次安装root到rootfs(cd /newmount; mount --move . /; chroot .),把stdin/sdout/stderr挂在新的/dev/console上,重新执行init。由于这是一个相当困难的实现过程(包括在使用一个 命令之前把它删除),所以klibc工具包引入一个帮助程序/utils/run_init.c来执行上述过程。其他大部分工具包(包括busybox) 把这个命令称为"switch_root"。
-------------------------------------------------------------------------------
Populating initramfs

2.6的内核缺省情况下总是生成一个gzipped的cpio文档,并且和内核链接在一起。这个文档缺省是空的,在X86环境下的大小是134字节。

CONFIG_INITRAMFS_SOURCE配制参数指定initramfs文档的源,并且自动的嵌入到二进制文件中。这个参数可以指向一个gzipped的cpio文档,一个包含文件的目录,或者文件描述的文本文件。例如文本文件:

   dir /dev 755 0 0
   nod /dev/console 644 0 0 c 5 1
   nod /dev/loop0 644 0 0 b 7 0
   dir /bin 755 1000 1000
   slink /bin/sh busybox 777 0 0
   file /bin/busybox initramfs/busybox 755 0 0
   dir /proc 755 0 0
   dir /sys 755 0 0
   dir /mnt 755 0 0
   file /init initramfs/init.sh 755 0 0

在内核编译完成后,可以执行/usr/gen_init_cpio命令获得cpio文档。配置文件的一个优势是不需要root权限,也不需要在新的文档中 生成设备节点。在上述文档中的两个file命令用来发现initramfs目录下面的init.sh文件和busybox文件。内核不需要外部的cpio 工具实现initramfs的cpio文档。如果在配置时指定了一个目录而不是一个描述文件,内核编译时将从这个目录生成一个描述文件(作为/usr /gen_init_cpio.c的输入)。内核编译时cpio生成代码和内核浑然一体,boot时解压缩程序也和内核浑然一体。

如果不使用配置文件或者配置目录,而使用定制的cpio文档时,需要外部的cpio工具。例如下面的命令可以从cpio映像文件抽取包含的文件、压缩cpio映像文件:

    cpio -i -d -H newc -F initramfs_data.cpio --no-absolute-filenames
   
下面的shell脚本可以生成一个定制的cpio.gz文档,可以用来代替配置文件生成的cpio文档:

   #!/bin/sh

   if [ $# -ne 2 ]
   then
     echo "usage: mkinitramfs directory imagename.cpio.gz"
     exit 1
   fi

   if [ -d "$1" ]
   then
     echo "creating $2 from $1"
     (cd "$1"; find . | cpio -o -H newc | gzip) > "$2"
   else
     echo "First argument must be a directory"
     exit 1
   fi

分享到:
评论

相关推荐

    initramfs_step_by_step(网络资料总结)

    initramfs是linux 2.6内核新增加的特性,这个教程是网络中一位大牛人写的,让人一步一步的对initramfs有了深入的了解...要像了解更多的有关initramfs的请参考内核中的documentation目录下的ramfs-rootfs-initramfs.txt

    解析linux根文件系统的挂载过程.pdf

    虚拟rootfs是为了保持内核精简,将部分功能转移到用户空间执行,常见的有initramfs和cpio-initrd、image-initrd。initramfs是内核2.5版本引入的技术,它是一个包含在内核镜像中的cpio包,内核启动时将其解压并作为...

    解析Initramfs机制在嵌入式Linux系统中的应用.pdf

    Initramfs机制是Linux 2.6中的一项新机制,它用来取代传统的Initrd机制。在嵌入式Linux系统中,Initramfs机制可以提高系统启动的灵活性和内存的使用效率。下面是Initramfs机制在嵌入式Linux系统中的应用知识点: 1....

    解析linux根文件系统的挂载过程参照.pdf

    虚拟 rootfs 又可以分为两种:initramfs 和 cpio-initrd。initramfs 是在 kernel 2.5 中引入的技术,它可以精简内核的初始化代码,使得内核的初始化过程更容易定制。cpio-initrd 是传统格式的 rootfs。 三、rootfs ...

    linux原理及rootfs制作

    rootfs可以是各种文件系统类型,如ext4、tmpfs或ramfs等。 制作rootfs的过程相当复杂,主要步骤如下: 1. **准备工作**:首先需要下载所需工具和软件包的源代码,准备安装环境,如划分合适的磁盘分区,创建LiveCD...

    linux根文件系统文件rootfs

    在实际应用中,`rootfs`可以是各种类型的文件系统,如ext4、ext3、vfat、ramfs、tmpfs等。在嵌入式系统或轻量级Linux发行版中,`rootfs`经常被设计成只读的,以保证系统的稳定性;而在开发和调试过程中,`rootfs`...

    initramfs创建根文件系统的详细步骤,自己测试 过,完全 可用 !

    initramfs创建根文件系统 测试 平台:linux-2.6.32 主机系统RHEL6.5

    ramfs文件系统源码

    ramfs 是一个内核文件系统,对于学习Linux下的文件系统是一个很好的资源,可以通过阅读源码了解文件系统,也可以参考编写自己的文件系统

    精通init ramfs构建

    【init ramfs 知识详解】 init ramfs 是 Linux 内核在早期启动阶段使用的一种临时文件系统。在 2.6 版本的 Linux 内核中,init ramfs 是一个预先打包好的 cpio 压缩文件,内核在启动时会解压这个文件并将其内容加载...

    linux_根文件系统_rootfs.pdf

    Linux 根文件系统 rootfs 详解 文件系统是指在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区的目录结构。一个可应用的磁盘设备可以包含一个或多个文件系统。如果您想进入一个文件系统,首先您要做的是挂载...

    file-mmu.rar_ramfs

    ramfs是一种轻量级的内存文件系统,专为Linux内核设计。它的全称是“Resizing Memory-based File System”,正如其名,它利用系统的物理内存来存储文件和目录,而不是像传统文件系统那样在磁盘上进行读写操作。由于...

    tinyramfs:用POSIX shell编写的微小initramfs

    **initrd**(Initial RAM Disk)和**initramfs** 是两种不同的启动时临时文件系统,它们的作用相似,但initramfs是直接内置于内核镜像中,而initrd是作为一个单独的映像文件加载。initramfs无需额外的设备驱动程序...

    file-nommu.rar_ramfs

    在Linux操作系统中,ramfs是一种基于内存的文件系统,它将物理内存的一部分用作存储空间。这个"file-nommu.rar_ramfs"标题暗示我们关注的是一个与无MMU(Memory Management Unit)环境相关的ramfs驱动程序的实现。在...

    解析linux根文件系统的挂载过程

    虚拟根文件系统的典型形式有initramfs、cpio-initrd和image-initrd等。 - **initramfs**:在Kernel 2.5中引入的技术,它实际上是将一个小文件系统嵌入到内核镜像中。该文件系统包含了一组必要的工具和服务,这些...

    文件系统制作

    在本文中,我们将深入探讨ramdisk、rootfs和ramfs的制作,以及它们在Linux内核中的应用。 1. **ramdisk制作**: ramdisk是一种在内存中模拟磁盘的机制,它创建了一个虚拟的块设备,数据存储在内存中,速度极快但不...

    ramfs.c

    ramfs.c

    u-root:具有Linux引导程序的完全Go用户环境! u-root可以创建一个单二进制的根文件系统(initramfs),其中包含用Go语言编写的类似于busybox的一组工具

    一种创建用于Linux内核的initramfs(文件存档)的方法。 使用kexec引导Linux或ESXi,Xen或tboot等多重引导内核的Go引导程序。 它们旨在与一起使用。 这样,用于或解析器将使向LinuxBoot的过渡更加容易。 用法 确保...

    制作基于X86小巧的内存Linux操作系统

    - 在内核加载时,initramfs中的文件会被解压并挂载为根文件系统(rootfs)。 - 含有初始的程序和服务,比如/sbin/init或类似的进程管理程序。 - 如果在initramfs中找不到必要的初始化程序,则内核会尝试寻找真正的...

Global site tag (gtag.js) - Google Analytics