创建initramfs

概述

最近在更新系统的时候,执行emerge命令收到提示:

genkernel-next由于glibc编译失败会在30天后移除

后来在某IM的群聊里看到这个消息是在7月11日就发布了,看来需要换个方法生成initramfs了。

原因

其实如果只是单纯的磁盘系统并不需要使用initramfs就可以引导系统,但是由于我使用lvm处理磁盘分区,而且root分区在lvm上,所以必须使用initramfs创建内存系统引导系统到真实root分区。

迁移过程

最开始想到的就是genkernel包,本身genkernel-next就是前者的迭代版本,而且按照 Gentoo Wiki里的介绍,两个包都可以实现initramfs的创建操作。于是按照原先的创建initramfs的流程用genkernel重新创建。

emerge -C genkernel-next
emerge genkernel
genkernel --lvm initramfs

整个编译过程持续时间远大于genkernel-next,最后重新启动系统,lvm分区挂载超时,在调试模式下root和boot两个lvm分区可以正常挂载,其他lvm分区无法挂载。
打算用进PE系统看看什么问题,手头没有现成的PE系统。好在双系统引导还在,切换到windows系统用ultrISO刷写了一个systemrescuecd系统到U盘。
中间反复3次,systemrescuecd 6.x版本无法正常引导,5.x版本卡在lvm服务启动上,换PE系统官网的最新版仍然无法引导。后来重新下载的ubuntu镜像作为PE系统。
这次直接改用dracut创建initramfs,重启后正常引导。

操作流程

  1. 安装dracut
emerge dracut
  1. 查看内核版本,记住版本信息
# eselect kernel list
Available kernel symlink targets:
  [1]   linux-5.0.0-gentoo *
  1. 创建initramfs
dracut --kver 5.0.0-gentoo -a lvm --force

如果已存在/boot/initramfs-<kernel-version>.img文件,dracut会中断执行并提示,可以使用--force参数覆盖操作。
4. 修改grub引导配置文件

vim /etc/default/grub
GRUB_CMDLINE_LINUX="rd.lvm.vg=<Volume GROUP NAME>"
  1. 重建引导配置文件
grub-mkconfig -o /boot/grub/grub.cfg
  1. 重启系统

总结

在之前的迁移过程中,并没有执行第4步修改GRUB_CMDLINE_LINUX的操作,GRUB_CMDLINE_LINUX的参数还是原来的dolvm,但是在重启后仍能正常引导,所以就没有修改这项。在PE系统中重建引导菜单os-prober无法检测到windows系统,我也是在重启到真实系统后重新创建的引导文件。
相比来说,dracut创建initramfs的速度要比genkernel-next要快一些。但是执行命令的时候需要制定内核版本,否则dracut会使用系统当前内核版本的库。

相关链接

gentoo lvm
gentoo dracut