Raspberry Pi

提供:Memorandum

ハードウェアを直接叩けるお手軽なLinuxコンソールホストとして、また、radikoの常時録音サーバとして、Raspberry Piシリーズをファンレスかつヘッドレスで24x7運用しているが、Raspberry Piシリーズは本体に装着できる唯一のストレージがフラッシュメモリのmicroSDメモリカードなので、結構な頻度で、microSDの寿命により使用不能となる[1]。その理由はフラッシュメモリの構造にある。それまでの磁気を利用したストレージと較べ、アクセス速度・耐衝撃性・静音性・省電力では大きな利点があるものの、書き換え可能回数に上限があるという致命的かつ回避不可能の欠点がある。この上限に達したmicroSDは、データを正常に保存できなくなるか、保存されているデータが破損するからだ。管理人のRaspberry Piシリーズの運用経験では、概ね1〜1.5年に1度、ext4ファイルシステムが破損したことが原因で、sshによるリモートログインやコマンド実行が不可能となり故障を知ることが殆どだ。

microSDが故障した場合、新品のmicroSDを用意し、ゼロから再インストール作業を実施せざるを得ないのだが、その際にいちいち自分の欲する情報や細かいtipsを検索するのが面倒なので、以下に、管理人なりのRaspberry Piシリーズの基本的なインストール手順を整理する。

Raspberry Piの運用ポリシはCPUやメモリが極めて貧弱で、かつ、ストレージの書き換え寿命が極端に短いので、通常運用中の動作に不要なソフトやプロセスは全て削除し、軽快さを極めることに尽きる。

前提条件

以下は運用開始当初から実施済である。

  1. microSDは高耐久仕様を
    ファンレスかつ24x7運用であるため、監視カメラやドライブレコーダ向けの、高温かつ常時書き換えが発生する環境でもある程度の長寿命が期待できるモデルを採用する。
    2020年06月12日21時45分に再インストールした際はKIOXIA(旧東芝メモリ株式会社)EXCERIA HIGH ENDURANCE32GBを選定している。購入価格は消費税込1,480円。
  2. ACアダプタは高出力仕様を
    ACアダプタは2.4A以上出力可能なものを採用する。特にRaspberry Pi 4 Model Bは起動時だけ2A以上が必要なので、高出力のACアダプタを用意しないと起動すらできない。
    Raspberry Pi 1 Model B+は起動時でもそこまで電流が不要らしく、PCのUSBポートから電源を取ることができる。
  3. ヒートシンクは必ず装着を
    Raspberry Piシリーズはシングルボードコンピュータとして販売されており、そのまま使用すると自ずとファンレスで運用することになるが、運用中のCPUやSoCは、触れると低温火傷する程度の高熱を発するため、放熱手段は運用者が運用形態を考慮して準備する必要がある。
    管理人は24x7で運用するため、Raspberry Pi 1 Model B+であればCPUやSoCに別売のヒートシンクを貼り付けたうえでケースに収めてから、Raspberry Pi 4 Model Bであればケースそのものがヒートシンクとなっているメタルケースに収めてから、それぞれ運用を開始する。

インストール手順

インストールするRaspberry Pi OS (旧Raspbian)はLinuxディストリビューションであるDebianを基盤としたRaspberry Piシリーズ向けLinuxディストリビューションだが、公開されている公式インストール手順とディストリビューションの仕組みから、先人による様々なtipsが存在する。それらを先述の運用ポリシに従ってまとめると、以下が最小手数のインストール手順となる。行頭にビュレット(•)があるものは実際に入力コマンドや列挙する項目を、無いものはファイルに書き込まれる内容を示す。

  1. イメージファイルをmicroSDに焼く
    作業時の最新版イメージファイルを32ビット版公式バージョンまたは64ビット版βバージョンからダウンロードする。解凍するとimgファイルが出て来るので、ddコマンドでmicroSDに焼く。
    以下では、真っ新なmicroSDをPCに挿したところ、dmesgコマンドで、/dev/sdbに論理ブロックサイズが512バイトのストレージデバイスとして認識されたことが確認できたため、それに2020-05-27-raspios-buster-lite-armhf.imgを焼くときのコマンド入力例である。
    • dd bs=512 if=2020-05-27-raspios-buster-lite-armhf.img of=/dev/sdb
  2. デフォルトユーザを変更する
    イメージファイルを焼いたmicroSDをRaspberry Piに装着し起動させると、一般ユーザはデフォルトでpi(デフォルトパスワードはraspberry)のみが、特権ユーザのrootはパスワード未設定で有効である。これらは知れ渡っているので、セキュリティ面から速やかに変更しなければならない。
    1. piでログイン後、rootにパスワードを設定する。
      • sudo passwd root
    2. ログアウト後、rootでログインし直し、piを希望するユーザ名に変更する。以下では例としてXXXとしている。
      • usermod -l XXX pi
    3. ホームディレクトリをpiからXXXへ変更する。
      • usermod -d /home/XXX -m XXX
    4. ユーザグループをpiから希望するユーザ名XXXへ変更する。
      • groupmod -n XXX pi
    5. 変更したXXXのログインパスワードをデフォルトパスワードから変更する。
      • sudo passwd XXX
  3. emacs-noxをインストールする
    これは管理人個人の完全な好みだが、今後の作業を円滑に進めるため、エディタとしてemacs-noxをインストールする。
    • apt-get install emacs-nox
  4. aptのリポジトリを変更してからupdate→upgradeする
    デフォルトで設定されているaptのリポジトリが、著しくレスポンスが悪いWIDE Project Tsukuba NOCなので、比較的高速なJAIST(北陸先端科学技術大学院大学)へ変更する。これを実施しないと、今後の作業でも時間のロスが激しい。Debianと同様、/etc/apt/source.list公式に公開されているリポジトリからJAISTのホストへ変更する。その後、インストールされているソフトを最新版へアップデートする。
    • apt-get update
    • apt-get upgrade
    • apt-get dist-upgrade
  5. 固定IPアドレスに設定する
    公開されている公式の手順ではDHCPクライアントソフトdhcpcdの設定/etc/dhcpcd.confを変更するようアナウンスされているが、管理人が運用しているサーバファームネットワークではDHCPを使用していないためDHCPプロセスは無駄なリソース消費となる。故に、通常のDebianと同様、/etc/network/interfacesにインタフェース名eth0で設定する。このときループバックインタフェースloも設定する。eth0に設定する各IPアドレスは各自がRaspberry Piを接続するネットワーク仕様に合わせる必要があるのは言うまでもない。

    # The loopback network interface
    auto lo
    iface lo inet loopback

    # The primary network interface
    allow-hotplug eth0
    iface eth0 inet static
    address 192.168.0.xxx
    netmask 255.255.255.xxx
    network 192.168.0.0
    gateway 192.168.0.xxx
    dns-nameservers 192.168.0.xxx

  6. 64ビットカーネルを有効にする
    Raspberry Pi 4 Model BはCPUが64ビットだが、特に指定しない限り、Raspberry Pi OSが32ビットカーネルで起動する。リソースを有効活用するため、64ビットカーネルを有効にする。
    Raspberry Pi OSの起動時の設定を記述している/boot/config.txtarm_64bit=1を追記する。
  7. 無線LANを無効にする
    管理人が運用しているサーバファームネットワークではRaspberry Piを無線LANで使用しないため無効とし、リソースと消費電力を節約する。
    Raspberry Pi OSの起動時の設定を記述している/boot/config.txtdtoverlay=disable-wifiを追記する。
    dtoverlayの引数はRaspberry Pi OSのVersionで変更される可能性があるので/boot/overlays/READMEを確認すること。2020-05-27-raspios-buster-lite-armhf.imgでは以下のように記述されている。

    Name: disable-wifi
    Info: Disable onboard WiFi on Pi 3B, 3B+, 3A+, 4B and Zero W.
    Load: dtoverlay=disable-wifi
    Params: <None>

  8. Buetoothを無効にする
    管理人が運用しているサーバファームネットワークではRaspberry PiでBluetoothを使用しないため無効とし、リソースと消費電力を節約する。
    Raspberry Pi OSの起動時の設定を記述している/boot/config.txtdtoverlay=disable-btを追記する。
    dtoverlayの引数はRaspberry Pi OSのVersionで変更される可能性があるので/boot/overlays/READMEを確認すること。2020-05-27-raspios-buster-lite-armhf.imgでは以下のように記述されている。

    Name: disable-bt
    Info: Disable onboard Bluetooth on Pi 3B, 3B+, 3A+, 4B and Zero W, restoring UART0/ttyAMA0 over GPIOs 14 & 15. N.B. To disable the systemd service that initialises the modem so it doesn't use the UART, use 'sudo systemctl disable hciuart'.
    Load: dtoverlay=disable-bt
    Params: <None>

    /boot/config.txtを変更する上記3設定は冒頭にまとめて以下のように記述すると忘れない。

    # enable 64bit
    arm_64bit=1

    # disable bluetooth and wi-fi
    dtoverlay=disable-bt
    dtoverlay=disable-wifi

  9. IPv6アドレスを無効にする
    管理人が運用しているサーバファームネットワークではIPv6を使用しないため無効とし、リソースと名前解決時間を節約する。
    以下の2行を/etc/sysctl.confの最下行に追加する。

    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1

  10. 再起動する
    ここまで実施後、再起動する。再起動が完了すると以下が反映される。
    • カーネルが64ビット
    • 固定IPv4アドレス
    • IPv6アドレス無効
    • 無線LAN無効
    • Bluetooth無効
    • 各種ソフトウェアが最新版
  11. 不要なソフトウェアとプロセスを削除する
    管理人が使用しないソフトウェアとプロセスを削除する。具体的には以下。
    • avahi-daemon
    • bluetooth
    • dhcpcd
    • exim4
    • iw
    • rpcbind
    • rsync
    • rsyslog
    • wpasupplicant
  12. microSDへの書き換えを極力無くし延命化する
    swap領域を無効にし、/tmp/vat/tmp/var/logをRAMへ追い出し、ext4ファイルシステムのジャーナルを無効化する。
    1. swap領域を無効化し、swap領域マネジャをパケージごと削除する
      • sudo swapoff --all
      • apt-get --purge remove dphys-swapfile
      • sudo rm -fr /var/swap
    2. /etc/fstabに以下を追記する

      tmpfs /tmp tmpfs defaults,size=496m,noatime,mode=1777 0 0
      tmpfs /var/tmp tmpfs defaults,size=8m,noatime,mode=1777 0 0
      tmpfs /var/log tmpfs defaults,size=8m,noatime,mode=0755 0 0

    3. 現在microSDに存在している各ディレクトリを削除する
      • sudo rm -fr /tmp
      • sudo rm -fr /var/tmp
      • sudo rm -fr /var/log
    4. /var/logのディレクトリ構成を復元するスクリプトを/etc/rc.localexit 0の手前に下記を追記する。

      mkdir -p /var/log/apt
      mkdir -p /var/log/fsck
      mkdir -p /var/log/ntpstats
      mkdir -p /var/log/samba

      chmod 750 /var/log/samba
      chown ntp:ntp /var/log/ntpstats
      chown root:adm /var/log/samba

      touch /var/log/btmp
      touch /var/log/lastlog
      touch /var/log/wtmp

      chmod 600 /var/log/btmp
      chmod 664 /var/log/lastlog
      chmod 664 /var/log/wtmp

      chown root:utmp /var/log/btmp
      chown root:utmp /var/log/lastlog
      chown root:utmp /var/log/wtmp

    5. ext4ファイルシステムのジャーナルを無効化する
      • sudo umount /dev/mmcblk0p2
      • sudo tune2fs -O ^has_journal /dev/mmcblk0p2
  13. 再起動する
    無事に再起動が完了すれば、microSDの書き換え頻度が著しく下げられた、24x7運用可能なRaspberry Piの基盤が出来上がる。その後は必要なソフトをインストールする。

脚注

  1. 録音スクリプトでは、ストリーミングデータとして受信したReal-Time Messaging ProtocolテンポラリファイルはRAMに追い出した/tmpに、それをffmpegで生成したmp3ファイルは管理人がサーバファームネットワークで運用しているNASにCIFSでマウントした先に、それぞれ置くようにしているため、radikoを録音するだけではRaspberry Piに装着したmicroSDへの書き換え頻度は少ないどころかほぼ無いはずだが、それでもこのぐらいの頻度で不意にext4ファイルシステムが壊れ、使用不能に陥る。microSDが置かれている高温環境も一因なのだろう。