「インストール - カーネルのアッブグレード(SUSE)」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

編集の要約なし
 
(同じ利用者による、間の10版が非表示)
4行目: 4行目:
<br>
<br>
ここでは、SUSEにおいて、カーネルをアップグレードする方法を記載する。<br>
ここでは、SUSEにおいて、カーネルをアップグレードする方法を記載する。<br>
<br><br>
== 依存関係のライブラリのインストール ==
Linuxカーネルのビルドに必要な依存関係のライブラリをインストールする。<br>
sudo zypper install patterns-base-basesystem patterns-devel-base-devel_basis patterns-devel-C-C++-devel_C_C++ gcc gcc-g++ ncurses-devel
<br><br>
<br><br>


55行目: 50行目:


== ソースコードからインストール ==
== ソースコードからインストール ==
==== 依存関係のライブラリのインストール ====
Linuxカーネルのビルドに必要な依存関係のライブラリをインストールする。<br>
sudo zypper install bc bison flex patterns-base-basesystem patterns-devel-base-devel_basis patterns-devel-C-C++-devel_C_C++ \
                    gcc ncurses-devel ncurses5-devel libopenssl-1_1-devel libelf-devel dwarves
<br>
==== Linuxカーネルのソースコードのダウンロード ====
==== Linuxカーネルのソースコードのダウンロード ====
[https://www.kernel.org/ The Linux Kernel Archives]または以下に示すURLからLinuxカーネルのTarballをダウンロードする。<br>
[https://www.kernel.org/ The Linux Kernel Archives]または以下に示すURLからLinuxカーネルのTarballをダウンロードする。<br>
88行目: 88行目:
<code>make olderconfig</code>コマンドは、可能な限り既存のカーネルコンフィグの設定を使用して、ビルドディレクトリ内に必要なファイルを生成する。<br>
<code>make olderconfig</code>コマンドは、可能な限り既存のカーネルコンフィグの設定を使用して、ビルドディレクトリ内に必要なファイルを生成する。<br>
  make -j $(nproc) olddefconfig O=./build
  make -j $(nproc) olddefconfig O=./build
<br>
以下に示すような警告が出力される場合がある。<br>
不要ならば、.configファイルから該当する設定をコメントアウトする。<br>
.config:9850:warning: symbol value 'm' invalid for CRYPTO_BLAKE2S_X86
.config:9941:warning: symbol value 'm' invalid for CRYPTO_ARCH_HAVE_LIB_BLAKE2S
.config:9942:warning: symbol value 'm' invalid for CRYPTO_LIB_BLAKE2S_GENERIC
<br>
<br>
ビルドディレクトリに移動する。<br>
ビルドディレクトリに移動する。<br>
103行目: 109行目:
   
   
  sudo make -j $(nproc) modules_install  # カーネルモジュールのインストール
  sudo make -j $(nproc) modules_install  # カーネルモジュールのインストール
  sudo make -j $(nproc) install          # Linuxカーネルのインストール(GRUBのエントリも生成する)
  sudo make -j $(nproc) install          # Linuxカーネルのインストール(GRUB2のエントリも生成する)
<br>
初期化スクリプトを生成する。<br>
sudo mkinitrd
<br>
==== GRUB2ブートメニューの設定 ====
GRUB2を使用している場合、かつ、GRUB2スクリプトが新しいカーネルを自動検出できない場合、手動で/etc/grub.d/40_customファイルに関連情報を追加することができる。<br>
なお、UUID名またはPARTUUID名は、<code>sudo blkid</code>コマンドを使用することにより、確認することができる。<br>
sudo vi /etc/grub.d/40_custom
<br>
# /etc/grub.d/40_customファイル
menuentry '<任意のLinuxカーネル名  例. kernel x.y.z>' {
    echo '<Linuxカーネルの読み込み時のメッセージ>'
    linux <vmlinuzファイルのパス> root=UUID=<ルートパーティションがあるUUIDまたはPARTUUID> <Linuxカーネルのパラメータ>
    echo '<初期化スクリプト(initrd)の読み込み時のメッセージ>'
    initrd <initrdファイルのパス>
}
# 例
menuentry 'kernel x.y.z' {
    echo 'Loading Linux x.y.z ...'
    linux /boot/vmlinuz root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ${extra_cmdline} splash=vervose resume=/dev/disk/by-uuid/<SWAPパーティションのUUID> preempt=full security=apparmor mitigations=auto
    echo 'Loading initial ramdisk ...'
    initrd /boot/initrd
}
<br>
GRUB2の変更を有効にするため、GRUB2を更新する必要がある。<br>
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
<br>
<br>
Linuxを再起動する。<br>
Linuxを再起動する。<br>
110行目: 144行目:
再起動後、Grubブートローダにおいて、インストールしたLinuxカーネルを選択する。<br>
再起動後、Grubブートローダにおいて、インストールしたLinuxカーネルを選択する。<br>
<br>
<br>
==== セキュアブートが有効の場合 ====
==== セキュアブートが有効の場合 ====
===== 署名の登録 =====
===== 署名の登録 =====
pesignとnss-toolsをインストールする。<br>
pesignとnss-toolsをインストールする。<br>
pesignのインストールと同時に、/etc/pki/pesignディレクトリ、および、/etc/pki/pesign-rh-testディレクトリにデータベースがインストールされる。<br>
pesignのインストールと同時に、/etc/pki/pesignディレクトリ、および、/etc/pki/pesign-rh-testディレクトリにデータベースがインストールされる。<br>
  sudo zypper install pesign nss-tools
  sudo zypper install pesign mozilla-nss-tools
<br>
<br>
certificateファイルを抽出する。<br>
certificateファイルを抽出する。<br>
130行目: 165行目:
<br>
<br>
カーネルへの署名を行う。<br>
カーネルへの署名を行う。<br>
この時、<code>-i</code>オプションを付加して、bzImageのパスを指定する。<br>
この時、<code>-i</code>オプションを付加して、vmlinuz(bzImageイメージ)のパスを指定する。<br>
  sudo pesign -c 'Red Hat Test Certificate' --certdir /etc/pki/pesign-rh-test -i <bzImageファイルのパス> -o vmlinuz.signed -s
  sudo pesign -c 'Red Hat Test Certificate' --certdir /etc/pki/pesign-rh-test \
      -i <vmlinuz(bzImageファイル)のパス  例. /boot/vmlinuz-x.xx.xx> \
      -o vmlinuz.signed -s
<br>
<br>
署名および生成されたLinuxカーネルであるvmlinuz.signedファイル名を変更する。<br>
署名および生成されたLinuxカーネルであるvmlinuz.signedファイル名を変更する。<br>
147行目: 184行目:
  uname -a
  uname -a
<br>
<br>
===== 署名の削除 =====
===== 署名の削除 =====
<u>署名を削除する時、そのカーネルでは起動できなくなることに注意すること。</u><br>
<u>署名を削除する時、そのカーネルでは起動できなくなることに注意する。</u><br>
  cd <署名ファイルがあるディレクトリ>
  cd <署名ファイルがあるディレクトリ>
  sudo mokutil --delete ./rhca.cer --root-pw
  sudo mokutil --delete ./rhca.cer --root-pw
156行目: 194行目:
Linuxのブート画面において、デフォルトで読み込まれるLinuxカーネルを変更する。<br>
Linuxのブート画面において、デフォルトで読み込まれるLinuxカーネルを変更する。<br>
<br>
<br>
現在の起動時に読み込まれるLinuxカーネルのバージョンを確認する。<br>
SUSEがLinxuカーネルのマルチバージョンに対応しているかどうかを確認する。<br>
  sudo grub2-editenv list
  sudo vi /etc/zypp/zypp.conf
<br>
# /etc/zypp/zypp.confファイル
multiversion = provides:multiversion(kernel)
<br>
GRUB2のサブメニューの変数<code>$menuentry_id_option</code>を検索する。<br>
sudo grep submenu /boot/grub2/grub.cfg
# 出力例
submenu 'Advanced options for SUSE Linux Enterprise 15 SP4' --hotkey=1 $menuentry_id_option 'gnulinux-advanced-xxx' {
<br>
使用するLinuxカーネルのメニューエントリの変数<code>$menuentry_id_option</code>を検索する。<br>
sudo awk '/menuentry/ && /class/ {count++; print count-1"****"$0 }' /boot/grub2/grub.cfg
# 出力例
0****menuentry 'SUSE Linux Enterprise 15 SP4'  --class opensuse --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-b9406985-a289-4710-be6b-c74f2c200075' {
1****   menuentry 'SUSE Linux Enterprise 15 SP4, with Linux 5.14.21-150400.24.28-default' --hotkey=2 --class opensuse --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.14.21-50400.24.28-default-advanced-xxx' {
2****   menuentry 'SUSE Linux Enterprise 15 SP4, with Linux 5.14.21-150400.24.28-default (recovery mode)' --hotkey=3 --class opensuse --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.14.21-150400.24.28-default-recovery-yyy' {
3****   menuentry 'SUSE Linux Enterprise 15 SP4, with Linux 5.14.21-150400.24.21-default'  --class opensuse --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.14.21-150400.24.21-default-advanced-zzz' {
4****   menuentry 'SUSE Linux Enterprise 15 SP4, with Linux 5.14.21-150400.24.21-default (recovery mode)' --hotkey=1 --class opensuse --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.14.21-150400.24.21-default-recovery-aaa' {
 
<br>
/etc/default/grubファイルにある<code>GRUB_DEFAULT</code>をコメントアウトして、<br>
上記で表示したサブメニューの変数<code>$menuentry_id_option</code>とLinuxカーネルのメニューエントリ変数<code>$menuentry_id_option</code>に、<code>></code>で区切って置き換える。<br>
sudo vi /etc/default/grub
<br>
# /etc/default/grubファイル
#GRUB_DEFAULT=saved
GRUB_DEFAULT="<サブメニュー変数$menuentry_id_optionの値 例. gnulinux-xxx>><メニューエントリ変数$menuentry_id_optionの値 例. gnulinux-<バージョン>.xxx-yyy>"
<br>
GRUB2を更新する。<br>
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
<br>
元のLinuxカーネルに戻す場合、/etc/default/grubファイルにある<code>GRUB_DEFAULT</code>の設定を戻す。<br>
sudo vi /etc/default/grub
# /etc/default/grubファイル
GRUB_DEFAULT=saved
#GRUB_DEFAULT="<サブメニュー変数$menuentry_id_optionの値 例. gnulinux-xxx>><メニューエントリ変数$menuentry_id_optionの値 例. gnulinux-<バージョン>.xxx-yyy>"
<br>
GRUB2を更新する。<br>
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
<br><br>
 
== vmlinuzファイルの展開と逆アセンブル ==
==== vmlinuzとは ====
vmlinuzは、システムを起動して、カーネルをメモリにロードすることができる圧縮されたLinuxカーネルのイメージである。<br>
また、vmlinuxは静的にリンクされた実行ファイルであり、カーネルはELF、COFF、a.out等のオブジェクトファイル形式をサポートしている。<br>
<br>
vmlinuzとvmlinuxは似た名前であるが、vmlinuxはvmlinuzの圧縮されていないブート不可能なバージョンのことである。<br>
(vmlinuz : Virtual Memory Linuz    linuzはLinuxの圧縮版の意味)<br>
<br>
アセンブリコードの問題の特定、または、特定の関数がどのように実行されているかをデバッグする場合、vmlinuzを抽出する。<br>
<br>
==== vmlinuzファイルの展開 ====
現在使用しているvmlinuzファイルの種類を確認する。<br>
file /boot/vmlinuz-$(uname -r)
# 出力例
vmlinuz-5.14.21-150400.24.28-default: Linux/x86 Kernel, Setup Version 0x20f, bzImage, Version 5.14.21-150400.24.28-default (geeko@buildhost)
#1 SMP PREEMPT_DYNAMIC Mon Oct 10 15:21:12 UTC 2, RO-rootFS, swap_dev 0xA, Normal VGA
<br>
<br>
起動時に選択できるLinuxカーネルのバージョンを確認する。<br>
Linuxカーネルのイメージから圧縮されていないカーネルを抽出するため、extract-vmlinuxスクリプトをダウンロードする。<br>
  sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg
  wget -O extract-vmlinux https://raw.githubusercontent.com/torvalds/linux/master/scripts/extract-vmlinux
chmod u+x extract-vmlinux
<br>
Linuxカーネルのイメージから圧縮されていないカーネルを抽出する。<br>
./extract-vmlinux /boot/vmlinuz-$(uname -r) > vmlinuz
<br>
展開したvmlinuzファイルの種類が、ELFオブジェクトかどうかを確認する。<br>
file vmlinuz
# 出力例
vmlinuz: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=915f2e0498b5123d9c51edb9ffca1b68d958fb7f, stripped
<br>
<br>
起動するLinuxカーネルのバージョンを変更する。<br>
<code>objdump</code>コマンドを使用して、vmlinuzを逆アセンブルすることができる。<br>
  sudo grub2-set-default <数値>
  objdump -D vmlinuz | less
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:SUSE]]
[[カテゴリ:SUSE]]