摘要: CentOS 7.3 从内核 3.10.0 升级到 4.14.40 后,重启进不了系统,原因是 Linux 内核 4.4.x 版本之后,dracut 命令生成的 initramfs 默认不会自动加载 mpt3sas 驱动模块。因为没有对应的驱动程序,所以识别不了系统盘(两块 SAS 系统盘接在 LSI 2308 HBA 卡上,创建 RAID 1),从而导致内核 vmlinuz 无法加载它的 rootfs(根文件系统)
使用 CentOS-7-x86_64-DVD-1611.iso
原版 ISO 光盘安装了 CentOS-7.3
后,默认的 Linux内核
版本是 3.10.0-514.el7.x86_64
下载并安装以下两个 RPM 包,将内核升级到 4.14.40
:
kernel-4.14.40-1.x86_64.rpm
kernel-headers-4.14.40-1.x86_64.rpm
重启系统,等了半天系统没启动成功,发现一直卡在进度条。按 ESC
键查看详细信息如下:
既然能显示 GRUB2
的引导菜单(都到进度条了,肯定过了引导菜单),说明 MBR
和 GRUB2
没有问题,那么问题应该是 initramfs
中没有系统盘的驱动程序(需要 mpt2sas
),导致内核 vmlinuz
无法加载它的 rootfs(根文件系统)
。不能使用 单用户模式
,因为进不去,systemd
不可能启动起来,自然进不了单用户模式,那只能使用安装光盘的 救援模式
了
我们需要利用原版 ISO
光盘所提供的 Rescure a CentOS Linux system
(救援模式)来重建 initramfs
插入光盘后,设置 Boot Sequence(启动顺序)
,选择从光盘启动:
选择 Troubleshooting(故障排除)
:
选择 Rescure a CentOS Linux system
:
输入数字 1
,即选择 1) Continue
:
按 Enter
回车键:
df 查看目录,执行命令:chroot /mnt/sysimage (切换根目录)
查看已安装的 Linux 内核版本
•使用rpm -qa kernel*或rpm -qa | grep -i kernel命令
•ps:如果前面那个命令后面不加 * 号,是查不到新安装的内核的
查看默认启动内核是否更改成功
•使用grub2-editenv list命令
查询initramfs的驱动
[root@lab103 lab103]# lsinitrd -k 3.10.0-327.el7.x86_64|grep mpt drwxr-xr-x 2 root root 0 Apr 17 12:05 usr/lib/modules/3.10.0-327.el7.x86_64/kernel/drivers/scsi/mpt2sas -rw-r--r-- 1 root root 337793 Nov 20 2015 usr/lib/modules/3.10.0-327.el7.x86_64/kernel/drivers/scsi/mpt2sas/mpt2sas.ko
可以在4.x内核中看到可以看到在3.10内核的时候是mpt2sas驱动
新版的内核已经把mpt2sas升级为mpt3sas
/lib/modules/4.4.46/kernel/drivers/scsi/mpt3sas/mpt3sas.ko
查询initramfs内的模块
lsinitrd -k 4.14.113-1.el7.x86_64|grep mpt3
可以看到并没有输出,说明initramfs并没有把这个驱动打进去
这个地方有两种方式来解决
修改 /etc/dracut.conf文件,增加字段
add_drivers+="mpt3sas"
重新生成initramfs,注意后面要加内核的版本号
dracut -f /boot/initramfs-4.14.113-1.el7.x86_64.img 4.14.113-1.el7.x86_64
强制加载驱动方法二:
dracut --force --add-drivers mpt3sas --kver=4.14.113-1.el7.x86_64
lsinitrd -k 4.14.113-1.el7.x86_64|grep mpt3
以上方法二选一做下驱动的集成,然后做下面的检查
如果有输出就是正常了的
然后重启操作系统即可