Dracut
dracut 是下一代的 initramfs 系统。和前一代 initramfs 系统,mkinitrd,的不同点在于,dracut 设计上就考虑到了映像尺寸的问题,尽量避免硬编码,以提高生成的 cpio 映像载入内存的速度; 实现上,由于 initramfs 的唯一作用就是挂载 rootfs(因此不需要把一堆无用的比如 plymouth 等都装进去),它主要依赖 udev 去获取 rootfs 的设备节点,一旦 rootfs 节点出现则立刻切换过去。按照官方维基的说法:5 秒启动不是梦。另外它采用了模块化的方式,使用者可自由在 %{_libdir}/dracut/modules.d 下创建他需要的特殊模块,可扩展性很强。最后它的使用方式和 mkinitrd 非常接近,迁移成本较低。
[编辑]安装openSUSE 12.2 可以从 MargueriteSu 讨论 - 贡献 的私人源尝试:dracut at home:MargueriteSu sudo zypper ar -f http://download./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 "不想要的模块列表" 的方式来去除自己用不到的模块。 [编辑]默认模块
[编辑]可选模块bootchart watchdog busybox network cms qemu qemu-net cifs dasd dasd_mod fcoe virtfs zfcp znet masterkey ecryptfs integrity pollcdrom systemd suse [编辑]压缩方式
openSUSE 的内核支持以上所有 dracut 有的压缩方式,只要你在系统上能打开相应格式的软件包,那用它启动就没有问题。 [编辑]不同压缩方式对映像大小和启动速度的影响
[编辑]其他与优化相关的选项
[编辑]常见问题[编辑]/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 命令导致的。解决方法有两种:
[编辑]多见于使用了 --hostonly 选项时。这是因为生成的 initramfs 中没有 /lib64/libreadline.so.6.2,所以造成了 kernel panic。因此: 使用 -i /lib64/libreadline.so.6.2 /lib64/libreadline.so.6.2 将它放到 initramfs 中。 [编辑]参考文献 |
|
来自: 身子莫 > 《linux内核及操作系统》