おまぬけ活動日誌

最近のツッコまれどころ

この日誌から Google してもらう


2008年11月25日(Tue) Windowsムービーメーカーで遊ぶ [同日]

[memo] grub legacyのstageファイルの検索順

DocoMomoで遊んでいてMomonga 4のgrubのブートローダをホストに仕込んでしまったようだ。こうなると、grub.confが使われなくなる(のでメニューが表示されずカーネルなどの場所を自分でタイプしないといけない)し、Momonga 5のext3はi-nodeが大きいのでMomonga 4のブートローダではkernelをロードできない。

よく見てみると、いろいろなOSから/bootとして使っているパーティションには中にもう一段/bootというディレクトリがあることがわかった。Linuxのインストール時の設定によって/bootが作られたり作られなかったりするのだろう。grub shellからこのパーティションをrootとしてsetupすると、grubはまず/boot/grub/stage1を探して、それが無い場合には/grub/stage1を探すようになっているみたい。手元では、/boot/grub/以下には古いgrub legacyが入ていてMomonga 5のext3パーティションは読めないようだった。Momongaのインストーラから起動してCtrl+Alt+F2で得られたshellから、このパーティションの/bootを消した(実際には/boot-nouseにmvした)ら、/grub/stage1が使われるようになって、元の通りgrubのメニューも表示されるようになったし、Momonga 5のパーティションも読めるようになった。

そういえばDocoMomoのためのディスクイメージづくりはまだ試行錯誤してます。ずいぶん前にokujiさんにアドバイスいただいたのにお恥しい限り。

(追記) 再びokujiさんにツッコミをいただいてしまいました。 ほんとうにありがとうございます。

そうですよね。grub shellの中で--prefixが使えるのを忘れてました。 もっと書くと、Momongaのインストーラを起動するまでもなく、 stage2が起動できた段階でこの方法が使える。試してみました。

まず古いgrubにしてみる。Momonga 5も起動できるgrubでstage2まで起動し、 メニューが表示されてからcでgrub shellに入り、

grub> root (hd0,1)
grub> setup --prefix=/boot-nouse/grub (hd0)
 Checking if "/boot-nouse/grub/stage1" exists... yes
 Checking if "/boot-nouse/grub/stage2" exists... yes
 Checking if "/boot-nouse/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot-nouse/grub/e2fs_stage1_5 (hd0)"... 15 sectors are embedded.
succeeded
 Running "install /boot-nouse/grub/stage1 (hd0) (hd0)1+15 p (hd0,1)/boot-nouse/grub/stage2 /boot-nouse/grub/gurb.conf"... succeeded
Done.

これでCtrl+Alt+Delを押すと、期待通りメニューの無いgrubが起動しました。 Momonga 5のkernelを読もうとすると、

grub> kernel (hd2,5)/bo<ここでTabキーを押す>
Error 2: Bad file or directory type

うむ。期待通り :) では戻す。

grub> root (hd0,1)
grub> setup --prefix=/grub (hd0)
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"... 24 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+24 p (hd0,1)/grub/stage2 /grub/gurb.conf"... succeeded
Done.

stage1.5が少し大きくなったのかな。Ctrl+Alt+Delで、Momonga 5も 起動できるGRUBに戻りました。

こういう動作ってドキュメントか、あるいはコード読めばすぐわかるはずなのにね。 うまくいっているときには看過しちゃうものですね。お恥しい。 まあ似たような人は多いと思うので、 DocoMomoが一段落したら、 このあたりの知識を何かまとまった文書にまとめたいものです。

[n810] Motorolaケータイ用のmicro>>mini-B変換ケーブルを試す

変換ケーブルN810にHHKをつなぐ計画の続き。前回の追記にも書いたようにTTYSSTDでMotorolaケータイ用の変換ケーブルが使える、という情報をいただいて先日買ってきました。Wal☆MartにもOffice MaxにもVerizonの携帯屋さん*1にもありませんでしたが、T-Mobileの携帯屋さんで発見。おねえさんがバックオフィスに中古品が無いか確認しにまで行ってくれましたよ、ありがとう。

モノは「Charging Adapter/Compatible with Motorola RAZR V8」で、箱の裏には「Allows you to charge your Micro-USB compatible device with a Mini-USB (EMU) charger」とあります。T-Mobileの商品番号はSUPM93367、変換ケーブルのMini USB側に刻印された番号はSKN6252A。Micro USB側にはホログラムのステッカーが貼ってあってAHADB097と書いてあります。えーと…充電だけ?不安なのでまずはデータ通信ができることだけ確かめます。この変換ケーブルをN810に挿し、Mini-USBコネクタを、この前買ったUSBハブの変換ケーブルを通してノートPCにつなぎました。

すると期待通りN810のSDカードがPCから外部記憶装置としてマウントされました。よかった。データのやりとりもできる。

次はPD-KB400Wに挿せるMini USBコネクタを入手する必要があるんだけれど、はたして上記のUSBハブの変換ケーブルを使っちゃっていいものかどうか…。ちょっと考えよう。

*1 店員さんはmicro USBコネクタを知らないらしく「こいつ何言ってんの?」と軽くあしらわれ、普通のUSBに挿すデータ通信用の端末を薦められちゃいました。もーいかねー。

[run] CSO+76+行き止まり+CSO+坂の登り途中まで 1時間04分07秒

GT-2090、少しだけ皮膚リミット。

非常にご無沙汰の筋力リミットでした。乳酸ばんざい!走る20分ほど前から水をがぶ飲みしたのも奏功したか最後まで汗が出続けてくれました。今日は有意義な会議があったのも良かったかしらん。明日から距離を増やそう。

途中、三輪乳母車をすごい速度で押しながらジョギングしてるお母さん(またはベビーシッターのおねえさん)を追い越しました。ぜったい僕より体力を使ってるよ。すごいなあ。

しかし本番は目前なのでありました。

[n810] USBの規格

ケーブルづくりに必要な情報。 USB.org - Documentsから 規格書「Universal Serial Bus Revision 2.0 specification」(zipファイル) がダウンロードできる。ありがたい。

usb_20.pdfの113ページ Figure 6-1によれば、 「A」プラグ(ケーブルの先)は必ずホストの方向を向いていて、 「B」プラグは必ず周辺デバイスの方向を向いている。 これはいつまでたっても覚えられない。

Micro USBについては、Micro-USB_final/Micro-USB_1_01.pdfに記載されている。 の10ページ Table 4-2によれば、Micro-Aのプラグのピン配置と配線の色は下記の通り。

Contact NumberSignal NameTypical Wiring Assignment
1VBUSRed
2D-White
3D+Green
4ID<Ra_PLUG_ID
5GNDBlack
ShellShieldDrain Wire

Micro-Aの場合は4ピンはGNDにつなぐ。 Micro-Bの場合はフロートにするか100KΩ以上の抵抗を介してGNDにつなぐ。 On-The-Goデバイスは4ピンとGNDの間の抵抗が10Ω以下ならMicro-Aがつながれていると、 それより大きいならMicro-Bがつながれていると判断する。

11ページ Table 4-3より、Micro-Aプラグの中のプラスティックの色は白、 Micro-Bプラグの中の色は黒じゃないといけない… 今はMicro-BプラグをMicro-Aプラグに改造するから、これは違反するしかないね :)

Mini USBについては、ecn1-usb20-miniB-revd.pdfかな。 今は、えーと、Mini-Bが必要で、まっかっかな16ページ Table 6-2によれば ピン配置と配線の色は下記の通り。

Contact NumberSignal NameTypical Wiring Assignment
1VBUSRed
2D-White
3D+Green
4IDnot connected
5GNDBlack
ShellShieldDrain Wire

って、Micro-Bと同じなんですね。

そうそう、ついでに、Mini-Bの材料にするMini syncのケーブルの配線の確認のために Standard-Aのピン配置と配線の色も確認しておこう。usb_20.pdfの 122ページ Table 6-1より、

Contact NumberSignal NameTypical Wiring Assignment
1VBUSRed
2D-White
3D+Green
4GNDBlack
ShellShieldDrain Wire

これはMini/microから4ピンを除いたもののようでした。 さーて。いつ手を動かせるかな♪

[DocoMomo] GRUB 2のgrub-setupの-dオプションの動作

okujiさんに知らせていただいたgrub-setupコマンドは、-dオプションでインストールする元になるgrubのイメージファイル(GRUB legacyでstage1やstage2などに相当するものだろう)の入っているホストOSでのパスと同時にインストール先のデバイスを指定しているように見えます。 さもなければoffset=16384としてパーティションの内部のみをループバックマウントしてるハードディスクのイメージファイルのMBR部分にアクセスできない。

今日はソースコードから追ってみることにしました。GRUB 2のレポジトリのリビジョンは1928です。

grub-setupコマンドのソースコードはutil/i386/pc/grub-setup.cにありそうでした。-dオプションの処理からあたりを付けて追って行くと、

  • util/i386/pc/grub-setup.c:695
  • util/getroot.c:380 stat(2)でディレクトリがあるデバイスのID(st_dev)を取得
  • util/getroot.c:185からのfind_root_device()で/dev以下に同じデバイスID(st_rdev)のファイルを見つける

という順で、デバイスファイル名を追っているようでした。

手元では、

$ stat --printf=%D\\n mnt/boot
700
$ stat --printf='%t,%T\n' /dev/loop0
7,0

んー…struct statのst_rdevに対応するstat(1)の書式指定子がわからない。

というわけでstat(2)を利用するちっちゃなプログラムを書いてみたところ、 確かにmnt/bootのst_devと/dev/loop0のst_rdevが等しい(0x700)ことが確かめられたとさ。

さて。

MBRの部分を読めるのかな。

$ hexdump -C -n 512 tmp/qemu-hd0.img
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 00  |................|
000001c0  02 00 06 1f bf 07 01 00  00 00 ff fe 0f 00 00 00  |................|
000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200
# hexdump -C -s -1032192 -n 512 /dev/loop0
hexdump: bad skip value.

そうだよねえ。負のスキップはできないよねえ。

もう一度grub-setupに戻ってMBRの読み方を教えてもらおう。 util/i386/pc/grub-setup.c:248あたりの、 grub_device_open()とかが怪しそうです。 引数になってるのはコマンドライン引数で指定されたデバイス名かな。 grub_device_open()はkern/device.cで定義されていて、grub_disk_open()を呼んでいます。 この関数はkern/disk.cで定義されていて、grub_disk_dev_listに定義されている関数を呼んでいる。 grub_disk_dev_listへの定義はgrub_disk_dev_register()が、えーと、どこから呼ばれるんだろう。 loopbackマウントしてたらうまいことdisk/loopback.cが使われるのかな? うーん。ちょっと違いそう。

時間切れをだいぶ過ぎてしまったので今宵はここまで。次はgrub-setupを動かしながら考えてみることにしましょうか。

本日のツッコミ(全2件) [ツッコミを入れる]
> okuji (2008年11月25日(Tue) 11:40)

GRUB Legacyの場合、setupに--prefixを指定すれば、好きな所を使えます。GRUB 2の場合、grub-setupに--directoryが利きます。

> zunda (2008年11月25日(Tue) 19:50)

ありがとうございます。GRUB legacyについては試してみて、上記の通り追記しました。GRUB 2については近々試せるといいな。


作り手とその取り巻きだけが楽しんでる間は本物じゃない。その中身が理解できない人々の生活を変えてこそ本物だ


zunda <zunda at freeshell.org>