APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

カーネル切替手順のメモ

はじめに

こんにちは。クラウド事業部の山田です。

1年の間に Ubuntu と Rocky Linux のカーネル切替を行う機会があったので手順をまとめてみます。
参考)
 Ubuntuにおけるカーネルの変更方法
 Kernel Update - Rocky Linux 8
 Ubuntu で Linux カーネルのバージョンを変更する

目次

概要

切替手順の概要

1) OS上のパッケージマネージャー ( 今回はaptとdnf ) の操作によりカーネルパッケージをインストールします。
 インストール方法には通常のパッケージと同様の下記パターンがあり、今回は a) c) のパターンを検証します。
 a) オンラインでインストールする。
 b) オフライン環境において、オンラインの別のLinuxサーバーでダウンロードしたパッケージファイルを利用する。
 c) オフライン環境において、オンラインのWindowsでダウンロードしたパッケージファイルを利用する。
2) 次回起動時に使用されるカーネルを切り替え、再起動することでカーネルが切り替わります。

検証方法

1) 少し古いマイナーバージョンのOSで仮想マシンを作成します。
 ディストリビューションによると思いますが、Rocky Linuxの最新バージョンではすでに最新のカーネルバージョンが使われており、かつ古いカーネルを選択できないものがあったためです。
2) 仮想マシンのチェックポイントを取って、上記 b) c) の操作をそれぞれ確認します。

切替手順

Ubuntu

全体の手順

仮想マシン作成

  • OSメディアの入手
     Ubuntuを入手する の最新版
      または
     Official CD Mirrors for Ubuntu のミラーサイトのいずれか
     ※ Yamagata University の場合:対象バージョンを選択して [Server install image] から server の iso ファイルを入手します。

  • 仮想マシン作成とOSインストール
    ※ 今回は ubuntu-24.04.1-live-server-amd64.iso を使用しました。
    手順省略

既存設定の確認

  • 現カーネルの確認
# uname -r
//---------------------------------------//
 6.8.0-71-generic 
//---------------------------------------//
  • インストール済みカーネルの確認
# ls /lib/modules
//---------------------------------------//
 6.8.0-71-generic
//---------------------------------------//

カーネルインストール

  • カーネルインストール
    次項 [オンラインのインストール手順] または [オフラインのインストール手順] によりカーネルをインストールします。

  • 追加されたカーネルの確認

# ls /lib/modules
//---------------------------------------//
 6.8.0-64-generic  6.8.0-71-generic
//---------------------------------------//

カーネル切り替え

  • カーネルのIDの確認
# grep -e menuentry -e submeny /boot/grub/grub.cfg
//---------------------------------------//
 if [ x"${feature_menuentry_id}" = xy ]; then
   menuentry_id_option="--id"
   menuentry_id_option=""
 export menuentry_id_option
 menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-21fee17f-814f-4416-b42d-4cb194359887' {
 submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-21fee17f-814f-4416-b42d-4cb194359887' {
         menuentry 'Ubuntu, with Linux 6.8.0-71-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.8.0-71-generic-advanced-21fee17f-814f-4416-b42d-4cb194359887' {
         menuentry 'Ubuntu, with Linux 6.8.0-71-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.8.0-71-generic-recovery-21fee17f-814f-4416-b42d-4cb194359887' {
         menuentry 'Ubuntu, with Linux 6.8.0-64-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.8.0-64-generic-advanced-21fee17f-814f-4416-b42d-4cb194359887' {
         menuentry 'Ubuntu, with Linux 6.8.0-64-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.8.0-64-generic-recovery-21fee17f-814f-4416-b42d-4cb194359887' {
                 menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' {
//---------------------------------------//

 または下記全文を1度に貼り付けて実行します。

# awk -F\' -v l=-1 -v ll=-1 \
    '/menuentry |submenu / {
    if ($1=="menuentry ") {l+=1; print l "\t" $2}
    else if ($1=="submenu ") {l+=1; ll=-1; print l "\t" $2}
    else {ll+=1; print "\t" l ">" ll "\t" $2}
    }' \
/boot/grub/grub.cfg
//---------------------------------------//
 0       Ubuntu
 1       Advanced options for Ubuntu
         1>0     Ubuntu, with Linux 6.8.0-71-generic
         1>1     Ubuntu, with Linux 6.8.0-71-generic (recovery mode)
         1>2     Ubuntu, with Linux 6.8.0-64-generic
         1>3     Ubuntu, with Linux 6.8.0-64-generic (recovery mode)
         1>4     UEFI Firmware Settings
//---------------------------------------//
  • 既定のカーネルの指定
# vi /etc/default/grub
//---------------------------------------//
 GRUB_DEFAULT="" ← ""内に 1>2 など対象のIDを記載して保存する。
 ↓
 GRUB_DEFAULT="1>2"
//---------------------------------------//
  • 再起動
# shutdown -r now
  • カーネルの再確認
# uname -r
//---------------------------------------//
 6.8.0-64-generic 
//---------------------------------------//
オンラインのインストール手順
  • インストール対象の確認
    インストール可能なパッケージを確認します。
    その中で linux-image-xx.xx.xx-xx-generic の最新のものをインストール対象とします。
    ※ 今回は 6.8.0-71 より新しいものがなかったため 6.8.0-64 を指定します。
# apt search linux-image
//---------------------------------------//
  ~略~
 linux-image-6.8.0-64-generic/noble-updates,noble-security 6.8.0-64.67 amd64
   Signed kernel image generic
  ~略~
 linux-image-6.8.0-71-generic/noble-updates,noble-security,now 6.8.0-71.71 amd64 [installed,automatic]
   Signed kernel image generic
  ~略~
//---------------------------------------//
  • インストール
    ※ linux-modules-xx.xx.xx-xx-generic も同時にインストールされることが分かります。
# apt install linux-image-6.8.0-64-generic
//---------------------------------------//
  ~略~
 Suggested packages:
   fdutils linux-tools linux-headers-6.8.0-64-generic linux-modules-extra-6.8.0-64-generic
  ~略~
//---------------------------------------//
オフラインのインストール手順
  • インストール対象の確認とダウンロード
    下記いずれかのサイトにて、オンラインで自動的に取得されるのと同じパッケージファイル ( .deb ) を取得します。
    ※ 今回は linux-image-6.8.0-64-generic と linux-modules-6.8.0-64-generic
    packages.ubuntu.com
     https //packages.ubuntu.com/<UbuntuのOSバージョンのコード名>/kernel/
     Ubuntu24の場合は https://packages.ubuntu.com/noble/kernel/
     にて、linux-image-xx.xx.xx-xx-generic と linux-modules-xx.xx.xx-xx-generic
      または
    archive.ubuntu.com
     の /ubuntu/pool/main/l/linux-signed/ から linux-image-xx.xx.xx-xx-generic
     の /ubuntu/pool/main/l/linux/ から linux-modules-xx.xx.xx-xx-generic

  • ディレクトリ準備
    対象サーバーにそのカーネルバージョン専用のディレクトリを作成します。

# mkdir 6.8.0-64
  • パッケージファイル配置
    作成したディレクトリに取得したパッケージファイルを全て配置します。
# ls 6.8.0-64
//---------------------------------------//
 linux-image-6.8.0-64-generic_6.8.0-64.67_amd64.deb
 linux-modules-6.8.0-64-generic_6.8.0-64.67_amd64.deb
//---------------------------------------//
  • インストール
# cd 6.8.0-64
# apt-get install ./*.deb

以降はオンラインのインストール手順と同じです。

Rocky Linux

全体の手順

仮想マシン作成

  • OSメディアの入手
     Rocky Linux
     [Default Images] - [DVD ISO] の各メジャーバージョン最新版
      または
     Index of /vault/rocky のアーカイブ
     /vault/rocky/<OSバージョン>/isos/x86_64/ の Rocky-<OSバージョン>-x86_64-dvd1.iso
    からisoファイルを入手します。

  • 仮想マシン作成とOSインストール
    ※ 今回は Rocky-8.8-x86_64-dvd1.iso を使用しました。
    手順省略

既存設定の確認

  • 現カーネルの確認
# uname -r
//---------------------------------------//
 4.18.0-477.10.1.el8_8.x86_64
//---------------------------------------//
  • インストール済みカーネルの確認
# ls /lib/modules
//---------------------------------------//
 4.18.0-477.10.1.el8_8.x86_64  4.18.0-477.el8.x86_64
//---------------------------------------//

カーネルインストール

  • カーネルインストール
    次項 [オンラインのインストール手順] または [オフラインのインストール手順] によりカーネルをインストールします。

  • 追加されたカーネルの確認

# ls /lib/modules
//---------------------------------------//
 4.18.0-477.10.1.el8_8.x86_64  4.18.0-477.el8.x86_64  4.18.0-553.63.1.el8_10.x86_64
//---------------------------------------//
  • 既定のカーネルの確認
    インストールしたカーネルが既定のカーネルに指定されていることを確認します。
# grubby --default-kernel
//---------------------------------------//
 /boot/vmlinuz-4.18.0-553.63.1.el8_10.x86_64
//---------------------------------------//
  • 既定のカーネルの変更
    既定のカーネルを手動で変更する場合、インストール済みカーネルのインデックス番号で指定します。
    ※ インストールしたカーネルに切り替えずに、従来のカーネルを既定のカーネルに戻す場合。
# grubby --info=ALL | grep -E "^kernel|^index"
//---------------------------------------//
 index=0
 kernel="/boot/vmlinuz-4.18.0-553.63.1.el8_10.x86_64"
 index=1
 kernel="/boot/vmlinuz-4.18.0-477.10.1.el8_8.x86_64"
 index=2
 kernel="/boot/vmlinuz-0-rescue-ef59161bb7674916a540ccc1e6bc0036"
//---------------------------------------//
# grubby --set-default-index=<インデックス番号>
# grubby --set-default-index=1
# grubby --default-kernel
//---------------------------------------//
 /boot/vmlinuz-4.18.0-477.10.1.el8_8.x86_64
//---------------------------------------//
  • 再起動
# shutdown -r now
  • カーネルの再確認
# uname -r
//---------------------------------------//
 4.18.0-553.63.1.el8_10.x86_64
//---------------------------------------//
オンラインのインストール手順
  • インストール対象の確認
    インストール可能なパッケージを確認します。
# dnf --showduplicates list kernel
//---------------------------------------//
  ~略~
 インストール済みパッケージ
 kernel.x86_64                                                        4.18.0-477.10.1.el8_8                                                          @anaconda
 利用可能なパッケージ
 kernel.x86_64                                                        4.18.0-553.el8_10                                                              baseos   
 kernel.x86_64                                                        4.18.0-553.5.1.el8_10                                                          baseos   
  ~略~
 kernel.x86_64                                                        4.18.0-553.62.1.el8_10                                                         baseos   
 kernel.x86_64                                                        4.18.0-553.63.1.el8_10                                                         baseos  
//---------------------------------------//
  • インストール
    ※ 今回は 4.18.0-553.63.1.el8_10 を指定します。
    ※ kernel-core と kernel-modules も同時にインストールされることが分かります。
# dnf install kernel-4.18.0-553.63.1.el8_10
//---------------------------------------//
 インストール:
  kernel                                 x86_64                         4.18.0-553.63.1.el8_10                           baseos                          10 M
 依存関係のインストール:
  kernel-core                            x86_64                         4.18.0-553.63.1.el8_10                           baseos                          44 M
  kernel-modules                         x86_64                         4.18.0-553.63.1.el8_10                           baseos                          36 M
//---------------------------------------//
オフラインのインストール手順
  • インストール対象の確認とダウンロード
    下記いずれかのサイトにて、オンラインで自動的に取得されるのと同じパッケージファイル ( .rpm ) を取得します。
    ※ 今回は kernel-4.18.0-553.63.1.el8_10.x86_64.rpm 、kernel-core-4.18.0-553.63.1.el8_10.x86_64.rpm 、kernel-modules-4.18.0-553.63.1.el8_10.x86_64.rpm
    /pub/rocky/8.10
    ※ 8.8向けのページは /vault/rocky/8.8 ですが、より新しいOSバージョンが出た以降のカーネルは新OSのページに表示されるようです。
      オンライン環境において、dnf --showduplicates list kernel コマンドでインストール可能とされた 4.18.0-553.63.1 が
      8.10 向けパッケージのページで入手できるのでそこからダウンロードします。

  • ディレクトリ準備
    対象サーバーにそのカーネルバージョン専用のディレクトリを作成します。

# mkdir 4.18.0-553.63.1.el8_10
  • パッケージファイル配置
    作成したディレクトリに取得したパッケージファイルを全て配置します。
# ls 6.8.0-64
//---------------------------------------//
 kernel-4.18.0-553.63.1.el8_10.x86_64.rpm
 kernel-core-4.18.0-553.63.1.el8_10.x86_64.rpm
 kernel-modules-4.18.0-553.63.1.el8_10.x86_64.rpm
//---------------------------------------//
  • インストール
# cd 6.8.0-64
# dnf install ./*.rpm --disablerepo='*'

以降はオンラインのインストール手順と同じです。