问题集锦(41-42)

2019-07-13 04:44发布

Problem 41 An introduction to initrd ? Ans:

          initrd

  Linux® 初始 RAM 磁盘initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程。initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然后再将这个 initrd RAM 磁盘卸载,并释放内存。在很多嵌入式Linux 系统中,initrd 就是最终的根文件系统。本文将探索 Linux 2.6 的初始 RAM 磁盘,包括如何创建以及如何在Linux 内核中使用。    什么是初始 RAM 磁盘     初始 RAM磁盘(initrd)是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd与内核绑定在一起,并作为内核引导过程的一部分进行加载。内核然后会将这个 initrd文件作为其两阶段引导过程的一部分来加载模块,这样才能稍后使用真正的文件系统,并挂载实际的根文件系统。   initrd 中包含了实现这个目标所需要的目录和可执行程序的最小集合,例如将内核模块加载到内核中所使用的 insmod 工具。   在桌面或服务器 Linux 系统中,initrd 是一个临时的文件系统。其生存周期很短,只会用作到真实文件系统的一个桥梁。在没有存储设备的嵌入式系统中,initrd 永久的根文件系统。本文将对这两种情况进行探索。    initrd 剖析     initrd 映像中包含了支持 Linux 系统两阶段引导过程所需要的必要可执行程序和系统文件。   根据我们运行的 Linux 的版本不同,创建初始 RAM磁盘的方法也可能会有所不同。在 Fedora Core 3 之前,initrd 是使用 loop 设备 来构建的。loop 设备是一个设备驱动程序,利用它可以将文件作为一个块设备挂载到系统中,然后就可以查看这个文件系统中的内容了。在您的内核中可能并没有 loop设备,不过这可以通过内核配置工具(make menuconfig)选择 Device Drivers > Block Devices> Loopback Device Support 来启用。我们可以按照下面的方法来查看 loop 设备的内容(initrd文件的名字可能会稍有不同):   清单 1. 查看 initrd 的内容(适用于 FC3 之前的版本)   # mkdir temp ; cd temp   # cp /boot/initrd.img.gz .   # gunzip initrd.img.gz   # mount -t ext -o loop initrd.img /mnt/initrd   # ls -la /mnt/initrd   #   现在我们就可以查看 /mnt/initrd 子目录中的内容了,这就代表了 initrd文件的内容。注意,即使您的 initrd 映像文件不是以 .gz 结尾,它也可能是一个压缩文件,您可以给这个文件添加上 .gz后缀,然后再使用 gunzip 对其进行解压。   从 Fedora Core 3 开始,默认的 initrd 映像变成了一个经过压缩的cpio 归档文件。我们不用再使用 loop 设备来将 initrd 作为压缩映像进行挂载,而是可以将其作为 cpio 归档文件来使用。要查看cpio 归档文件的内容,可以使用下面的命令:   清单 2. 查看 initrd 的内容(适用于 FC3 及其以后的版本)   # mkdir temp ; cd temp   # cp /boot/initrd-2.6.14.2.img initrd-2.6.14.2.img.gz   # gunzip initrd-2.6.14.2.img.gz   # cpio -i --make-directories < initrd-2.6.14.2.img   #   结果会生成一个很小的根文件系统,如清单 3 所示。在 ./bin 目录中有一组很少但却非常必要的应用程序,包括 nash(即 not a shell,是一个脚本解释器)、insmod(用来加载内核模块)和 lvm(逻辑卷管理工具)。   清单 3. 默认的 Linux initrd 目录结构   # ls -la   #   drwxr-xr-x 10 root root 4096 May 7 02:48 .   drwxr-x--- 15 root root 4096 May 7 00:54 ..   drwxr-xr-x 2 root root 4096 May 7 02:48 bin   drwxr-xr-x 2 root root 4096 May 7 02:48 dev   drwxr-xr-x 4 root root 4096 May 7 02:48 etc   -rwxr-xr-x 1 root root 812 May 7 02:48 init   -rw-r--r-- 1 root root 1723392 May 7 02:45 initrd-2.6.14.2.img   drwxr-xr-x 2 root root 4096 May 7 02:48 lib   drwxr-xr-x 2 root root 4096 May 7 02:48 loopfs   drwxr-xr-x 2 root root 4096 May 7 02:48 proc   lrwxrwxrwx 1 root root 3 May 7 02:48 sbin -> bin   drwxr-xr-x 2 root root 4096 May 7 02:48 sys   drwxr-xr-x 2 root root 4096 May 7 02:48 sysroot   #   清单 3 中比较有趣的是 init