Raspberry Pi 1 Model B+ に取り付けていた microSD を取り替えるにあたって、ルートパーティションの内容を USB メモリに移動した。USB にルートパーティションを作成する理由は「ただやってみたかったから」。
- 前) 16GB microSD
- 後) 2GB microSD + 16GB USB memory Stick
作業は別のマシンで行う。
一般的(?)に microSD(mmcbulk0)の内容を複製するには dd
を使うことが多い(と思う)が、2GB 程度しか使ってない 16GB のパーティションを dd
でコピーするのは時間の無駄なので cpio
によるコピーを使う。
構成はこんな感じ。まずはルートパーティション用の USB フラッシュメモリから。
/dev/ | +-- sdb/ (2GB microSD) | | | +-- sdb1 (mmcblk0p1 / FAT32) | | | +-- sdb2 (mmcblk0p2 / ext4) | +-- sdc (16GB USB memory stick) | +-- sdd (2GB microSD)
ルートパーティションを独立させる場合、GPT でもマウントできるっぽいので sgdisk
で作成。
sgdisk -Z /dev/sdc sgdisk -n 1::: /dev/sdc mkfs.ext4 /dev/sdc1
続いてルートパーティションのデータを移動する。既にファイルシステムは出来上がっているので resize2fs
をする必要はない。
cd /tmp mkdir src dst mount /dev/sdb2 src mount /dev/sdc1 dst cd src find . -depth -print | cpio -pdmu ../dst cd .. sync umount src dst
次にブートパーテイション。こっちは MBR。
sgdisk -Z /dev/sdd fsdisk /dev/sdd <<! o n +100M t c w ! mkfs.vfat /dev/sdd
ルートパーティションと同じようにブートパーティションをコピーする。
mount /dev/sdb1 src mount /dev/sdd1 dst cd src find . -depth -print | cpio -pdmu ../dst cd ..
/boot/cmdline.txt
の root=
を書き換える。root=/dev/mmcblk0p2
を root=/dev/sda1
とする。
vim dst/boot/cmdline.txt
+++ src/boot/cmdline.txt 2016-01-30 23:26:08.000000000 +0900 --- dst/boot/cmdline.txt 2016-01-30 23:26:17.000000000 +0900 @@ -1 +1 @@ -root=/dev/mmcblk0p2 rw rootwait console=ttyAMA0,115200 console=tty1 selinux=0 plymouth.enable=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 kgdboc=ttyAMA0,115200 elevator=noop +root=/dev/sda1 rw rootwait console=ttyAMA0,115200 console=tty1 selinux=0 plymouth.enable=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 kgdboc=ttyAMA0,115200 elevator=noop
アンマウントして Raspberry Pi に差し替える。
umount src dst
Raspberry Pi に新しい microSD と USB メモリをセットして起動する。
この方法は欠点があり、ストレージデバイスが接続されている場合、必ずしもルートパーティションを含んだデバイスが sda
にはならないということがある(USB メモリと HDD であれば USB メモリの方が先に認識されるだろうが)。
root=UUID=
による指定方法もあるらしいのだが、Raspberry Pi 2 Model B 移行対応なのか、root=UUID=
や root=PARTUUID=
で指定しても Raspberry Pi 1 Model B+ ではどうしても起動できなかった。
で、速くなったのかと言われると微妙で、シングルコアの ARM だとよくわからないのである。た、耐久性重視なんだ…(;´∀`)
HDD だともう少しわかりやすいんだろうけど。
追記:initrd を使用して UUID でマウントできるようにしてみました。