注意
この記事は古いです。もっと簡単な方法が以下記事に記載があります。
Raspberry Pi4を買ったが起動がMicroSDかぁ・・と思っていた矢先、外付けのHDDから起動できるそうなのでやってみた。
構成
SSDはどこのお家にも転がっている2.5インチSSDを使用。SSDのケースはラズパイのために買いました。あとUSBハブも買った。あと1,000円出せばラズパイ4がもう1台買えます。
SSD起動する際の注意点
SSDから起動してもMicroSDカードは挿している必要がある
ラズパイ3は純粋にSSDから起動できるみたいだが、ラズパイ4は2020/2時点でSSDからの純粋な起動はできないみたいです。SSDからOSを起動させてもMicroSDカードは付けてないとダメらしい。
ラスパイ4は電源を入れたときに、まずは「/boot」領域を見に行き、通常はMicroSDカードの「/」領域(OSが入っている領域でWindowsでいうcドライブ)を読み込みに行く(青矢印)。
今回おこなうのはSSDに「/」領域を作り、MicroSDの「/boot」領域を読み込んだ際に、「/」領域の読み込み先をSSDの「/」領域に変える(オレンジ矢印)。みたいな事らしい。
「/boot」をSSDに作ればいいじゃない と思うが、「/boot」は今のところMicroSDしか認識しないっぽい?今後MicroSDを挿さなくても直接起動できるようになるらしい。とりあえず今は「/boot」の入ったMicroSDカードは挿しとけ!
セルフパワーのUSBハブは必要
これは家だけかもしれないが、今回の環境ではセルフパワーのUSBハブは必要でした。理由はおそらく電圧不足。
SSDをラズパイのUSB3.0に直接挿したんですが、認識したりしなかったり・・・
セルフパワーのハブを間にかますまでは1回認識しても途中でデバイスがないとか言われたりとおかしな挙動を繰り替えしてました。これが一番ハマりました。(デスクトップ画面では電圧不足のアイコンが出るらしいが、パソコンからCUIで操作していたので原因がわからないまま半日とかすぎた)
上が今回の機器一覧。SSDの電力はセルフパワーのハブから供給。もはやシングルボードコンピュータではない。
手順
手順概要
手順の概要はざっくりと、パソコンからCUI(Teraterm)で以下を行います。
- SSDをラスパイに挿す
- ラズパイでSSDのパーティションの作成
- MicroSDカートの「/」領域をSSDにコピー
- SSDの「/」領域の拡張
- 「/boot」領域を見に行く先をMicroSDカードの「/」領域からSSDの「/」へ変更する
以上になります。
手順4番の「/」領域の拡張はMicroSDカードは32Gで、SSDは500Gあり、コピーをしてもSSDの領域は32G分しかコピーされないので、「/」領域を500Gまで広げる作業。
実際の手順
SSDにラズパイを挿す
挿してください。
ラズパイにSSDを挿すとOS側で勝手にデバイスが認識されました。
挿したSSDを確認
以下コマンドで確認。
sudo fdisk -l
pi@SHIMUSHU:~ $ sudo fdisk -l Disk /dev/mmcblk0: 29.7 GiB, 31914983424 bytes, 62333952 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
Disklabel type: dos
Disk identifier: 0xea7d04d6 Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 532479 524288 256M c W95 FAT32 (LBA)
/dev/mmcblk0p2 532480 62333951 61801472 29.5G 83 Linux Disk /dev/sda: 167.7 GiB, 180045766656 bytes, 351651888 sectors
Disk model: DSC2CT180A3
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4096 bytes / 33553920 bytes
Disklabel type: dos
Disk identifier: 0x5a0a55af
下の赤太文字の「/dev/sda」がSSDドライブです。ちなみに上の「/dev/mmcblk0」はMicroSDカード。コマンドの結果で容量が167.7G、29.7 GiBとあるので、この辺のディスク容量からデバイスの名前を察することもできます。また、MicroSDカードの「ブート(/boot)」領域は/dev/mmcblk0p1であることも想像されます(青文字より)。これもパーティション容量が256Gなので多分そうです。
さらに「/」領域は/dev/mmcblk0p2で、容量が29.5Gであることから予想がつきます。
この情報は大変重要なので覚えておくように!終始この情報を使います。
SSDのパーティションの作成
SSDのパーティションを作成します。SSDのデバイスは上の「sudo fdisk -l」コマンドの結果より、/dev/sdaなのでラズパイから以下コマンドを実行
sudo fdisk /dev/sda
pi@SHIMUSHU:~ $ sudo fdisk /dev/sda Welcome to fdisk (util-linux 2.33.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): n ←新規パーティション作成 Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p ←デフォルトでエンター Partition number (1-4, default 1): ←デフォルトでエンター First sector (65535-351651887, default 65535): 65600 ←8の倍数で指定
Last sector, +/-sectors or +/-size{K,M,G,T,P} (65600-351651887, default 351651887): ←デフォルトでエンター Created a new partition 1 of type 'Linux' and of size 167.7 GiB.
Partition #1 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: Y ←とりあえずY
The signature will be removed by a write command.
Command (m for help):
パーティション確認
パーティションが設定されたか確認。下の赤文字で「/dev/sda1」の領域が設定されたことがわかります。
Command (m for help): p ←pで確認 Disk /dev/sda: 167.7 GiB, 180045766656 bytes, 351651888 sectors
Disk model: DSC2CT180A3
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4096 bytes / 33553920 bytes
Disklabel type: dos
Disk identifier: 0x5a0a55af Device Boot Start End Sectors Size Id Type
/dev/sda1 65600 351651887 351586288 167.7G 83 Linux ←/dev/sda1というのができている Filesystem/RAID signature on partition 1 will be wiped. Command (m for help):
パーティション書き込み
Command (m for help): w ←wでパーティション書き込み
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
pi@SHIMUSHU:~ $
領域のコピー
以下コマンドでMicroSDの「/」領域(/dev/mmcblk0p2)をSSDの/dev/sda1へコピー
sudo dd if=/dev/mmcblk0p2 of=/dev/sda1 bs=512 conv=noerror,sync
sudo fdisk -lで確認したMicroSDの「/」領域(/dev/mmcblk0p2)をSSDの/dev/sda1へコピーします。
このコピーは今回の環境では10分ほどでした。ddコマンドはパーティション領域をそのまんまコピーするコマンドっぽいです。
あまりに長い場合は、新しくラズパイにログインして以下のコマンドを実行すれば状況が分かります。
sudo pkill -USR1 dd
pi@SHIMUSHU:~ $ sudo dd if=/dev/mmcblk0p7 of=/dev/sda1 bs=512 conv=noerror,sync 2031486+0 レコード入力 2031485+0 レコード出力 1040120320 bytes (1.0 GB, 992 MiB) copied, 25.2115 s, 41.3 MB/s
別ターミナルからコマンドを実行すると、ddコマンドをしているターミナルに黒太字みたいな情報が出ます。
領域のチェック
終わったら以下コマンドで領域のチェック。
sudo e2fsck -f /dev/sda1
pi@SHIMUSHU:~ $ sudo e2fsck -f /dev/sda1 Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong (6650979, counted=6650935).
Fix<y>? yes
Free inodes count wrong (1765533, counted=1765530).
Fix<y>? yes rootfs: ***** FILE SYSTEM WAS MODIFIED *****
rootfs: 111142/1876672 files (0.3% non-contiguous), 1074249/7725184 blocks pi@SHIMUSHU:~ $
上記はWindowsのディスクチェック見たいものを実行してます。とりあえずYes。
Yesを繰り返し押し、エラーがなくなるまで、sudo e2fsck -f /dev/sda1を実行する。下記がエラーがなくなった時のsudo e2fsck -f /dev/sda1の結果。
pi@SHIMUSHU:~ $ sudo e2fsck -f /dev/sda1
2fsck 1.44.5 (15-Dec-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
rootfs: 111142/1876672 files (0.3% non-contiguous), 1074249/7725184 blocks pi@SHIMUSHU:~ $
たまに以下エラーでチェックできないことがある。
pi@SHIMUSHU:~ $ sudo e2fsck -f /dev/sda1
e2fsck 1.44.5 (15-Dec-2018)
/dev/sda1 is mounted.
e2fsck: Cannot continue, aborting.
かってに/dev/sda1の領域をmountしているっぽいので、以下のコマンドを打てば実行できる
umount /dev/sda1
領域の拡張
以下コマンドでパーティションの拡張。SSDの「/」領域が32Gしかとられてない(ハズ)なので180Gまで拡張。
sudo resize2fs /dev/sda1
領域の最終確認
再度以下コマンドで領域を確認します。
sudo fdisk -l
Disk /dev/mmcblk0: 29.7 GiB, 31914983424 bytes, 62333952 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
Disklabel type: dos
Disk identifier: 0xea7d04d6 Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 532479 524288 256M c W95 FAT32 (LBA)
/dev/mmcblk0p2 532480 62333951 61801472 29.5G 83 Linux Disk /dev/sda: 167.7 GiB, 180045766656 bytes, 351651888 sectors
Disk model: DSC2CT180A3
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4096 bytes / 33553920 bytes
Disklabel type: dos
Disk identifier: 0x5a0a55af Device Boot Start End Sectors Size Id Type
/dev/sda1 65600 351651887 351586288 167.7G 83 Linux pi@SHIMUSHU:~ $
赤文字の/dev/sdaに/dev/sda1が作成されて、167.7Gの領域が作成されています。
あああ
SSDの「PARTUUID」を確認する
以下のコマンドを実行。
sudo blkid
結果
pi@SHIMUSHU:~ $ sudo blkid
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="6341-C9E5" TYPE="vfat" PARTUUID="ea7d04d6-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="80571af6-21c9-48a0-9df5-cffb60cf79af" TYPE="ext4" PARTUUID="ea7d04d6-02"
/dev/mmcblk0: PTUUID="ea7d04d6" PTTYPE="dos"
/dev/sda1: LABEL="rootfs" UUID="80571af6-21c9-48a0-9df5-cffb60cf79af" TYPE="ext4" PARTUUID="5a0a55af-01"
SSD(/dev/sda1)の「PARTUUID」をメモっときます。「5a0a55af-01」です。
なお、MIcroSDカードの「/」領域の「PARTUUID」は「"ea7d04d6-02"」
cmdline.txtの編集
「/boot」領域を見に行く先をMicroSDカードの「/」領域からSSDの「/」へ変更させる作業です。
以下コマンドでファイルcmdline.txtを編集。「PARTUUID」をMicroSDの値から、SSDの値へ変更します。
sudo vi /boot/cmdline.txt
pi@SHIMUSHU:~ $ sudo vi /boot/cmdline.txt console=serial0,115200 console=tty1 root=PARTUUID=ea7d04d6-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles ↓青文字を赤文字へ変更 console=serial0,115200 console=tty1 root=PARTUUID=5a0a55af-01 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
上の青文字を赤文字へ変更
fstabの編集
引き続き「/boot」領域を見に行く先をMicroSDカードの「/」領域からSSDの「/」へ変更させる作業です。
以下コマンドでファイルfstabを編集。これも「/」領域の「PARTUUID」をMicroSDカードの値からSSDの値へ変更している。
sudo vi /etc/fstab
proc /proc proc defaults 0 0
PARTUUID=ea7d04d6-01 /boot vfat defaults 0 2
PARTUUID=5a0a55af-01 / ext4 defaults,noatime 0 1 # a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that ↓下に書き直す proc /proc proc defaults 0 0
PARTUUID=ea7d04d6-01 /boot vfat defaults 0 2
PARTUUID=ea7d04d6-02 / ext4 defaults,noatime 0 1 # a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
確認
以下コマンドで「/」領域がどのパーティションから読み込んでいるか確認。
lsblk
pi@SHIMUSHU:~ $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 167.7G 0 disk
|-sda1 8:1 0 167.7G 0 part
mmcblk0 179:0 0 29.7G 0 disk
|-mmcblk0p1 179:1 0 256M 0 part /boot
|-mmcblk0p2 179:2 0 29.5G 0 part / pi@SHIMUSHU:~ $
現在の「/」領域は下青文字のmmcblk0p2パーティションになっています。これはMicroSDカードの領域です。29.5Gから察します。
再起動
再起動してSSDの「/」領域を読み込ませる。
sudo reboot
確認
再度以下コマンドで領域確認
lsblk
pi@SHIMUSHU:~ $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 167.7G 0 disk
|-sda1 8:1 0 167.7G 0 part /
mmcblk0 179:0 0 29.7G 0 disk
|-mmcblk0p1 179:1 0 256M 0 part /boot
|-mmcblk0p2 179:2 0 29.5G 0 part pi@SHIMUSHU:~ $
「/」領域がsda1になっているのでSSDの「/」領域が使われています。
これでSSDが使われるようになりました。
お疲れさまでした。
今回はここまで。次回はベンチマーク。