定制化RHEL6.7升级至7.4时dracut无法识别根分区求助
解决GRUB 0.97引导RHEL7.4内核时dracut无法找到LVM根分区的问题
我之前碰到过一模一样的场景——用老版本GRUB引导跨大版本的RHEL内核,LVM根分区识别失败的问题。核心原因是RHEL7的dracut initramfs默认不会自动识别你的自定义LVM卷组信息,加上GRUB 0.97的参数传递方式和后续版本有差异,导致内核启动时找不到根分区。下面是一步步的解决步骤:
第一步:修正GRUB启动参数(最可能解决问题)
GRUB 0.97的配置文件是/boot/grub/grub.conf,你需要在RHEL7.4的启动条目里补充LVM相关的强制参数,确保dracut能定位到你的根卷:
- 编辑GRUB配置文件:
vi /boot/grub/grub.conf - 找到你添加的RHEL7.4启动条目,比如类似这样的结构:
title RHEL 7.4 Upgrade root (hd0,0) # 这里是你的/boot分区对应的GRUB设备,别和系统根分区搞混 kernel /Upgrade/isolinux/vmlinuz root=/dev/mapper/stats-rootvol ro initrd /Upgrade/isolinux/initrd.img - 修改
kernel行,添加关键的LVM引导参数,修改后应该是:
各参数的作用:kernel /Upgrade/isolinux/vmlinuz root=/dev/mapper/stats-rootvol ro rd.lvm.vg=stats rd.driver.pre=dm_mod rd.lvm.lv=stats/rootvolrd.lvm.vg=stats:强制dracut激活名为stats的LVM卷组rd.driver.pre=dm_mod:提前加载设备映射模块,确保LVM能被识别rd.lvm.lv=stats/rootvol:明确指定要挂载的逻辑卷
第二步:如果参数修正无效,生成适配你的LVM环境的自定义initrd
官方RHEL7.4的initrd是通用版本,可能没有包含你的特定LVM卷组信息或必要的驱动模块。你可以生成一个适配的initrd:
- 确保你能访问RHEL7.4的相关工具(可以挂载RHEL7.4 ISO到本地,或者安装dracut包)
- 运行以下命令生成自定义initrd(替换内核版本为你的vmlinuz对应的版本,比如
3.10.0-693.el7.x86_64):dracut --add-drivers "dm_mod dm_mirror dm_log dm_snapshot" --include /etc/lvm /etc/lvm /Upgrade/isolinux/custom-initrd.img 3.10.0-693.el7.x86_64 - 修改GRUB配置里的
initrd行,指向这个自定义镜像:initrd /Upgrade/isolinux/custom-initrd.img
第三步:用UUID替代设备路径(避免名称识别问题)
如果你的LVM设备名称在启动时可能被识别错误,可以用UUID来指定根分区,更可靠:
- 查看根卷的UUID:
输出会类似:blkid /dev/mapper/stats-rootvol/dev/mapper/stats-rootvol: UUID="abc123-def4-5678-90gh-ijklmnopqrst" TYPE="xfs" - 同时查看LVM卷组的UUID:
vgdisplay stats | grep UUID - 修改GRUB的
kernel行,用UUID指定:kernel /Upgrade/isolinux/vmlinuz root=UUID=abc123-def4-5678-90gh-ijklmnopqrst ro rd.lvm.uuid=lvm-xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rd.driver.pre=dm_mod
额外排查技巧
如果还是失败,在dracut的紧急shell里手动排查:
- 加载LVM模块:
modprobe dm_mod - 激活卷组:
vgchange -ay stats - 如果能成功激活,说明是initrd里缺少模块或参数,回到第二步重新生成initrd;如果激活失败,检查卷组是否损坏或磁盘连接问题
内容的提问来源于stack exchange,提问作者joe




