ユーザーモードエミュレーションqemu を使って Kono on Debian のイメージを Host PC で apt-get とかする

Kobo on Debian ですが，ストレージがmicroSD のせいかよくイメージが壊れてしまいます．そのたびに書き込みなおして設定を行ってというのは大変です．ということで Kobo on Debian のイメージをホストのLinux マシンでマウントしてユーザーモードqemu を利用して apt-get したりする方法の紹介です．

ここではhost pc に Debian jessie を利用していますが，wheezy や Ubuntu 13.10 なんかでも全く同じように動作しそうです．
（他のディストリビューションでも大丈夫でしょうがパッケージ名などが異なると思われます．）

qemu-user-static パッケージを導入

先ず，ユーザーモードqemu のパッケージを導入します．これで，別のアーキテクチャのバイナリをユーザーモードで動作させることが出来ます．

% sudo apt-get install qemu-user-static

パッケージの中を見ると以下のアーキテクチャが動作するようです．

% dpkg -L qemu-user-static
/usr/bin/qemu-mipsn32-static
/usr/bin/qemu-or32-static
/usr/bin/qemu-mips-static
/usr/bin/qemu-m68k-static
/usr/bin/qemu-ppc64-static
/usr/bin/qemu-sparc-static
/usr/bin/qemu-i386-static
/usr/bin/qemu-armeb-static
/usr/bin/qemu-mipsn32el-static
/usr/bin/qemu-ppc-static
/usr/bin/qemu-ppc64abi32-static
/usr/bin/qemu-mipsel-static
/usr/bin/qemu-arm-static
/usr/bin/qemu-x86_64-static
/usr/bin/qemu-sh4-static
/usr/bin/qemu-mips64el-static
/usr/bin/qemu-sparc64-static
/usr/bin/qemu-unicore32-static
/usr/bin/qemu-sh4eb-static
/usr/bin/qemu-microblazeel-static
/usr/bin/qemu-microblaze-static
/usr/bin/qemu-mips64-static
/usr/bin/qemu-cris-static
/usr/bin/qemu-sparc32plus-static
/usr/bin/qemu-alpha-static
/usr/bin/qemu-s390x-static

ディスクイメージをマウント

Kobo on Debian のイメージを loopback mount します．イメージは複数パーティションなので，fdisk コマンドでパーティション情報を確認して mount 時に offset を指定します．

% /sbin/fdisk -l -u ./2013-08-17_kobo_debian.img

Disk ./2013-08-17_kobo_debian.img: 8014 MB, 8014266368 bytes
255 heads, 63 sectors/track, 974 cylinders, total 15652864 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000aad1a

Device Boot Start End Blocks Id System
./2013-08-17_kobo_debian.img1 19456 10506239 5243392 83 Linux
./2013-08-17_kobo_debian.img2 10506240 14698495 2096128 b W95 FAT32
./2013-08-17_kobo_debian.img3 14698496 15652863 477184 82 Linux swap / Solaris

今回利用したいのは1つめのパーティションの ./2013-08-17_kobo_debian.img1 19456 10506239 5243392 83 Linux 部分です．
先頭ブロックは 19456 で，ブロックサイズは 512 なので， 19456*512 = 9961472 が offset になります．（若しくは expr 19456 \* 512 とかしても判りやすいかもです．）

% sudo mount -o loop,offset=9961472 ./2013-08-17_kobo_debian.img /mnt

これで 2013-08-17_kobo_debian.img の第1パーティションが /mnt にマウントされました．

ユーザーモードエミュレーションQEMU コマンドをコピーする

Kobo on Debian 部分を chroot で利用したいので，ユーザーモードエミュレーションQEMU コマンドをイメージ内にコピーします．
マウント時に /usr/bin になる部分にコピーします．

% sudo cp -p /usr/bin/qemu-arm-static /mnt/debian/usr/bin

chroot してapt とかする

イメージを chroot して apt とかしてみます．

% sudo chroot /mnt/debian /bin/bash
# vi etc/apt/sources.list

名前解決に失敗するので，nameserver を設定します．以下は Google の 8.8.8.8 を指定した時の例です．chroot 前に host のresolv.conf を cp しておいてもいいかもしれません．

# cat <<__EOF__> /etc/resolv.conf
> nameserver 8.8.8.8
> __EOF__
# apt-get update
:

後は普通に設定していきます．
設定が終了したらexit コマンドで chroot を抜け，umount コマンドでアンマウントします．

RaspberryPi の Rasbian イメージでも行けるだろうと思って試したのですが，失敗してしまいました．解決したいところです…．

ADD: その後やり直したらうまく行った