2010年04月22日

kexecシステムコールでLinuxそのものをLinuxのブートローダとして使う

サンフランシスコで開催されたELC(Embedded Linux Conference)で聴いてきた面白いセッションを紹介します。

ELCのスライドのページのMagnus Damm さんの"Kexec - Ready for Embedded Linux? " を見てください。


そもそものきっかけは彼が手に入れた評価ボードにEthernetがなくて、USBでしかホストとつなぐことができないことでした。

Linuxを起動するのにSDメモリカードを抜き差ししてそこにカーネルのイメージを書き込まなければならない。いったんカーネルがブートしてしまえば、Ethernet over USBの機能を使うことができます。

このボードでネットワーク経由でカーネルをブートしようとしたら、普通ならばubootにEthernet over USBのためのドライバやプロトコルスタックを移植することになります。でもそれはなかなか大変な作業。そもそもLinuxカーネルではすでにEthernet over USBが動いているのに、同じ機能を別の環境で作り直すのは無駄な作業に思えます。

一方、Linuxにはkexecというシステムコールがあります。これは任意のカーネルイメージに任意のカーネルオプションをつけてリブートするためのものです。サーバの世界で障害からの自動復帰などで使われるそうです。

彼が考えたことは、このkexecシステムコールを使えばネットワーク経由でのカーネルのブートが可能なので、ブート専用に余計なものをはずしたコンパクトなカーネルイメージを作れば、それをブートローダとして使えるのでは? ということです。


ubootでSDメモリカードから小さなカーネルをブートし、その小さなカーネルがネットワーク経由で本来のカーネルをブートするという多段式になります。ネットワーク経由でブートしたいのは開発の時ですからこれで充分です。これで今ビルドしたカーネルを(SDメモリカードの抜き差しをせずに)すぐに起動してみることができます。

ユーザーランドのファイルは最小限にしてinitramfsにまとめて、カーネルのイメージとパッキングします。発表資料によれば、最初は4MBのサイズだったのが、いろいろと最適化を重ねて、1MBのサイズまで小さくすることができたそうです。一昔前ならば、1MBのサイズのブートローダって有り得なかったと思いますが、今ならSDメモリカードやNANDフラッシュというGBクラスのストレージが利用可能なので、サイズは特に問題になりません。

ブート専用にするために、不要な部分を削っていくノウハウも他に使い道があると思います。ぜひwikiで共有したいですね。





トラックバックURL

コメント一覧

1. Posted by oku   2010年04月25日 18:07
PS3-linuxではOpenWrtなLinuxをそのままブートローダとして使ってたりします(petitboot)。
telnetやviが普通に使えるので地味に便利ですが、起動にちょっと時間が掛かるのが玉に瑕。
2. Posted by koba   2010年04月27日 20:16
okuさん、コメントありがとうございます。
開発の時にはソース修正、コンパイル、動作確認を繰り返すことになるので、手間が減らせるブートローダは重要ですよね。

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード