使用dracut来生成内核initramfs
2012-09-25 16:46:56

dracut(工具)是一个事件驱动initramfs架构,用于制作initrd启动镜像文件。它通过从一个已经安装的系统复制工具和文件来创建一个initramfs镜像并且将它和dracut框架结合,通常可以在/usr/lib/dracut/modules.d找到。和现存的initramfs不同,dracut框架尝试尽可能少在initramfs中硬编码。initramfs的基本目标是使得rootfs可以挂载以便我们能够转换到真实的rootfs。这个initramfs包含了所有的驱动,然而,替代脚本硬编码完成不同的工作,dracut的initramfs基于udev来创建动态链接到设备节点,并且只在rootfs设备节点出现时创建,挂载并切换根目录。这样可以使得initramfs尽可能小,并且快速启动。


首先介绍一下initramfs,先从2.6版本的内核开始吧。


所有的2.6 Linux内核包含了一个gzip压缩过的"cpio"格式存档,当内核启动时它将被提取到rootfs。在提取之后,内核检测rootfs是否包含了一个"init"文件,如果包含就来执行它并设置PID为1。如果找到,这个init进程将负责引导系统的其余内容,包含了要寻找和挂载的真正根设备(若有的话)。如果rootfs在提取cpio存档以后并不包含一个init程序,内核将失败并通过旧的代码来寻找和挂载一个根分区,接着执行一些/sbin/init的变种。与旧的initrd有以下几点不同:
- 旧的initrd通常是一个独立的文件,而initramfs存档是连接到linux内核映像的。(Linux系统目录-*/usr 在构建时就是为了生成这个存档)

- 旧的initrd文件是一个gzip压缩过的文件系统映像(在一些文件格式,如ext2,需要构建一个驱动到内核),而这个新的initramfs存档是一个gzip压缩过的cpio存档(象tar一样简单,参见cpio(1) and Documentation/early-userspace/buffer-format.txt)。内核的cpio提取代码不仅极少,而且init文本和数据可以在启动过程中被丢弃。

- 程序通过旧的initrd(叫做/initrd,而不是/init)运行一些设定并接着返回内核,而init程序从initramfs并不预计返回内核。(如果/init需要手工关闭并控制它,可以与一个新的根设备一起覆盖挂载 / 并执行另一个init程序。参见switch_root utility的后部分)

- 当切换到另一个根设备,initrd会pivot_root并且接着卸载内存磁盘。但是initramfs是rootfs:你可以不用 pivot_root rootfs和卸载它。而是删除除rootfs之外的所有东西来释放空间(find -xdev / -exec rm '{}' ';'),与新的根(cd /newmount; mount --move . /; chroot .)一起覆盖挂载rootfs,附加stdin/stdout/stderr到新的/dev/console并执行新的init。

由于这是一个非常谨慎的进程(以及在你运行它们之前涉及到删除命令),klibc包为你引进了一个帮助程序(utils/run_init.c)来做这些。大部分其他软件包(如,busybox)已命名在此命令"switch_root"中。

提供 initramfs

2.6 内核构建进程总是创建一个gzip压缩过的cpio格式的initramfs存档并连接它到生成的内核二进制文件。默认的,这些存储是空的(在x86上占用134 bytes)

配置选项CONFIG_INITRAMFS_SOURCE(存在于menuconfig的General Setup选项和usr/Kconfig中)可为initramfs存档使用特定的一个源文件,它自动合并到生成的二进制文件中。这个选项可以指定一个现有的gzip压缩的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"(在构建内核之后)来获得一个用法文档。一个高级的配置文件是root访问不需要在新的存档上设置权限或者创建设备节点。(注意示例的那两个"file"期望在linux-2.6.*目录下,在"initramfs"目录中找到名为"init.sh"和"busybox"的文件。参见Documentation/early- userspace/README 以获得更多细节。)

内核并不依赖外部的cpio工具。如果你指定一个目录而不是一个配置文件,内核的构建结构将从那个目录(usr/Makefile调用scripts/gen_initramfs_list.sh) 创建一个配置文件,并封装该目录来使用配置文件(通过释放它到从 usr/gen_init_cpio.c 创建的 usr/gen_init_cpio)。在内核构建时cpio创建的代码是完全独立的,在内核开启时提取器也是(完全)独立的。

你唯一可能需要为创建或提取你自己的cpio文件以提供给内核构建(而不是一个配置文件或目录)而安装外部的cpio工具。

以下的命令行可提取一个cpio映像(不管是通过以上脚本或是通过内核构建成的)回退到它的组成文件:
cpio -i -d -H newc -F initramfs_data.cpio --no-absolute-filenames

以下的shell脚本可创建一个预制的cpio存档,你可以使用在上述的配置文件中:
#!/bin/sh

# Copyright 2006 Rob Landley <rob@landley.net> and TimeSys Corporation.
# Licensed under GPL version 2

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

注意:如果你是按照cpio的man页做的,那么它包含的一些不良建议将会破坏你的initramfs存档。它说"生成文件名列表的一个典型方式是使用 find命令,你应该提供-depth选项来搜索"。而在创建initramfs.cpio.gz映像时不要这么做,因为它并不可行。Linux内核的 cpio提取器不会在一个不存在的目录中创建文件,因此目录项必须在文件被提取到该目录之前被提取。以上脚本保证了它们的顺序正确性。

外部initramfs映像

如果内核有启用initrd支持,一个外部的cpio.gz存档也可替换一个2.6 内核的initrd。既然这样,内核将自动检测文件类型(initramfs, 而不是initrd)并在尝试运行/init前,提取外部的cpio存档到rootfs。

initramfs有内存效率的优势(没有内存磁盘块设备),而initrd可单独封装(如果你有非GPL许可协议的代码,而你想从initramfs运行,这还是不错的。不要与GPL许可的二进制的Linux内核混为一谈)。

外部initramfs映像也可以用来补充内核内建的initramfs映像。外部存档文件将覆盖与内建initramfs存档中任意不一致的文件。一些发行商也偏爱定制一个单一内核映像和特定initramfs映像,而不用重编译。

initramfs的内容

一个initramfs存档是一个完整独立的Linux根文件系统。如果你还不能理解共享库、设备和路径,你需要获得一个小的根文件系统来启动和运行,这里有一些参考资料:
http://www.tldp.org/HOWTO/Bootdisk-HOWTO/
http://www.linuxfromscratch.org/lfs/view/stable/
http://www.tldp.org/HOWTO/From-PowerUp-To-Bash-Prompt-HOWTO.html

软件包"klibc"(http://www.kernel.org/pub/linux/libs/klibc)被设计为一个极小的C库来静态连接早期的用户空间代码,以及一些相关的工具。它是BSD授权。

我使用uClibc (http://www.uclibc.org)和busybox (http://www.busybox.net)。这些分别是LGPL和GPL授权(一个独立的initramfs软件包被计划在busybox 1.3 release。)

从理论上说你可以使用glibc,但是对于小型嵌入式系统象这样使用并适合(一个"hello world"程序静态连接glibc将近400k。用uClibc的话它是7k。还要注意,glibc dlopens libnss作为名称查找,即使是使用静态连接。)

一个好的开头是获得initramfs来运行一个静态连接的"hello world"程序作为init,并在一个类似qemu(www.qemu.org)的仿真器或用户模式的Linux中测试它,象这样:
#include 'stdio.h'
#include 'unistd.h'

int main(int argc, char *argv[]){
    printf("Hello world!\n");
    sleep(999999999);
}

gcc -static hello.c -o init
echo init | cpio -o -H newc | gzip > test.cpio.gz
# Testing external initramfs using the initrd loading mechanism.
qemu -kernel /boot/vmlinuz -initrd test.cpio.gz /dev/zero

当调试一个普通根文件系统时,能够用"init=/bin/sh"来启动将是不错的。与initramfs等价的是"rdinit=/bin/sh",而且它很有用。

为什么是cpio而不是tar?

这个决定的发布是在2001年12月。讨论浏览在这里:
http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1538.html

并且催生了第二件事情(tar与cpio的比较),浏览这里
http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1587.html

快速且直接的总结版本(这些是无法替代上述内容的阅读的):
1) cpio是一个标准。它十来岁了(从 AT&T起),并已被广泛应用在Linux上(在RPM中,Red Hat的设备驱动磁盘上)。这里有从1996年起有关它的Linux日志:
http://www.linuxjournal.com/article/1213

它并没有象tar一样流行,因为传统的cpio命令行工具要求使用极可怕的命令行。同时没有其他有关存档格式的方式,并有可选的工具。如:
http://freshmeat.net/projects/afio/

2) cpio存档格式是由内核选择的,它比(许多国家的)任意的tar存档格式都简单且干净(并极容易来创建和解析)。完整的initramfs存档格式说明在buffer-format.txt,创建在usr/gen_init_cpio.c,并提取在init/initramfs.c。所有三个可阅读的文本一起不到26k。

3) GNU项目使用tar标准似乎是与Windows使用zip的标准相关。Linux并不是它们中任一一个,并自由的作出了自己的技术决策。

4) 由于这是一个内核的内部格式,它可以很容易做一些更新。内核提供它自己的工具来创建和提取这个格式。使用现有的标准是可取的,但不是必要的。

5) Al Viro 作出决定(引用: "tar is ugly as hell and not going to be supported on the kernel side"):
http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1540.html

解释它的理由:
http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1550.html
http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1638.html

最重要的是,设计和实现initramfs的代码。

发展的方向

当前(2.6.16), initramfs总被编译进,但并没总被使用。内核做到回退到原来的启动代码只需initramfs中不包含一个/init程序。回退到原来的代码,以此确保一个平滑的过渡并允许尽早的开启功能逐步移动到"前期用户空间"(即initramfs)。

移动到前期用户空间是必要的,因为寻找和挂载真正的根设备是复杂的。根分区可以跨多个设备。它们可在网络上进行(要求dhcp,设定一个特定MAC地址,登录到一台服务器等)。它们可用在可移动媒体,动态分配主/次号以及要求udev执行清理的持续命名的问题。它们可被压缩、加密、写时拷贝,回环挂载、异常分区等。

这种复杂性(必将包含的策略)是在用户空间的处理的正确性。klibc和busybox/uClibc两者一起在简单的initramfs软件包中工作以组成一个内核构建。软件包klibc现在已被Andrew Morton's 2.6.17-mm 接受到树中。内核当前的提前启动代码(分区检测等)可能会迁移到默认的initramfs中,由内核构建自动创建并使用。


dracut工具介绍

语法:
dracut [--force] [/PATH/TO/new_image_name] [kernel version]


示例:
#一些dracut内置模块默认不会添加至initramfs中,可以在/etc/dracut.conf或/etc/dracut.conf.d/xxx.xonf中添加,也可以使用--add选项
# dracut --add bootchart initramfs-bootchart.img

#查看所有可用的dracut模块
# dracut --list-modules

#忽略(不添加)模块
# dracut –omit "multipath lvm" no-multipath-lvm.img

#手动添加没有被dracut自动识别的kernel模块
# dracut --add-drivers mymod initramfs-withmymod.img

dracut 作为新一代的 initramfs 系统,和前一代的initramfs系统的 mkinitrd 的不同点在于:它在设计上就考虑到了映像尺寸的问题,尽量避免硬编码,以提高生成的 cpio 映像载入内存的速度。实际上,由于initramfs的唯一作用就是挂载rootfs,它主要依赖 udev 去获取 rootfs 的设备节点,一旦 rootfs 节点出现则立刻切换过去。按照官方维基的说法:5秒启动不是梦。另外它采用了模块化的方式,使用者可自由在 %{_libdir}/dracut/modules.d 下创建他需要的特殊模块,可扩展性很强。最后它的使用方式和 mkinitrd 非常接近,迁移成本较低。

dracut-network会为镜像内添加nfs等网络支持。

来看看在centos 7.2上它的情况

版本:
dracut-033-359.el7.x86_64
dracut-config-rescue-033-360.el7_2.x86_64
dracut-033-360.el7_2.x86_64
dracut-network-033-360.el7_2.x86_64

命令行工具:
dracut    create initial ramdisk images for preloading modules。dracut创建虚拟磁盘映像,提供给内核,预加载块设备模块(例如IDE、SCSI或者RAID),通过加载这些设备模块访问根文件系统。

dracut [OPTION…] [ []]

创建一个带有kernel版本号,为kernel使用的 initramfs 镜像。如果被省略,那么使用实际运行的内核版本号;如果被省略或为空,那么缺省的位置 /boot/initramfs-<version>.img 被使用。

在启动时,内核解包这个存档载入内存,挂载和使用它作为初始化根文件系统。所有发现的根设备发生在这个早期的用户空间。完整的内核命令行选项,详看 dracut.cmdline(7)。

如果被降到一个紧急shell,当启动 initramfs时,文件 /run/initramfs/rdsosreport.txt 被创建,这个文件能被安全(手动挂载)的成为一个分区(通用/启动)或一个USB盘。通过在内核命令添加 rd.debug 产生附件的调试信息。/run/initramfs/rdsosreport.txt 包含所有的日志和一些工具的输出,这个文件应该被联系到关于dracut问题的任何报告。

lsinitrd tool to show the contents of an initramfs image. if is omitted, then lsinitrd uses the default image /boot/initrd or /boot/initramfs-.img.

lsinitrd [OPTION…] [ [ [ […] ]]]

lsinitrd [OPTION…] -k

lsinitrd 显示一个 initramfs 镜像的内容。 如果被省略,那么 lsinitrd 用这个缺省的镜像 /boot/initrd 或者 /boot/initramfs-<version>.img

OPTIONS
-h, –help:print a help message and exit.
-s, –size:sort the contents of the initramfs by size.
-f, –file:print the contents of .
-k, –kver:inspect the initramfs of .

mkinitrd is a compat wrapper, which calls dracut to generate an initramfs(调用 dracut 来产生 initramfs)

mkinitrd [OPTION…] []

mkinitrd 通过调用 dracut 去创建一个 initramfs 带有版本的镜像。

注意:如果需要生成一个更细粒度控制的镜像,“dracut”应该被直接调用。

OPTIONS

–version:print info about the version

-v, –verbose:increase verbosity level

-f, –force:overwrite existing initramfs file.

*–image-version:append the kernel version to the target image.

–with=:add the kernel module to the initramfs.

–preload=:preload the kernel module in the initramfs before any other kernel modules are loaded. This can be used to ensure a certain device naming, which should in theory be avoided and the use of symbolic links in /dev is encouraged.

–nocompress:do not compress the resulting image.

–help:print a help message and exit.

配置
/etc/dracut.conf:see dracut.conf5

/etc/dracut.conf.d/*.conf:see dracut.conf5

/usr/lib/dracut/dracut.conf.d/*.conf:see dracut.conf5

Configuration in the initramfs

/etc/conf.d/:Any files found in /etc/conf.d/ will be sourced in the initramfs to set initial values. Command line options will override these values set in the configuration files.

/etc/cmdline:Can contain additional command line options. Deprecated, better use /etc/cmdline.d/*.conf.

/etc/cmdline.d/*.conf:Can contain additional command line options.

服务
dracut-cmdline.service
dracut-initqueue.service
dracut-mount.service
dracut-pre-mount.service
dracut-pre-pivot.service
dracut-pre-trigger.service
dracut-pre-udev.service
dracut-shutdown.service

日志
/var/log/dracut.log:initramfs 镜像创建的日志文件

/tmp/dracut.log:initramfs 镜像创建的日志文件, 如果 /var/log/dracut.log 没有被写。


这将在 /boot 目录下创建一个名为 initramfs-<kernel version>.img 的通用 initramfs,这包含了你当前运行内核当前加载的全部内核模块。要是那个文件已经存在了,dracut 会报错,你可以使用 dracut --force 来强行写入。

你还可以指定生成映像的名称和内核版本,如:
dracut 名称.img 内核版本

当前内核版本可使用 uname -r 查看,后安装的内核版本可在 /usr/src 目录中执行 ls -l 查看 linux 文件夹的链接指向来确定。主要用于安装了多版本内核的情况,比如内核升级完成未重启前重制 initramfs。

要是想生成最小化的 dracut 的话,可是使用:
dracut --hostonly

该命令生成的 initramfs 映像只能在本机使用。也就说你,你既不能把硬盘放到别的机器上引导,也不能调整 root 分区。不然就会挂掉。因此请备份一份 initramfs 以做恢复之用。最好之前的 initrd 也留着!另外一定要看下面的常见问题,否则就目前版本的 dracut 来说,生成的映像是一定不能用的!


检查文件

dracut 生成的也是 cpio 压缩包,可以使用 lsinitrd 工具来查看:
lsinitrd /boot/initramfs-$(uname -r).img | less

查看镜像内文件的内容:
# lsinitrd /boot/initramfs-$(uname -r).img  /etc/ld.so.conf

查看可用模块
dracut --list-module

注意这样列出的是所有 dracut 模块。你并不知道哪个将被包含到生成的 initramfs 中去。关于模块的描述请见优化章节。

添加模块
dracut -a "模块名"

忽略模块
dracut -o "模块名"

这点在后面优化的时候很有用。

添加内核驱动
用来指定 kernel-modules 这个 dracut 配置模块将加载的内核驱动。默认 dracut 的 kernel-modules 会加载你在 lsmod 命令中能够见到的所有内核模块。因此如果你的内核像 openSUSE 的这么强大,那么基本上 lsmod 命令就列出了你这个硬件配置所需的模块,不必再添加新的了。有备无患:

dracut -a "内核驱动模块名"

插入自定义文件
dracut -i 该文件在你本机上的位置 该文件在映像中的位置 // 一般是相同的

只使用指定的模块
dracut -m "模块列表,空格分开"

启用 dracut 生成的 initramfs
编辑 /boot/grub2/grub.cfg,替换下面这行:
echo    'Loading initial ramdisk ...'
initrd  /initd-3.6.3-1-desktop


恢复 initramfs
如果你用 --hostonly 未能引导,而且你有通用 initramfs 映像。你可以在 grub2 中按 e 进入菜单条目,把里面的 initrd= 给替换成通用的。依然不能引导的话你可以换回 initrd。

引导选项
以下操作都发生在 /etc/grub2/grub.cfg 中。

指定 rootfs
下面是 grub2 的语法。
rootfs=/dev/sda6
rootfs=UUID=blabla
rootfs=LABEL=blabla

键盘布局设置

屏蔽内核模块
比如你在使用 nouveau 开源显卡的时候,创建的通用 initramfs 映像,现在你想在私有的上面用,那就需要屏蔽掉一些内核驱动:
rd.driver.blacklist=nouveau


加速引导
rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0

这将直接关闭针对 LUKS 磁盘加密、LVM 逻辑磁盘、MDRAID 多设备磁盘、DeviceMapper 设备映像器的检测(后三者多用于服务器)。


模块列表和它们的用途

注意:本列表移植自 Gentoo 维基,官方并没有这样的说明。因此准确性无法保证。

下面列出了所有模块的功能,读者生成自己的 initramfs 时可以使用 dracut -m "想要的模块列表" 的方式也可以通过 dracut -o "不想要的模块列表" 的方式来去除自己用不到的模块。

默认模块
模块    描述    启用
dash    以 /bin/dash 作为 /bin/sh    总是
i18n    包含键盘布局、终端字体,等等    总是
convertfs    下次启动时将 / 合并到 /usr    从不
kernel-modules    包含内核模块    总是
fstab-sys    在挂载 root 分区前挂载其他分区    /etc/fstab.sys 存在时,或使用 --fstab 或 --add-fstab 选项时
resume    将系统从休眠中唤醒    总是
rootfs-block    挂载 rootfs    总是
terminfo    包含一个 terminfo 文件    总是
udev-rules    包含 udev 和基本规则    总是
securityfs    早早挂载 securityfs    永不
usrmount    启动时挂载 /usr    总是
base    基础工具    总是
fs-lib    文件系统工具 (包括 mount)    总是
img-lib    解压映像的工具    从不
shutdown    关机    总是


可选模块
Module    Purpose    Enabled?    USE Flag    Additional Packages
biosdevname    启用 BIOS 网络设备重命名    总是        biosdevname , pciutils

btrfs    支持 btrfs rootfs    host-only: rootfs        btrfsprogs

caps    supports dropping capabilities before init    总是        sys-libs/libcap(also replaces dash with bash)

crypt    支持加密 rootfs    host-only: rootfs    device-mapper, static-libs4    cryptsetup

crypt-gpg    支持 gpg 加密(需要 crypt 模块)    永不        gnupg

dmraid    支持 FakeRAID 上的 rootfs    host-only: rootfs    device-mapper    multipath-tools ,dmraid

dmsquash-live    支持 LiveCD rootfs    永不 (host-only: refused)    device-mapper

gensplash    包含静态 splash 屏幕    永不    static-libs4    media-gfx/splashutils

iscsi    支持 iscsi 设备上的 rootfs    host-only: rootfs    net    open-iscsi

livenet    通过 HTTP 获取 rootfs (需要 dmsquash-live 模块)    永不    device-mapper, net

lvm    支持 LVM 设备上的 rootfs    host-only: rootfs    device-mapper    lvm2

mdraid    支持软件 RAID 上的 rootfs    host-only: rootfs        mdadm

multipath    支持多路径设备上的 rootfs    host-only: rootfs        multipath-tools

nbd    支持在网络块设备上的 rootfs    host-only: rootfs    net    ndb

nfs    支持以 NFS 方式挂载的 rootfs    net    host-only: rootfs    nfs-utils rpcbind

plymouth    启动动画    总是    libkms3    plymouth

ssh-client    包含 ssh 和 scp 客户端    永不    net    openssl

syslog    支持远程日志    永不        app-admin/syslog-ng 或 app-admin/rsyslog

debug    包含调试工具    永不    installed when USE=debug

dm    包含 device-mapper    永不    installed when USE=device-mapper sys-fs/device-mapper or sys-fs/lvm2

ifcfg    运行时生成网络配置    永不    installed when USE=net

network    用于网络启动    总是    installed when USE=net dhcp, iproute2

selinux    加载 selinux 策略    永不    installed when USE=selinux

url-lib    包含 cUrl 和 SSL 证书    永不    installed when USE=net net-misc/curl


bootchart watchdog busybox network cms qemu qemu-net cifs dasd dasd_mod fcoe virtfs zfcp znet masterkey ecryptfs integrity pollcdrom systemd suse


压缩方式
--gzip 默认
--bzip2
--lzma
--xz
--no-compress

openSUSE 的内核支持以上所有 dracut 有的压缩方式,只要你在系统上能打开相应格式的软件包,那用它启动就没有问题。

不同压缩方式对映像大小对比
压缩方式    映像大小
gzip    偏大
bzip    适中
lzma    最小
xz    小

其他与优化相关的选项

-H, --host-only 解释见上,生成的 initramfs 会小一多半,一般在 5 MB 以下。
--nofscks 不安装磁盘修复工具,启动时也不检查磁盘,比如 btrfs 这类的就可以考虑一下
--strip 把 debuginfo 从即将包含进 initramfs 的二进制可执行文件中提取出来并丢掉
--kernel-only 只包含内核模块。不明白什么意思,但勇敢者可以尝试一下

常见问题
/bin/setfont/ bin/loadkey failed with error code 1

这是因为你开启了 i18n 模块却没有在 grub2 的内核命令行中设置 vconsole 字体和键盘布局导致的。由于中文完全没有所谓的 console 字体(console 字体最多不能超过 256 个字符,中文你懂得),所以我们没有必要开启 i18n,在生成 initramfs 时使用 -o "i18n" 选项来屏蔽 i18n 模块。

rpcbind: rpcbind terminating on signal. restart with "rpcbind -w"

这是由于你启用了 nfs 模块,在 initramfs 中却没有 rpcbind 命令导致的。解决方法有两种:
-o "nfs" 来禁用 nfs 模块。多用于桌面
-i /sbin/rpcbind /sbin/rpcbind 来将 rpcbind 放到 initrmfs 中。

/bin/sh: error while loading shared libraries : libreadline.so.6. can not open shared object file: no such file or directory. kernel panic.

多见于使用了 --hostonly 选项时。这是因为生成的 initramfs 中没有 /lib64/libreadline.so.6.2,所以造成了 kernel panic。因此:
使用 -i /lib64/libreadline.so.6.2 /lib64/libreadline.so.6.2 将它放到 initramfs 中。


dracut 维基
https://dracut.wiki.kernel.org/index.php/Main_Page
http://www.360doc.com/content/13/0428/09/12139495_281449877.shtml

dracut 官方手册
https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html


该文章最后由 阿炯 于 2021-03-21 10:17:48 更新,目前是第 2 版。