株式会社アイズ・ソフトウェア

/~eyes-software-co-jp/A1A2
お問い合わせ |  情報セキュリティへの取組について情報セキュリティ方針個人情報保護方針) |  ブログ

NEWS RELEASE 新着情報

Raspberry Pi 400 をSSDから起動する

●Raspberry Pi 400 をSSDから起動する
ラズパイのOSを入れるメディアとして使用されているSDカードには「寿命」があります。寿命と言っても、何年で壊れるいうのではなく、何回書き込みをしたら壊れるというものです。
とは言え、スマホやデジカメで写真や音楽データを保存するような使い方では、寿命に達することはほとんどありません。
しかし、ラズパイでOSを入れたシステムディスクとして使用していると、一時的なファイルを作成したり、ログファイルを作成したりと、頻繁にファイル書き込みが行われます。ネット上で「raspberry pi SDカード 寿命」でググると24時間稼働して1年ほどで壊れたなんていう記事もあります。
先ほどのキーワードでググった結果には「SDカードの寿命を延ばす」方法を書いた記事がたくさん検索されます。

あまりSDカードのアクセスをしないプログラムを動かすのなら問題ないかもしれませんが、ネットサーフィンに使用するような場合はネットからダウンロードしたファイルをSDカードへキャッシュとしてコピーしますので、SDカードへのアクセスが多くなります。
その為、早く寿命に到達する可能性があります。

社員Iが入手したRaspberry Pi 400 はそのような使い方をする予定の為、寿命対策に外部USBメディアをシステムディスクとして使用し、SDカード無しで起動できるようにしてみました。


RaspberryPi 400に使用する外部USBメディアはUSB3接続のSSDを購入しました。スティック型のUSBメモリより少し大きいくらいのものです。安定して運用できる様なら本体に両面テープで張り付けようと考え、できるだけ小さいものにしました。これ

外部USBメディアから起動させるための設定手順は以下のサイトを参考にしました。
ラズパイ4をUSB接続のSSDから起動する方法(USBブート)
手順の概略は、SDカードの中身をSSDにコピーし、USBメディアからブートできるように設定変更します。 参照先のページでは、Raspberry Pi 4を対象にし、bootloaderのアップデートから記載されていますが、Raspberry Pi 400は購入時点でUSB Bootに対応した bootloaderになっていますので、ここの手順から実行します。
SDカードの中身をSSDにコピーした後、SDカードをスロットから抜いて再起動します。

ブート失敗の画面
このような画面が出て、起動に失敗しました。
「Unsupported block size 4096」というエラーが出ています。SSDのブロックサイズ4096をサポートしていないのでブートできないようです。

SDカードからブートして接続したSSDの属性を調べてみました。

$ sudo fdisk -l 
Disk /dev/sda: 119.2 GiB, 128026935296 bytes, 31256576 sectors
Disk model: Tech            
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 268431360 bytes
Disklabel type: dos
Disk identifier: 0xc3872196

Device     Boot  Start      End  Sectors   Size Id Type
/dev/sda1         8192   532479   524288     2G  c W95 FAT32 (LBA)
/dev/sda2       532480 31256575 30724096 117.2G 83 Linux
セクターサイズは4098になっています。
SSDのセクターサイズは変えられなさそうですので、SSDからのブートはあきらめるしかないようです。(チップメーカーのユーティリティーで変更できるものはあるようです。)

●SDカードからブート、システムディスクをSSDにする
次の案として、SDカードでブートし、システムディスクとしてSSDを使用することとしました。これはRaspberry PiのbootloaderがUSBデバイスからの起動に対応していなかった頃にSDカードの寿命対策として使われていた方法です。

いま、手元にはRaspberryPi OSの入ったSDカードとそのコピーのSSDがあり、両方にブートパーティションとルートパーティションが存在します。
それを生かせば、少しの設定変更でSSDをシステムディスクとしてOSを起動することはできそうです。
設定については以下のページを参考にしました。
Raspberry Pi 3B+ SSD起動ディスク化 MicroSD必要と不要 両方試してみた

1. 「Raspberry Piの設定」画面でSDカードでブートされるように設定を戻す。
端末からraspi-configを実行し、6 Advances Options → A6 Boot Orderへ入り、B1 Card Boot に設定する。
$ sudo raspi-config

raspi-config メイン画面    raspi-config アドバンスドオプション画面    raspi-config ブートオーダー画面  
2. SSDをUSBポートから抜き、SDカードで起動する。
3. SSDをUSBポートに挿す。するとSSDのブートパーティションとルートパーティションが自動でマウントされる。
4. SSDのブートパーティションにあるcmdline.txtをSDカードのブートパーティションにコピーする。SDカードのcmdline.txtは別名でバックアップしておく。
$ cd /boot
$ sudo cp -p cmdline.txt cmdline_org.txt
$ sudo cp -p /media/[username]/boot/cmdline.txt ./
[username]は現在ログインしているアカウントのユーザー名

5. リブートする。
$ sudo reboot
ブート成功後のデスクトップ画面

あれ? デスクトップにbootとrootfsのアイコンができています。

使っていないSDカードが自動でマウントされてしまいました。
未使用のパーティションなのでマウントさせないか、隠したいですね。 使用しないパーティションは削除しても良いのですが、バックアップを兼ねて残しておきたいです。
その為にfstabに未使用パーティションを記述してマウントすることで、自動マウントによるアイコンが表示されないように設定しました。

a. マウントポイントを決めてディレクトリを作成する。
/mnt/unused/boot、/mnt/unused/rootfs をマウントポイントとすることにし、これらのディレクトリをmkdirで作成します。
$ cd /mnt
$ sudo mkdir -p unused/boot
$ sudo mkdir -p unused/rootfs
b. SDカードのパーティションのUUIDを調べる。
blkidコマンドで調べることもできますが、SDカード内のfstabを見れば分かります。
$ cd /media/[username]/rootfs/etc/
$ cat fstab
proc            /proc           proc    defaults          0       0
PARTUUID=c74c9849-01  /boot           vfat    defaults          0       2
PARTUUID=c74c9849-02  /               ext4    defaults,noatime  0       1
#
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
//192.168.0.15/raspberry-pi-smb /mnt/smb    cifs    _netdev,guest,file_mode=0777,dir_mode=0777  0   0
bootのUUIDが c74c9849-01 、rootfsのUUIDが c74c9849-02 でした。

c. SSD側のfstabを修正します。
/etc/fstabは以下の様になっています。
proc            /proc           proc    defaults          0       0
PARTUUID=c3872196-01  /boot           vfat    defaults          0       2
PARTUUID=c3872196-02  /               ext4    defaults,noatime  0       1
#
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
//192.168.0.15/raspberry-pi-smb /mnt/smb    cifs    _netdev,guest,file_mode=0777,dir_mode=0777  0   0
これを以下のように変更します。
proc            /proc           proc    defaults          0       0
PARTUUID=c74c9849-01  /boot           vfat    defaults          0       2
PARTUUID=c3872196-02  /               ext4    defaults,noatime  0       1
#
# unused devices
PARTUUID=c3872196-01  /mnt/unused/boot          vfat    defaults,ro          0       2
PARTUUID=c74c9849-02  /mnt/unused/rootfs        ext4    defaults,ro,noatime  0       1
#
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
//192.168.0.15/raspberry-pi-smb /mnt/smb    cifs    _netdev,guest,file_mode=0777,dir_mode=0777  0   0
2行目、SDカードのブートパーティションを/bootとしてマウントするようにします。
6行目、SSDのブートパーティションを/mnt/unused/bootとしてマウントします。変更されないように"ro"オプションを付けておきます。
7行目、SDカードのルートパーティションを/mnt/unused/rootfsとしてマウントします。同様に"ro"オプションを付けておきます。
編集を終了したらリブートします。

これでデスクトップに未使用のメディアが表示されなくなりました。

システムディスクをSSDに変える事で全体的に速くなりました。
特に、日本語入力をする時に待たされることが無くなり、ネットサーフィンも快適に行えます。

最後に
ここに記載した方法は用意した外部USBメディアで起動できない場合の方法です。
外部USBメディアから起動する為の設定を行った後に起動方法を変更しているので外部USBメディア及びSDカードに使用しない領域を作ってしまいます。
なので、最初からブートできることが分かっているメディアを使用することを推奨します。
  • Category:
  • タグ:RaspberryPi
  • Author:eyes-software-co-jp