Raspberry Pi 4 起動ドライブを高耐久USBメモリにする

HomeKitを使う

Homebridgeなどを常時稼働させているRaspberry Pi 4で、普通のUSB 3.0メモリを起動ドライブに使ってました。これを、高耐久らしい「産業用」USBメモリに交換しました。

RPi4の補助記憶

Raspberry Pi 4 (RPi4)で、Homebridge, Mosquitto, Zigbee2MQTTを常時稼働させてます。これのドライブとして、Micro SDカードやUSBメモリを使ってきました。使った感じは以下のようでした。

普通のSDカード

RPiは元々SDカードを起動ドライブに使う設計になってますが、SDカードは壊れやすいです。初代RPiの時からの経験で、常時稼働すると数ヶ月くらいで壊れてしまう気がしてます。AliExpressで売っているような格安SDカードは何枚か壊れましたし、SanDiskのようなブランド品でもダメでした。SDカードは、デジカメの記録メディアとしては適しているけど、OS起動ドライブのように、ちまちまと頻繁に読み書きする用途には、向いていないのだと思います。

産業向けSDカード

それでTranscendから出ていた「産業用」というSDカードを使いました。組み込み向けに適しているそうです。別の場所で使っている常時稼働RPiで、ほぼ2年使ってますが、今のところ問題なく動いています。

普通のUSB3.0メモリ

こちらの記事では、RPi4の起動ドライブに一般的なUSB 3.0メモリを使いました。

品薄Raspberry Pi 4が買えたのでHomebridgeを引越した
ずっと品切れだったRaspberry Pi 4が入手できたので、 Homebridge本体と Mqttthingプラグイン Zigbee2MQTTプラグイン Mosquitto Zigbee2MQTT をインストールしました。補助記憶にはU...

USB 3.0メモリは、SDカードよりreadで6倍くらい高速でした。USB 2.0メモリは、逆にSDカードより低速です。SDカードとの比較した耐久性の違いは不明ですが、現時点で8ヶ月くらい、問題なく動作してます。

産業向けUSB3.0メモリ

SDカードに産業向けがあるなら、USBメモリにもあるのではと探したところ、やはりTransendが作ってました。価格は、通常のブランド品USBメモリの倍以上、もしかすると3倍くらいの値段です。3D TLC NANDを使っているとのことです。集積度は高くなりそうだけど、耐久性にも関係するのかはよくわかりません。

Amazonのページにあるスペック表によると、80TB書き込んでも大丈夫らしく、ウェアレベリング(書き込む場所の分散平均化)機能もあるとのことです。ウェアレベリングは今時のUSBメモリにはどれも搭載されていると聞いたこともありますが、明記されているのはちょっと安心です。

耐久性が本当に優れているのかどうかは使ってみないとわかりませんが(使ってみてもわからない可能性もありますが)これをRPi4に使ってみます。ちなみに、読み出し/書き込み速度は、140/28MB/sくらいで一般的なUSB 3.0メモリと同じです。

サイズは、一般的なUSBメモリのサイズで、今まで使っていた小型USBメモリと比べると大きいです。邪魔になるかと思ったのですが、他のUSBコネクタやLANケーブルも同じように飛び出しているので、それほど出っ張っている印象にはなりませんでした。

追記:現在は、新モデルが販売されているようです。

RPiをバックアップする

ということで、RPiのドライブとして使用中の普通の32GB USBメモリを、産業用32GB USBメモリに移行することにしました。ddコマンドで機械的に複写してしまう手もありますが、気分が良いので、綺麗さっぱりインストールしなおしました。忘れていたセットアップ手順を思い出して、使わないファイルの掃除をすれば、今後のメンテにも役立つかもと思いました。

ということで、まずは現在の設定ファイル類をバックアップします。こちらの記事で書いたように、

Raspberry Pi上のHomebridge関連設定をバックアップする
Raspberry Pi 4で動かしている、Homebridge, MQTT, Zigbee2MQTTの設定をバックアップすることを考えました。Raspberry Pi 4はUSBメモリで起動しているので、SDスロットは未使用でした。そこで...

今のRPi4は、USBメモリで起動して動作していますが、使わなくなったSDカードスロットにも小容量SDカードを差してバックアップ用に使ってます。SDカードは/mnt/sdにマウントしてます。そこで、USBメモリを交換する前に、バックアップしておきたいファイルを、このSDカードと、作業しているMacにコピーすることにしました。バックアップしたいファイルはいろいろありました。

Homebridgeのバックアップ

Web UIのバックアップ機能を使って、バックアップアーカイブファイルをMacにダウンロードしておきます。これですぐに復帰できます。

念のために、 /var/lib/homebridge/backups/ 以下もSDカードにバックアップしておきました。

MQTTのバックアップ

MQTTの設定ファイルとパスワードファイルの、

  • /etc/mosquitto/mosquitto.conf
  • /etc/mosquitto/password.txt

をSDカードにバックアップしました。

Zigbee2MQTTのバックアップ

Zigbee2MQTTの設定ファイルやデータベースは、/opt/zigbee2mqtt/data/ 以下にあります。Zigbee2MQTTのバージョンアップの方法のガイドでも、これをバックアップして戻すという手順が紹介されてます。なので、/opt/zigbee2mqtt/data/ 以下のすべてのファイルをSDカードにバックアップしました。

homeのバックアップ

念のためにhomeディレクトリもバックアップしておきました

$ tar cvf /mnt/sd/backup/$USER.tar ~

思いの外、隠しファイルがたくさんあってサイズが大きかったです。

その他設定ファイルのバックアップ

crontabで動かしていたスクリプトがいくつかあったので、これもバックアップしておきました。crontabの設定は以下のようにしておきました。

$ crontab -l > /mnt/sd/backup/mycron

systemctlで設定した自動起動の設定ファイルもSDカードにバックアップしておきました。必須なのは

  • /etc/systemd/system/zigbee2mqtt.service

です。このほかDIYしたプログラムの自動起動設定ファイルもバックアップしておきました。homebridgeとmosquittoは、インストーラが自動起動設定を作ってくれているのでバックアップ不要です。

SDカードを自動マウントする/etc/fstabの設定もSDカードにバックアップしようと思いました。でもよく考えたら、SDカードをマウントするために必要なファイルなので、SDカードに入れておいたら使えません。それで内容をMacのメモ.appにコピーしおきました。

これくらいバックアップしておけば大丈夫でした。

起動用USBメモリを作る

まずはいつものようにRaspberry Pi Imagerを使って起動USBメモリを作ろうとしました。

Just a moment...

Raspberry Pi Imagerの「OSを選ぶ」から、「Other specific-purpose OS」を選び、「Home Assistants and home automation」を選び、Homebridgeを選びます。

Raspberry Pi Imagerの歯車アイコンを押すと、起動の設定ができます。まずはWiFi設定を聞かれるので、Macと同じLANでよければYesしておきます。

ホスト名は、デフォルトではraspberrypiですが、短くpi4にしまた。ディスプレイは接続しない予定なので、sshを有効にしておきます。公開鍵認証のみにしておきました。ユーザ名はMacでいつも使っている名前にしました。セキュリティも上がるし、sshするときにユーザ名を入れなくて良いので楽です。またここで、時差を設定しておけばログの日時などが日本時間になります。Ethernetを使う予定ですが、バックアップとして5GHzのWiFiも設定もしました。

「ストレージを選ぶ」からUSBメモリを選んで、

「書き込む」ボタンを押せば作成終了のはずでした。

しかし、エラーが出てしまいました。

追記:新しいバージョン(試したものは1.8.1)ではエラーは出ず、問題なくインストールできました。

このメッセージ “Reached end of FAT32 root directory, but no end-of-directory marker found.” で検索したところ、以下の情報がありました。

Imager returns "No end-of-directory marker found" error - Raspberry Pi Forums

どうやら最新版Raspberry Pi Imager 1.7.4のバグで、何らかの条件で発生するらしいです。こちらから古いバージョンを入手して

Releases · raspberrypi/rpi-imager
Contribute to raspberrypi/rpi-imager development by creating an account on GitHub.

1.7.3を使ったらインストール成功しました。

こうしてHomebridgeを書き込んだUSBメモリで、RPiを起動できます。pi4という名前をつけて、sshで接続できる設定にしたので、起動してしばらくすれば、

$ ssh pi4.local

でRPi 4に接続できます。

RPiを復元

これから元の状態に復元していきます。

SDカードをマウント

まずは、バックアップ先のSDカードを読めるようにしておきます。マウントポイントを/mntの下に作ります。次に、/etc/fstabをエディタで開いて、以前のfstabの設定に戻します。前の設定は、先の手順で、Macのメモにコピーしてあったので、その行を追加しました。

$ sudo mkdir /mnt/sd
$ sudo vi /etc/fstab

これで再起動すればSDカードが復活します。

IPアドレスを固定する

今まで通り/etc/dhcpcd.confの内容をバックアップしておいて復活すれば良いと思ってたのですが、それではアドレス固定されませんでした。sudo raspi-configしたら、NetworkManagerを使う設定に変わっているみたいでした。

去年インストールした時は、dhcpcd方式だったのですが、イメージファイルの設定が変わったのか、それとも今回はWiFiも設定したので変わったのか、今回はNetworkManagerでした。dhcpcdに戻してみたところ、Homebridgeのweb UIにアクセスできなくなりました。なので、おとなしくNetworkManagerで進めることにしました。NetworkManagerは、nmtuiコマンドで設定が可能です。

$ sudo nmtui

これで表示されるメニューを選んで、固定アドレスにしました。

homebridgeを復元

適当なブラウザからhttp://pi4.local:8581、もしくは指定した固定アドレスを開けば、Homebridgeを使用できます。

アカウント設定して起動させた後、メニューから「バックアップと復元」を選び、バックアップファイルをアップロードします。

これでHomebridgeは復元できました。

Mosquittoの再インストール

次にこちらに書いた手順で、Mosquittoをインストールします。

MQTTブローカーMosquittoを設置する
今回はMQTTブローカーをインストールします。MQTTがあると、スイッチ、センサ、リレー、サーボモータなどを接続したArduinoのようなコンピュータを、ネットワーク越しにIP接続したい時にとても便利です。また、MQTTを使うスマートホーム...

基本的には、aptコマンドでインストールして、RPi起動時に立ち上がるよう設定しました。

sudo apt install mosquitto mosquitto-clients
sudo systemctl enable mosquitto.service

また、バックアップしてあった以下のファイルを元に戻し、ユーザアカウント、パスワードを有効化します。

  • /etc/mosquitto/mosquitto.conf
  • /etc/mosquitto/password.txt

これで再起動すればMosquittoが起動しますし、以下のコマンドでも起動します。

sudo systemctl start mosquitto.service

Zigbee2MQTTを再インストール

次にZigbee2MQTTを、公式ページの手順に従ってインストールしました。

Linux | Zigbee2MQTT
Zigbee to MQTT bridge, get rid of your proprietary Zigbee bridges

Zigbee2MQTT公式ページの手順に従って、nodejsなどを入れて、zigbee2mqttのディレクトリを作り、ユーザを設定して、Zigbee2MQTTのリポジトリをクローンします。

sudo curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install -y nodejs git make
sudo mkdir /opt/zigbee2mqtt
sudo chown -R ${USER}: /opt/zigbee2mqtt
git clone --depth 1 https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
cd /opt/zigbee2mqtt
npm ci

次にSDカードにバックアップしてあった/opt/zigbee2mqtt/dataを復活しました。

$ cp -r /mnt/sd/backup/zigbee2mqttdata/* /opt/zigbee2mqtt/data/.

以下のコマンドで動作を確認して、

cd /opt/zigbee2mqtt
npm start

コントロールcで止めます。これもSDカードにバックアップしてあったzigbee2mqtt.serviceファイルを戻して、

$ sudo cp /mnt/sd/backup/zigbee2mqtt.service /etc/systemd/system/.

電源投入時に自動起動する設定にします。

sudo systemctl enable zigbee2mqtt.service

これもsystemctl startコマンドで起動できます。

sudo systemctl start zigbee2mqtt.service

zigbee2mqttに関しては、こちらの記事

Zigbee2MQTT非対応の無線壁スイッチを動かす
LoraTap社のZigbee無線スイッチをZigbee2MQTT (Z2M) とHomebridge経由でHomeKitから使えるようにしました。通常の壁スイッチと同じサイズなので、取り替えが簡単で綺麗に収まります。 壁スイッチ問題 電球...

で変更したこの

/opt/zigbee2mqtt/node_modules/zigbee-herdsman-converters/devices/tuya.js

tuya.jsファイルをバックアップし忘れてました。同じ変更をしておきました。

USBメモリ交換に必要だったバックアップ

この他、ホームディレクトリを戻したり、crontabの設定を戻すなどして、USBメモリ移行が完了しました。USBメモリ交換で必要だったバックアップ情報、ファイルをまとめておくと、

  • /etc/fstabの設定
  • ホームディレクトリの内容
  • crontabで動かしていた設定とスクリプトファイル
  • Homebridgeのバックアップアーカイブファイル
  • /etc/mosquitto以下のmosquitto.confとpassword.txt
  • /opt/zigbee2mqtt/data以下の全ファイル
  • /etc/systemd/system/zigbee2mqtt.service
  • その他自動起動させていたsystemctl関連ファイル
  • zigbee2mqttのnode_moduleでパッチ当てしたtuya.jsファイル

でした。

まとめ

Homebridgeなどを常時稼働させているRaspberry Pi 4の起動ドライブを、高耐久らしい「業務用」「産業用」USBメモリに交換しました。今までの普通のUSBメモリと比べて、耐久性が上がったのかは、今のところ不明です。でも、たまにこうやってゼロからインストールし直すと、サーバの状態を把握できるので良いと思いました。

コメント

タイトルとURLをコピーしました