【Raspberry Pi】UbuntuのシステムをSDメモリからSSDへ移動する

Ubuntu
Raspberry Pi 4Bで64bitのUbuntuを使って遊んでいます。SDメモリよりUSB接続したSSDの方が速いのは明らかなのでUbuntuをSSDへ移動してみます。


64bitのUbuntuでNextcloudというソフトでおうちクラウドを作って遊んでいます。
関連記事:Raspberry Pi 3でNextcloudを動かす時の注意点
ラズパイ4Bでメモリーが4GBになりメモリキャッシュが効くとはいえ、SDメモリで大きなビデオファイルを入れたり消したりするとだんだん書き込み速度が遅くなります。SDメモリにはファイルを削除したメモリブロックを未使用領域に戻すTrim命令がありません。
USB接続したSSDの方が速いのは明らかなのでSSDで動くようにしたいとは思っていました。できればRaspberry Pi 4BがUSBブートに対応してからと考えていましたがUSBブートはいつになるか分かりません。辛抱できないのでUbuntuのパーティションだけSSDへ移動する事にします。

SDメモリでブートしてUSB接続のSSDを動かす方法は他のサイト様がいくらでも紹介しているでしょう。私も同じ方法なのでわざわざ記事にする必要はないかなと思ったのですがUbuntuでやるという付加価値を付けてみます。まぁこれも良く見かけるけど。

Raspberry Pi 4BのUbuntuにUSB SSDをつなぐ

まずはUSB端子にSSDをつながなくてはなりません。Raspberry Pi 4BではついにUSB3.0に対応し高速な読み書きが可能です。ですがUSB3.0のストレージアダプタには多くの相性問題があるようです。
SSDの読み書きが遅い、書き込み途中でI/Oエラーが出る、などの症状が出ます。こんな時はこちらの記事も御覧ください。
関連記事:Raspberry Pi 4でUSB3.0接続のSSDがとても遅い

私が使っているアダプタはこれです。

これにWestern DigitalのWD GREEN 120GBをつないでいます。上の関連記事の設定をしないと上手く動きませんでした。
このアダプタでも動かないSSDがありました。Raspberry Piでパーティションを新しく作りフォーマットをすると途中でUSBストレージドライバが消えます。エラーが起きて消えてしまうようです。
こんな時は
dmseg
でエラーを確認します。
エラーメッセージで検索するとUSBの電流が足りないとか見つかります。バスパワーではなく電源を付けられるUSBハブを使えば良いそうです。

こんな感じでUSBにSSDをつなぐだけでも面倒な事が起きるかもしれません。
それでは無事にSSDがつながったとして話を続けます。

SSDにパーティションを作成する

SSDに新しくパーティションを作ります。
まずは接続したSSDがデバイスとしてどう認識されたかを確認します。
lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0  80.9M  1 loop /snap/core/8596
loop1         7:1    0  59.9M  1 loop /snap/lxd/13953
loop2         7:2    0  59.9M  1 loop /snap/lxd/13991
loop3         7:3    0  80.9M  1 loop /snap/core/8691
sda           8:0    0 111.8G  0 disk 
└─sda1        8:1    0 111.8G  0 part 
mmcblk0     179:0    0  29.8G  0 disk 
├─mmcblk0p1 179:1    0   256M  0 part /boot/firmware
└─mmcblk0p2 179:2    0  29.6G  0 part /
この例では名前sdaとして認識されています。USBにいろいろつないでいるとsdb,sdcなどになる場合もあります。そしてつないだSSDにパーティションが既にあるとsda1などと表示されるでしょう。

デバイスの名前を確認したら既存のパーティションを消して新しいパーティションを作ります。SSDの中身は消えてしまうのでバックアップするなど注意してください。
パーティションを操作するプログラムを動かします。
sudo fdisk /dev/sda
Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help):
こんな風にfdiskのコマンド入力の待機プロンプトが表示されます。"m"を入力するとコマンド一覧が表示できます。
パーティションを削除するには"d"を入れます。
Command (m for help): d
Selected partition 1
Partition 1 has been deleted.
パーティションが複数ある場合は繰り返します。
次は新しくパーティションを作るので"n"を入れます。
Command (m for help): n
Partition number (1-128, default 1): 
First sector (34-234441614, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-234441614, default 234441614): 

Created a new partition 1 of type 'Linux filesystem' and of size 111.8 GiB.
Partition #1 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: y

The signature will be removed by a write command.
いくつかパラメータを入れる必要がありますが、こだわりが無ければ何も入れなくとも大丈夫でしょう。以前のパーティションの状況によって確認が要求されます。多くの場合”y”と入れれば良いでしょう。ちゃんとメッセージを呼んで入れてください。

これまでの作業は実際のSSDにはまだ反映されません。最後に"w"とコマンドを入れると新しい設定がSSDへ書き込まれます。
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
そしてfdiskも終了しターミナルのプロンプトに戻ります。ここで再起動を求めるメッセージが出る場合もあるでしょう。メッセージに従ってください。

SDメモリのUbuntuをSSDのパーティションへコピーする

SSDの準備が整ったのでSDメモリのUbuntuのパーティションをSSDのパーティションへコピーします。
Ubuntuのパーティションを確認します。先程と同じlsblkコマンドを入れます。
lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0  80.9M  1 loop /snap/core/8596
loop1         7:1    0  59.9M  1 loop /snap/lxd/13953
loop2         7:2    0  59.9M  1 loop /snap/lxd/13991
loop3         7:3    0  80.9M  1 loop /snap/core/8691
sda           8:0    0 111.8G  0 disk 
└─sda1        8:1    0 111.8G  0 part
mmcblk0     179:0    0  29.8G  0 disk 
├─mmcblk0p1 179:1    0   256M  0 part /boot/firmware
└─mmcblk0p2 179:2    0  29.6G  0 part /
今度はmmcblk0というデバイスのmmcblk0p2というパーティションに注目します。ここにUbuntuが入っています。このパーティションをまるごとSSDへコピーします。
sudo dd if=/dev/mmcblk0p2 of=/dev/sda1 bs=16M conv=noerror,sync
数GBをコピーする事になるでしょうから、しばらく時間がかかります。
無事に終わるとこんなメッセージが出ます。
1891+1 records in
1892+0 records out
31742492672 bytes (32 GB, 30 GiB) copied, 794.299 s, 40.0 MB/s
15分近くかかりました。

SSDのパーティションのラベルを変える

Raspberry Piのブート時にどこのパーティションのOSを動かすかはパーティションのラベルで指定します。SDメモリのパーティションをそのままコピーしたのでSSDのパーティションにはSDメモリと同じラベルがついています。確認してみます。
sudo e2label /dev/sda1
writable
Ubuntuでは”writable”というラベル名になっているようですね。このラベル名を一意なものに変えます。ここでは"myUbuntu"とします。
sudo e2label /dev/sda1 myUbuntu
Recovering journal.

カーネルコマンドラインでブートパーティションを変える

SSDの準備が整ったのでカーネルコマンドラインをSSDのパーティションからブートするように変更します。
カーネルコマンドラインは/boot/firmwareディレクトリのnobtcmd.txtに書かれています。
これはデフォルトのままの場合です。もしもご自分でbluetooth設定を変えたならbtcmd.txtを変えます。わからなくなったら両方とも変えておけば良いでしょう。
エディタで編集します。
sudo nano /boot/firmware/nobtcmd.txt
この中に
root=LABEL=writable
とある部分を
root=LABEL=myUbuntu
に変更します。
エディタで保存し終了します。
再起動をするとSSDからUbuntuが立ち上がります。
この変更を元に戻せばSDメモリから立ち上がります。
ラベル名で起動するパーティションを指定していますので、ラベル名が他とダブらないようにしてください。

ベンチマーク

SSDから起動できたので試しにSSDのベンチマークを見てみます。
ベンチマークにはiozone3を使いました。
sudo apt update
sudo apt install iozone3
iozone -e -I -a -s 50M -r 4k -r 512k -r 16M -i 0 -i 1 -i 2
結果はこのくらいです。
                                                              random    random                                   
              kB  reclen    write  rewrite    read    reread    read     write
           51200       4    16493    22192    24628    24545    13724    20777                                                          
           51200     512   222229   237639   265308   270429   261824   229109                                                          
           51200   16384   272707   263528   310013   307732   311118   275270 
シーケンシャルでは500MB/s近く出るはずなので思ったより速くないです。ですがSDメモリーに比べたら桁違いに速いですね。
関連記事:Raspberry Piには4kランダムリードライトが速いSDカードを使おう

まとめ

SDメモリのUbuntuパーティションをSSDへコピーしてSSDからUbuntuが動くようにしてみました。
パーティションをコピーしてラベル名を変えるだけでSSDからUbuntuが動くようになりました。
起動するパーティションはラベル名で決まるのでユニークなラベル名にしておく必要があります。

Raspberry Pi 4BのUSB3.0にSSDをつなぐにはUSBアダプタとの相性に気をつける必要があります。
また電源を接続できるUSBハブを使う必要があるかもしれません。

肝心のNextcloudですがイーサネットの方に律速があり100Mbps弱の速度しか出ないため高速なSSDにしても恩恵があまりありませんでした。phpって遅いのかな?

コメント

  1. 通りすがりのものですが、下記は微妙に違います。
    >SDメモリにはファイルを削除したメモリブロックを未使用領域に戻すTrim命令がありません。

    SDカード=NANDフラッシュメモリ、なので消去コマンドは必ず対応しています。(でないとデータが消せません。)
    かつ、raspberry PIのSDカードスロット(/dev/mmcblk0)は discardに対応しています。
    以下、当方所有のRPI4bでの "lsblk -D"の結果で、DISC-GRANが非ゼロで対応です。

    ubuntu@ubuntu:~$ lsblk -D /dev/mmcblk0
    NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
    mmcblk0 0 8M 455.4G 0
    ├─mmcblk0p1 7340032 8M 455.4G 0
    └─mmcblk0p2 0 8M 455.4G 0

    とはいえ、、、
    USBアダプタ経由(mass-storage class driver)でSDカードにアクセスする場合、UASP非対応=TRIM/discardが通らない製品ばかりのようですので、メインデータをSSDに載せるのは賛成です。

    返信削除
    返信
    1. コメントありがとうございます。
      Trim命令は未使用ブロックをコントローラへ伝えるだけでTrim命令で何をするかはメモリーコントローラしだいなのでは?OSは暇があったらちゃんと消しといてよと言うけど、そんな面倒なことをSDカードはしない。OSのドライバでプログラム的にTrim命令に期待する結果と同じ動作をさせる方法はあるでしょうがTrim命令とは異なる話ではないでしょうか。

      削除

コメントを投稿

最近のコメント

Threaded Recent Comments will be here.