CentOSでデフォルトのkernelを固定したい。確認と設定方法は?

IT小技

CentOSでデフォルトのkernelを固定したい。確認と設定方法は?

RHEL/CentOSをサーバーで利用していると度々アップデートが走り、明示的にkernelのアップデートを除外しない場合には、徐々にkernelのバージョンも更新されていきます。

上記は普段使いしているCentOS7.9ですが、長期利用していると起動時にkernelが複数回アップデートされたことが分かります。

もちろん、起動時に表示されるkernelリストから利用したいkernelを選択することも出来ますが、サーバー用途でLinuxを利用する場合、サーバー上で利用するアプリケーションによってはkernelの指定が必要になる場合があります。

今回は、こういった不意にバージョンアップされてしまったり、利用したいkernelバージョンに固定する方法をご紹介します。

この方法を利用することで、

  • アプリケーションをインストールできない
  • アプリケーションが動作しない
  • 動作保証されいない(アプリケーションベンダーのサポート外)

といった事象から回避できます。

インストールされているkernelのバージョンと起動するkernelの設定

非セキュアブート環境とセキュアブート環境でのkernelの固定手順は同じものの、確認のためのメニュー情報のファイルが異なります。

設定ファイル
非セキュアブート環境/etc/grub2.cfg
セキュアブート環境/boot/efi/EFI/centos/grub.cfg

そこで、まずは本手順を実施する前にセキュアブート環境であるかどうかを『mokutil』コマンドが利用可能か否かで確認しましょう。

セキュアブートが有効の場合は『mokutil』コマンドが利用可能です。

【セキュアブートが有効な場合】

# mokutil
Usage:
  mokutil OPTIONS [ARGS...]

Options:
  --help                                Show help
  --list-enrolled                       List the enrolled keys
  --list-new                            List the keys to be enrolled
  --list-delete                         List the keys to be deleted

【セキュアブートが無効な場合】

# mokutil
EFI variables are not supported on this system

非セキュアブート(secure boot)環境での設定

先ずは現在のkernelのバージョンと設定を確認します。

$ uname -r
3.10.0-1160.53.1.el7.x86_64
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

RHEL/CentOSは、起動時にハードティスク等からOSを起動するためにブートローダというプログラムを利用しており、現在のLinuxではGRUB(or GRUB2)が標準的に利用されています。

デフォルトで読み込まれるGRUBの設定を確認するには、管理者権限で『grub2-editenv list』で確認することかできます。

# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-1160.53.1.el7.x86_64) 7 (Core)

前述の通り、『uname -r』コマンドの結果から、起動しているkernelは『3.10.0-1160.53.1.el7.x86_64』であることは分かっていますので、結果が同じであることが分かります。

起動メニューは『/etc/grub2.cfg』にありますが、設定ファイルが長く読みにくいため、awkコマンドを利用して起動時と同じ出力形式で表示させます。

# awk -F\' '$1=="menuentry " {print i++ " " $2}' /etc/grub2.cfg
0 CentOS Linux (3.10.0-1160.53.1.el7.x86_64) 7 (Core)
1 CentOS Linux (3.10.0-1160.49.1.el7.x86_64) 7 (Core)
2 CentOS Linux (3.10.0-1160.45.1.el7.x86_64) 7 (Core)
3 CentOS Linux (3.10.0-1160.42.2.el7.x86_64) 7 (Core)
4 CentOS Linux (3.10.0-1160.36.2.el7.x86_64) 7 (Core)
5 CentOS Linux (0-rescue-f2ac527c93d94aafb0ccf428c66c70bc) 7 (Core)

最後にインストールされたkernelは『0』に該当します。

試しに『1』つまり、『3.10.0-1160.49.1.el7.x86_64』をセットします。

# grub2-set-default 1

正しく設定されたかどうかを再度『grub2-editenv list』コマンドで確認します。

# grub2-editenv list
saved_entry=1

確認後、リブートせて設定を反映します。

# reboot

OSが起動後にkernelのバージョンを確認すると、期待通り『3.10.0-1160.49.1.el7.x86_64』で起動していることが確認できます。

# uname -r
3.10.0-1160.49.1.el7.x86_64

以上で、kernelを固定しての起動は完了です。

セキュアブート (secure boot)環境での設定

セキュアブート (secure boot)とは、コンピュータ起動時の安全性の確保のためにデジタル署名で起動するソフトウェアを検証し、悪意のあるソフトウェアが読み込まれないように設計された重要なセキュリティ機能で、UEFI(BIOS)の機能として提供されます。

Windows11ではセキュアブートが必須要件とされているだけでなくGCP(Google Compute Engine)においてもデフォルトで有効になっています。

セキュアブート環境の場合には、前述の通りmokutilコマンドで確認ができますが、セキュアブート を有効にするにはBOIS側での設定を変更後に、仮想マシンオプションでファームウェアの設定を変更します。

セキュアブートを有効後にyum upgradeを行い、kernelを追加します。

前述の通り、セキュアブート環境でメニュー情報が含まれる設定ファイルが異なります。

設定ファイル
非セキュアブート環境/etc/grub2.cfg
セキュアブート環境/boot/efi/EFI/centos/grub.cfg

対象ファイルを変更してawkコマンドを実行します。

# awk -F\' '$1=="menuentry " {print i++ " " $2}' /boot/efi/EFI/
centos/grub.cfg
0 CentOS Linux (3.10.0-1160.59.1.el7.x86_64) 7 (Core)
1 CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
2 CentOS Linux (0-rescue-90e7f5c163694660bf8d53c4085ced0c) 7 (Core)

今回はセキュアブート環境を設定しているOSがCentOSのためパス名がcentosですが、RHELを利用の場合には、『/boot/efi/EFI/redhat/grub.cfg』になります。

第26章 GRUB 2 での作業 | Red Hat Product Documentation
第26章 GRUB 2 での作業 | Red Hat Documentation

インストールされているkernel情報が分かれば、設定は非セキュアブート環境と同じです。

現在設定されているkernelを『grub2-editenv list』コマンド

# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-1160.59.1.el7.x86_64) 7 (Core)

試しに『1』つまり、『CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)』をセットします。

# grub2-set-default 1

正しく設定されたかどうかを再度『grub2-editenv list』コマンドで確認します。

# grub2-editenv list
saved_entry=1

リブートして設定を反映します。

# reboot

リブート後、期待通りのkernelで起動してるかを確認します。

# uname -a
Linux centos79 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

想定通り起動していることが確認できました。

CentOS 8 でkernelを固定する場合には?

CentOSは2021年12月末で、RHELのクローンOSではなくなりましたが、それでもまだしばらくの間はCentOS8を利用したいと思う人もいるかもしれません。

そこで、CentOS 8でのKernelの固定方法も合わせてご紹介したいと思います。

CentOS 8 ではgrubbyコマンドによってブートローダーの設定が可能です。

40.2. grubby とは | Red Hat Product Documentation
40.2. grubby とは | Red Hat Documentation
# grubby --default-kernel
/boot/vmlinuz-4.18.0-348.7.1.el8_5.x86_64
# uname -r
4.18.0-348.7.1.el8_5.x86_64

『grubby –default-index』は『grub2-editenv list』コマンドと同様のコマンドで、設定されているインデックス番号ですが現在の設定が確認できます。

# grubby --default-index
0

インストールされているkernelは『grubby –info=ALL | grep -A 2 index』コマンドで確認できます。

# grubby --info=ALL | grep -A 2 index
index=0
kernel="/boot/vmlinuz-4.18.0-348.7.1.el8_5.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet $tuned_params"
--
index=1
kernel="/boot/vmlinuz-4.18.0-305.3.1.el8.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet $tuned_params"
--
index=2
kernel="/boot/vmlinuz-0-rescue-902eab58be33429b9956720e82ff74d5"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"

設定は『grubby –set-default』コマンドで、カーネル名かインデックス番号で設定します。

# grubby --set-default=/boot/vmlinuz-4.18.0-305.3.1.el8.x86_64

試しに『1』つまり、『4.18.0-305.3.1.el8.x86_64』をセットします。

# grubby --set-default-index=1
The default is /boot/loader/entries/902eab58be33429b9956720e82ff74d5-4.18.0-305.3.1.el8.x86_64.conf with index 1 and kernel /boot/vmlinuz-4.18.0-305.3.1.el8.x86_64

設定の反映を『grubby –default-index』コマンドで確認します。

# grubby --default-index
1

確認後リブートし設定を反映させます。

OSが起動すると、カーネルが『4.18.0-305.3.1.el8.x86_64』で起動されます。

# uname -r
4.18.0-305.3.1.el8.x86_64

以上で完了です。

まとめ

今回はCentOSで重要なkernelの固定方法について寄稿しました。

CentOS 7 とCentOS 8 で設定方法が異なりますが、今回の手順でどちらのOSでも対応可能です。

是非お試しください。

タイトルとURLをコピーしました