SDB:Dracut

跳转至: 导航, 搜索

Template:Working

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

Fedora 11 的时候就使用了 dracut,而 openSUSE 对 dracut 的评估开始于 2012 年 Hackweek 8 前夕和期间,因此目前只进入了 Factory,尚未确定是否会应用于 openSUSE 12.3。因此有风险。非高级用户请谨慎尝试。

安装

openSUSE 12.2 可以从 MargueriteSu 讨论 - 贡献 的私人源尝试:dracut at home:MargueriteSu

sudo zypper ar -f http://download.opensuse.org/repositories/home:/MargueriteSu/openSUSE_12.2/ home:MargueriteSu
sudo zypper in dracut dracut-tools dracut-caps dracut-network

创建新 initramfs

最简单的方法就是使用:

dracut

这将在你的 /boot 目录下创建一个名为 initramfs-<kernel version>.img 的通用 initramfs,这包含了你当前运行内核当前加载的全部内核模块。

要是那个文件已经存在了,dracut 会报错,你可以使用 dracut --force 来强行写入。

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

dracut 名称.img 内核版本

当前内核版本可使用 uname -r 查看,后安装的内核版本可在 /usr/src 目录中执行 ls -l 查看 linux 文件夹的链接指向来确定 。主要用于安装了多版本内核的情况,比如内核升级完成未重启前重制 initramfs(因为 openSUSE 整合 dracut 不够深,现在没有这样的自动化命令出现)。

要是想生成最小化的 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 中。

参考文献