📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の11版が非表示) | |||
| 4行目: | 4行目: | ||
<br> | <br> | ||
ここでは、SUSEにおいて、カーネルをアップグレードする方法を記載する。<br> | ここでは、SUSEにおいて、カーネルをアップグレードする方法を記載する。<br> | ||
<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カーネルのインストール( | 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> | この時、<code>-i</code>オプションを付加して、vmlinuz(bzImageイメージ)のパスを指定する。<br> | ||
sudo pesign -c 'Red Hat Test Certificate' --certdir /etc/pki/pesign-rh-test -i < | 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>署名を削除する時、そのカーネルでは起動できなくなることに注意する。</u><br> | ||
cd <署名ファイルがあるディレクトリ> | cd <署名ファイルがあるディレクトリ> | ||
sudo mokutil --delete ./rhca.cer --root-pw | sudo mokutil --delete ./rhca.cer --root-pw | ||
<br><br> | |||
== GRUBの設定 == | |||
Linuxのブート画面において、デフォルトで読み込まれるLinuxカーネルを変更する。<br> | |||
<br> | |||
SUSEがLinxuカーネルのマルチバージョンに対応しているかどうかを確認する。<br> | |||
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> | |||
Linuxカーネルのイメージから圧縮されていないカーネルを抽出するため、extract-vmlinuxスクリプトをダウンロードする。<br> | |||
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> | |||
<code>objdump</code>コマンドを使用して、vmlinuzを逆アセンブルすることができる。<br> | |||
objdump -D vmlinuz | less | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:SUSE]] | [[カテゴリ:SUSE]] | ||