QEMUには専用カーネルファイルとディスクイメージファイルを与えるのだが、ディスクイメージファイルは自前のRPiの実機のSDカードイメージその物。
ここでちょっと困ったことに気づいた。QEMU用カーネルと実機のカーネルのバージョンが違うのだ。前者は3.10.26+で後者は3.10.24+。自前のディスクイメージファイルには3.10.26+のカーネルモジュールがないので、カーネルモジュールがロードできない。
RPiの公式ダウンロードページに各種ディストロのディスクイメージファイルが掲載されているでの、このディスクイメージファイルに3.10.26+のカーネルモジュールが入っていればそれをQEMUのターゲットファイルシステムにコピーすればよいと考え、我が家のシステムのベースであるRaspbian(Debian Wheezy)をダウンロードする。このディスクイメージは伸長時約2.8GBが約780MBのZIPファイルに収まっている。
さてダウンロードに成功したものの、これはディスクイメージファイルなのでそのままではマウントできない。「loopデバイスを使えば」と言うかもしれないが、「マウント」とはファイルシステムをマウントすることであり、イメージファイルをloopデバイスでブロックデバイスに見せかけても、このディスクイメージファイルは複数パーティションに分かれており、その中のパーティション(=ファイルシステム、この場合)にアクセスできなければマウントできない。一旦SDカード(でも何でも、とにかく物理ブロックデバイスメディア)に書き出して物理的にマウントなどはやりたくない。
例によってぐぐったら見つかった。 ディスクイメージファイルから目的のパーティションの位置を探し、その情報をmountのoffsetオプションに与えればよい。パーティション情報を見るにはpartedを使う(MBRパーティションの場合)。fdiskはバイト単位の表示ができない。
h@spice:~/projects/rpi$ parted 2014-01-07-wheezy-raspbian.img WARNING: You are not superuser. Watch out for permissions. GNU Parted 2.1 Using /home/h/projects/rpi/2014-01-07-wheezy-raspbian.img Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) unit B (parted) print Model: (file) Disk /home/h/projects/rpi/2014-01-07-wheezy-raspbian.img: 2962227200B Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 4194304B 62914559B 58720256B primary fat16 lba 2 62914560B 2962227199B 2899312640B primary ext4 (parted) q h@spice:~/projects/rpi$ sudo mount -o loop,offset=62914560,ro,noload 2014-01-07-wheezy-raspbian.img w/ |
noloadオプションは、マウント時にEXT4のジャーナル情報を無視するためのおまじない。これがないとマウントエラーになりdmesgが「EXT4-fs (loop0): INFO: recovery required on readonly filesystem」と文句を言うことがある(本稿はこちらを参考にした)。なお、当然のことながら、QEMUで使用中のディスクイメージを書き込みモードでマウントするとキャッシュコヒーレンシが崩れてディスクイメージに損傷を与える可能性があるので避けるべし。
実際にダウンロードしたディスクイメージファイルは3.10.25+カーネル用のもので、目的とする3.10.26+は含まれていなかった。目的は達成できなかったが、今のところQEMUで走っているシステムが実際にカーネルモジュールをロードしようとしてはいなさそうなので、これでよしとする。
loopデバイス作成コマンドのlosetupにもoffsetオプションがあるので、これを使えば、例えばパーティションに区切られたディスクイメージファイルからRAIDを再現してマウントなどができそうなことが分かった。
0 件のコメント:
コメントを投稿