Raspberry Pi の Raspbian OS を SSD で動かす

Raspberry Pi をサーバとして常時稼働させた場合、Raspbian OS が SDカードにインストールされたデフォルトの状態では、SDカードに対してログ等の情報が逐次書込みが発生するため、SDカードの書込み限度回数越えによる不良が比較的早く発生してしまう様です。(1年程サーバとして稼働させた Raspberry Pi のSDカードを ”ddコマンド” でバックアップしようとしたところ、エラーで読み出せない事象がありました。)

SSD (Solid State Drive) も SDカードと同じフラッシュメモリ系のデバイスですが、コンピュータのストレージ用に最適化した設計が行われているため、Raspberry Pi サーバの長期安定稼働に貢献してくれる期待が持てます。

そこで、Raspbian OS を SSD 上で動かす設定手順を記述します。

記載する手順は、下記の状態を例としています。また、SDカードを未使用 (SSDのみで起動)にする手順ではありませんので、ご注意願います。
・対象OS:Raspbian (stretch) ※イメージファイルから作成(NOOBS未使用)
・設定には、”作業用の Raspbian OS” をインストールした SDカードを使用
以下は、今回使用したSSDの参考
・SSD=KingDian M.2 NGFF サイズ N400 64GB
・ELUTENG SSD M.2 ケース NGFF USB3.0 変換

1. “作業用の Raspbian OS” の SDカードで起動

SSD に移行する “対象の Raspbian OS” が入った SDカード とは別に用意した、”作業用の Raspbian OS” の SDカードを使用して、Raspberry Pi を起動します。
その後、”lsblkコマンド”で、ブロックデバイスの状態を確認します。

# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
mmcblk0     179:0    0 14.9G  0 disk 
├mmcblk0p1 179:1    0 43.9M  0 part /boot
└mmcblk0p2 179:2    0 14.8G  0 part /
#

上の例は、Raspberry Pi の USBポートに何も接続していない状態で、起動に使用した SDカードのみが、一覧に表示している状態。

2. “対象の Raspbian OS” の SDカードを接続

SSD に移行する “対象の Raspbian OS” が入った SDカードを、USB SDカードリーダ/ライタにセットして Raspberry Pi の USBポートに接続します。
その状態で、”lsblkコマンド”で、ブロックデバイスの状態を確認します。

# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    1 14.9G  0 disk  ← sda として、SDカードを認識 
├sda1        8:1    1 43.9M  0 part 
└sda2        8:2    1 14.8G  0 part 
mmcblk0     179:0    0 14.9G  0 disk 
├mmcblk0p1 179:1    0 43.9M  0 part /boot
└mmcblk0p2 179:2    0 14.8G  0 part /
#

上の例は、”対象の Raspbian OS” が入った SDカードを、”sda” として認識しています。

3. SSD を接続

“対象の Raspbian OS” の移行先となる “SSD” を、USB変換アダプタ(ケース)にセットした状態で、Raspberry Pi の USBポートに接続します。
再度、”lsblkコマンド”で、ブロックデバイスの状態を確認します。

# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    1 14.9G  0 disk 
├sda1        8:1    1 43.9M  0 part 
└sda2        8:2    1 14.8G  0 part 
sdb           8:16   0 59.6G  0 disk  ← sdb として、SSDを認識  
mmcblk0     179:0    0 14.9G  0 disk 
├mmcblk0p1 179:1    0 43.9M  0 part /boot
└mmcblk0p2 179:2    0 14.8G  0 part /
#

上の例は、”SSD” を “sdb” として認識しています。

4. SSD を ext4 ファイルシステムでフォーマット

まず “SSD” 上に “fdiskコマンド” を使用して、パーティションを作成します。

# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p  ← p コマンドで、パーティション情報確認
Disk /dev/sdb: 59.6 GiB, 64023257088 bytes, 125045424 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: 0x4a99c373

Command (m for help): n  ← n コマンドで、新規パーティションを作成
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p):  ← デフォルト値で ok のため、enter のみ

Using default response p.
Partition number (1-4, default 1):   ← デフォルト値で ok のため、enter のみ
First sector (2048-125045423, default 2048):   ← デフォルト値で ok のため、enter のみ
Last sector, +sectors or +size{K,M,G,T,P} (2048-125045423, default 125045423):   ← デフォルト値で ok のため、enter のみ

Created a new partition 1 of type 'Linux' and of size 59.6 GiB.

Command (m for help): p  ← p コマンドで、新規作成パーティションの情報確認
Disk /dev/sdb: 59.6 GiB, 64023257088 bytes, 125045424 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: 0x4a99c373

Device     Boot Start       End   Sectors  Size Id Type
/dev/sdb1        2048 125045423 125043376 59.6G 83 Linux

Command (m for help): w  ← w コマンドで、パーティション情報の反映
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

#

再度、”lsblkコマンド” で、ブロックデバイスの状態を確認します。

# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    1 14.9G  0 disk 
├sda1        8:1    1 43.9M  0 part 
└sda2        8:2    1 14.8G  0 part 
sdb           8:16   0 59.6G  0 disk 
└sdb1        8:17   0 59.6G  0 part   ← パーティションが作成されたことを確認
mmcblk0     179:0    0 14.9G  0 disk 
├mmcblk0p1 179:1    0 43.9M  0 part /boot
└mmcblk0p2 179:2    0 14.8G  0 part /
#

“blkidコマンド” を使用して、下記2つのパーティションの “PARTUUID” 情報を確認しておきます。
・/dev/sda2  ←SSD に移行する “対象の Raspbian OS” が入ったパーティション
・/dev/sdb1  ←SSD に作成したパーティション

# blkid
/dev/mmcblk0p1: LABEL="boot" UUID="9304-D9FD" TYPE="vfat" PARTUUID="6906384d-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="29075e46-f0d4-44e2-a9e7-55ac02d6e6cc" TYPE="ext4" PARTUUID="6906384d-02"
/dev/sda1: LABEL="boot" UUID="9304-D9FD" TYPE="vfat" PARTUUID="07013f45-01"
/dev/sda2: LABEL="rootfs" UUID="29075e46-f0d4-44e2-a9e7-55ac02d6e6cc" TYPE="ext4" PARTUUID="07013f45-02"
/dev/mmcblk0: PTUUID="6906384d" PTTYPE="dos"
/dev/sdb1: PARTUUID="4a99c373-01"
#

“mkfsコマンド” を使用して、”SSD” に作成したパーティションを ext4 ファイルシステムでフォーマットします。

# mkfs -t ext4 /dev/sdb1
mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 15630336 4k blocks and 3915216 inodes
Filesystem UUID: adac2ec8-1fd5-4da3-a490-f6314aea4305
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424

Allocating group tables:   0/477       done                            
Writing inode tables:   0/477       done                            
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information:   0/477 10/477       done

#

5. “対象の Raspbian OS” のバックアップ

移行する “対象の Raspbian OS” を SDカードから “dumpコマンド” でバックアップします。
※”作業用の Raspbian OS” に “dumpコマンド” が入っている状態で実行して下さい。

# dump -z -0uf raspbian.dump.gz /dev/sda2
DUMP: Date of this level 0 dump: Sun Dec  9 10:16:40 2018
  DUMP: Dumping /dev/sda2 (an unlisted file system) to raspbian.dump.gz
  DUMP: Label: rootfs
  DUMP: Writing 10 Kilobyte records
  DUMP: Compressing output at transformation level 2 (zlib)
  DUMP: mapping (Pass I) [regular files]
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 1098236 blocks.
  DUMP: Volume 1 started with block 1 at: Sun Dec  9 10:16:58 2018
  DUMP: dumping (Pass III) [directories]
  DUMP: dumping (Pass IV) [regular files]
  DUMP: Closing raspbian.dump.gz
  DUMP: Volume 1 completed at: Sun Dec  9 10:18:49 2018
  DUMP: Volume 1 took 0:01:51
  DUMP: Volume 1 transfer rate: 3840 kB/s
  DUMP: Volume 1 1099020kB uncompressed, 426328kB compressed, 2.578:1
  DUMP: 1099020 blocks (1073.26MB) on 1 volume(s)
  DUMP: finished in 111 seconds, throughput 9901 kBytes/sec
  DUMP: Date of this level 0 dump: Sun Dec  9 10:16:40 2018
  DUMP: Date this dump completed:  Sun Dec  9 10:18:49 2018
  DUMP: Average transfer rate: 3840 kB/s
  DUMP: Wrote 1099020kB uncompressed, 426328kB compressed, 2.578:1
  DUMP: DUMP IS DONE
#

上の例では、”作業用の Raspbian OS” の “/root” をカレントディレクトリとして、”dumpコマンド” を実行しています。

6. SSDに “対象の Raspbian OS” のリストア

dumpコマンド” でバックアップした “対象の Raspbian OS” を “restoreコマンド” で “SSD” にリストアします。

まず、リストア先の “SSD” をマウントし、カレントディレクトリを移動します。

# mount /dev/sdb1 /mnt
# cd /mnt

バックアップした “対象の Raspbian OS” をリストアします。

# restore -rf /root/raspbian.dump.gz
Dump tape is compressed.
restore: ./lost+found: File exists
#

“SSD” をマウントしたままの状態で、次の手順に進みます。

7. “PARTUUID” 情報の編集

以下の2つのファイル内の “PARTUUID” の情報を、”SSD” のパーティション1の “PARTUUID” に編集します。
・”SSD” 上にリストアした “対象の Raspbian OS” 内の “fstabファイル”
・”対象の Raspbian OS” の入っていた “SDカード” パーティション1内の “cmdline.txtファイル”

まず、マウントしてある “SSD” 上の “fstabファイル” の内容(編集前)を、確認します。

# cat /mnt/etc/fstab
proc            /proc           proc    defaults          0       0
PARTUUID=07013f45-01  /boot           vfat    defaults          0       2
PARTUUID=07013f45-02  /               ext4    defaults,noatime  0       1
#

上記の例では、”/” の “PARTUUID” が、”対象の Raspbian OS” が入っていた “SDカード” の、パーティション2(PARTUUID=07013f45-02)を示しています。

“fstabファイル” 内 “/” の “PARTUUID”情報を、”SSD” のパーティション1の “PARTUUID” に編集し、再確認します。

# vi /mnt/etc/fstab
# cat /mnt/etc/fstab
proc            /proc           proc    defaults          0       0
PARTUUID=07013f45-01  /boot           vfat    defaults          0       2
PARTUUID=4a99c373-01  /               ext4    defaults,noatime  0       1
#

“SSD” のマウントを解除し、”SDカード” をマウントします。

# cd /
# umount /dev/sdb1
# mount /dev/sda1 /mnt
#

“SDカード” 上の “cmdline.txtファイル” の内容(編集前)を、確認します。

# cat /mnt/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=07013f45-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
#

上記の例では、”対象の Raspbian OS” が入っていた “SDカード” の、パーティション2(PARTUUID=07013f45-02)を示しています。

“cmdline.txtファイル” 内の “PARTUUID”情報を、”SSD” のパーティション1の “PARTUUID” に編集し、再確認します。

# vi /mnt/cmdline.txt
# cat /mnt/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=4a99c373-01 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
#

“SDカード” のマウントを解除し、”作業用の Raspbian OS” をシャットダウンします。

# cd /
# umount /dev/sda1
# shutdown -h now

8. Raspbian OS を SSD 移行後の確認

USB SDカードリーダ/ライタにセットしていた “SDカード” (これ以降は “起動用SDカード” になります)を Raspberry Pi のSDカードスロットに戻します。
また、”SSD” をUSBポートに接続し、Raspberry Pi を起動します。

起動後に、”SSD” 上の raspbian OS で起動しているのかを、”lsblkコマンド” を使用して確認します。

# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0 59.6G  0 disk 
└sda1        8:1    0 59.6G  0 part /  ← " / " の位置が変更していることを確認
mmcblk0     179:0    0 14.9G  0 disk 
├mmcblk0p1 179:1    0 43.9M  0 part /boot
└mmcblk0p2 179:2    0 14.8G  0 part 
#

上記の例では “SSD” のブロックデバイス名が “sda”として認識しています。
備考として、ブロックデバイス名はUSBポートの認識順で変化するので、設定作業中のブロックデバイス名と異なっていても問題はありません。

以上で作業は完了です。