情况是这样的,阿里云免费赠送了7天的安骑士,于是乎便想疯狂地用安骑士来修补一把所有的漏洞,结果按照阿里云的建议的方法修补一个高危漏洞需要升级Kernel内核时把服务器“整趴了”!好在之前有预感——把服务器当前状态做了一个镜像,才不至于把肠子悔青。
问题的产生
之前按安骑士的建议直接用命令yum update kernel
直接升级了Kernel,重启服务器之后似乎并没有生效,然后通过命令uname -a
查询得知当前的系统内核为:
Linux 3.10.0-123.9.3.el7.x86_64
还是原来的系统内核,并没有升级到最新的3.10.0-693.5.2.el7.x86_64
,然后通过以下命令来查看当前所有安装的内核:
cat /boot/grub2/grub.cfg |grep menuentry
可以看到确实已经安装上了,而且安装了不止一个内核,由此我便简单地以为是没有通过新内核启动到系统,因此便直接修改linux启动项到刚升级的新内核,就此拉开了悲剧的序幕,整个系统直接崩溃,重启系统后显示如下信息:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block
正在抓狂之际,欣喜地看到了阿里云官方如何避免升级 Linux 实例内核后无法启动这根救命稻草,本来故事到这里就应该愉快地结束了的,但由于文档教程上写得太模糊,再加上他们没做过全版本的测试,而我的是2015年的centos7,所以硬是折腾了我近一天的时间,好了,废话不多说直接上解决方法吧。
升级方法
1、按教程上写的编辑系统配置文件,若配置文件中缺失下列内容需要您手动加上,但这一步有没有用还真不知,因为我找到dracut.conf.d/
这个目录里后发现竟然是空的,不过我还是照做新建了一个文件virt-drivers.conf
,也没时间做彻底的测试:
下面引用自文档
CentOS 6 和 CentOS 7:
执行 vi /etc/dracut.conf.d/virt-drivers.conf
添加 add_drivers+=" xen-blkfront virtio_blk "
CentOS 5:执行 vi /etc/dracut.conf.d/virt-drivers.conf
添加 add_drivers+=" xen-vbd virtio_blk virtio_console "
2、更新内核,命令如下:
yum install kernel
提示:
因为我之前有执行过yum update kernel
升级kernel的命令,如果有错可试着执行下看;
另外,如果执行yum update kernel
升级kernel的过程中出现部分包更新的错误(我就碰到了,死活升不成功),导致中止的话可尝试yum update
,记住,这会一次性更新所有的软件与工具及系统内核,所以备好份做好镜像,备好份做好镜像,备好份做好镜像,重要的事情说三遍,否则到时别哭,网络出错除外哈!
3、检查并确认 initrd / initramfs 文件包中是否已经包含了 virtio-blk 和 xen-blkfront 驱动,非常重要,是你重启后能否进系统的关键,执行的命令官方写的是:
lsinitrd /boot/initramfs-$(new-kernel-ver).img | grep -E 'virtio|xen'
但实际上这里的$(new-kernel-ver)
是个变量,执行命令到/boot/
目录,再列出文件可以看到你的系统内核启动相关文件,运行如下命令:
cd /boot/
ls
看到上面的initramfs-xxxx.img类似的文件了么?这便是我们需要的变量文件名,所以我这里的命令是:
lsinitrd /boot/initramfs-3.10.0-693.5.2.el7.x86_64.img | grep -E 'virtio|xen'
-rw-r--r-- 1 root root 7624 Oct 21 05:44 usr/lib/modules/3.10.0-693.5.2.el7.x86_64/kernel/drivers/block/virtio_blk.ko.xz
-rw-r--r-- 1 root root 12804 Oct 21 05:44 usr/lib/modules/3.10.0-693.5.2.el7.x86_64/kernel/drivers/char/virtio_console.ko.xz
-rw-r--r-- 1 root root 14276 Oct 21 05:45 usr/lib/modules/3.10.0-693.5.2.el7.x86_64/kernel/drivers/net/virtio_net.ko.xz
-rw-r--r-- 1 root root 7996 Oct 21 05:45 usr/lib/modules/3.10.0-693.5.2.el7.x86_64/kernel/drivers/scsi/virtio_scsi.ko.xz
drwxr-xr-x 2 root root 0 Nov 30 19:45 usr/lib/modules/3.10.0-693.5.2.el7.x86_64/kernel/drivers/virtio
-rw-r--r-- 1 root root 4340 Oct 21 05:45 usr/lib/modules/3.10.0-693.5.2.el7.x86_64/kernel/drivers/virtio/virtio.ko.xz
-rw-r--r-- 1 root root 9488 Oct 21 05:45 usr/lib/modules/3.10.0-693.5.2.el7.x86_64/kernel/drivers/virtio/virtio_pci.ko.xz
-rw-r--r-- 1 root root 8136 Oct 21 05:45 usr/lib/modules/3.10.0-693.5.2.el7.x86_64/kernel/drivers/virtio/virtio_ring.ko.xz
从系统回显的内容看到文件中已经包含了 virtio-blk 或 xen-blkfront 驱动即可,记住一定必须确认 virtio-blk 和 xen-blkfront 驱动在 initrd 中才可以重启实例。
好了,祝升级顺利~