カーネルパラメーター
カーネルパラメーターは、カーネルの挙動に影響と及ぼす設定値のこと。カーネルパラメータの用途は様々で、特定のハードウェアデバイスの制御、メモリ・CPUなどのリソース制限。起動時に問題が発生した場合に、原因特定のためにデバッグ用のパラメータを指定し、ログの詳細度を増やす。メモリ管理の方法やプロセススのケジューリングに関するチューニングによるパフォーマンスの最適化を行う。SELinuxやAppArmorなどのセキュリティ機能の有効化や無効化などがある。実行中に変更可能なパラメータを変更した場合は、変更した瞬間に変更が適用されるため、システムの実行中に調整ができる。
カーネルパラメーターの変更は”/proc/”以下に保存されているファイルで変更できる。
パス | 内容 |
/proc/sys/kernel/acct | プロセスアカウンティング(各プロセスの開始時間、終了時間、CPU使用量などの情報を追跡・記録する機能)に関連する設定。 |
/proc/sys/kernel/bpf_stats_enabled | カーネル内で実行されるプログラムを安全にロードし、フィルタリングやモニタリングなどのタスクを行うために使用されるBPF(Berkeley Packet Filter)の統計情報の有効化を制御。 |
/proc/sys/kernel/ctrl-alt-del | [Ctrl] + [Alt] + [Del]押下時の動作設定。 |
/proc/sys/kernel/dmesg_restrict | カーネルメッセージバッファを表示するためのコマンドであるdmesgコマンドを、非特権ユーザーが閲覧できるかどうかを制御する。値が1の場合、ルート以外のユーザーはdmesgを使用できなくなる。 |
/proc/sys/kernel/domainname | NISドメイン名 |
/proc/sys/kernel/ftrace_enabled | カーネルの動作やパフォーマンスを追跡し、デバッグや性能分析を行うFtrace(関数トレース)の機能を有効・無効を設定する。値が1の場合、有効となり、値が0の場合、無効となる |
/proc/sys/kernel/hardlockup_all_cpu_backtrace | CPU が特定の時間内にスケジューリングされず、システムが完全に応答しなくなる状態であるハードロックアップを検出した際に、すべてのCPUでバックトレースを取得するかどうかを制御する。値が1の場合は、全CPUのバックトレースをdumpする。 |
/proc/sys/kernel/hostname | ホスト名 |
/proc/sys/kernel/hotplug | システムが動作中にデバイスを接続・取外しするホットプラグに関連する設定。 |
/proc/sys/modprobe | カーネルモジュールのロードおよびアンロードを行うためのコマンド(modprobe)を指定する。 |
/proc/sys/modules_disabled | カーネルモジュールのロードおよびアンロードを完全に無効化する設定。値が1の場合は、すべてのカーネルモジュールのロードとアンロードが無効となる。セキュリティを強化する目的で使用される。 |
/proc/sys/kernel/osrelease | カーネルバージョン。unameコマンドの”-r”オプションでも取得できる。 |
/proc/sys/kernel/ostype | OSの種類。unameコマンドの”-s”オプションでも取得できます。 |
/proc/sys/kernel/pid_max | システムで許可されるプロセスID(PID)の最大値を設定。通常は、32768や4194304に設定される。 |
/proc/sys/kernel/poweroff_cmd | システムの電源を切るときに実行するコマンドを指定。通常は、”/sbin/poweroff”がデフォルト。 |
/proc/sys/kernel/sem | プロセス間の同期を行い、特に共有リソースへのアクセス制御に利用されるシステムVセマフォに関する設定。 |
/proc/sys/kernel/shmall | システムで使用できる共有メモリの総ページ数の最大値を設定。 |
/proc/sys/kernel/shmmax | システムで使用できる共有メモリセグメントの最大サイズを設定。 |
/proc/sys/kernel/shmmni | システムで使用できる共有メモリセグメントの最大数を設定。 |
split_lock_mitigate | スプリットロック(競合するメモリアクセス)が発生した場合の対応を制御。パフォーマンスとセキュリティに影響を与える場合があるので注意が必要。 |
soft_watchdog | ソフトウェアウォッチドッグの有効化を制御。値が1の場合は有効。 |
/proc/sys/kernel/sysrq | SysRqの制御。SysRqは、特定のキーボード入力することでカーネルに対して直接コマンドを発行し、システムのデバッグやリカバリを行うためのツール。システムのフリーズや操作が不能になった場合でも、SysRqを利用し特定の操作を強制的に実行する。 |
/proc/sys/kernel/threads-max | システム全体で許可される最大スレッド数を設定。スレッドはプロセス内での実行単位で、リソースが圧迫するため制限を設けることがある。 |
/proc/sys/kernel/version | Linux カーネルのバージョン情報を取得。 |
/proc/sys/fs/file-max | 最大ファイルディスクリプタ数を制御。ファイルディスクリプタは、プロセスがファイルやソケット、パイプなどのリソースにアクセスするために使用されるインデックス。システムで同時に開くことができるファイルの最大数を設定できる。 |
/proc/sys/fs/file-nr | システムで現在使用されているファイルディスクリプタの数の確認。 |
/proc/sys/net/core/rmem_default | 受信ソケットバッファのデフォルトサイズ |
/proc/sys/net/core/rmem_max | 受信ソケットバッファの最大サイズ |
/proc/sys/net/core/wmem_default | 送信ソケットバッファのデフォルトサイズ |
/proc/sys/net/core/wmem_max | 送信ソケットバッファの最大サイズ |
/proc/sys/net/ipv4/ip_forward | ネットワークインターフェース間でのパケット転送の有効/無効の設定。 |
/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts | ブロードキャストまたはマルチキャスト宛のICMP Echo Requestを無視するかどうかを設定。 |
/proc/sys/net/ipv4/icmp_echo_ignore_all | すべてのICMP Echo Requestを無視するかどうかを設定。 |
カーネルパラメータを書き換えるだけでは、システム再起動後にデフォルト値に戻ってしまう。システム再起動後も変更を有効にするためには、”/etc/sysctl.conf”に設定を記述する必要がある。
sysctlコマンド
sysctlコマンドは、Linuxを含むUnix系システム(つまり、Macでも使える)でカーネルパラメータを動的に表示又は変更するためのツールで、再起動せずにカーネルの動作システムの調整したり、管理したりすることが可能にる。sysctlコマンドで操作できるパラメータは、カーネル、メモリ、ネットワーク関連などの設定で、変更できるパラメータは/proc/sys/ 以下にリストされているもの。ただし、sysctlコマンドでの変更は、デフォルトでは一時的なので、再起動すると元の設定に戻るため、カーネルパラメータの永続化や再起動後も設定を保持したい場合は、設定ファイル(”/etc/sysctl.conf”)に書き込む。
sysctl [オプション] [パラメータ]
sysctl -w [パラメータ] = [値]
オプション | 内容 |
-a, –all | 変数をすべて表示する。現在利用できる全ての値を表示 |
-e, –ignore | 未知の変数のエラーを無視する |
-n, –values | 与えられた変数の値のみを表示します。 |
-N, –names | キーの名前は表示せず、値だけ表示する |
-p, –load[=] | ファイルから値を読み込む。 |
-w, –write | 変数に値を書き込む。sysctlの設定を変更する場合は、このオプションを指定する |
変数をすべて表示する。
$ sysctl -a
abi.vsyscall32 = 1
debug.exception-trace = 1
debug.kprobes-optimization = 1
dev.raid.speed_limit_max = 200000
dev.raid.speed_limit_min = 1000
dev.scsi.logging_level = 0
dev.tty.ldisc_autoload = 0
fs.aio-max-nr = 65536
fs.aio-nr = 0
fs.binfmt_misc.WSLInterop = enabled
fs.binfmt_misc.WSLInterop = interpreter /init
fs.binfmt_misc.WSLInterop = flags: PF
fs.binfmt_misc.WSLInterop = offset 0
fs.binfmt_misc.WSLInterop = magic 4d5a
fs.binfmt_misc.status = enabled
fs.dentry-state = 24239 5846 45 0 1248 0
fs.dir-notify-enable = 1
fs.epoll.max_user_watches = 1809853
fs.fanotify.max_queued_events = 16384
fs.fanotify.max_user_groups = 128
fs.fanotify.max_user_marks = 67590
fs.file-max = 812095
fs.file-nr = 256 0 812095
fs.inode-nr = 23005 0
fs.inode-state = 23005 0 0 0 0 0 0
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 524288
fs.lease-break-time = 45
fs.leases-enable = 1
fs.mount-max = 100000
・
・
・
試しに、”fs.mount-max”の値を変更してみる。因みに”fs.mount-max”は、システム上で同時にマウントできるファイルシステムの最大数を指定するカーネルパラメータ。
$ sysctl fs.mount-max
fs.mount-max = 100000
最大数を100001に更新する。ただし、下記の更新の方法だと再起動時にデフォルト値に戻る。
$ sysctl -w fs.mount-max=100001
fs.mount-max = 100001
試しに再起動してみると100000に戻っている
$ sysctl fs.mount-max
fs.mount-max = 100000
再起動時にも設定を残しておきたい場合は、”/etc/sysctl.conf”に設定を記述しておく。
$ vi /etc/sysctl.conf
・
・
・
fs.mount-max = 100001
再起動して値を確認してみると100001が保持されている。
$ sysctl fs.mount-max
fs.mount-max = 100001
初期RAMディスク
初期RAMディスクは、Linuxシステムの起動の途中で一時的に利用される小さいルートファイルシステムのこと。RAMディスクは、メモリ上にファイルシステムを作成する機能で、ループバックマウントというファイルをファイルシステムとしてマウントする機能を持つ。ファイルシステムのファイルをメモリ上にRAMディスクとして展開し、暫定的なルートファイルシステムとしてカーネルを起動し、その後、本来のルートファイルシステムをマウントする。このときのRAMディスクが初期RAMディスク。初期RAMディスクには、”/bin”、”/lib”、”/dev”などのディレクトリがあり、それぞれのディレクトリには必要最低限のコマンドやデバイスファイルなどが含まれている。また、初期RAMディスクのファイルには、ファイルシステムイメージに圧縮したinitrd形式と、cpioアーカイブで圧縮したinitramfs形式がある。initramfs形式は、ファイルシステムのドライバが不要でメモリ効率に優れていることから、最近ではinitramfs形式を利用するディストリビューションが多い。
Linuxの起動プロセス
Linuxは下記の順で起動する。
- 電源オン
- BIOS/UEFI起動
- ブートローダ(GRUB、GRUB2)
- カーネル(vmliuz)及び初期RAMディスク(initramfs)読み込み
- カーネルを実行
- 初期RAMディスクを実行
- init実行
mkinitramfsコマンド
初期RAMディスクの生成を行うコマンド。
mkinitramfsコマンドの書式
mkinitramfs -o /boot/initrd.img-[カーネルバージョン] [カーネルバージョン]
自分の環境下では”6.8.0-45-generic”というバージョンでカーネルが動いていたので、これで初期RAMディスクを生成してみる。
$ sudo mkinitramfs -o /boot/initrd.img-6.8.0-45-generic 6.8.0-45-generic
lsinitramfsコマンド
初期RAMディスクの内容をリスト表示するコマンド。イメージファイルを展開する必要があるが、lsinitramfsコマンドは展開せずに、内容を表示できる。
$ lsinitramfs initrd.img-6.8.0-45-generic
.
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/AuthenticAMD.bin
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/.enuineIntel.align.0123456789abc
kernel/x86/microcode/GenuineIntel.bin
.
usr
usr/lib
usr/lib/firmware
usr/lib/firmware/3com
usr/lib/firmware/3com/typhoon.bin.zst
usr/lib/firmware/acenic
usr/lib/firmware/acenic/tg1.bin.zst
usr/lib/firmware/acenic/tg2.bin.zst
usr/lib/firmware/adaptec
usr/lib/firmware/adaptec/starfire_rx.bin.zst
usr/lib/firmware/adaptec/starfire_tx.bin.zst
usr/lib/firmware/advansys
・
・
・
記事を読んでいただきありがとうございました。