読者です 読者をやめる 読者になる 読者になる

😃 mattintosh note 📝

Hello Raspberry Pi!

Raspberry PiのルートパーティションをUSBデバイスに移動する

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+ ではどうしても起動できなかった。

ルートパーティションをUSBメモリに移した。 #RaspberryPi

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

で、速くなったのかと言われると微妙で、シングルコアの ARM だとよくわからないのである。た、耐久性重視なんだ…(;´∀`)

HDD だともう少しわかりやすいんだろうけど。


追記:initrd を使用して UUID でマウントできるようにしてみました。

mattintosh.hatenablog.com