カーネルをアップデートする方法について

カーネルのアップデート方法についてですが、 kernel-*.el7.x86_64 全てを一気にアップデートするのではなく、まず一番最初に、最新安定版のカーネルをインストールします。

その後、新しいカーネルで問題なく起動できることを確認し、問題なかったら残りの kernel-headers-*.el7.x86_64kernel-devel-*.el7.x86_64 等を新しいものに切り替えることで、より安全に作業できると思います。

今回は、最新安定版のカーネルを提供する ELRepo リポジトリを使って、CentOS 7 のカーネルバージョン kernel-3.10.0-229 からこの記事を作成した時点で、一番最新安定版カーネルである kernel-ml-4.6.3-1 へアップデートする方法についてご紹介します。

主に、以下の作業を実施します。

  • 最新安定版カーネルのインストール
  • 最新安定版カーネルでシステム再起動
  • 旧カーネル関連パッケージの切り替え
  • 旧カーネル本体の削除
  • 最終確認

最新安定版カーネルのインストール、及び起動

Step 1. 現在のカーネルバージョン確認

まずは、現在のシステム上で動いているカーネルのバージョンとパッケージ一覧を確認します。

カーネルのバージョン 3.10.0-229 がインストールされていることが分かります。

現在のカーネルバージョン確認
# uname -a
Linux centos 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

# rpm -qa | grep "^kernel" | sort
kernel-3.10.0-229.11.1.el7.x86_64
kernel-3.10.0-229.el7.x86_64
kernel-devel-3.10.0-229.11.1.el7.x86_64
kernel-devel-3.10.0-229.el7.x86_64
kernel-headers-3.10.0-229.11.1.el7.x86_64
kernel-tools-3.10.0-229.11.1.el7.x86_64
kernel-tools-libs-3.10.0-229.11.1.el7.x86_64

Step 2. 最新安定版カーネルのインストール

ELRepo リポジトリを使って、最新安定板カーネルをインストールするには、以下のコマンドを実施します。

ELRepo を導入してない場合には、前回の記事を参考にし、インストールしてください。

最新安定板カーネルのインストール
# yum --enablerepo=elrepo-kernel -y install kernel-ml
読み込んだプラグイン:fastestmirror, langpacks
base                                            | 3.6 kB  00:00:00
elrepo                                          | 2.9 kB  00:00:00
elrepo-kernel                                   | 2.9 kB  00:00:00
extras                                          | 3.4 kB  00:00:00
updates                                         | 3.4 kB  00:00:00

・・・

Determining fastest mirrors
 * base: download.nus.edu.sg
 * elrepo: dfw.mirror.rackspace.com
 * elrepo-kernel: dfw.mirror.rackspace.com
 * extras: ftp.iij.ad.jp
 * updates: download.nus.edu.sg
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ kernel-ml.x86_64 0:4.6.3-1.el7.elrepo を インストール      | 418 kB  00:00:01
--> 依存性解決を終了しました。

依存性を解決しました

=======================================================================================
 Package             アーキテクチャー   バージョン              リポジトリー      容量
=======================================================================================
インストール中:
 kernel-ml           x86_64             4.6.3-1.el7.elrepo      elrepo-kernel     38 M

トランザクションの要約
=======================================================================================
インストール  1 パッケージ

総ダウンロード容量: 38 M
インストール容量: 173 M
Downloading packages:
kernel-ml-4.6.3-1.el7.elrepo.x86_64.rpm          |  38 MB  00:00:15
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
警告: RPMDB は yum 以外で変更されました。
  インストール中          : kernel-ml-4.6.3-1.el7.elrepo.x86_64     1/1
  検証中                  : kernel-ml-4.6.3-1.el7.elrepo.x86_64     1/1

インストール:
  kernel-ml.x86_64 0:4.6.3-1.el7.elrepo

完了しました!

Step 3. 新しいカーネルで再起動

カーネルのインストールが終わったら以下のコマンドで新しいカーネルがインストールされていることを確認します。

インストールされるカーネルのバージョンについて、詳細は後で説明しますが、この例では、この記事を書いた時点での最新安定版カーネル kernel-ml-4.6.3-1.el7.elrepo.x86_64 がインストールされました。

新しいカーネルインストール確認
# rpm -qa | grep "^kernel" | sort
kernel-3.10.0-229.11.1.el7.x86_64
kernel-3.10.0-229.el7.x86_64
kernel-devel-3.10.0-229.11.1.el7.x86_64
kernel-devel-3.10.0-229.el7.x86_64
kernel-headers-3.10.0-229.11.1.el7.x86_64
kernel-ml-4.6.3-1.el7.elrepo.x86_64
kernel-tools-3.10.0-229.11.1.el7.x86_64
kernel-tools-libs-3.10.0-229.11.1.el7.x86_64

後は、新しいカーネルで問題なく起動できることを確認するために、再起動を実施します。

画像があった方が分かりやすいので、ここからは画像で。。

現在、動いているカーネルは、バージョン 3.10.0-229 です。 # shutdown -r now で再起動を実施します。

OS 再起動

# shutdown -r now

そうすると、カーネルのバージョンを選択する画面が表示されるので、新しいカーネル 4.6.3-1 を選択し、Enter を押します。

OS 再起動

新しいカーネルで起動

起動が完了するまで、しばらく待ちます。 (この画面はバージョンによって違うかもしれません)

OS 再起動

しばらく待機

起動完了後には、以下のようにログインプロンプトが表示されます。

新しいカーネル 4.6.3-1 で問題なく起動できました。

OS 再起動

新しい Kernel 4.6.3-1 で起動完了

# uname -a を実行してみるとカーネルのバージョンが上がっていることが分かります。

新しいカーネルのバージョン確認
# uname -a
Linux centos 4.6.3-1.el7.elrepo.x86_64 #1 SMP Sat Jun 25 11:28:39 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux

これで新しいカーネルのインストールが完了しました。

旧カーネルと関連パッケージの切り替え

最新版カーネルのインストールは終わったものの、以下のように、昔のカーネル kernel-*3.10.0-229* がそのまま残っている状態なので、不要なものは削除し、切り替えが必要なものに関しては、新しいバージョンへの切り替えを実施します。

旧カーネル リスト確認
# rpm -qa | grep "^kernel" | sort
kernel-3.10.0-229.11.1.el7.x86_64
kernel-3.10.0-229.el7.x86_64
kernel-devel-3.10.0-229.11.1.el7.x86_64
kernel-devel-3.10.0-229.el7.x86_64
kernel-headers-3.10.0-229.11.1.el7.x86_64
kernel-ml-4.6.3-1.el7.elrepo.x86_64
kernel-tools-3.10.0-229.11.1.el7.x86_64
kernel-tools-libs-3.10.0-229.11.1.el7.x86_64

Step 1. 旧カーネル関連パッケージの切り替え

まずは、kernel-3.10.0-229 を除いて、以下のカーネル関連パッケージを新しいものに切り替えます。

  • kernel-headers-3.10.0-*
  • kernel-tools-libs-3.10.0-*
  • kernel-tools-3.10.0-*
  • kernel-devel-3.10.0-*

特に、kernel-headers-* は、依存関係上、あちこちで使われているため、削除してしまうとまずいことになりますが、ありがたいことに、yum swap を使うことによって、kernel-* から kernel-ml-* へ安全に切り替えることができます。

ちなみに、旧カーネルの本体である kernel-3.10.0-* は、一番最後に削除します。 最初に削除しても構いませんが、なんとなく、最後まで残しといた方が良いと思っただけなので、そうします。

kernel-headers 切り替え

まずは、kernel-headers-3.10.0-* の切り替えから。

kernel-headers 切り替え
# yum --enablerepo=elrepo-kernel -y swap \
kernel-headers -- \
kernel-ml-headers

・・・

Running transaction
  インストール中 : kernel-ml-headers-4.6.3-1.el7.elrepo.x86_64    1/2
  削除中         : kernel-headers-3.10.0-229.11.1.el7.x86_64      2/2
  検証中         : kernel-ml-headers-4.6.3-1.el7.elrepo.x86_64    1/2
  検証中         : kernel-headers-3.10.0-229.11.1.el7.x86_64      2/2

・・・

kernel-tools-libs 切り替え

次に、kernel-tools-libs-3.10.0-* を切り替えます。

kernel-tools-libs の切り替えについて

kernel-tools を切り替えようとすると以下のように衝突が発生します。

エラー: kernel-ml-tools conflicts with kernel-tools-3.10.0-327.22.2.el7.x86_64

問題を回避するために --skip-broken を用いることができます。

これらを試行できます: rpm -Va --nofiles --nodigest

そのため、先に kernel-tools-libs の切り替えを実施します。

また、kernel-tools-libs を切り替えると kernel-tools は自動的に削除されるため、切り替えが終わったら kernel-ml-tools を個別に新規インストールする必要があります。

kernel-tools-libs 切り替え
# yum --enablerepo=elrepo-kernel -y swap \
kernel-tools-libs -- \
kernel-ml-tools-libs

・・・

Running transaction
  インストール中 : kernel-ml-tools-libs-4.6.3-1.el7.elrepo.x86_64    1/3
  削除中         : kernel-tools-3.10.0-327.22.2.el7.x86_64           2/3
  削除中         : kernel-tools-libs-3.10.0-327.22.2.el7.x86_64      3/3
  検証中         : kernel-ml-tools-libs-4.6.3-1.el7.elrepo.x86_64    1/3
  検証中         : kernel-tools-3.10.0-327.22.2.el7.x86_64           2/3
  検証中         : kernel-tools-libs-3.10.0-327.22.2.el7.x86_64      3/3

・・・

kernel-ml-tools 新規インストール

次に、kernel-tools-3.10.0-* が削除されていることを確認し、 kernel-ml-tools を新規インストールします。

kernel-ml-tools 新規インストール
# rpm -qa | grep "^kernel" | sort
kernel-3.10.0-229.11.1.el7.x86_64
kernel-3.10.0-229.el7.x86_64
kernel-devel-3.10.0-229.11.1.el7.x86_64
kernel-devel-3.10.0-229.el7.x86_64
kernel-ml-4.6.3-1.el7.elrepo.x86_64
kernel-ml-headers-4.6.3-1.el7.elrepo.x86_64
kernel-ml-tools-libs-4.6.3-1.el7.elrepo.x86_64

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

・・・

Running transaction
  インストール中 : kernel-ml-tools-4.6.3-1.el7.elrepo.x86_64    1/1
  検証中         : kernel-ml-tools-4.6.3-1.el7.elrepo.x86_64    1/1

・・・

kernel-devel 切り替え

次に、kernel-devel-3.10.0-* を切り替えます。

kernel-devel 切り替え
# yum --enablerepo=elrepo-kernel -y swap \
kernel-devel -- \
kernel-ml-devel

・・・

Running transaction
  インストール中 : kernel-ml-devel-4.6.3-1.el7.elrepo.x86_64    1/3
  削除中         : kernel-devel.x86_64                          2/3
  削除中         : kernel-devel.x86_64                          3/3
  検証中         : kernel-ml-devel-4.6.3-1.el7.elrepo.x86_64    1/3
  検証中         : kernel-devel-3.10.0-229.el7.x86_64           2/3
  検証中         : kernel-devel-3.10.0-229.11.1.el7.x86_64      3/3

・・・

Step 2. 旧カーネルの本体削除

最後に、既存のカーネル本体は残してもしょうがないので、削除します。

カーネル関連パッケージ一覧確認
# rpm -qa | grep "^kernel" | sort
kernel-3.10.0-229.11.1.el7.x86_64
kernel-3.10.0-229.el7.x86_64
kernel-ml-4.6.3-1.el7.elrepo.x86_64
kernel-ml-devel-4.6.3-1.el7.elrepo.x86_64
kernel-ml-headers-4.6.3-1.el7.elrepo.x86_64
kernel-ml-tools-4.6.3-1.el7.elrepo.x86_64
kernel-ml-tools-libs-4.6.3-1.el7.elrepo.x86_64

# ls -l /lib/modules/
合計 12
drwxr-xr-x. 7 root root 4096  9月 16  2015 3.10.0-229.11.1.el7.x86_64
drwxr-xr-x. 7 root root 4096  9月 14  2015 3.10.0-229.el7.x86_64
drwxr-xr-x  7 root root 4096  7月  5 13:58 4.6.3-1.el7.elrepo.x86_64
旧カーネル本体削除
# yum -y remove kernel

・・

Running transaction
  削除中 : kernel.x86_64                        1/2
警告: ファイル /lib/modules/3.10.0-229.el7.x86_64/weak-updates: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /lib/modules/3.10.0-229.el7.x86_64/modules.softdep: 削除に失敗しました: そのようなファイルやディレクトリはありませ ん
警告: ファイル /lib/modules/3.10.0-229.el7.x86_64/modules.devname: 削除に失敗しました: そのようなファイルやディレクトリはありませ ん
  削除中 : kernel.x86_64                        2/2
警告: ファイル /lib/modules/3.10.0-229.11.1.el7.x86_64/weak-updates: 削除に失敗しました: そのようなファイルやディレクトリはありま せん
警告: ファイル /lib/modules/3.10.0-229.11.1.el7.x86_64/modules.softdep: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /lib/modules/3.10.0-229.11.1.el7.x86_64/modules.devname: 削除に失敗しました: そのようなファイルやディレクトリはありません
  検証中 : kernel-3.10.0-229.11.1.el7.x86_64    1/2
  検証中 : kernel-3.10.0-229.el7.x86_64         2/2

削除しました:
  kernel.x86_64 0:3.10.0-229.el7
  kernel.x86_64 0:3.10.0-229.11.1.el7

完了しました!

旧カーネル削除時に表示される警告メッセージについて

削除時に、カーネルのモジュールが格納されている /lib/modules/ ディレクトリ内のいくつかのモジュールが見つからないという警告が表示されますが、どうせ、yum remove で旧カーネル本体を削除すれば、/lib/modules/3.10.* ディレクトリは丸ごと削除されるので無視しても良いです。

旧カーネルの本体が削除が完了した後は、/lib/modules/ を確認し、新しいカーネルのみ存在することを確認します。

カーネルのモジュールディレクトリ確認
# ls -l /lib/modules/
合計 4
drwxr-xr-x 7 root root 4096  7月  5 13:58 4.6.3-1.el7.elrepo.x86_64

# rpm -qa | grep "^kernel" | sort
kernel-ml-4.6.3-1.el7.elrepo.x86_64
kernel-ml-devel-4.6.3-1.el7.elrepo.x86_64
kernel-ml-headers-4.6.3-1.el7.elrepo.x86_64
kernel-ml-tools-4.6.3-1.el7.elrepo.x86_64
kernel-ml-tools-libs-4.6.3-1.el7.elrepo.x86_64

だいぶスッキリしましたね。

最終確認

最終確認ですが、念のためもう一回再起動を実施し、問題なく起動できることを確認します。

# shutdown -r now コマンドで再起動を実施します。

centos7 カーネルアップデート後の再起動

# shutdown -r now

そうすると、もう旧カーネルは完全に削除されたため、新しいカーネルしか残ってないことが分かります。

centos7 カーネルアップデート後のブート画面

無事にログイン画面も表示されました。

centos7 カーネルアップデート完了

以上、CentOS 7 : 最新安定版カーネルインストール、及び切り替え でした。