MBAのSDカードスロットを使ってRaspberryPI用のSDカードにGentooがインストールされたディスクイメージを書き込む方法

私のGentooマシンにはSDカードスロットがついてなくて,RaspberryPIのためだけに買ってくるのもなんなので,MBAについているSDカードスロットを使って書き込みを行おうと思った.しかしOSXの/sbin/fdiskはutil-linuxのそれとは全く使い方が違って使いたくなかったし,そもそもGentooマシンのほうがいろいろやりやすいので,OSX上でインストール作業をするのは諦めて,ディスクイメージを作ってからそれを丸っとSDカードに書き込む方法をとることにした.

# SDカードと同じサイズのディスクイメージを作る.512はセクタサイズ,30881792はセクタ数
$ dd if=/dev/zero of=sdcard.img bs=512 count=30881792
$ /sbin/fdisk sdcard.img
# 普通にパーティショニングする.3番目のパーティションを30881758にしているのは,SDカードのlast usable sectorがそこまでだから.
...
Command (m for help): p

Disk sdcard.img: 15.8 GB, 15811477504 bytes, 30881792 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: 0x9160bad5

     Device Boot      Start         End      Blocks   Id  System
sdcard.img1            2048      835379      416666    c  W95 FAT32 (LBA)
sdcard.img2          835584     2932735     1048576   82  Linux swap / Solaris
sdcard.img3         2932736    30881758    13974511+  83  Linux

# ディスクイメージの各パーティションをdevice-mapperでfsにマップしてやる.これで普通のブロックデバイスのパーティンションが如く扱える.
$ sudo kpartx -a sdcard.img
$ ls -l /dev/mapper
total 0
crw------- 1 root root 10, 236 Apr 27 21:34 control
lrwxrwxrwx 1 root root       7 Apr 30 13:23 loop0p1 -> ../dm-0
lrwxrwxrwx 1 root root       7 Apr 30 13:23 loop0p2 -> ../dm-1
lrwxrwxrwx 1 root root       7 Apr 30 13:23 loop0p3 -> ../dm-2

# 諸々physical fsを作ってやる
sudo mkfs.vfat -F 16 /dev/mapper/loop0p1
sudo mkswap /dev/mapper/loop0p2
sudo mkfs.ext4 /dev/mapper/loop0p3

# mountする
sudo mkdir -p /mnt/raspberrypi/boot
sudo mount /dev/mapper/loop0p3 /mnt/raspberrypi
sudo mount /dev/mapper/loop0p1 /mnt/raspberrypi/boot

# 普通にGentooとRaspberryPIのファームウェア系をインストールする
$ cd /mnt/raspberrypi/
...

# umountしてdevice-mapperの解放
sudo umount /mnt/raspberrypi/boot
sudo umount /mnt/raspberrypi/
sudo kpartx -d /dev/loop0
# ループバックデバイスのアロケーションはkpartxが勝手にやってくれるが,
# 解放はしてくれないので自分でやる.
$ /sbin/losetup -a
/dev/loop0: []: (/home/kawamuray/sdcard.img)
$ sudo /sbin/losetup -d /dev/loop0

# SDカードにMBA経由で書き込む
$ ssh -C <MBA address> sudo dd if=/dev/stdin of=/dev/disk2 bs=512 count=30881792 < sdcard.img

ちゃんと動いた.