INITRD - Linux手册页

时间:2019-08-20 18:01:46  来源:igfitidea点击:

Linux程序员手册 第4部分
更新日期: 2019-03-06

名称

initrd-引导加载程序初始化的RAM磁盘

CONFIGURATION

/ dev / initrd是一个只读块设备,分配了主编号1和次编号250。通常,/ dev / initrd由模式为0400的root:disk拥有(仅由root进行读取访问)。如果Linux系统尚未创建/ dev / initrd,则可以使用以下命令创建它:

mknod -m 400 /dev/initrd b 1 250
chown root:disk /dev/initrd

另外,必须将对" RAM磁盘"和"初始RAM磁盘"的支持(例如CONFIG_BLK_DEV_RAM = y和CONFIG_BLK_DEV_INITRD = y)直接编译到Linux内核中才能使用/ dev / initrd。使用/ dev / initrd时,RAM磁盘驱动程序无法作为模块加载。

说明

特殊文件/ dev / initrd是只读块设备。该设备是RAM磁盘,在启动内核之前由引导加载程序进行了初始化(例如加载)。然后,内核可以使用/ dev / initrd的内容进行两阶段系统引导。

在第一个启动阶段,内核启动并从/ dev / initrd的内容(例如,由引导加载程序初始化的RAM磁盘)挂载初始的根文件系统。在第二阶段,将从初始根设备的内容中加载其他驱动程序或其他模块。加载其他模块后,将从其他设备挂载新的根文件系统(即普通根文件系统)。

Boot-up operation

使用initrd引导时,系统将按以下方式引导:

1.
引导加载程序将内核程序和/ dev / initrd的内容加载到内存中。
2.
在内核启动时,内核解压缩设备/ dev / initrd的内容并将其复制到设备/ dev / ram0上,然后释放/ dev / initrd使用的内存。
3.
然后,内核以读写方式将设备/ dev / ram0挂载为初始根文件系统。
4.
如果指示的普通根文件系统也是初始根文件系统(例如/ dev / ram0),则内核将跳至常规引导序列的最后一步。
5.
如果可执行文件/ linuxrc存在于初始根文件系统中,则/ linuxrc以UID 0执行。(文件/ linuxrc必须具有可执行文件许可权。文件/ linuxrc可以是任何有效的可执行文件,包括shell脚本。)
6.
如果未执行/ linuxrc或/ linuxrc终止,则将装入普通的根文件系统。 (如果/ linuxrc退出,并且在初始根文件系统上挂载了任何文件系统,则将检查内核的行为。有关当前内核的行为,请参见NOTES部分。)
7.
如果普通的根文件系统具有目录/ initrd,则将设备/ dev / ram0从/移至/ initrd。否则,如果目录/ initrd不存在,则将卸载设备/ dev / ram0。 (当从/移到/ initrd时,/ dev / ram0不会被卸载,因此进程可以从/ dev / ram0继续运行。如果目录/ initrd在普通的根文件系统上不存在,并且任何进程都从/ dev / ram0继续运行当/ linuxrc退出时,将检查内核的行为。有关当前内核的行为,请参见NOTES部分。)
8.
通常的引导顺序(例如,/ sbin / init的调用)在普通的根文件系统上执行。

Options

与initrd结合使用时,以下引导加载程序选项会影响内核的引导操作:

initrd=filename
指定要加载的文件作为/ dev / initrd的内容。对于LOADLIN,这是一个命令行选项。对于LILO,您必须在LILO配置文件/etc/lilo.config中使用此命令。用此选项指定的文件名通常是gzip压缩的文件系统映像。
noinitrd
此引导选项将禁用两阶段引导操作。内核执行通常的引导顺序,就好像未初始化/ dev / initrd一样。使用此选项,将保留由引导加载程序内容加载到内存中的/ dev / initrd的所有内容。此选项允许/ dev / initrd的内容为任何数据,并且不必限于文件系统映像。但是,设备/ dev / initrd是只读的,在系统启动后只能读取一次。
root=device-name
指定要用作普通根文件系统的设备。对于LOADLIN,这是一个命令行选项。对于LILO,这是引导时间选项,或者可以用作LILO配置文件/etc/lilo.config中的选项行。此选项指定的设备必须是具有合适的根文件系统的可安装设备。

Changing the normal root filesystem

默认情况下,内核设置(例如,使用rdev(8)在内核文件中设置或编译到内核文件中)或引导加载程序选项设置用于普通的根文件系统。对于安装了NFS的普通根文件系统,必须使用nfs_root_name和nfs_root_addrs引导选项来提供NFS设置。有关挂载NFS的根的更多信息,请参见内核文档文件Documentation / filesystems / nfs / nfsroot.txt(或Linux 2.6.33之前的Documentation / filesystems / nfsroot.txt)。有关设置根文件系统的更多信息,另请参见LILO和LOADLIN文档。

/ linuxrc可执行文件也可以更改普通的根设备。要使/ linuxrc更改普通的根设备,必须安装/ proc。挂载/ proc后,/ linuxrc通过写入proc文件/ proc / sys / kernel / real-root-dev,/ proc / sys / kernel / nfs-root-name和/ proc / sys /来更改普通的根设备。内核/ nfs-root-addrs。对于物理根设备,通过使/ linuxrc将新的根文件系统设备号写入/ proc / sys / kernel / real-root-dev来更改根设备。对于NFS根文件系统,通过使/ linuxrc将NFS设置写入文件/ proc / sys / kernel / nfs-root-name和/ proc / sys / kernel / nfs-root-addrs,然后写入0xff来更改根设备(例如,伪NFS设备号)放入文件/ proc / sys / kernel / real-root-dev。例如,以下shell命令行会将普通的根设备更改为/ dev / hdb1:

echo 0x365 >/proc/sys/kernel/real-root-dev

对于NFS示例,以下shell命令行会将IP地址为193.8.232.2且名为" idefix"的系统的正常根设备更改为IP地址为193.8.232.7的本地联网NFS服务器上的NFS目录/ var / nfsroot。 :

echo /var/nfsroot >/proc/sys/kernel/nfs-root-name
echo 193.8.232.2:193.8.232.7::255.255.255.0:idefix \
    >/proc/sys/kernel/nfs-root-addrs
echo 255 >/proc/sys/kernel/real-root-dev

注意:使用/ proc / sys / kernel / real-root-dev更改根文件系统已过时。有关更改根文件系统的现代方法的信息,请参见Linux内核源文件Documentation / admin-guide / initrd.rst(或Linux 4.10之前的Documentation / initrd.txt)以及ivot_root(2)和ivot_root(8)。

Usage

实施initrd的主要动机是在系统安装时允许模块化内核配置。

可能的系统安装方案如下:

1.
加载程序从具有最小内核的软盘或其他介质引导(例如,对/ dev / ram,/ dev / initrd和ext2文件系统的支持),并使用gzip压缩的初始文件系统加载/ dev / initrd。
2.
可执行文件/ linuxrc确定(1)挂载普通根文件系统(即设备类型,设备驱动程序,文件系统)和(2)分发介质(例如CD-ROM,网络,磁带等)所需的内容。 。这可以通过询问用户,自动探测或使用混合方法来完成。
3.
可执行文件/ linuxrc从初始根文件系统加载必要的模块。
4.
可执行文件/ linuxrc创建并填充根文件系统。 (在此阶段,普通的根文件系统不必是完整的系统。)
5.
可执行文件/ linuxrc设置/ proc / sys / kernel / real-root-dev,卸载/ proc,普通的根文件系统以及它已挂载的任何其他文件系统,然后终止。
6.
然后,内核挂载普通的根文件系统。
7.
既然文件系统是可访问且完整的,则可以安装引导加载程序。
8.
引导加载程序被配置为将带有用于启动系统的模块集的文件系统加载到/ dev / initrd中。 (例如,可以修改设备/ dev / ram0,然后将其卸载,最后将映像从/ dev / ram0写入文件。)
9.
系统现在可以启动,并且可以执行其他安装任务。

上面/ dev / initrd的关键作用是在正常的系统运行过程中重用配置数据,而无需选择初始内核,使用大型通用内核或重新编译内核。

第二种情况是针对Linux在单个管理网络中具有不同硬件配置的系统上运行的安装。在这种情况下,可能希望仅使用一小部分内核(理想情况下仅一个),并使配置信息的系统特定部分尽可能小。在这种情况下,请创建一个包含所有所需模块的通用文件。然后,只有/ linuxrc文件或/ linuxrc执行的文件会有所不同。

第三种情况是更方便的恢复磁盘。由于在启动时不需要诸如根文件系统分区的位置之类的信息,因此从/ dev / initrd加载的系统可以使用对话框和/或自动检测功能,然后进行完整性检查。

最后但并非最不重要的一点是,CD-ROM上的Linux发行版可以使用initrd以便从CD-ROM轻松安装。该发行版可以使用LOADLIN从CD-ROM直接加载/ dev / initrd,而无需任何软盘。该发行版还可以使用LILO引导软盘,然后通过CD-ROM中的/ dev / initrd引导更大的RAM磁盘。

文件

/ dev / initrd
/ dev / ram0
/ linuxrc
/初始

备注

1.
在当前内核下,/ dev / ram0从/移至/ initrd时仍挂载的任何文件系统仍可访问。但是,/ proc / mounts条目不会更新。
2.
在当前内核中,如果目录/ initrd不存在,那么如果/ dev / ram0被任何进程使用或在其上安装了任何文件系统,则/ dev / ram0将不会完全卸载。如果未完全卸载/ dev / ram0,则/ dev / ram0将保留在内存中。
3.
/ dev / initrd的用户不应依赖上述注释中给出的行为。在将来的Linux内核版本中,该行为可能会更改。

另外参见

chown(1),mknod(1),ram(4),freeramdisk(8),rdev(8)

Linux内核源代码树中的Documentation / admin-guide / initrd.rst(或Linux 4.10之前的Documentation / initrd.txt),LILO文档,LOADLIN文档,SYSLINUX文档

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/