Linux更新內核

1. 關於 Linux 內核

Linux 內核分兩種:官方內核(通常是內核開發人員用)和各大 Linux 發行版內核(一般用戶常用)。

1.1 官方內核

在使用 Docker 時,發現其對 Linux 內核版本的最低要求是 3.10(這也剛好是 CentOS 7.2 的內核版本),但是在這個版本上有部分功能無法實現。目前 Linux 內核已經發布到 4.X(可以隨時在 Linux 內核官網 查看當前版本),爲了使用最新版本的內核,只好在安裝 CentOS 7 後對內核進行升級。

當然,內核也不能選最新的,防止有尚未發現的 BUG。而且爲了減少以後停止維護帶來的麻煩,最好安裝長期支持版本。各個版本的支持時間在 這個頁面 查看。每個版本可能有四種類型,概述如下:

  • Prepatch:Prepatch 或 “RC” 內核是主要的內核預發行版本,主要針對內核開發人員和 Linux 愛好者。必須從源代碼進行編譯,並且通常包含必須在可以放入穩定版本之前進行測試的新功能。Prepatch 內核由 Linus Torvalds 維護和發佈。
  • Mainline:Mainline 主線樹由 Linus Torvalds 維護。這個版本的內核會引入所有新功能。新的 Mainline 內核每 2-3 個月發佈一次。
  • Stable:每個主線內核被髮布後,即被認爲是“stable”。任何對 stable 內核的 BUG 修復都會從 Mainline 主線樹中回溯並由指定的 stable 內核維護人員使用。 在下一個主線內核可用之前,通常只有幾個 BUG 修復內核版本 - 除非它被指定爲“longterm maintenance kernel(長期維護內核)”。stable 內核更新按需發佈,通常每月 2-3 次。
  • Longterm:通常會提供幾個“longterm maintenance”內核版本,用於修復舊版內核的 BUG。這些內核只會修復重大 BUG,並且不會頻繁發佈版本。

Longterm release 的內核:

版本 維護人 發佈日期 項目生命週期
4.14 Greg Kroah-Hartman 2017-11-12 Jan, 2020
4.9 Greg Kroah-Hartman 2016-12-11 Jan, 2019
4.4 Greg Kroah-Hartman 2016-01-10 Feb, 2022
4.1 Sasha Levin 2015-06-21 May, 2018
3.16 Ben Hutchings 2014-08-03 Apr, 2020
3.2 Ben Hutchings 2012-01-04 May, 2018

1.2 各大 Linux 發行版內核

一般來說,只有從 kernel.org 下載並編譯安裝的內核纔是官方內核。
大多數 Linux 發行版提供自行維護的內核,可以通過 yum 或 rpm 等包管理系統升級。這些內核可能不再和 Linux 內核官方開發維護人員有關係了。通過這個由各大 Linux 發行版支持的倉庫升級內核,通常來說更簡單可靠,但是可選擇的內核版本也更少。

使用 uname -r 區分你用的是官方內核還是 Linux 發行版內核,橫線後面有任何東西都表示這不是官方內核:

# uname -r
3.10.0-514.26.2.el7.x86_64

2. 查看當前的內核版本

2.1 概述

Linux 只表示內核。各大 Linux 發行版(RedHat、Ubuntu、CentOS 等)在內核基礎上集成了其他的一系列軟件,按照各自的版本規則發佈。例如 CentOS 7.2 中,通過 uname -r 查看內核版本時,會看到 3.10.0-514.26.2.el7.x86_64,表示對應的 Linux 內核版本是 3.10。

2.2 常用的查看內核信息的命令

2.2.1 uname

打印指定的系統信息。不帶參數時,默認使用 -s 參數。
參數:
-a, –all:按照下面的順序打印所有信息,如果 -p 和 -i 未知時排除掉。
-s, –kernel-name:打印內核名字,一般就是 Linux。
-n, –nodename:打印網絡節點的主機名。
-r, –kernel-release:打印內核發行版的版本。常用。3.10.0-514.26.2.el7.x86_64
-v, –kernel-version:打印內核的版本。#1 SMP Tue Jul 4 15:04:05 UTC 2017
-m, –machine:打印機器硬件名。
-p, –processor:打印處理器名字或“unknown”。
-i, –hardware-platform:打印硬件平臺或“unknown”。
-o, –operating-system:打印操作系統。
–help:顯示這個幫助並退出。
–version:顯示這版本信息並退出。

示例:

# uname -r
3.10.0-514.26.2.el7.x86_64
# uname -a
Linux VM_139_74_centos 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 

2.2.2 /proc 虛擬文件系統

內核空間和用戶空間通過 /proc 虛擬文件系統可以通信。
/proc 目錄中包含一些目錄和虛擬文件,這些虛擬文件可以向用戶呈現內核信息或者從用戶空間向內核發送信息。
常用文件:

  • cpuinfo:標識了處理器的類型和速度
  • pci:顯示在 PCI 總線上找到的設備
  • modules:當前加載到內核中的模塊
  • version:系統版本及內核版本

示例:

# cat /proc/version 
Linux version 3.10.0-514.26.2.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Tue Jul 4 15:04:05 UTC 2017

3. 備份數據

4. 升級內核

記得首先更新倉庫:

yum -y update
  • 1

-y 選項可以在每次需要確認時,自動使用 yes,節省時間。

4.1 啓用 ELRepo 倉庫

ELRepo 倉庫是基於社區的用於企業級 Linux 倉庫,提供對 RedHat Enterprise (RHEL) 和 其他基於 RHEL的 Linux 發行版(CentOS、Scientific、Fedora 等)的支持。
ELRepo 聚焦於和硬件相關的軟件包,包括文件系統驅動、顯卡驅動、網絡驅動、聲卡驅動和攝像頭驅動等。

啓用 ELRepo 倉庫:

# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

4.2 查看可用的系統內核包:

可以看到,只有 4.4 和 4.15 兩個版本可以使用:

# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
Loaded plugins: fastestmirror, langpacks
elrepo-kernel                                                   | 2.9 kB  00:00:00     
elrepo-kernel/primary_db                                        | 1.7 MB  00:00:02     
Determining fastest mirrors
* elrepo-kernel: elrepo.org
Available Packages
kernel-lt.x86_64                           4.4.118-1.el7.elrepo            elrepo-kernel
kernel-lt-devel.x86_64                     4.4.118-1.el7.elrepo            elrepo-kernel
kernel-lt-doc.noarch                       4.4.118-1.el7.elrepo            elrepo-kernel
kernel-lt-headers.x86_64                   4.4.118-1.el7.elrepo            elrepo-kernel
kernel-lt-tools.x86_64                     4.4.118-1.el7.elrepo            elrepo-kernel
kernel-lt-tools-libs.x86_64                4.4.118-1.el7.elrepo            elrepo-kernel
kernel-lt-tools-libs-devel.x86_64          4.4.118-1.el7.elrepo            elrepo-kernel
kernel-ml.x86_64                           4.15.6-1.el7.elrepo             elrepo-kernel
kernel-ml-devel.x86_64                     4.15.6-1.el7.elrepo             elrepo-kernel
kernel-ml-doc.noarch                       4.15.6-1.el7.elrepo             elrepo-kernel
kernel-ml-headers.x86_64                   4.15.6-1.el7.elrepo             elrepo-kernel
kernel-ml-tools.x86_64                     4.15.6-1.el7.elrepo             elrepo-kernel
kernel-ml-tools-libs.x86_64                4.15.6-1.el7.elrepo             elrepo-kernel
kernel-ml-tools-libs-devel.x86_64          4.15.6-1.el7.elrepo             elrepo-kernel
perf.x86_64                                4.15.6-1.el7.elrepo             elrepo-kernel
python-perf.x86_64                   

4.3 安裝最新內核:

# yum --enablerepo=elrepo-kernel install kernel-ml

--enablerepo 選項開啓 CentOS 系統上的指定倉庫。默認開啓的是 elrepo,這裏用 elrepo-kernel 替換。

5. 設置 grub2

內核安裝好後,需要設置爲默認啓動選項並重啓後纔會生效

5.1 查看系統上的所有可以內核:

# sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (4.15.6-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-514.26.2.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-f9d400c5e1e8c3a8209e990d887d4ac1) 7 (Core)

5.2 設置 grub2

我的機器上存在 4 個內核(騰訊雲的機器,不知道後面兩個幹嘛的),我們要使用 4.15 這個版本,可以通過 grub2-set-default 0 命令或編輯 /etc/default/grub 文件來設置。

1. 通過 grub2-set-default 0 命令設置:

其中 0 來自上一步的 awk 命令:

sudo grub2-set-default 0

2. 編輯 /etc/default/grub 文件

設置 GRUB_DEFAULT=0,表示使用上一步的 awk 命令顯示的編號爲 0 的內核作爲默認內核:

# vi /etc/default/grub

> GRUB_TIMEOUT=5
> GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
> GRUB_DEFAULT=0
> GRUB_DISABLE_SUBMENU=true
> GRUB_TERMINAL_OUTPUT="console"
> GRUB_CMDLINE_LINUX="crashkernel=auto console=ttyS0 console=tty0 panic=5"
> GRUB_DISABLE_RECOVERY="true"
> GRUB_TERMINAL="serial console"
> GRUB_TERMINAL_OUTPUT="serial console"
> GRUB_SERIAL_COMMAND="serial --speed=9600 --unit=0 --word=8 --parity=no --stop=1"

    5.3 生成 grub 配置文件並重啓

    下一步,通過 gurb2-mkconfig 命令創建 grub2 的配置文件,然後重啓:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
  • 1
  • 2

5.4 驗證

通過 uname -r 查看,可以發現已經生效了。

# uname -r
4.15.6-1.el7.elrepo.x86_64

6. 刪除舊內核(可選)

內核有兩種刪除方式:通過 yum remove 命令或通過 yum-utils 工具。

6.1 通過 yum remove 命令

查看系統中全部的內核:

# rpm -qa | grep kernel
kernel-tools-libs-3.10.0-514.26.2.el7.x86_64
kernel-ml-4.15.6-1.el7.elrepo.x86_64
kernel-3.10.0-327.el7.x86_64
kernel-tools-3.10.0-514.26.2.el7.x86_64
kernel-headers-3.10.0-514.26.2.el7.x86_64
kernel-3.10.0-514.26.2.el7.x86_64

刪除舊內核的 RPM 包

yum remove kernel-tools-libs-3.10.0-514.26.2.el7.x86_64 kernel-3.10.0-327.el7.x86_64 kernel-tools-3.10.0-514.26.2.el7.x86_64 kernel-headers-3.10.0-514.26.2.el7.x86_64 kernel-3.10.0-514.26.2.el7.x86_64
  • 1

刪除舊內核

6.2 通過 yum-utils 工具

如果安裝的內核不多於 3 個,yum-utils 工具不會刪除任何一個。只有在安裝的內核大於 3 個時,纔會自動刪除舊內核。

6.2.1 安裝

yum install yum-utils

6.2.2 刪除

package-cleanup --oldkernels
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章