Raspberry Piをサーバーとして使う その1補足

SDカードをストレージとしたサーバーは不安か?

SDカードには不安材料がある。インターネット上でもよく言われている「寿命」である。関係しているのは「書き込み回数」であり、一般的にはSDカードの寿命は短いと言われている(同じ仕組みであるSSDの寿命が短かったら、今頃サーバー用など発売されていないだろうし)。そのため、DockerやCMSなど、よく書き込みが発生するシステムには向いていない。

サーバー用途としてRaspberry Piを使うのであれば、主ストレージをSDカードからHDDに変更し、SDカードはブートローダーとして使うのがベターと考える。ブートローダーだけなら読み込みだけで書き込みはほぼないはずなので、早々に臨終を迎えることはないだろう。

というわけで、USB-HDDでRaspberry Piを起動し、サーバー用途として安心できるようにするのがこのページの目的である。

準備物およびスペック

・Raspberry Pi3 : OSはHypriotを選択した。理由は後程。
・SDカード : 16GB これでも正直無駄であるが、たまたま手元に小容量のものがなかった。
・HDD : 2.5インチHDD。容量は320GBで、SATA接続のものをUSBに変換する。中古で1980円くらい。
・SATA-USB : SATA接続のデバイスをUSB接続化するもの。HDDケースでもよいが、Raspberry Piの場合は電力確保も考える必要がある。今回は、コネクタを変換するキットを使った。価格はだいたい2000円前後。

早速実行

参考にしたサイトは以下のとおりである。
Raspberry PiをUSB(HDD)で起動させる(純規の暇人趣味ブログ )
まずはUSB接続に変換したSATA-HDDをRaspberry Piにつなぎ、起動。
続いて

$ sudo fdisk -l (実行結果は中略)
Device         Boot  Start      End  Sectors  Size Id Type  
/dev/mmcblk0p1        2048   133119   131072   64M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      133120 30547967 30414848 14.5G 83 Linux

Disk /dev/sda: 298.1 GiB, 320072931328 bytes, 625142444 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  

これで、OSのパーティションおよびHDDのデバイスが判明する。/dev/mmcblk0p2がOS(TypeがLinux)、/dev/sdaがSATA-HDD(Disk /dev/sda)である。ddコマンドを使い、SATA-HDDへOSのデータを丸ごとコピーする。コピーし終えたら、e2fsckとresize2fsでディスク領域のチェックおよび調整を行う。

$ sudo dd if=/dev/mmcblk0p2 of=/dev/sda bs=32M conv=noerror,sync
$ sudo e2fsck /dev/sda
$ sudo resize2fs /dev/sda

次に、HDD上のOSデータにあるfstabを更新する。更新前に、/dev/sdaをどこかにマウントする。

$ sudo mount -t ext4 -o defaults /dev/sda /mnt
$ sudo nano /mnt/etc/fstab
  ↓ root(/)のところが/dev/mmcblk0p2となっているので、/dev/sdaにする
/dev/sda  /               ext4    defaults,noatime  0       1

終わったら、shutdownコマンドでシステムを停止する。

システムが停止したら、SDカードを別のPCで読み込ませる。SDカードにはcmdline.txtがあるので、テキストエディタで編集する。編集箇所は「root=」の値。ここを編集して、システムを読み込む場所を変更する。
変更前:root=/dev/mmcblk0p2
変更後:root=/dev/sda

あとは、編集済みのSDカードをRaspberry Piに差しなおし、電源を入れる。起動したら成功である。

結果

結果としてはしょぼいかもしれないが、以下を挙げる。

$ df -m
Filesystem     1M-blocks  Used Available Use% Mounted on  
/dev/root         287788   597    274848   1% /
devtmpfs             427     0       427   0% /dev  
tmpfs                431     0       431   0% /dev/shm  
tmpfs                431     6       426   2% /run  
tmpfs                  5     0         5   0% /run/lock  
tmpfs                431     0       431   0% /sys/fs/cgroup  
/dev/mmcblk0p1        64    31        34  48% /boot

Mounted onの値が「/」の行に注目。「1M-blocks」が287788、約280GBとなっている。とりあえず、これでHDDのシステムでやり取りしているとみてよいかと思う。