カーネルについて
LinuxはOSの名前であるが、厳密に言えばカーネルの名前となる。カーネルとは文字通りOSの核となるファイルの事で、各種コマンドは、カーネルを通して実行される。
コマンドが動く仕組みだが、コマンドがカーネルに対し実行して欲しい処理を依頼して、カーネルに実行してもらうことになる。カーネルは実行結果をコマンドに返して、コマンドはあたかも自分が実行したかように結果を表示する。このようにバックでカーネルが処理を実行しているのだ。コマンドがカーネルに処理を依頼することを、システムコールと呼ぶ。
Linuxカーネルのファイルはどこに保存されているのかといえば、/bootの中のvmlinuzというファイル名で保存されている。ls -lをしてvmlinuzファイルを見てみると、vmlinuz5.4.0.80-genericのシンボリックリンクとなっている。大元のvmlinuz5.4.0.80-genericファイルも、vmlinuzがある同じディレクトリ配下に存在している。
また、同一ディレクトリ配下に、vmlinuz.oldという名のファイルも存在している。このファイルもまた、vmlinuz5.4.0.80-genericのリンボリックリンクとなっている。oldという拡張子がついてるということは、恐らく、vmlinuzのバックアップリンクの役割だと思われる。カーネルファイルが壊れた場合、このoldファイルをリネームして、拡張子を取れば復旧できるようになっているものと思われる。
vmlinuzだが、拡張子はついていないが、fileコマンドで詳細を表示してみると、bziImageという形式のイメージファイルであることが確認できる。OSを起動したときに、ブートローダーがこのvmlinuzファイルを、メモリ上にロードすることでOSは起動される。そしてブートローダーを起動するのは、マザーボード上に組み込まれている、BIOSもしくはUEFIというファームウェア。カーネルがロードされるメモリ空間のことをカーネル空間と呼ぶ。また、vmlinuzの後についている5.4.0.80-genericは、カーネルのバージョンを指している。
ls -lhで、vmlinuzの容量を確認してみると、12Mであることが分かる。重要なファイルである割には、随分と軽いファイルになっている。実は軽い方がOSの起動が短時間で済むため、あえて軽くしているのだ。カーネルファイルを軽くできる理由は、本来、カーネルに含まれていた機能をモジュールとして別ファイルにして外部に出しているためだ。そして、モジュールはカーネルが起動されたとき、カーネルの中に一緒に組み込まれることで動作するようになっている。各種モジュールファイルは、/lib/modeulesの配下に格納されている。/lib/modeulesの配下をみると、5.4.0.80-genericという、カーネルのバージョン番号であらわされたディレクトリが1つだけ存在している。そのディレクトリの中にたくさんのモジュールが格納されていることが確認できる。カーネルのバージョンを表示するコマンドはuname -r。実行すると、5.4.0.80-genericと表示される。OSのバージョンはUbuntu20.4なので、OSのバージョンとカーネルのバージョンは全く関連性がないことになる。
ls -lでモジュールが保管されているファイルの一覧を表示するには、ls -l /lib/modeules/5.4.0.80-genericとなるが、**ls -l /lib/modeules/uname -r
**というコマンドを使って応用することができる。これはちょっとしたテクニック。
OS起動時にカーネルに組み込まれたモジュールの一覧を表示するコマンドがある。それがlsmodコマンド。
vmlinuzは起動した後は、ディレクトリの大元である、ルート(/)のファイルシステムをマウントして、各種サービスを起動する大元のプログラム、/sbin/initを起動して、準備OKとなる。