1 分で読了 #devops
このページの目次

カーネル操作マニュアル

Gentoo でのカスタムカーネルのコンパイル、モジュール管理、DKMS、initramfs の操作について。

ステータス確認

uname -r                                 # 現在実行中のカーネルバージョン
uname -a                                 # 完全情報: バージョン+アーキテクチャ+コンパイル日時
cat /proc/version                        # カーネルバージョン + コンパイラ情報

# インストール済みカーネル
ls -la /boot/vmlinuz-*                   # カーネルイメージ
ls -la /lib/modules/                     # モジュールディレクトリ (カーネルごとに1つ)
eselect kernel list                      # eselect からの確認

# 現在使用しているカーネルの設定
zcat /proc/config.gz                     # 実行中のカーネルの設定 (CONFIG_IKCONFIG が必要)
zcat /proc/config.gz | grep CONFIG_NF_TABLES
# 確認できない場合: カーネルで CONFIG_IKCONFIG_PROC が無効化されている。/boot/config-$(uname -r) を確認

# ロード済みモジュール
lsmod                                    # ロード済みモジュールとその参照カウント
lsmod | grep mt7927
modinfo mt7927                           # モジュール詳細: パラメータ/依存関係/パス/署名

# カーネルログ
dmesg -w                                 # リアルタイムのカーネルログ
dmesg -T                                 # 人間が読みやすいタイムスタンプ付き
dmesg --level=err,warn                   # エラーと警告のみ表示
dmesg | grep -i "firmware\|mt79\|amdgpu" # ファームウェア/ドライバ関連

# カーネルパラメータ (ランタイム)
sysctl -a                                # すべてのパラメータをリスト
sysctl net.ipv4.ip_forward               # 単一パラメータの参照
sysctl net.ipv4                          # 全体のサブシステムを参照

カーネルのコンパイル

# ソースコードの場所
eselect kernel list                      # 利用可能なソースを確認
eselect kernel set linux-6.6.21-gentoo   # 切り替え
cd /usr/src/linux                        # シンボリックリンク → 現在のソースディレクトリ

# 設定
make menuconfig                          # TUI 設定
make oldconfig                           # 古い .config からアップグレード (対話式)
make olddefconfig                        # 古い .config からアップグレード (デフォルト値を自動選択)
make localmodconfig                      # 現在ロードされているモジュールのオプションのみ有効化 (設定を簡素化)
make nconfig                             # 別の TUI

# 設定の保存/復元
cp .config /boot/config-6.6.21-gentoo    # バックアップ (後々の参照用)
# 既にバックアップがある場合: cp /boot/config-6.6.21-gentoo .config && make olddefconfig

# コンパイル (Gentoo)
make -j$(nproc)                          # 並列コンパイル
make -j$(nproc) modules_install          # モジュールを /lib/modules/X.Y.Z/ にインストール
make install                             # vmlinuz と System.map を /boot にインストール

# または genkernel を使用 (自動化)
genkernel all                            # 完全自動でコンパイル+initramfs 作成
genkernel --menuconfig all               # コンパイル前に設定を変更可能
genkernel --lvm --mdadm all              # LVM/RAID サポート付き

# ディストリビューション提供カーネル (Gentoo, 推奨)
emerge -av sys-kernel/gentoo-kernel      # ディストリビューション提供カーネルを使用 (自動更新、Ubuntu に類似)
# または emerge gentoo-sources + 手動コンパイル (より柔軟)

DKMS (動的カーネルモジュール)

# ステータス
dkms status                              # すべての DKMS モジュールとそのステータス (installed/built/added) をリスト
# 例: mt7927/2.12, 6.6.21-gentoo, x86_64: installed

# モジュールのインストール
dkms add /path/to/source                 # ソースコードを DKMS ツリーに追加
dkms build mt7927/2.12                   # コンパイル
dkms install mt7927/2.12                 # 現在のカーネルにインストール
dkms autoinstall                         # 新しいカーネルに対してすべての DKMS モジュールを自動コンパイル

# アンインストール/削除
dkms remove mt7927/2.12 --all            # すべてのカーネルから
dkms remove mt7927/2.12 -k 6.6.21        # 特定のカーネルから
dkms uninstall mt7927/2.12               # モジュールをアンインストール (ソースは保持)

# デバッグ
dkms status --verbose                    # 詳細情報
dkms build mt7927/2.12 --verbose         # コンパイルの詳細ログ
cat /var/lib/dkms/mt7927/2.12/build/make.log  # ビルドログ

# 新しいカーネルインストール後の DKMS 自動トリガーメカニズム:
# @module-rebuild は installkernel 時に dkms autoinstall を自動呼び出します
# 確認: eselect kernel list で新しいカーネルが選択されていることを確認、dkms status でステータスを確認

モジュール管理

# 一時的なロード/アンロード
modprobe mt7927                           # モジュールをロード (依存関係を含む)
modprobe -r mt7927                        # モジュールをアンロード (未使用の依存関係を含む)
modprobe -f mt7927                        # 強制ロード (バージョン不一致を無視)
modprobe -r --force mt7927                # 強制アンロード

# モジュールパラメータ
modinfo -p mt7927                         # モジュールがサポートするパラメータを表示
modprobe mt7927 param1=value1             # ロード時にパラメータを設定
# 永続化: echo "options mt7927 param1=value1" > /etc/modprobe.d/mt7927.conf

# ブロックリスト (ロードを阻止)
# echo "blacklist nouveau" > /etc/modprobe.d/blacklist.conf
# echo "blacklist mt7927" > /etc/modprobe.d/blacklist-mt7927.conf

# 自動ロード (起動時)
# echo "mt7927" > /etc/modules-load.d/mt7927.conf

# ロード済みモジュールの全パラメータ
systool -vm mt7927                        # sysfs からの確認 (sysfsutils が必要)
cat /sys/module/mt7927/parameters/*       # 各パラメータの現在の値を確認

initramfs (dracut)

# initramfs の生成
dracut --force /boot/initramfs-6.6.21-gentoo.img 6.6.21-gentoo
dracut --force --hostonly /boot/initramfs-6.6.21-gentoo.img  # 現在のホストに必要なモジュールのみ
dracut --force --lvm --mdadm /boot/initramfs-6.6.21-gentoo.img  # LVM/RAID 対応

# initramfs の内容確認
lsinitrd /boot/initramfs-6.6.21-gentoo.img      # ファイルリスト
lsinitrd /boot/initramfs-6.6.21-gentoo.img | grep lvm
lsinitrd --mod /boot/initramfs-6.6.21-gentoo.img # 含まれている dracut モジュール

# ブート問題のデバッグ
dracut --force --verbose /boot/initramfs-6.6.21-gentoo.img  # 内包プロセスの表示
# GRUB コマンドラインに追加: rd.debug rd.shell
# 問題が発生した場合、emergency shell に進入:
journalctl -b                              # 今回起動のログを確認

# カーネルコマンドライン (GRUB)
# /etc/default/grub:
# GRUB_CMDLINE_LINUX="quiet splash rd.lvm.vg=vg0 resume=/dev/vg0/swap"
grub-mkconfig -o /boot/grub/grub.cfg       # GRUB 設定を再生成

カーネルパラメータのチューニング (sysctl)

# 一時的な設定
sysctl -w net.ipv4.ip_forward=1
sysctl -w vm.swappiness=10

# 永続化
# /etc/sysctl.conf または /etc/sysctl.d/99-custom.conf:
#   net.ipv4.ip_forward = 1
#   vm.swappiness = 10
sysctl -p                                   # 設定を読み込み
sysctl --system                              # すべての sysctl.d を読み込み

# 一般的なチューニング項目
# net.core.default_qdisc = fq                # BBR 対応の qdisc
# net.ipv4.tcp_congestion_control = bbr      # TCP 輻輳制御
# vm.swappiness = 1                          # スワップを極力使用しない (0 以外で最低値)
# kernel.sysrq = 1                           # Magic SysRq を有効化
# fs.inotify.max_user_watches = 524288       # inotify 監視の上限 (IDE/LSP で大量のファイルがある場合)

カーネルのデバッグ

# ブートパラメータ (GRUB コマンドラインで一時的に変更)
# single                  # シングルユーザーモード (メンテナンス用)
# init=/bin/bash          # シェルに直接進入 (init をバイパス)
# ignore_loglevel         # すべてのカーネルログを表示
# rd.break=pre-mount      # dracut: ルートファイルシステムをマウントする前に停止

# Magic SysRq (カーネルの緊急時対応)
echo 1 > /proc/sys/kernel/sysrq            # 有効化
# Alt+SysRq + b  → 即時再起動
# Alt+SysRq + s  → ディスクの同期
# Alt+SysRq + u  # 読み取り専用で再マウント
# Alt+SysRq + e  → 全プロセスに SIGTERM を送信
# Alt+SysRq + i  → 全プロセスに SIGKILL を送信
# 安全な再起動順序: R E I S U B (または "BUSIER" を逆にしたものを覚える)

# カーネルクラッシュ後の分析
cat /proc/sys/kernel/panic                 # クラッシュ後 N 秒後に自動再起動 (0=自動再起動なし)
# kdump を有効化し、crash ツールで vmcore を分析

# パフォーマンスの観測
perf top                                   # リアルタイムのホットスポット関数
perf record -g sleep 10 && perf report     # サンプリング + フレームデータ