1、为啥要踩这个坑
管理的服务器是很早前买的,系统是centos6.5。阿里云的安骑士给报了一堆的漏洞,但是系统内核kernel的漏洞一直修复不成功。修复的方式也很简单,就是升级linux内核。
2、漏洞
阿里云服务器出现如下漏洞
软件: kernel 3.10.0-514.6.2.el7
命中: kernel version less than 0:3.10.0-514.16.1.el7
软件: kernel 3.10.0-514.6.2.el7
命中: kernel version less than 0:3.10.0-514.16.1.el7
软件: kernel 3.10.0-514.6.2.el7
命中: kernel version less than 0:3.10.0-514.21.1.el7
软件: kernel 3.10.0-514.6.2.el7
命中: kernel version less than 0:3.10.0-514.10.2.el7
仔细观察,发现是由于kernel的版本过低导致。
执行阿里云生成的修复指令 yum update kernel , 执行完一台服务器报错,一台服务器没有反应。。所以这种方法无效。
3、修复过程
1、首先查看服务器的centos版本
cat /etc/centos-release
2、查看服务器的内核版本
uname -r
发现服务器的内核版本确实比较低。
3、导入public key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
4、 安装ELRePo到centos-6.5中
这里有个需要注意的是elrepo-release-6-8.el6.elrepo.noarch.rpm这是针对centos6.0+版本的,很多博客写的都是elrepo-release-6-6.el6.elrepo.noarch.rpm。现在6-6的版本已经下载不到,只有6-8的版本是可以下载的,这个版本就是针对centos6.x的
rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
5、安装kernel-lt(lt=long-term)
yum --enablerepo=elrepo-kernel install kernel-lt -y
或者安装kernel-ml(ml=main line)
yum --enablerepo=elrepo-kernel install kernel-ml -y
6、编辑grub.conf,修改grub引导顺序
vim /etc/grub.conf
将default的值修改为我们新安装的内核
7、阿里云的服务器要注意的坑
对于 CentOS,OpenSUSE,SLES (SUSE Linux Enterprise Server) 和 Aliyun Linux,升级 Linux 实例后启动失败,可能是因为升级后的内核对应的 initrd 文件中没有 virtio-blk 和 xen-blkfront 驱动。而 Debian 和 Ubuntu 的 virtio-blk 和 xen-blkfront 驱动是内核内置的,所以不存在这个可能性。
**什么是 initrd 文件 **
initrd(initial ramdisk)是用于载入临时 root 文件系统到磁盘中的,运行于 Linux 实例启动阶段。起同样作用的还有 initramfs 文件,虽然 initrd 和 initramfs 是两种不同的操作概念,但这两个文件都活跃在启动实例时挂载 root 文件系统之前。
可以直接升级内核的系统镜像
阿里云优化了镜像名称 image_no 中时间戳从 20161115 开始的镜像公共系统镜像内核,这些镜像的 initrd 文件不会因为缺失 virtio-blk 和 blkfront 驱动的情况而导致启动失败。如下所示:
- centos_6u8_64_40G_cloudinit_20161115.vhd
- centos_6u8_32_40G_cloudinit_20161115.vhd
- centos_5u11_64_40G_cloudinit_20161115.vhd
- centos_5u11_32_40G_cloudinit_20161115.vhd
- centos_6_8_64_40G_base_20170222.vhd
- centos_6_8_32_40G_base_20170222.vhd
- centos_7_2_64_40G_base_20170222.vhd
- centos_5_11_64_40G_base_20170222.vhd
- centos_5_11_32_40G_base_20170222.vhd
- centos_6_08_64_20G_alibase_20170824.vhd
- debian_8_09_64_20G_alibase_20170824.vhd
如何优化内核并避免启动失败
编辑系统配置文件,若配置文件中缺失下列内容需要您手动加上:
- 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 "。
- OpenSUSE/SUSE:执行 vi /etc/sysconfig/kernel,添加 INITRD_MODULES=" virtio_blk virtio_pci xen-vbd"。
执行 vi /etc/dracut.conf,添加 add_drivers+="virtio_blk virtio_pci xen-vbd"。
更新内核:
- CentOS:执行 yum install kernel。
- OpenSUSE/SUSE:执行 zypper install kernel-default。
执行命令 lsinitrd /boot/initramfs-$(new-kernel-ver).img | grep -E 'virtio|xen' 检查并确认 initrd / initramfs 文件中已经包含了 virtio-blk 和 xen-blkfront 驱动。
必须确认 virtio-blk 和 xen-blkfront 驱动在 initrd 中才可以重启实例。先前就是因为没有注意这个initrd文件直接重启了服务器,然后服务器炸了,只能去阿里云工单去解决,先备份镜像,倒腾了好久才搞定。'
8、完成上述步骤以后,重启服务器
reboot
9、重新查看系统内核版本
uname -r
发现系统的内核版本已经升级了
10、删除系统旧的内核版本(可做可不做)
查找系统的所有内核
rpm -qa|grep kernel*
删除低版本的内核
yum remove 低版本内核
等待一天就发现所有系统的内核漏洞都已经被修复了