寫在前面的話
對於系統而言,除非是那種安全性要求非常高的公司或者經常會有第三方安全機構對其漏洞掃描的才容易涉及到系統的內核升級,比如之前呆過一個公司,因為需要做三級等保的原因,就會涉及到系統掃描,這時候就會牽扯到內核升級,當然,這一次寫這篇文章的場景不是這個,而是最近又再度學習 Kubernetes,所以升級下內核,盡可能避免已知的因為內核導致的 BUG。
升級方法
特別說明:生產環境需謹慎,請確保測試通過沒問題后再進行升級!
我的虛擬機安裝的是 CentOS Linux release 7.5.1804 (Core)
查看方法:
cat /etc/redhat-release
內核版本:
uname -r
結果為:3.10.0-1062.7.1.el7.x86_64,這里希望將其升級為 4+ 版本。
1. 更新 yum 倉庫為 EL 倉庫:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
2. 查看可供更新的版本:
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
結果如下:
我們選擇更新為 4.4 即可。注意 4.4 是 kernel-lt
yum --enablerepo=elrepo-kernel install kernel-lt
3. 此時可以查看系統已經安裝的內核版本:
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
結果如圖:
可以看到新安裝的 4.4 版本索引是 0。
4. 修改默認版本:
grub2-set-default 0
修改配置文件:
vim /etc/default/grub
設置 GRUB_DEFAULT=0
5. 生成配置文件:
grub2-mkconfig -o /boot/grub2/grub.cfg
重啟服務器測試:
reboot
查看:
uname -r
結果為:4.4.206-1.el7.elrepo.x86_64,到此內核升級完成,當然還可以后續操作,比如刪除舊版本的內核。
卸載舊版
1. 查看已安裝的內核:
rpm -qa | grep kernel
結果如下:
2. 卸載所有 3 版本:
yum -y remove kernel-tools-3.10.0-862.el7.x86_64 kernel-tools-libs-3.10.0-862.el7.x86_64 kernel-3.10.0-1062.7.1.el7.x86_64 kernel-headers-3.10.0-1062.7.1.el7.x86_64 kernel-3.10.0-862.el7.x86_64
3. 此時查看內核:
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
結果如下:
只剩下兩個!到此真正算是升級完成!
升級腳本
內容如下:
#!/bin/bash ############################################################################################# # 用途:CentOS7.5 內核版本升級 # 作者:Dy1an<1214966109@qq.com> # 時間:2019-12-09 ############################################################################################# ############################################################################################# # 導入系統變量 ############################################################################################# . /etc/init.d/functions source /etc/profile ############################################################################################# # 服務變量定義 ############################################################################################# # 線條 LINE='---------------------------------------------------------------------------------------' # 進程用戶 USER_PROCESS='root' ############################################################################################# # 顏色輸出函數 ############################################################################################# function FUNC_COLOR_TEXT() { echo -e " \e[0;$2m$1\e[0m" } function FUNC_ECHO_RED() { echo $(FUNC_COLOR_TEXT "$1" "31") } function FUNC_ECHO_GREEN() { echo $(FUNC_COLOR_TEXT "$1" "32") } function FUNC_ECHO_YELLOW() { echo $(FUNC_COLOR_TEXT "$1" "33") } function FUNC_ECHO_BLUE() { echo $(FUNC_COLOR_TEXT "$1" "34") } ############################################################################################# # 顏色通知輸出函數 ############################################################################################# # 通知信息 function FUNC_ECHO_INFO() { echo $(FUNC_COLOR_TEXT "${LINE}" "33") echo $(FUNC_COLOR_TEXT "$1" "33") echo $(FUNC_COLOR_TEXT "${LINE}" "33") } # 完成信息 function FUNC_ECHO_SUCCESS() { echo $(FUNC_COLOR_TEXT "${LINE}" "32") echo $(FUNC_COLOR_TEXT "$1" "32") echo $(FUNC_COLOR_TEXT "${LINE}" "32") } # 錯誤信息 function FUNC_ECHO_ERROR() { echo $(FUNC_COLOR_TEXT "${LINE}" "31") echo $(FUNC_COLOR_TEXT "$1" "31") echo $(FUNC_COLOR_TEXT "${LINE}" "31") } ############################################################################################# # 系統版本檢測函數 ############################################################################################# function FUNC_SYSTEM_CHECK() { VAR_SYSTEM_FLAG=$(/usr/bin/cat /etc/redhat-release | grep 'CentOS' | grep '7' | wc -l) if [[ ${VAR_SYSTEM_FLAG} -ne 1 ]];then FUNC_ECHO_ERROR '本腳本基於 [ CentOS 7 ] 編寫,目前暫不支持其他版本系統!' exit 1001 fi } ############################################################################################# # 用戶檢測函數 ############################################################################################# function FUNC_USER_CHECK() { VAR_USER=$(/usr/bin/whoami) if [[ ${VAR_USER} != 'root' ]];then FUNC_ECHO_ERROR '腳本目前只支持 [ root ] 用戶執行,請先切換用戶...' exit 1002 fi } ############################################################################################# # 服務器聯網函數 ############################################################################################# function FUNC_NETWORK_CHECK() { VAR_PING_NUM=$(/usr/bin/ping -c 3 www.baidu.com | grep 'icmp_seq' | wc -l) if [[ ${VAR_PING_NUM} -eq 0 ]];then FUNC_ECHO_ERROR '網絡連接失敗,請先配置好網絡連接...' exit 1003 fi } ############################################################################################# # 打印系統信息 ############################################################################################# function FUNC_PRINT_SYSTEM_INFO() { # 獲取系統信息 SYSTEM_DATE=$(/usr/bin/date) SYSTEM_VERSION=$(/usr/bin/cat /etc/redhat-release) SYSTEM_CPU=$(/usr/bin/cat /proc/cpuinfo | grep 'model name' | head -1 | awk -F: '{print $2}' | sed 's#^[ \t]*##g') SYSTEM_CPU_NUMS=$(/usr/bin/cat /proc/cpuinfo | grep 'model name' | wc -l) SYSTEM_KERNEL=$(/usr/bin/uname -a | awk '{print $3}') SYSTEM_IPADDR=$(/usr/sbin/ip addr | grep inet | grep -vE 'inet6|127.0.0.1' | awk '{print $2}') # 打印系統信息 FUNC_ECHO_YELLOW ${LINE} echo "服務器的信息: ${SYSTEM_IPADDR}" FUNC_ECHO_YELLOW ${LINE} echo "操作系統版本: ${SYSTEM_VERSION}" echo "系統內核版本: ${SYSTEM_KERNEL}" echo "處理器的型號: ${SYSTEM_CPU}" echo "處理器的核數: ${SYSTEM_CPU_NUMS}" echo "系統當前時間: ${SYSTEM_DATE}" FUNC_ECHO_YELLOW ${LINE} } ############################################################################################# # 升級內核 ############################################################################################# function FUNC_UPDATE_KERNEL() { # 安裝 EL 源 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm if [[ $? -ne 0 ]];then FUNC_ECHO_ERROR "EL 源安裝失敗,請檢查是否存在問題!" exit 1004 fi # 查看可提供升級的版本 yum --disablerepo="*" --enablerepo="elrepo-kernel" list available VAR_KERNEL_NAME="kernel-lt" read -p "請輸入上面列出的版本中你想安裝的版本(默認 lt 版本) [lt/ml]: " VAR_VERSION_CHOICE if [[ ${VAR_VERSION_CHOICE} == "ml" ]];then VAR_KERNEL_NAME="kernel-ml" fi FUNC_ECHO_INFO "本次選擇升級的版本為:${VAR_KERNEL_NAME}" # 升級內核 yum --enablerepo=elrepo-kernel install ${VAR_KERNEL_NAME} if [[ $? -ne 0 ]];then FUNC_ECHO_ERROR "內核升級失敗,請根據報錯檢查是否存在問題!" exit 1005 fi # 查看目前版本 FUNC_ECHO_INFO "系統當前所安裝的內核版本如下:" awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg # 選擇默認內核版本 VAR_NUM_CHOICE=0 read -p "請輸入上面列出的版本序號選擇系統最終默認版本(默認 0): " VAR_NUM_CHOICE if [[ $(echo ${VAR_NUM_CHOICE} | sed 's/[0-9]//g') == '' ]];then if [[ ${VAR_NUM_CHOICE} == "" ]];then VAR_NUM_CHOICE=0 fi else FUNC_ECHO_INFO "輸入有誤,將以默認配置執行..." VAR_NUM_CHOICE=0 fi # 配置系統默認 grub2-set-default ${VAR_NUM_CHOICE} sed -i "s#^GRUB_DEFAULT=.*#GRUB_DEFAULT=${VAR_NUM_CHOICE}#g" /etc/default/grub if [[ $? -ne 0 ]];then FUNC_ECHO_ERROR "默認內核配置失敗,可以手動配置/etc/default/grub文件中:GRUB_DEFAULT參數為指定內核索引!" fi } ############################################################################################# # 卸載舊版本內核 ############################################################################################# function FUNC_UNINSTALL_KERNEL() { # 顯示內核版本 FUNC_ECHO_INFO "系統當前所安裝的內核版本如下:" rpm -qa | grep kernel # 提示卸載 FUNC_ECHO_INFO "你可以手動卸載舊版本:yum -y remove 包名字,然后重啟使用:uname -r 查看升級結果" } ############################################################################################# # 安裝程序開始 ############################################################################################# # 系統檢查 FUNC_SYSTEM_CHECK # 用戶檢查 FUNC_USER_CHECK # 聯網檢測 FUNC_NETWORK_CHECK # 打印系統信息 FUNC_PRINT_SYSTEM_INFO read -p "是否繼續安裝升級(默認 y) [y/n]: " VAR_CHOICE case ${VAR_CHOICE} in [yY][eE][sS]|[yY]) FUNC_UPDATE_KERNEL FUNC_UNINSTALL_KERNEL ;; [nN][oO]|[nN]) FUNC_ECHO_YELLOW "安裝升級即將終止..." exit ;; *) FUNC_UPDATE_KERNEL FUNC_UNINSTALL_KERNEL esac
效果如圖 - 開始執行:
結束執行: