2008年11月20日(Thu) いい天気だが嵐が来るのだそうだ [長年日記]
● [DocoMomo] qemuでブートできるディスクのイメージをつくる (成功編)
フラッシュメモリに書き込まずにDocoMomoを試したいと思いついて幾星霜(というほどでもないけれど)、 grubにinstallしてもらうにはBIOSがディスクのことを知ってないといけないと気づいて*1、 自分でディスクのイメージを組み立てることにしました。
stage1のイメージをディスクの最初に起くべきなのは知っていたのですが、 それだけでは、 画面じゅうGRUBで埋め尽される。 stage1.5があればディスク上の位置ではなくファイルシステム内のパスからstage2を探せそうだとわかっても、 素のstage1からstage1.5を起動できない。 いっぽう、GRUBでブートするためのフロッピーのイメージを作るには、 stage1とstage2をただ連結すればいい*2のだけれど、 stage2はでかすぎてハードディスクのMBR直後の空き領域には入らない、 という問題がありました。
LinuxにおけるMBRのまとめとバックアップ方法 - adsaria moodなどを参考にさせていただきつつ やっと閃いたのは、qemu専用にディスクのイメージをつくるからこそできる方法で、 でかいstage2をstage1の直後に置いて、そこにはファイルシステムの入ってるパーティションを起かないようにするという方法でした。 普通のインストール方法でこれを使うときっとインストーラが0シリンダ目からパーティションを切っちゃってstage2の場所がなくなる。
というわけで、fat16のパーティションにkernelとinitrdを置いてqemuの中でrun level 1まで行けるように確認できたのが下記のスクリプトです。
ポイントはsfdiskへの入力でパーティションのはじまりが0ではなくて1のところ。この途中で$(tmp_dir)/qemu-hd0-2.imgをループバックマウントしてkernelとinitrdを入れてやりました。
こういうパズルは楽しいです。マニュアルとコード読め、と言われそうだけど。
で。この記事を書きつつ自分のメモをふりかえって見ると、Re: Installing grub into the mbr of a disk imageより、実は、
でGRUBに、BIOSが知らないハードディスクイメージにインストールをしてもらえる?うーん…まあ頭の体操、ということで。(hd3)の数字だってマシンによってどこまで増やせばいいかわからないしね、ね。
● [run] CSO+76+行き止まり+CSO延長 1時間02分43秒
新しい靴。すげい呼吸器リミット。少し皮膚消化器リミット。
汚い話でもうしわけないけれど、どばっと痰が出た。これで体調が良くなると良いのだけれど。
● sedとかgrepとかの速度
DocoMomoのためのRPMパッケージのダウンロードが全然進まないので試してみた。
sed-4.1.5-1m.mo4、grep-2.5.1a-1m.mo4、ruby-1.8.6.111-4m.mo4、perl-5.8.8-14m.mo4。 検索対象はビデオカメラを選ぶ時にサンプルとしてダウンロードしたMP4のファイル(13MB)。 下記のようなコマンドでuser時間を記録した。
1回ずつしか試してないけど。今回使ったファイルではどのやりかたでも「hello」の含まれる行はみつからなかった。
LANG | C | ja_JP.EUC-JP | ja_JP.UTF-8 | en_US | en_US.UTF-8 |
---|---|---|---|---|---|
grep | 0.01 | 0.97 | 1.06 | 0.01 | 1.06 |
sed | 0.10 | 1.38 | 1.04 | 0.10 | 1.06 |
ruby | 0.15 | 0.14 | 0.15 | 0.15 | 0.15 |
perl | 0.13 | 0.13 | 0.13 | 0.12 | 0.12 |
sedもgrepも文字コードに依存して速度が違う。 言語には依存してないみたい。 perlとrubyでは文字コードや言語による違いは無かった。
pythonは同等なワンライナーをすぐに思い付けなかったので無し。スミマセン。
(追記) ときどきの雑記帖 i戦士篇より、sedやgrepは「マッチングの際にバイト文字列をワイド文字に変換しながら、 ワイド文字基準で動作する」のだそうです。変換する分だけ遅くなる、と、「食わせたデータバイナリ(MP4)なんですね。 だとすると、上の説明にある mbrtowc で変換エラーを頻発しているはずなので 信頼性にちょっとかけるデータかも」。あう。そうですね。何か良いテキストファイルはないかな…。それはそうと、Pythonはロケールによっては起動するときに読み込むモジュールが増えるので起動が遅くなる、という実験をしたことがあったような気がしたのですが、なんだか曖昧な結論しか残ってませんでした。3年前のPythonだし、今は違うのかも。
デバイスの番号はBIOSの起動時に合わせるだけです。grub shellに任せるのが絶対楽です。<br><br>ちなみに、私がGRUB2の開発で使っているシェルスクリプトはこんな感じです。コメント多くてすみません。<br><br>#! /bin/sh<br><br>#file=$HOME/hobby/grub2/objs/floppy.img<br>file=$HOME/hobby/grub2/objs/hd.img<br><br>make || exit 1<br>./grub-mkimage -d . -v -o core.img biosdisk _chain ext2 pc gpt<br>parted -s hd.img mklabel msdos<br>parted -s hd.img mkpartfs primary ext2 0 10<br>#mkdosfs $file<br>#mke2fs -F $file<br>#sudo mount -o loop -t ext2 $file /mnt/loop<br>sudo mount -o loop,offset=16384 -t ext2 $file /mnt/loop<br>sudo mkdir -p /mnt/loop/boot/grub<br>sudo cp boot.img core.img *.mod moddep.lst command.lst fs.lst /mnt/loop/boot/grub || exit 1<br>#test -f grub.cfg && gzip -c grub.cfg | sudo dd of=/mnt/loop/grub.cfg.gz<br>test -f grub.cfg && sudo cp -f grub.cfg /mnt/loop/boot/grub<br>#sudo ./grub-setup -d /mnt/loop/boot/grub -v -r '(fd0)' -m device.map '(fd0)'<br>sudo ./grub-setup -d /mnt/loop/boot/grub -v -r '(hd0,1)' -m device.map '(hd0)'<br>sudo umount /mnt/loop
最近のツッコまれどころ