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