2014年4月24日

ディスクイメージファイルをマウントする

Raspberry Pi(RPi)をQEMUエミュレータで走らせている。

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カード(でも何でも、とにかく物理ブロックデバイスメディア)に書き出して物理的にマウントなどはやりたくない。

例によってぐぐったら見つかった。 ディスクイメージファイルから目的のパーティションの位置を探し、その情報をmountoffsetオプションに与えればよい。パーティション情報を見るには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 件のコメント:

コメントを投稿