編譯制作Linux 3.18內核rpm包(升級centos6.x虛擬機內核)


介紹

openstack平台需要使用各種Linux發行版模板鏡像,其制作方法主要有兩種,要么是基於各大Linux發行版ISO光盤手動制作,要么是使用官方提供的模板鏡像再做修改

之前制作的openstack centos6.5模板鏡像,其內核為2.6.xx,現需要升級其內核到3.18.x,使用這里提供的rpm包kernel-ml-3.18.3-1.el6.elrepo.x86_64.rpm升級內核遇到了下面幾個問題,下面談談我的解決過程

問題

問題1.virtio驅動加載問題

使用上面提到的rpm包升級kernel之后,重啟虛擬機出現錯誤:

FATAL: Module scsi_wait_scan not found.

再進一步測試,就會發現,在物理機上升級內核,一切ok!

原因是KVM虛擬機使用了virtio_blk.ko這個半虛擬化驅動模塊來使虛擬機支持scsi設備,而物理機升級時用不到virtio驅動,自然不會有問題,在kernel3.13版本以前,可以使用"blk_init_queue"這個函數加載virtio_blk.ko模塊,而在kernel3.13版本之后,這個函數名變為"blk_mq_init_queue", 此函數名位於"/usr/share/dracut/modules.d/90kernel-modules/installkernel"文件中,可以看到,centos6.5系統中的函數名為"blk_init_queue"

centos6系統中使用Dracut這個程序生成內核的initramfs.img, 而Dracut程序使用的是舊函數"blk_init_queue"(installkernel文件中),因此升級3.18.x內核后,Dracut程序生成的initramfs.img無法包含virtio_blk.ko模塊,造成虛擬機啟動報錯

解決問題的關鍵在於要確保virtio_blk.ko能夠被加載

如果我們單純是需要解決升級內核后啟動失敗問題,那么就沒必要編譯內核rpm包,直接下載文章開始提到的內核rpm包,然后使用下面的步驟解決啟動問題

#安裝rpm包
rpm -ivh kernel-ml-3.18.3-1.el6.elrepo.x86_64.rpm

#添加virtio_blk支持(新建conf文件) echo 'add_drivers+="virtio_blk"' >/etc/dracut.conf.d/force-vitio_blk-to-ensure-boot.conf
#備份initramfs cp /boot/initramfs-3.18.3-1.el6.elrepo.x86_64.img /boot/initramfs-3.18.3-1.el6.elrepo.x86_64.img.bak
#重新生成initramfs dracut -f /boot/initramfs-3.18.3-1.el6.elrepo.x86_64.img 3.18.3-1.el6.elrepo.x86_64

#重啟系統
注:以上步驟可以解決虛擬機啟動問題,如果你不需要制作centos6.5(3.18.x kernel)模板鏡像,那么就不需要進行后續步驟
問題2.雲硬盤熱拔插問題

解決了虛擬機啟動問題,如果需要制作centos6.5(3.18kernel)模板鏡像,那上面的方法是不行的,在openstack中使用此模板啟動虛擬機后,其雲硬盤的動態加載、移除功能無法使用,centos6.5(2.6.xx kernel)是可以動態加載雲硬盤的, 檢查3.18版本內核的配置文件/boot/config-3.18.3-1.el6.elrepo.x86_64(安裝完kernel rpm包,就會生成此文件),其中並沒有熱拔插功能支持模塊的配置項

問題3. 掛載ceph文件系統

2.6.xx內核是不支持ceph文件系統掛載,Linux kernel從3.10版本開始支持ceph文件系統掛載,假如我們的模板鏡像需要掛載ceph文件系統,那么也需要確保內核包含cephfs支持相關模塊

制作centos6.5(3.18 kernel)模板鏡像

1.准備一台虛擬機

首先需要有一個centos6.5(2.6.xx kernel)虛擬機,為了使編譯出來的內核rpm包適應openstack虛擬機環境,最好使用一台KVM虛擬機,以下步驟都在此虛擬機環境中操作,我們需要在此環境中編譯制作一個3.18 kernel的rpm包

進入虛擬機, 為了解決[問題1],需要修改文件/usr/share/dracut/modules.d/90kernel-modules/installkernel

vim /usr/share/dracut/modules.d/90kernel-modules/installkernel
#第四行中的"blk_init_queue" 替換為"blk_mq_init_queue"
2.下載Linux內核源碼(3.18)
#安裝編譯環境
yum groupinstall "Development Tools"
yum install ncurses-devel

#下載源碼
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.12.tar.xz
tar -xf linux-3.18.12.tar.xz -C /usr/src/ cd /usr/src/linux-3.18.12/
 3.添加編譯模塊

我們在系統原有的內核(2.6.xx)配置文件的基礎上建立新的編譯選項,所以可以復制系統現有的配置文件/boot/config-2.6.32-431.23.3.el6.x86_64到源碼目錄/usr/src/linux-3.18.12下,再添加我們需要的編譯參數來編譯3.18.x內核

#復制配置文件到源碼解壓目錄
cp /boot/config-2.6.32-431.23.3.el6.x86_64 /usr/src/linux-3.18-12/.config

#支持熱拔插模塊需要的參數
CONFIG_HOTPLUG_PCI=y CONFIG_HOTPLUG_PCI_FAKE=m CONFIG_HOTPLUG_PCI_ACPI=y CONFIG_HOTPLUG_PCI_ACPI_IBM=m

#支持ceph文件系統掛載需要的參數
CONFIG_CEPH_LIB=m
CONFIG_CEPH_FS=m
CONFIG_CEPH_FSCACHE=y
CONFIG_CEPH_FS_POSIX_ACL=y
4.制作內核rpm包

接下來需要根據上一步驟配置的.config文件編譯kernel,生成rpm包

#加載配置文件
sh -c 'yes "" | make oldconfig'

#制作rpm包
make rpm

#生成的內核rpm包目錄位於/root/rpmbuild/RPMS/x86_64下 
6.修改grub.conf
default=0    #default為新內核
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (3.18.3-1.el6.elrepo.x86_64)
        root (hd0,0)
        kernel /vmlinuz-3.18.3-1.el6.elrepo.x86_64 ...
7.重啟系統

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM