SDB:Dracut
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 设备映像器的检测(后三者多用于服务器)。
调试
优化
模块列表和它们的用途
下面列出了所有模块的功能,读者生成自己的 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 rootfs | host-only: rootfs | ||
caps | supports dropping capabilities before init | 总是 |
(also replaces | |
crypt | 支持加密 rootfs | host-only: rootfs | device-mapper , static-libs 4 |
|
crypt-gpg | 支持 gpg 加密(需要 crypt 模块) |
永不 | ||
dmraid | 支持 FakeRAID 上的 rootfs | host-only: rootfs | device-mapper |
|
dmsquash-live | 支持 LiveCD rootfs | 永不 (host-only: refused) | device-mapper |
|
gensplash | 包含静态 splash 屏幕 | 永不 | static-libs 4 |
|
iscsi | 支持 iscsi 设备上的 rootfs | host-only: rootfs | net |
|
livenet | 通过 HTTP 获取 rootfs (需要 dmsquash-live 模块) |
永不 | device-mapper , net |
|
lvm | 支持 LVM 设备上的 rootfs | host-only: rootfs | device-mapper |
|
mdraid | 支持软件 RAID 上的 rootfs | host-only: rootfs | ||
multipath | 支持多路径设备上的 rootfs | host-only: rootfs | ||
nbd | 支持在网络块设备上的 rootfs | host-only: rootfs | net |
|
nfs | 支持以 NFS 方式挂载的 rootfs | net |
host-only: rootfs |
|
plymouth | 启动动画 | 总是 | libkms 3 |
|
ssh-client | 包含 ssh 和 scp 客户端 | 永不 | net |
|
syslog | 支持远程日志 | 永不 |
或 | |
debug | 包含调试工具 | 永不 | installed when USE=debug |
|
dm | 包含 device-mapper | 永不 | installed when USE=device-mapper |
or |
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 中。
多见于使用了 --hostonly 选项时。这是因为生成的 initramfs 中没有 /lib64/libreadline.so.6.2,所以造成了 kernel panic。因此:
使用 -i /lib64/libreadline.so.6.2 /lib64/libreadline.so.6.2 将它放到 initramfs 中。