vmlinuzの概要だけ把握する
Linux用のブートローダーをいじっているとvmlinuz
という謎のファイルに出会うことがある。vm
もlinuz
も意味がわからない。(virtual machineじゃないだろうし。)
というわけでこの記事ではvmlinuz
について調べていく。
そもそもなに
vmlinuz
またはvmlinux
は、静的リンクされた実行ファイルとしてLinuxカーネルを格納したもの。ファイル形式はELFやCOFF、a.outなど、Linuxのサポートするオブジェクトファイルの形式がとられる。
このファイルはカーネルデバッグなどにも使われるが、OSとして使用される前にはmultiboot headerやbootsectorなどを追加してブート可能にする必要がある。
名前の由来
伝統的にUNIXのプラットフォームではkernelイメージは/unix
と呼ばれていた。仮想記憶 (virtual memory) の発展と共に、この機能をサポートしたカーネルはvm
プレフィックスをつけて区別された。つまりvmunix
である。vmlinux
はこれのLinuxバージョンである。これが圧縮されたものがvmlinuz
と呼ばれた。z
はzipped
を由来とする。
ファイルの置き場所
このファイルは昔からファイルシステム階層のルートディレクトリ/
に置かれてきた。しかしブートローダーはBIOSドライバーを使ってハードディスクにアクセスしなくてはならないため、いくつかのi386システムではハードディスクの最初の1024シリンダーしかアクセスできないという制限があった。
このためLinuxでは、ハードドライブの始めにパーティションを作り、そこにブートローダーとカーネル関連ファイルを置くことが推奨された。慣習的にこのパーティションはファイルシステムの/boot
にマウントされ、後にFilesystem Hierarchy Standard (FHS)によって標準化された。
このFHSによって現在、Linuxカーネルイメージを/
か/boot
のどちらかに置くことが要求されるが、すでに技術的制約はない。
圧縮
ブート可能なカーネルイメージを作る際はgzipか、Linux 2.6.30以降はLZMAかbzip2によって圧縮されていた。bzImage (次項参照) 開発以前は、いくつかのアーキテクチャ、特にi386では、サイズ制限がとても厳しかったため圧縮が必須だった。
bzImage
Linuxカーネルの開発が進んでいくにつれてサイズが大きくなっていき、カーネル格納用のサイズ制限があるアーキテクチャにおいてその制限を超え始めた。この状況を克服するため、不連続なメモリ領域にカーネルを分割するbzImage (big zImage) フォーマットが開発された。bzImageのビルドや構成についてはここが詳しい。
この記事の最初の列挙したファイル形式 (ELF, COFF, a.outなど) に加えてbzImageも実際のvmlinuz
のファイル形式として使われているっぽい。私の環境ではbzImageのvmlinuzが使われていた。
まとめ
vmlinuz
はLinuxカーネルの実行ファイル。vm
は"virtual memory"で仮想記憶の機能を備えていることを、z
は"zipped"でファイルが圧縮されていることを示している。
Discussion