天天看點

CENTOS 7 更新核心版本(附帶更新腳本)

寫在前面的話

對于系統而言,除非是那種安全性要求非常高的公司或者經常會有第三方安全機構對其漏洞掃描的才容易涉及到系統的核心更新,比如之前呆過一個公司,因為需要做三級等保的原因,就會涉及到系統掃描,這時候就會牽扯到核心更新,當然,這一次寫這篇文章的場景不是這個,而是最近又再度學習 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      

結果如下:

CENTOS 7 更新核心版本(附帶更新腳本)

我們選擇更新為 4.4 即可。注意 4.4 是 kernel-lt

yum --enablerepo=elrepo-kernel install kernel-lt      

3. 此時可以檢視系統已經安裝的核心版本:

awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg      

結果如圖:

CENTOS 7 更新核心版本(附帶更新腳本)

可以看到新安裝的 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      
CENTOS 7 更新核心版本(附帶更新腳本)

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      
CENTOS 7 更新核心版本(附帶更新腳本)

隻剩下兩個!到此真正算是更新完成!

更新腳本

内容如下:

#!/bin/bash

#############################################################################################
# 用途:CentOS7.5 核心版本更新
# 作者:Dy1an<[email protected]>
# 時間: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      

效果如圖 - 開始執行:

CENTOS 7 更新核心版本(附帶更新腳本)

結束執行:

CENTOS 7 更新核心版本(附帶更新腳本)

繼續閱讀