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
ちゃんと動いた.