Dracut本页面正在建设!
建言或参与施工请至这篇文章的 讨论 页面。
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。因此有风险。非高级用户请谨慎尝试。
[编辑]安装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-.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 网络设备重命名总是
btrfs支持 btrfs rootfshost-only: rootfs
capssupports dropping capabilities before init总是(also replaces dash with bash)
crypt支持加密 rootfshost-only: rootfsdevice-mapper, static-libs4
crypt-gpg支持 gpg 加密(需要 crypt 模块)永不
dmraid支持 FakeRAID 上的 rootfshost-only: rootfsdevice-mapper
dmsquash-live支持 LiveCD rootfs永不 (host-only: refused)device-mapper
gensplash包含静态 splash 屏幕永不static-libs4
iscsi支持 iscsi 设备上的 rootfshost-only: rootfsnet
livenet通过 HTTP 获取 rootfs (需要 dmsquash-live 模块)永不device-mapper, net
lvm支持 LVM 设备上的 rootfshost-only: rootfsdevice-mapper
mdraid支持软件 RAID 上的 rootfshost-only: rootfs
multipath支持多路径设备上的 rootfshost-only: rootfs
nbd支持在网络块设备上的 rootfshost-only: rootfsnet
nfs支持以 NFS 方式挂载的 rootfsnethost-only: rootfs
plymouth启动动画总是libkms3
ssh-client包含 ssh 和 scp 客户端永不net
debug包含调试工具永不installed when USE=debug
dm包含 device-mapper永不installed when USE=device-mapper
ifcfg运行时生成网络配置永不installed when USE=net
network用于网络启动总是installed when USE=net
selinux加载 selinux 策略永不installed when USE=selinux
url-lib包含 cUrl 和 SSL 证书永不installed when USE=net
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 中。
[编辑]参考文献