microSDカードとRaspberry Pi

Last modified: 2019-07-15

Raspberry Piは基本的に(初代Piなどの一部を除き)microSDカードを通じてOSのプログラムなどのデータを読み書きするが、このmicroSDカードは寿命を意識して使う必要がある。

ここで扱うmicroSDカードの性質の一部はSSDに対しても言えるが、SSDとは実施可能な対策に一部違いがある。

書き込み可能回数は有限であることを意識する

  • microSDカードはその中にある “NAND” という種類のフラッシュメモリにデータを記録する
  • フラッシュメモリは書き換え可能回数が有限で、使い続けると遅かれ早かれデータの書き込みが正常に行えなくなるときが来る
    • Raspberry Piは、(データを頻繁に書き込むような一部の用途を除き)ドライブレコーダーなどと比べれば書き込まれるデータ量は遥かに小さいが、工夫次第で書き込み量を大幅に抑えることができ、長寿命化につなげられる
    • HDDのような感覚で頻繁に書き込みを行う使い方をすると、書き込み量を抑えた使い方をした場合と比べて早く寿命を迎えてしまう
      • もちろん、金銭的にも時間的にも余裕があって書き込み回数を気にした使い方をするのが面倒というのであれば、使い方は自由

長く使うためのmicroSDカードの選び方

  • 同じ “NAND型フラッシュメモリ” にも幾つかの記録方式があり、安価なTLC(Triple Level Cell)方式のカードよりもやや高めなMLC(Multi Level Cell)方式のカードのほうが書き換え可能回数が10倍程度と言われている
    • SLC(Single Level Cell)方式は更に10倍と言われているが、コストパフォーマンスを考えるとMLC方式が最も適していると思われる
  • 容量の大きいカードは、その容量自体が必要でなくても書き換え可能な場所の量が多くなるため、ディスク使用量が少ないときの書き換え可能回数が容量の少ないカードよりも多くなり、Raspberry Piの “OSのデータを入れる” という使い方では、容量の多いカードを選ぶのが長く使うのには適している
  • まとめると、できるだけ容量が多く、かつMLC方式を採用していることが明示されているか “高耐久” や “繰り返しの書き込みに強い” といった記述のあるものを選ぶのがよい

長く使うためのmicroSDカードの使い方 (Raspbian)

  • インストールするソフトウェアはなるべく最小限にする
    • 配布されるOSイメージの中で一番サイズの大きいものは書き込み量が無駄に多くなるため使わず、GUIを使うかどうかで残りの選択肢の中から決める
    • 初めてRaspbianをインストールした時に追加インストールしたがその後あまり使わなかったソフトウェアは将来クリーンインストールするときや2台目以降には追加しない
  • ログファイルや一時ファイルの書き込み先がRAMディスク(tmpfsファイルシステム)になるようにする
    • /etc/fstabでtmpfsのマウントポイントを記述
      • ディレクトリの所有者やパーミッションは元のものに合わせる
      • /var/log/fsckのように、/etc/rc.localの中などでディレクトリを作成する記述を追加する必要のある場所もあるので注意
    • /etc/environmentXDG_CACHE_HOME=/dev/shm/[任意の名前]を追加するとfreedesktop.org準拠アプリケーションのキャッシュがRAMディスクになるようにできる(未設定時は[ホームディレクトリ]/.cache/)
      • XDG_CONFIG_HOME(未設定時[ホームディレクトリ]/.config/)も、RAMディスクにすることで一部の一時ファイルの類の書き込みをRAMディスクに対して行うようにできるが、一部のGUIアプリケーションなどの設定が再起動時などに消えてしまうようになるため、用途によってはおすすめはできない
  • Raspbianのパッケージがなかったりパッケージのバージョンが古かったりするソフトウェアについて、実機ではなるべくビルドしない
    • Piの実機上ではなるべくソフトウェアの開発パッケージを入れたりビルド作業をしたりはせず、x86/x86_64のGNU/Linux PC上でRaspbianのOSイメージ(軽量版推奨)から作ったchroot環境とQEMU(Debian/Ubuntuではqemu-user-static)を用いて、この “CPU命令のエミュレーションのみが行われる環境” から開発パッケージのインストールやソフトウェアのビルド作業を行って実機に持っていく
      • 何かのライブラリ(特にGUI関係など)の開発パッケージを実機に入れようとすると多数のパッケージのインストール処理が行われてストレージへの書き込み処理が大量に発生する上、ソフトウェアのビルド作業では一時ファイルも多数書き込まれる(こちらはtmpfsの使用で回避できる)
      • 新しいバージョンのコンパイラなどから成るクロスコンパイル環境は作るのが面倒らしい
        • Raspbianが初期Piのハードウェアに合わせて “ARMv6 + VFPv2” 向け(-march=armv6 -mfpu=vfp -mfloat-abi=hard)にパッケージをビルドしている一方で、ARMv6で動くアーキテクチャ向けにDebianがビルドしているパッケージのビルド設定はこれと一致しておらず、DebianのMultiarchの仕組みを利用して簡単に環境を作るというわけにはいかない
          • RaspbianにはDebianにはないPi用の追加ソフトウェアが複数存在することなど、他にもDebianがそのまま利用できない理由はある
          • 64bit対応CPUを搭載した世代のPiであれば、arm64アーキテクチャのDebian系OSをインストールして使えば、利用可能パッケージに制約はあるがクロスコンパイルはしやすいと思われる(未確認)
        • それでも実際にクロスコンパイル環境を作った人は複数いるため、それらを参考にするのもよい
  • 自動起動サービスの見直し
    • スワップファイルを作成・有効化するdphys-swapfileというサービスが動いていたらmicroSDカードの寿命を急速に削ってしまうため、できるだけ早く無効化する
    • /etc/systemd/systemd-journald.confStorage=volatile指定をする
    • 電源を切らない使い方をするかNTPサーバを用いる場合はfake-hwclockサービスを無効にする
    • rsyslogのサービスは運用上必要がなければ無効化し、必要であれば最低限のものだけになるように設定する
  • cronの設定の見直し
    • /etc/cron.*ly/系のディレクトリ以下の定期的に実行される処理について、不要なものを除くことで書き込み処理回避を図る
      • /etc/cron.*ly/系のディレクトリを全て名前を変更した上で元のディレクトリを空にして必要なものだけを入れていくか、/etc/crontabにおけるそれらのディレクトリ内の処理の呼び出し部分をコメントアウトしてしまうなどする
    • 一般ユーザのcrontab -e設定でMAILTO=""を記述して電子メールの送信をさせないようにする
  • ext4ファイルシステムのジャーナリング機能の無効化については、不具合が発生したという人もおり、ファイルシステムの破損リスクともなるため、個人的にはおすすめはしない
  • Pi 3以降ではUSBストレージからのOS起動がサポートされているため、用途によってはUSBストレージからの起動を検討するのもよい
    • 頻繁にデータを書き込む用途では書き込まれるディレクトリだけをUSB HDDにするという使い方もでき、Piの世代にも依存しない
  • Raspbianでは、外部プロジェクトのソフトウェアを活用することでmicroSDカードの中身を読み取り専用として運用することができるため、これによりmicroSDカードの中身を読み取り専用にする(停電時などの電源断による破損の対策にもなる)

tmpfsの使用(読み取り専用の運用でも使われる)はメインメモリを圧迫するため、tmpfsのファイルシステムが合計どのぐらいのメインメモリを使用しているのかには十分な注意が必要。

書き換え寿命以外のリスクと対策

データの揮発とその対策

  • 書き換え可能回数を温存したとしても、microSDカードに書き込んだデータは数年以上という単位の期間で自然に消えてしまうと言われており、一般的には大事なデータは数年に一回コピー操作により書き込み直す必要があるとされているが、Raspberry PiではOSのアップグレードを兼ねたクリーンインストールを数年に一度(OSのアップグレードを兼ねて)行うか、またはmicroSDカード全体の中身をバックアップしてそれを同じカードに書き込むなどの対策を行っていれば揮発を心配することはそれほどないと考えられる
    • 稼働中のOS上の(クリーンインストールでない)アップグレードのみで長期間運用し続けると、読み込めないファイルが出て不具合が発生するかもしれない
  • /etc/やホームディレクトリの設定ファイル類などは必要に応じてバックアップを取るようにする

電源断によるデータ破損のリスクと対策

  • microSDカードは、データの書き込み中に停電などにより電源が突然切れたときに中のデータが破損することがあると言われている
  • Raspbianでは、microSDカードの中身を読み取り専用として運用するための方法がある
    • GitHubの “root-ro” というプロジェクト(Overlayfsを用いた読み取り専用環境を構成するためのinitrdファイルを作成し、これを用いて起動する)を用いる方法が導入しやすいが、操作ミスをするとOSが起動しなくなるリスクもあるため、事前にバックアップを取るとよい
      • 読み取り専用状態に入っても書き込み操作は見かけ上可能で、tmpfsの領域(/mnt/boot-rw//mnt/root-rw/)にデータが保存される(再起動で消える)が、メインメモリの空きが不足するとこの書き込み操作が失敗するようになる
      • OS稼働中にmicroSDカードへ書き込みを行うには/mnt/boot-ro/(/bootに対応)や/mnt/root-ro/(/に対応)をremount,rwでマウントし直してこれらの中の階層に書き込んだ後remount,roでマウントし直す
      • 読み取り専用状態を解除するには/mnt/boot-ro/config.txtを(書き込み可能でマウントし直した後で)編集してinitramfsの行をコメントアウトして上書き保存後に再起動
      • /boot/cmdline.txtnet.ifnames=0を追記しないと読み取り専用状態でネットワークインターフェース名が変わってこの名前に依存する部分で不具合(IPアドレスが固定できないなど)の原因となる?
  • Raspbian以外の特定用途向けOSの一部は自動的に読み取り専用化して動作するらしいが具体的には未確認