Raspberry Pi OS 64bitβ版にポータブルSSD増設スワップ設定

![000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960318/455f328c-125a-6ccf-c197-4570a1fc5c9d.jpeg)
上の写真は増設したSSDです。少し熱を持つので不安定ですがファンの上に載せています。Raspberry Pi 4BのUSB3ポートは仕様ギリギリの給電能力しかなく、またRaspberry Pi本体はこれ以上は電力供給できないので、増設する場合は右側の写真のようにDCアダプター付のUSB3ハブで接続しています。電力供給に限界のあるRaspberry Piでは、高速ながら電力多消費型のSSDを増設すると、写真に見るように少しゴタゴタしてしまいます。SIMを想定したモバイルでなく、省電力・省空間のDESKTOPおよびSERVERと割り切れば、もう少しスッキリと構成もできそうですが。しかし高価ながらWi-Fiと同じ使い勝手でSIMオプションの選択肢があるということもRaspberry Piの大きな魅力の一つです。といろいろ、出だしから文章まで少しゴタゴタしてしまって申し訳ありませんが、以下で今回の試行を説明します。

まず４Ｇを超えるメモリー領域が使えるRaspberry Pi OSの64bitベータ版をインストールしました。そして今回のテーマは、① ポータブルSSDをRaspberry Pi 4B 8Gに増設すること。② swapをデフォルトのSDカードから、増設したポータブルSSDへ変更すること。この２点を試行しました。

結果は、増設したポータブルSSD上で、Raspberry Pi OS 64bitベータ版のメインメモリーのswap機能は正常に動作しました。ベータ版と言いながら相当完成度が高い印象を受けました。ただメインメモリーのswapだけしか試行していないので他の部分はわかりません。さらに64bitベータ版ということでGUI操作ではまだメニューが完備されていませんでした。ゆえに少しハードルが高かったのですが、今回の試行はほとんどコマンドラインからの設定になっています。

#64bitβ版OSインストール
64bitベータ版はベータ版です。不具合に伴う損害は補償されませんので、ご自身で試行される場合は免責事項に同意して進めてください。Raspberry Pi OSの64bitベータ版は通常のSoftwareのダウンロードページにはありません。64bitベータ版は、下記URLのフォーラムページで注意書きを読み、ページ内のリンクより
https://www.raspberrypi.org/forums/viewtopic.php?f=117&t=275370
下記のダウンロードページへいき、
https://downloads.raspberrypi.org/raspios_arm64/images/
ダウンロードページで、下記リンクテキストをクリックするとzipファイルがダウンロードされます。
***raspios_arm64-2020-08-24***
zipファイルを解凍すると下記imgファイルが生成します。
```2020-08-20-raspios-buster-arm64.img```
(2021JAN11時点では64bitベータ版の最新版です)
このimgファイルがEtcherやRaspberry Pi ImagerなどでSDカードに書き込むimgファイルです。この後のインストール操作は従来と同じです。sshを使う場合は空sshファイルを置き、config.txtにhdmiモニター設定を追記し、SDカードをRaspberry Piにセットして電源ONにします。起動後に追加設定をしました。


#SSD増設swapの前処理
Raspberry Piを一旦シャットダウンし、市販のNTFSフォーマットされたSSDをRaspberry Piに接続して、電源ONにするとSSDが自動認識されます。dfで確認するとUSB接続の/dev/sda1が/media/pi/XXXX（XXXX：SSDのボリューム名）に自動的にmountされています。データ保存用のSSDとして使用する場合は、このNTFSフォーマットのままRaspberry Pi上で使えます。何の変更もしなくても支障は出ませんでした。

しかし今回のように特別に、Raspberry Pi OSのメインメモリーのswapとして増設SSDを使用する場合は、支障が出ます。swapとして使用する場合はext4フォーマットにしなければなりません。その前に前処理をします。まず/dev/sda1の自動mountを解除します。（このとき画面からSSDが消えますがRaspberry Pi OSは接続したSSDのハードウェア認識を継続しています）
```pi@raspberrypi:~ $ sudo umount /dev/sda1```
dphys-swapfileファイルで起動されているswapを停止します。　　　
```pi@raspberrypi:~ $ sudo dphys-swapfile swapoff```
```pi@raspberrypi:~ $ sudo dphys-swapfile uninstall```

#SSDをext4フォーマット
SSDにあるデータは完全に消えますのでデータは別に保存しておいてください。今回はfdiskを使ってフォーマットします。（SDカード、モニター、キーボード、マウス、LAN、電源Cタイプ、そして今回の増設したSSD以外は、あらかじめ取り外しておいてください。万一、別のものをフォーマットして消してしまうと大変ですから。）
まず増設したSSDを確認します。
```pi@raspberrypi:~ $ df```
```/dev/sda1 .... .... .... /media/pi/XXXXXX```
/dev/sdaに、sda1があります。sdaというのが1個のハードウェア―SSDです。sda1はその中の1個目のパーテーションです。パーテーション毎にXXXXXXで示されたUUIDがあります。今回はSSD全体が1個のパーテーションですからsda1だけです。
* パーテーションが別れたSSDの場合はsda1,sda2...があります。
* 別個のUSBメモリーなどが接続されていれば/dev/sdb1というものも現れます。この場合はRaspberry Pi 本体をシャットダウンして、増設したSSD以外は取り外して、Raspberry Pi 本体を再起動してください。以下では/dev/sdaという1個のハードウェア―SSD全体を初期化してから、パーテーションを作成しext4でフォーマットします。

##初期化
```pi@raspberrypi:~ $ sudo sgdisk -Z /dev/sda```

##パーティション作成
fdiskを起動します。
```pi@raspberrypi:~ $ sudo fdisk /dev/sda```
Command (m for help): で入力待ちになるので、'm'とEnterキーでCommand一覧を見てみます。'p'とEnterキーは変更は何もないがSSDの現状が見れます。今回のSSDに間違いないことを確認します。
```Command (m for help): p↓```
'n'入力とEnterキーでパーティション作成を開始します。Enterキーだけが続きます。
```Command (m for help): n↓```
```Select (default p): ↓```
```Partition number (1-4, default 1): ↓```
```First sector ....: ↓```
```Last sector ....: ↓```
```Command (m for help): w↓```
最後に'w'入力とEnterキーで、設定を書き込んでfdiskが終了します。

##ext4フォーマット
パーテーション１であるsda1をext4でフォーマットします。
```pi@raspberrypi:~ $ sudo mkfs.ext4 /dev/sda1```
SSDがext4フォーマットされたことを確認します。UUIDも認識されています。
```pi@raspberrypi:~ $ sudo blkid /dev/sda1```
```/dev/sda1: UUID="XXXXXXXXX" TYPE="ext4" PARTUUID="....."```


#/media/piにmount
mount先の/media/piは既にパーミッションが設定されているのでsudo chmod 777 /media/piで変更しません。ext4フォーマットしたパーテーション/dev/sda1を、/media/piへとmountします。
```pi@raspberrypi:~ $ sudo mount /dev/sda1 /media/pi```
SSDが/media/piにmountされたことを確認します。
```pi@raspberrypi:~ $ lsblk```
```sda1  ....... /media/pi```
/media/piにmountされています。しかし、/media/piの後の/UUIDがまだありません。Raspberry Pi 本体を再起動(Reboot)します。

再起動後、再起動に伴い自動で再設定されたswapを再び停止します。
```pi@raspberrypi:~ $ sudo dphys-swapfile swapoff ```
```pi@raspberrypi:~ $ sudo dphys-swapfile uninstall```
lsblkで確認してみます。今度はUUIDが追加されています。
```pi@raspberrypi:~ $ lsblk```
```sda1  ....... /media/pi/XXXXXX```
別の方法でmountを確認してみます。
```pi@raspberrypi:~ $ mount | grep sda```
```/dev/sda1 on /media/pi/XXXXXX type ext4 (......)```


#SSDをswapに設定
上でmountした/media/pi/XXXXXのパーテーションにswapを設定します。LinuxのTextエディターmousepadで/etcフォルダにあるdphys-swapfileファイルを開きます。
```pi@raspberrypi:~ $ sudo mousepad /etc/dphys-swapfile```
開いたdphys-swapfileファイル内でSDカードに設定されていた100MBのスワップCONF_SWAPSIZE=100をコメントアウトします。そして以下の３行を追加します。新しいCONF_SWAPSIZEは210000です。210GBです。CONF_SWAPFILEは/media/pi/XXXXXパーテーションのswapファイルを指定します。（swapファイルはまだありませんがswapを起動するときに自動で生成されます）XXXXXXXX部分は上で確認したUUIDを記入します。UUID入力部分XXXXXXXが少し長く大変です。CONF_MAXSWAPは数字を記入しません。無制限になります。
```#CONF_SWAPSIZE=100```
```CONF_SWAPSIZE=210000```
```CONF_SWAPFILE=/media/pi/XXXXXXXXXXX/swap```
```CONF_MAXSWAP=```
保存(save)してmousepadを終了します。

#swapの動作確認
swapを起動します。
```pi@raspberrypi:~ $ sudo dphys-swapfile setup```
```pi@raspberrypi:~ $ sudo dphys-swapfile swapon```
```pi@raspberrypi:~ $ free```
210GBのSwapが現れています。ここでRaspberry Pi 本体を再起動します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960318/614af47d-8f9c-578e-7194-41c87229fbed.png)
再起動後、freeで確認します。Swapが０になっています。
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960318/ad1bcaa2-2c04-0e9b-4da8-3e3fbbff1909.png)
SDカード以外にswapを移動させると、Raspberry Pi本体起動時にswapが自動起動しない仕様になっているようです。この状態では本体のメインメモリ８Ｇだけの状態です。手動でswapを起動します。210GBのSwapが現れます。
```pi@raspberrypi:~ $ sudo dphys-swapfile setup```
```pi@raspberrypi:~ $ sudo dphys-swapfile swapon```
```pi@raspberrypi:~ $ free```

次に、手動で起動したこの210GBのswapが動くのか確認してみます。750MBのBMP画像ファイルを、WinSCPを使ってssh経由で、Raspberry Pi本体の/home/piに転送します。Raspberry Pi本体でBMP画像ファイルを数秒毎で次々とopenします。メインメモリ８Ｇありますから10個ほどまで2秒ほどで開きます。速いです。しかし開いた画像ファイルが10個を超えたあたりから25秒かかるようになります。SSDのLEDが点滅し始めます。1個openするのに25秒かかりましたが40個の画像ファイルをopenしました。freeで確認したのが下図です。
![333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960318/a73c0c8c-e97b-8478-e93e-a8f39de03bf9.png)
swapを41GBほど使っています。メインメモリー空きは92MBほどしか残っていません。750MBのBMP画像ファイルをopenする毎に、swapにスワップアウトが発生することがわかります。実効速度として760MB毎に25秒かかります。下側は画像ファイルを全て閉じた後です。メインメモリ空きが7.2Ｇほどまで回復しています。ただswapに91MBほど残っています。使う頻度が少ないとみなされたファイルでしょう。しかしRaspberry Pi 本体を再起動するとswapはまた０になります。


以上、メインメモリーのswapをUSBに増設したポータブルssdに設定して、Raspberry Pi 4B を動作させることができました。

しかしメインメモリーから、USB3に増設したext4フォーマットSSDへのスワップアウトの実効速度は30MB/S程度しか出ませんでした。UHS-Ⅰ30のSDカードを使えばデフォルトのSDカードへのスワップアウトでも同じ30MB/Sの実効速度が出ます。一方、購入したままのNTFSフォーマットされたSSDのコピペでの実効速度は50MB/Sほどです。別途、このNTFSフォーマットされたSSDをPCのUSBに接続してコピペすると実効速度は300MB/S前後が出ます。ext4フォーマットしたSSDはRaspberry Pi OSでswap領域として使用できるようになるのですが、ext4フォーマットしたことによりRaspberry Pi OS上では逆に遅くなってしまうことがわかりました。

64bitのOSは4GBを超えるメモリー空間が使え、大画像ファイルや動画のエンコーディングにも大変有用です。PCでは大容量のメインメモリーを増設することが最短の方法です。しかし大画像ファイルを処理する場合などは、この大容量のメインメモリーさえも超え頻繁にスワップアウトします。この時、実効速度400MB/S前後のSSDのswapは大変快適です。

ただRaspberry Piはこのような用途は想定されておらず、1ボードコンピュータなのでメインメモリーも増設することはできません。そこで考えたのが今回のSSDのswap増設でした。しかし実効速度は30MB/S前後でした。今回のSSDは、Raspberry Pi OS上でhdparmを使って測定すると読み書きとも280MB/Sほど速度が出ているのですが、swapの実効速度がなぜこれほど遅かったのか原因は分かりません。どこか設定が悪かったのかもしれません。

今回の結果よりRaspberry Pi 4Bではswapとして、SSDとSDカードがほぼ同じ速度でした。ゆえに今回のようなSSDでのswap導入の高い難易度のハードルを考えると、現状ではRaspberry PiのswapとしてはデフォルトのSDカードスロットで30MB/S保証SDカードの方がむしろおすすめです。さらに次モデルでRaspberry Pi本体にUHS-Ⅱカードスロットが追加される選択肢も期待できそうです。一方、DESKTOPおよびSERVERでのデータ保存DISKを考えた場合、NTFSでフォーマットされたSSDの方が、Raspberry Piでは自動認識され、50MB/Sほどの速度が確保され、データ保存の安全性から、そしてコストパフォーマンスからも優れています。データ保存DISKとしては、NTFSフォーマットのSSDを接続して、そのまま使っています。メモリーは８Ｇのメインメモリーだけで、swapは０設定で使っています。メインメモリーが８Ｇもあると通常はswapを全く必要としません。SDカードは起動専用として永持ちしそうです。30MB/S保証SDカードは少し高価でしたが起動は速いです。そして、swapを動かす時があれば、sudo dphys-swapfile setup とsudo dphys-swapfile swaponの２行で、いつでも210GBのSSDのswapが動きます。


最後までご覧いただきありがとうございました。