🤐

vmlinuzの謎をさぐる

2022/09/20に公開約2,300字

Linux用のブートローダーをいじっているとvmlinuzという謎のファイルに出会うことがある。vmlinuzも意味がわからない。(virtual machineじゃないだろうし。)

というわけでこの記事ではvmlinuzについて調べていく。

そもそもなに

vmlinuzまたはvmlinuxは、静的リンクされた実行ファイルとしてLinuxカーネルを格納したもの。ファイル形式はELFやCOFF、a.outなど、Linuxのサポートするオブジェクトファイルの形式がとられる。

このファイルはカーネルデバッグなどにも使われるが、OSとして使用される前にはmultiboot headerbootsectorなどを追加してブート可能にする必要がある。

名前の由来

伝統的にUNIXのプラットフォームではkernelイメージは/unixと呼ばれていた。仮想記憶 (virtual memory) の発展と共に、この機能をサポートしたカーネルはvmプレフィックスをつけて区別された。つまりvmunixである。vmlinuxはこれのLinuxバージョンである。これが圧縮されたものがvmlinuzと呼ばれた。zzippedを由来とする。

ファイルの置き場所

このファイルは昔からファイルシステム階層のルートディレクトリ/に置かれてきた。しかしブートローダーは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

ログインするとコメントできます