この記事はBitVisor アドベントカレンダー17日目として日付変更直前に慌てて書いて,慌てて投稿して,アドベントカレンダーに登録しようとしたら,17日目が埋まったので,もちょっとまともにしてからアドベントカレンダーに登録しようと思っている記事です.
Qiita では一度投稿してしまったブログをドラフトに戻すのが面倒そうなので,公開状態のまま編集します.
どうしてこうなった?
いやですね,アドベントカレンダーで書いた記事がわりと小ネタばっかりなので,そろそろ,ちょっとかっこいいことしたいなーなんて思ったわけですよ.
で,BitVisor でも Linux みたいなブートオプションを指定できるようにしたいなーなんて思ったわけで.
「Linux みたいなブートオプション」を実装したいわけなので,まぁ,Linux のコードを読んでみる.
僕の記憶が正しければ,Linux では,起動の初期段階でメモリのどこかから,オプションの文字列を拾ってきて,それをパースすていた気がする.
この「メモリのどこか」がわかって,それをBitVisorからでも取れればOKだよね,と思って読んだり調べたりし始めたんだけど...
...Linux のブートローダのコード読むのって思った以上に難しいのね.
それでも読んだり調べたりしてたら,
Linux と GRUB は結構,癒着しているみたいで,それと同じ方法でブートオプションを渡すのは厳しいかなーという感じがしてきました.
「あれ,これLinux と同じ方法はBitVisor じゃ使えなくない?」ってなったんですよ.
BitVisor は Grub から起動するときは,multiboot
コマンドでブートしますが(linux kernel
とか linux
コマンドでロードしてboot
で起動だったかな) ,この時はどういうブートプロトコルになってたか.
そもそも multiboot コマンドでブートオプションって渡せたっけ...?
といったことを調べてたら,時間がなくなったので,今まで自分が発表した資料などを載せてちょっと説明書くことにした.
Multiboot Specification Ver. 2 を読んでみる(メモ, 2015/12/18 頃から随時追記)
僕らの味方 OSDev さん ( http://wiki.osdev.org/Multiboot ) 曰く
http://git.savannah.gnu.org/cgit/grub.git/tree/doc/multiboot.texi?h=multiboot2 がMultiboot Specification Ver. 2 のドキュメントらしい.
Textinfo ファイルやんけ...
読むために
読みやすいようにPDF にするまでの軌跡は以下
$ git clone http://git.savannah.gnu.org/r/grub.git
$ cd grub
$ git checkout -b multiboot2 origin/multiboot2
$ emacs doc/multiboot.texi
diff --git a/doc/multiboot.texi b/doc/multiboot.texi
index 4b92918..134a23c 100644
--- a/doc/multiboot.texi
+++ b/doc/multiboot.texi
@@ -358,6 +358,7 @@ executable header.
* Address header tag::
* Console header tags::
* Module alignment tag::
+* EFI boot services::
@end menu
$ autogen.sh
$ ./configure
$ make
$ cd doc
$ texi2pdf multiboot.texi
読んでみる
- Boot Loader さんは EBX にいろんな情報が入った構造体的なものを指す物理アドレスを入れてくれることになっているらしい.
過去の記事の解説など
僕の考えたさいきょーのVMM開発環境
http://www.slideshare.net/DeepTokikane/k-vm-slide-1
実際に僕が開発に使っている環境です.
ブートの流れは
- リモートからマシンの電源を操作(IPMIじゃないよ,RasPIで電源ピン叩くよ!)
- iPXE で iSCIS 接続, BitVisor ロード&起動
- Grub からLinux を起動(ブートローダ,カーネルはiSCSI 上のもの)
- シリアルコンソール経由でLinux のシェルとこんにちは
- BitVisor のログはネットワークへのログ出し
いろいろ組み合わせてます.
これで,シリアルケーブルとネットワークをつなげてある,sshログイン可能な開発用マシンを用意すると,開発やデバッグをすべてssh越しでできるという自慢の開発環境です.
iPXE でネットワークブートする方法は下記ページに昔書いてみました(DHCPサーバの設定が間違っているという噂があったりしますが...)
http://tokikane-tec.blogspot.jp/2015/02/ipxe-bitvisor.html
ネットワーク経由でログを出す方法は
http://qiita.com/deep_tkkn/items/ee6563aafb0d33de8450
syslogでかっこよくログを取りたい方はこっちかな
http://qiita.com/hdk_2/items/2431710fcf257904fc8a
ライブマイグレーション実装で体験したデバッグの解説
これはつい最近,BitVisor Summit 4 で話した内容です.
BitVisor で何か実装していると,何もログ出さずに(panic さえせずに)固まることがたまによくあるので,そういう事例を集めて解説してみた発表です.
おわりに
やっぱり BitVisor でブートオプション渡したいので,詳しい人教えてほしい.