カーネル サービスと構成

はじめに

第25章はじめに

このビデオでは、この章で説明するトピックの概要を簡単に説明します。


学習目標
この章の終わりまでに、次のことができるようになります。

カーネルが果たさなければならない主な責任と、それをどのように達成するかを把握できます。
カーネル コマンド ラインで設定できるパラメータと、それを1回のシステム ブートで、または恒久的に、有効にする方法を説明できます。
これらのパラメータに関する詳細なドキュメントの場所を知ることができます。
sysctlを使用して、システムの起動後、または再起動後も恒久的に、カーネル パラメータを設定できます。


カーネル サービスと構成

カーネルの概要
狭義には、Linuxはオペレーティング システムのカーネルのみを指します。オペレーティング システムにはカーネルとやりとりするライブラリやアプリケーションなど、他の多くのコンポーネントが含まれています。

カーネルは、ハードウェアをソフトウェアに接続し、競合するアプリケーションやサービス間のメモリやCPU時間の割り当てなどのシステム リソースを管理する、重要な中枢コンポーネントです。接続されたすべてのデバイスをデバイス ドライバを使って処理し、デバイスをオペレーティング システムで使用できるようにします。

カーネルのみを実行するシステムでは、機能がかなり制限されています。このようなケースは専用の組み込みデバイスでのみ見受けられます。

カーネルの主な責任は次のとおりです。

システムの初期化と起動
プロセス スケジューリング
メモリ管理
ハードウェアへのアクセス制御
アプリケーションとストレージ デバイス間のI/O（入力/出力）
ローカルおよびネットワークのファイルシステムの実装
（ファイルシステムのパーミッションなどの）ローカルとネットワーク経由の両方のセキュリティ制御
ネットワーク制御


カーネル コマンド ライン
カーネル コマンド ラインでのブート時には、さまざまなパラメータがシステムに渡されます。通常、これらはGRUB構成ファイルのlinuxまたはlinux16の行にありますが、ブート時に変更できます。

サンプルのカーネル コマンド ラインはディストリビューションに依存しています。例えば次のようになっています。

linux boot/vmlinuz-4.19.0 root=UUID=7ef4e747-afae-90b4-9be8be8d0258 ro quiet crashkernel=384M-:128M

または、

linuxfi /boot/vmlinuz-5.2.9 root=UUID=77461ee7-c34a-4c5f-b0bc-29f4feecc743 ro crashkernel=auto rhgb quiet

そして、この行は、/boot/grubなどのboot下のサブディレクトリのgrub.cfg、または/boot/efi/EFI/centos/grub.cfgなどのファイルの中にあります。

vmlinuzファイル以降で指定されているものはすべてオプションです。カーネルが理解できないオプションはすべて、システムで最初に実行されるユーザー プロセスのinit（pid=1）に渡されます。

変更などの編集は、このファイルを直接編集するのではなく、/etcの下の関連ファイルで行ってください。

システムの起動に使用したコマンド ラインを確認するには、次のように入力します。

$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-5.2.9 root=UUID=77461ee7-c34a-4c5f-b0bc029f4feecc743 ro crashkernel=auto rhgb quiet


カーネル ブート パラメータ
利用可能なカーネル パラメータは、驚くほど多いです。詳細なドキュメントは以下で見つけることができます。

カーネル ソース内のファイルkernel-parameters.txt
オンライン「using the kernel's command line parameters documentation」
ほとんどのディストリビューションで提供されている、システム上のkernel-docやlinux-docなどの名前を持つカーネル ドキュメント パッケージ
man bootparamと入力することで見ることができる内容
パラメータは、引数の値として、またはparam=valueの形式で指定できます。指定できる値は、ドキュメント ファイルで説明されているように、文字列、整数、整数の配列などです。

vmlinuz root=/dev/sda6 ..... noapic .... crashkernel=256M

カーネル オプションは、カーネルを指定する行の最後に書き、スペースで区切ります。カーネル ブート パラメータの例（すべて１行で書きます）は次のとおりです。

linux16 /boot/vmlinuz-3.19.1.0 root=UUID=178d0092-4154-4688-af24-cda272265e08 ro vconsole.keymap=us crashkernel=auto vconsole.font=latarcyrheb-sun16 rhgb quiet LANG=en_US.UTF-8

以下に、以前に表示したいくつかのブート パラメータの説明を示します。

root：ルート ファイルシステムを指定します。
ro：ブート時に読み取り専用でルート デバイスをマウントします。
vconsole.keymap：コンソールで使用するキーボードを指定します。
crashkernel：カーネル クラッシュダンプ用に確保するメモリ量を指定します。
vconsole.font：コンソールで使用するフォントを指定します。
rhgb：ブート時にグラフィカル表示をするように指定します。
quiet：ほとんどのログ メッセージを無効にします。
LANG：これはシステム言語を指定します。

慣例的に、意図的に隠されたり秘密にされたパラメータはありません。それらはすべてドキュメントで説明する必要があり、新しいパラメータを使用するカーネル ソースへのパッチには、常にドキュメント ファイルへの説明パッチを含める必要があります。


sysctl
sysctlインターフェイスは、実行時にカーネル パラメータを読み取って調整するために使用できます。スクリーンショットは、以下を実行することで現在の値を表示したものです。

$ sysctl -a

sysctlの使用例

各値は、/proc/sysにある特定の疑似ファイルに対応しており、ディレクトリのスラッシュ（/）をドット（.）に置き換えたものです。たとえば、次の2つのコマンド文は同じことをします。

$ sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
$ sudo sysctl net.ipv4.ip_forward=1

ここで、2番目のコマンド文は、sysctlコマンド ライン インターフェイスで値を設定するものです。このコマンドの=記号の前後にスペースを入れないでください。最初のコマンド文では、echo付きの単純な sudo を使用できないことに注意してください。コマンドは、ここに示した複雑な方法で実行するか、rootとして実行する必要があります。

/proc/sysの下の疑似ファイルを参照すると、sysctl -aと同じ情報が表示されます。man 8 sysctlを実行すれば、sysctlの使用方法に関する詳細情報を取得できます。プログラムから sysctl()関数を使用して情報を取得するには、man 2 sysctlで説明されている方法を実行します。

/etc/sysctl.confで設定されている（詳細は man sysctl.conf 参照）場合、設定内容はブート時に修正できます。

以下のように入力すれば、

$ sudo sysctl -p

ファイルを即座に読み込み、すべてのパラメータを指定されたとおりに設定します。これもブート プロセスの一部です。

systemdの登場により、状況はもう少し複雑になりました。ベンダーは、/usr/lib/sysctl.d/ディレクトリ内に設定ファイルを置きます。これらのファイルは、/etc/sysctl.dにあるファイルに追加、または置換できます。ただし、元のファイル（/etc/sysctl.conf）は、そのファイルに自己文書化されている（初めて触る人でもファイル自身が良く書かれているので読むだけで内容がわかる）ので、引き続きサポートされます。

デモ：sysctlの使用

このビデオは、sysctlユーティリティの簡単なデモを提供します。


演習

課題 25.1. sysctlで調整可能なシステムの値

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

【【ここから橋本さんの訳を挿入】】

1.  Check if you canpingyour own system.
2.  Check the current value ofnet.ipv4.icmp_echo_ignore_all, which is used to turn on and off whether your system will respond to ping. A value of 0 allows your system to respond to pings.
3.  Set the value to1using the sysctl command line utility and then check if pings are responded to.
4.  Set the value back to 0 and show the original behavior in restored.
5.  Now change the value by modifying /etc/sysctl.confand force the system to activate this setting file without a reboot.
6.  Check that this worked properly.

You will probably want to reset your system to have its original behavior when you are done.

Solution 25.1

You can use eitherlocalhost,127.0.0.1(loopback address) or your actual IP address for target of ping below.

1.$ ping localhost
2.$ sysctl net.ipv4.icmp_echo_ignore_all
3.$ sudo sysctl net.ipv4.icmp_echo_ignore_all=1
$ ping localhost
4.$ sudo sysctl net.ipv4.icmp_echo_ignore_all=0
$ ping localhost
5.  Add the following line to /etc/sysctl.conf:

in /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all=1
and then do:
$ sysctl -p

6.$ sysctl net.ipv4.icmp_echo_ignore_all
$ ping localhost

Since the changes to /etc/sysctl.conf are persistent, you probably want to restore things to its previous state.


課題 25.2. プロセスIDの最大値を変更する

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

Exercise 25.2: Changing the Maximum Process ID

The normal behavior of aLinux system is that process IDs start out at PID=1 for the initprocess, the first user process on the system, and then go up sequentially as new processes are constantly created (and die as well.)

However, when the PID reaches the value shown in /proc/sys/kernel/pid_max, which is conventionally 32768 (32K), they will wrap around to lower numbers. If nothing else, this means you can’t have more than 32K processes on the system since there are only that many slots for PIDs.

1.  Obtain the current maximum PID value.
2.  Find out what current PIDs are being issued
3.  Reset pid_maxto a lower value than the ones currently being issued.
4.  Start a new process and see what it gets as a PID.

Solution 25.2

Very Important

In the below we are going to use two methods, one involving sysctl, the other directly echoing values to /proc/sys/kernel/pid_max. Note that the echo method requires you to be root;sudo won’t work. We’ll leave it to you to figure out why, if you don’t already know!

1.$ sysctl kernel.pid_max
$ cat /proc/sys/kernel/pid_max
2.  Type:
$ cat &
[1] 29222
$ kill -9 29222
3.$ sudo sysctl kernel.pid_max=24000
$ echo 24000 >  /proc/sys/kernel/pid_max # This must be done as root
$ cat /proc/sys/kernel/pid_max
4.$ cat &
[2] 311
$ kill -9 311

Please Note

Note that when starting over, the kernel begins at PID=300, not a lower value. You might notice that assigning PIDs tonew processes is actually not trivial; since the system may have already turned over, the kernel always has to check when generating new PIDs that the PID is not already in use.  The Linux kernel has a very efficient way of doing this that does not depend on the number of processes on the system.


知識チェック

「第25章 - カーネル サービスと構成」を完遂しました。おめでとうございます。このクイズに答えて、これまでに学んだ概念の理解度をチェックしてください。

クイズ開始

問題 25.1
この章では、カーネル構成をチューニングする2つの方法について説明しました。カーネル コマンド ラインでは起動オプションを指定できますが、sysctlを使用するとランタイム時にオプションを指定できます。次のうち、ランタイム時に指定できるオプションを選択してください。

A. IPフォワーディングを有効にする
B. ルート デバイスを読み取り専用でマウントする
C. 指定した論理ボリュームのルート ファイルシステムをアクティブ化する
D. PID番号の最大値
E. DM RAID検出を無効にする
F. システム言語を選択する
G. シングル ユーザー モードで起動する


