Raspberry Pi 3のルートドライブをSSD(USB)に

ご注意

この記事は,2016年9月4日に書いたもので,内容は陳腐化しています

Slackware ARM 14.xに限った話です.

また,Raspberry Pi 3 Model B, 同 Model B+で可能なSDカードなしのブートについては,一切触れていません.

Raspberry Pi 3(RPi3)が,各種サーバーに使えないか,という試みですが,結論的には,「使えないことはないけどUSB2接続のSSD(HDD)がボトルネックになり,それをがまんできるかどうか」と言えます

SlackwareARMをSDカードにインストール

前提条件である,SlackwareARM 14.2をRPi3のSDカードにインストールして動かす方法は,ちゃんと手引きしてくれるサイトがあるので,順を追って実行すれば,問題なくできます.

USBドライブで動かすまでの手順

次の段階として,USBドライブをルートドライブにしたいという,本題に入ります.手順はいくつかありますが,おおざっぱに言うと,

  1. ルートドライブにしたいUSBドライブを用意して,パーティションを切る
  2. SDカードのext4パーティションをUSBドライブにコピーする
  3. コピーしたUSBドライブの/etc/fstabを修正する
  4. SDカードの/boot/cmdline.txtを修正する

でおしまいです.おまけとして,32GBのSDカードを起動だけのために使うのがもったいなければ,/boot部分(vfat)だけを小さいSDカードにコピーして,起動用に使っても良いと思います.

SSDのパーティション

私の場合は,とりあえず,手持ちの1TB SSDをUSB3のケースに入れたものを用意しました.パーティションを切ってこんなふうになっています.

fdisk -l /dev/sda
Disk /dev/sda: 953.9 GiB, 1024209543168 bytes, 2000409264 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: 0x324275f7

Device     Boot   Start        End    Sectors  Size Id Type
/dev/sda1          2048    4018175    4016128  1.9G 83 Linux
/dev/sda2       4018176    8034303    4016128  1.9G 82 Linux swap
/dev/sda3       8034304 2000409263 1992374960  950G 83 Linux

いろいろ,流儀はあるでしょうが,システムが壊れかかっているような時に/boot用のsda1とswap用のsda2を合わせると,そこにちょっとしたディストリビューションをインストールできますので,それで,システムの回復を図るために,2GBくらいずつ切ってきました.今となっては,そんな方法を取らなくてもUSBメモリーから起動するなどして,レスキューはできるので,bootとswapが使い回せるくらいの意味しかありません

今回は,sda2をswapにして,sda3をrootドライブ(ext4)にします.mkswap, mkfsで準備します.

SDカードからSSDへのコピー

コピーの仕方も山ほどあります.大別するとRPi3でコピーする方法と,他のLinuxマシンでコピーする方法に分けられます.前者だと,/tmpや/devについて,もう一手間必要となるので,今回は,他のLinuxマシンを使用しました

sdカードと,USBドライブの両方をマウントして,cpなり,cpio等でコピーします.筆者はこういう場合もrsyncでコピーします.

rsync -artlvd /path/to/sd/ /path/to/usb_drive/

rsyncを使い慣れた方には言うまでもありませんが,それぞれのpathの最後の”/”は必要です(後のほうのは必要ないかも^^; ).

設定変更

fstab

コピーした先の/etc/fstabの最初の3行を,

/dev/sda2        swap             swap        defaults         0   0
/dev/sda3        /                ext4        defaults         1   1
/dev/mmcblk0p1   /boot            vfat        fmask=177,dmask=077 1   0

としました(それぞれの行が複数行として表示される場合がありますが,それぞれ一行ずつです).

cmdline.txt

次は,ブートのおまじないの変更です.sdカードのブートパーティション(vfat)にあるcmdline.txtを,次のようにします(ここも,複数行として表示される場合がありますが,改行なしの1行です).

dwc_otg.lpm_enable=0 console=tty1 nofont root=/dev/sda3 rootfstype=ext4 rootwait ro

変更したところは,root=/dev/sda3のところのみです.これで,sdカードとUSBドライブをRPi3に接続して起動すれば,USBドライブがルートになって起動します.

起動したあと

このあと,mariaDB(MySQLの互換サーバー),Apache, PHP, WordPressについて,それぞれデータを稼働中のSlackware64 (x86_64)のマシンから,まるまるコピーしただけで,どれも問題なく(あっけないくらい^^; )起動しました(ただし,コピーの際には,それぞれのデーモンを止めた方が無難と思います).また, Netatalk 3.1.9については,ソースからbuildしてインストールしてこちらも問題なく動きました.

印象

唯一の問題は,クライアントからのリクエストに対するレスポンスの悪さ(データの送信の遅さ)です.SDカードをルートにするよりは断然速いものの,USB2.0のスピードがボトルネックになります.もし,RPi3のUSBが3.0だったとしたら,十分使用に耐えるサーバーに仕上がったと思います.それだけに,とても残念です.

加筆・修正多数

2022年6月23日(木)に追記.
2017/08/29修正
2018/4/24の見解としては,Raspberry Pi 3 Model B+にすれば,十分とまではいかないまでも,かなりサーバーとして使えると思います.
外部電源式がいいです.もし,外部電源が使えないケースの場合は,外部電源式のUSB-HUBを介して接続します.
2018/4/24注: その後,gdiskを使って,gptにしてパーディションを切り直しました.
2023/03/13注: その後,SWAPは実機も仮想マシンもZRAMにしているのでこの “流儀” はもはや廃れ,/bootとルートの2パーティションにしています(RPi以外ではext4の1パーティションのみ).
sda1は,スペアーというか無駄です^^;
もう一台SSDをルートにするために,RPi3でコピーを試みましたが,エラーが出てしまいコピーができませんでした.他のしっかり稼働しているLinuxマシンでコピーすることをお勧めします.
別のLinuxマシンにマウントしたままであれば,/path/to/usb_drive/etc/fstab
その後発覚しましたが,OpenLDAPについては,バイナリーコピーではNGでした.元のサーバー上でldifを使ってテキストでexportして,Slackware ARMで,ldapaddを使って読み込ませる必要があります.
SATAインターフェースがあればなおさら良い.

PHP 7 disaster

そろそろ,PHP 7かなと思い,buildしてインストールしてみましたが,httpdがsegfault を起こして,動いてくれません.

仕方がないので,従前のphp-5.6.20に戻そうとしましたが,httpdとphpが動かないのですが,その辺のノウハウはすべて非公開の自分用メモのWikiに記してあるため,httpd+phpが動かないと確認できません^^; SlackwareのSlackBuildスクリプトでbuildするしかありません.

ほかにも,libgcrypt, libmcrypt, afpd (Netatalk)などが変なエラーを出しています.たぶん,先日,SlackwareのSecurity情報に基づいて,まとめてライブラリーなどをupdateして,依存性が破綻しているのだと思います^^;

なんだかんだとぐるぐる一通りインストールしなおしましたが,相変わらずPHPは起動してくれません.手でlibphp7などを削除する必要がありました.一般的に,down gradeは,up gradeよりやっかいなことが多いです.

ようやく元通りのはずなのに,「Apache httpdはマルチスレッドサポートなのにphpがマルチスレッドをサポートしていない」というエラーが出て,phpだけは動きません.結論的には,–with-tsrm-pthreadsを付ける必要がありました

また,php-5.6.20をSlackBuildスクリプトでbuildはできるのですが,動いてくれません.何か余計なオプションがあるのでしょう.当分は手でbuildを続けることにします.

一時間半ほど,システムのトラブル対応のトレーニングができました^^;

Segmentation fault.
ネットで調べたら,ガセネタをつかまされて,時間を浪費しました^^;
時間の浪費.