摘要: CentOS 7.3 從內核 3.10.0 升級到 4.14.40 后,重啟進不了系統,原因是 Linux 內核 4.4.x 版本之后,dracut 命令生成的 initramfs 默認不會自動加載 mpt3sas 驅動模塊。因為沒有對應的驅動程序,所以識別不了系統盤(兩塊 SAS 系統盤接在 LSI 2308 HBA 卡上,創建 RAID 1),從而導致內核 vmlinuz 無法加載它的 rootfs(根文件系統)
1. 現象描述
使用 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
不可能啟動起來,自然進不了單用戶模式,那只能使用安裝光盤的 救援模式
了
2. 問題解決
2.1 救援模式
我們需要利用原版 ISO
光盤所提供的 Rescure a CentOS Linux system
(救援模式)來重建 initramfs
插入光盤后,設置 Boot Sequence(啟動順序)
,選擇從光盤啟動:

選擇 Troubleshooting(故障排除)
:

選擇 Rescure a CentOS Linux system
:

輸入數字 1
,即選擇 1) Continue
:

按 Enter
回車鍵:

2.2 重建 initramfs
(1) chroot
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並沒有把這個驅動打進去
(2) add kernel module
這個地方有兩種方式來解決
方法一:
修改 /etc/dracut.conf文件,增加字段
重新生成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
以上方法二選一做下驅動的集成,然后做下面的檢查
如果有輸出就是正常了的

然后重啟操作系統即可