【Raspberry Pi】UbuntuのシステムをSDメモリからSSDへ移動する
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でやるという付加価値を付けてみます。まぁこれも良く見かけるけど。
SSDの読み書きが遅い、書き込み途中でI/Oエラーが出る、などの症状が出ます。こんな時はこちらの記事も御覧ください。
関連記事:Raspberry Pi 4でUSB3.0接続のSSDがとても遅い
私が使っているアダプタはこれです。
これにWestern DigitalのWD GREEN 120GBをつないでいます。上の関連記事の設定をしないと上手く動きませんでした。
このアダプタでも動かないSSDがありました。Raspberry Piでパーティションを新しく作りフォーマットをすると途中でUSBストレージドライバが消えます。エラーが起きて消えてしまうようです。
こんな時は
エラーメッセージで検索するとUSBの電流が足りないとか見つかります。バスパワーではなく電源を付けられるUSBハブを使えば良いそうです。
こんな感じでUSBにSSDをつなぐだけでも面倒な事が起きるかもしれません。
それでは無事にSSDがつながったとして話を続けます。
まずは接続したSSDがデバイスとしてどう認識されたかを確認します。
デバイスの名前を確認したら既存のパーティションを消して新しいパーティションを作ります。SSDの中身は消えてしまうのでバックアップするなど注意してください。
パーティションを操作するプログラムを動かします。
パーティションを削除するには"d"を入れます。
次は新しくパーティションを作るので"n"を入れます。
これまでの作業は実際のSSDにはまだ反映されません。最後に"w"とコマンドを入れると新しい設定がSSDへ書き込まれます。
Ubuntuのパーティションを確認します。先程と同じlsblkコマンドを入れます。
無事に終わるとこんなメッセージが出ます。
カーネルコマンドラインは/boot/firmwareディレクトリのnobtcmd.txtに書かれています。
これはデフォルトのままの場合です。もしもご自分でbluetooth設定を変えたならbtcmd.txtを変えます。わからなくなったら両方とも変えておけば良いでしょう。
エディタで編集します。
root=LABEL=writable
とある部分を
root=LABEL=myUbuntu
に変更します。
エディタで保存し終了します。
再起動をするとSSDからUbuntuが立ち上がります。
この変更を元に戻せばSDメモリから立ち上がります。
ラベル名で起動するパーティションを指定していますので、ラベル名が他とダブらないようにしてください。
ベンチマークにはiozone3を使いました。
関連記事:Raspberry Piには4kランダムリードライトが速いSDカードを使おう
パーティションをコピーしてラベル名を変えるだけでSSDからUbuntuが動くようになりました。
起動するパーティションはラベル名で決まるのでユニークなラベル名にしておく必要があります。
Raspberry Pi 4BのUSB3.0にSSDをつなぐにはUSBアダプタとの相性に気をつける必要があります。
また電源を接続できるUSBハブを使う必要があるかもしれません。
肝心のNextcloudですがイーサネットの方に律速があり100Mbps弱の速度しか出ないため高速なSSDにしても恩恵があまりありませんでした。phpって遅いのかな?
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がとても遅い
私が使っているアダプタはこれです。
このアダプタでも動かない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/s15分近くかかりました。
SSDのパーティションのラベルを変える
Raspberry Piのブート時にどこのパーティションのOSを動かすかはパーティションのラベルで指定します。SDメモリのパーティションをそのままコピーしたのでSSDのパーティションにはSDメモリと同じラベルがついています。確認してみます。sudo e2label /dev/sda1
writableUbuntuでは”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って遅いのかな?
通りすがりのものですが、下記は微妙に違います。
返信削除>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に載せるのは賛成です。
コメントありがとうございます。
削除Trim命令は未使用ブロックをコントローラへ伝えるだけでTrim命令で何をするかはメモリーコントローラしだいなのでは?OSは暇があったらちゃんと消しといてよと言うけど、そんな面倒なことをSDカードはしない。OSのドライバでプログラム的にTrim命令に期待する結果と同じ動作をさせる方法はあるでしょうがTrim命令とは異なる話ではないでしょうか。