カーネル操作マニュアル

9 分で読了
このページの目次

Gentoo のカーネル・モジュール・initramfs 保守を扱う。稼働中・インストール済み・次回起動予定の版は別々で、ビルド成功は起動成功を保証しない。

やりたいこと参照先
ドライバー未読込版とモジュール
新カーネルの導入ビルドから起動へ
新版が起動しないinitramfs と旧版への復帰
調整と性能観測稼働中の変更

各層の版を一致させる

稼働版・設置 file・source は別の状態

# 現在稼働中の release を読む
uname -r
# 今回の起動で使った引数を読む
cat /proc/cmdline

root=・UUID・暗号化・復旧引数を確認する。boot file を変えても現在値は変わらない。

# 設置 module tree の release を列挙する
ls /lib/modules/

directory があるだけで完全性・起動可能性は保証されない。

# Gentoo の source 選択を確認する
eselect kernel list
# 現 source link の実 directory を読む
readlink -f /usr/src/linux

device → driver → module file → log

# PCI device の使用中・候補 driver を調べる
lspci -k

USB は対応 sysfs・tool を使う。以下 MODULE は実 module 名へ置き換える。

# 現在 load された module を列挙する
lsmod
# 現 release の module file を特定する
modinfo -F filename MODULE
# module の build 互換情報を読む
modinfo -F vermagic MODULE

一致は手掛かりの一つ。署名・symbol 版・load error も log で確認する。

# driver 検出・firmware・module error を読む
journalctl -k -b -n 150 --no-pager

MODULE は lspci -k や sysfs で特定した実際の名前。eselect kernel はソースリンクの選択で稼働版は変わらない。組込ドライバーは lsmod に出ない。/proc/config.gz または稼働 release の /boot/config-* を確認する。

起動要素は対象 release に合わせる vmlinuz <release> /lib/modules/<release> initramfs <release> 起動項目 → root FS

図は確認項目の並びで起動処理の実行順ではない。全項目を同じ対象 release に合わせる。

保守方式を先に選ぶ

方式責任範囲
gentoo-kernel / gentoo-kernel-bin配布設定と installkernel 統合。機器のドライバー・署名・bootloader は確認
gentoo-sources + make自分で .config・ビルド・モジュール・initramfs・起動項目を管理
genkernelその版のオプションで自動化。dracut の引数と混ぜない

手動 build:source directory を固定し設定を保存する

以下は gentoo-sources + make 専用。配布 kernel package は package の手順を使う。対象 hardware の source・.config を用意し、書込可能な一般 user で build する。

# この shell で対象 source directory を固定・表示する
ops_ksrc=$(readlink -f /usr/src/linux)
printf "%s\n" "$ops_ksrc"

意図した完全な source path を確認する。同じ shell を使い、source・設定が変われば再確認する。

# 対象の設定が存在し空でないことを確認する
test -s "${ops_ksrc:?Set the verified source path}/.config"

非ゼロなら止めて適切な設定を用意し、定制を不用意に上書きしない。

# 旧 backup も残して更新前設定を保存する
cp --backup=numbered "${ops_ksrc:?Set the verified source path}/.config" \
  "$ops_ksrc/.config.before-update"
# 旧設定をこの source の選択肢へ更新する
make -C "${ops_ksrc:?Set the verified source path}" olddefconfig

新項目は既定値になる。旧新 diff で root device・filesystem・復旧 driver を確認する。

# 対象 hardware の設定を対話的に確認・調整する
make -C "${ops_ksrc:?Set the verified source path}" menuconfig

build 成功後に対象 release を記録する

# 対象 kernel・module を build する
make -C "${ops_ksrc:?Set the verified source path}" -j"$(nproc)"

-j は並行数。memory が少なければ下げる。失敗を解決してから設置する。

# module tree・起動 image に使う完全な release を記録する
make -s -C "${ops_ksrc:?Set the verified source path}" kernelrelease

uname -r と同じとは限らない。回退用と同名なら suffix を変えて上書きを避ける。

確認済み .config から始める。olddefconfig の追加項目の既定値を確認する。localmodconfig は未接続機器や救援用機能を落とし得る。modules_install/make install の前に /boot・ESP のマウント、空き、旧版保持を確認する。

設置前に対象 mount を確認する

# /boot の filesystem を確認する
findmnt --target /boot

root filesystem が表示される場合もある。独立 /boot が必要なら想定 device かを確認する。

# 新旧 kernel を残す容量を確認する
df -h /boot
# build 済み module を対象 release 配下へ設置する
sudo make -C "${ops_ksrc:?Set the verified source path}" modules_install

設置結果を確認し、外部 module が全て自動処理されたと仮定しない。

# 本機の install 連携で kernel を設置する
sudo make -C "${ops_ksrc:?Set the verified source path}" install

先に installkernel・hook を確認する。initramfs・boot entry も生成される場合があるため、成果物を確認する。

# 設置した対象 release を読む・照合する
ops_release=$(make -s -C "${ops_ksrc:?Set the verified source path}" kernelrelease)
printf "%s\n" "$ops_release"
# 新 release の必要 module file を確認する
modinfo -k "${ops_release:?Set the verified target release}" -F filename MODULE

必要な loadable driver 名を使う。組込の場合は設定を別に確認する。

# 外部 module が対象 release に設置されたか確認する
dkms status

DKMS 管理がなければ省略。別 release の installed だけでは不十分。

DKMS の installed は対象 release に対応する必要がある。必要なモジュール名・版・カーネルを指定して build/install し、make.log・署名・Secure Boot を確認する。自動 hook は導入構成に依存する。

initramfs と旧版の起動項目を確認

release を選んで image を確認・生成する

# 次回起動する完全な release を入力する
read -r ops_release

build 出力・設置済みの実値を入力する。文字列 RELEASE や現在の uname -r を新 release の代わりにしない。

# 対象版の module directory を確認する
ls -ld "/lib/modules/${ops_release:?Set the verified target release}"
# この ESP mount point を使う場合に device を確認する
findmnt /boot/efi

実 ESP path に合わせる。全機が /boot/efi とは限らない。/boot・空き容量も確認する。

# 手動生成が必要で出力がない場合だけ作成する
sudo dracut --kver "${ops_release:?Set the verified target release}" \
  "/boot/initramfs-$ops_release.img"

hook で生成済みなら省略して確認する。同名 file に直ちに --force を使わない。

# image 内の driver・firmware・設定を見る
lsinitrd "/boot/initramfs-${ops_release:?Set the verified target release}.img"
# dracut 機能 module を列挙する
lsinitrd -m "/boot/initramfs-${ops_release:?Set the verified target release}.img"

-m は dracut module 一覧で kernel driver の確認とは別。boot entry の kernel・initramfs・root の対応を最後に確認する。

起動パスは機器に合わせる。新規生成では force を付けず既知の正常像を保護する。hostonly は機器と root 配置に依存し、暗号化・LVM・RAID・ドライバー・firmware を確認する。dracut の --add と --add-drivers は対象が異なり genkernel 引数とは互換でない。

現象確認
新版が起動メニューにない配置先・ESP・実際の GRUB/systemd-boot/UKI 手順
root デバイスが見つからないUUID・initramfs・ドライバー・復号経路。必要なら一時 rd.debug
module format・署名の拒否release・vermagic・署名・起動ポリシー。不整合を force で無視しない

再起動前に旧版を選べる状態と復旧経路を確保し、起動後に uname -r・機器・サービスを確認する。唯一の遠隔接続用ドライバーを外さない。blacklist は主に別名による自動読込に作用し、initramfs 内設定は再生成が必要。

稼働設定と性能観測

問題に応じて実行時設定を読む

# IPv4 転送状態を確認する
sysctl net.ipv4.ip_forward

routing・subnet 転送の確認用で、性能対策として無条件に有効化しない。

# memory 回収方針を読む
sysctl vm.swappiness
# user ごとの watch 上限を見る
sysctl fs.inotify.max_user_watches
# 対象 module の対応引数を見る
modinfo -p MODULE

説明の一覧で現在値ではない。load 済み値は /sys/module/MODULE/parameters/ を確認する。

性能採取:対象と出力を明確にする

# 単純な process で perf 計数を確認する
perf stat -- sleep 5

sleep の測定で全体負荷ではない。実 program へ置き換えるか system 範囲を選ぶ。

# 10 秒間の system 全体 call stack を採取する
sudo perf record -a -g -o perf-kernel-review.data -- sleep 10

-a は全体、-g は stack、-o は出力。未使用名で症状発生時に採取する。負荷・symbol・unwind の影響がある。

# 作成した採取 file を解析する
sudo perf report -i perf-kernel-review.data

function・process・call chain を読み q で終了。sample 比率だけで根因とは断定しない。

sysctl -w は現在値だけを変更する。sysctl.d に範囲を絞って保存・読込・確認する。swappiness は0–100限定ではなく万能値もない。全体 perf には権限と負荷があり、-a なしで sleep を測っても全体のホットスポットにはならない。SysRq の即時再起動は安全な保存を保証しない。

Gentoo kernel configuration · dracut · Kernel admin guide