Raspberry Pi で、指定したフォルダを RAM 上に設定する手順についてまとめておきます。
以下の環境で動作確認をしています。
環境:Raspberry Pi (Debian系 Linux)
背景 ~ SDカードの劣化を最小化する!
Raspberry Pi の起動用のディスクは、標準では SDカードを設定するようになっています。
しかし、一般に市販されているSDカードは、書き込み回数の上限が1000回~程度となっています。
1年365日として、SDカードの空いているすべての領域を毎日書き換えたとすると、3年程度で書き換え回数の上限に達することになります。
実用的な用途で、毎日のように Raspberry Pi を使用する場合、書き込み回数のオーダーはやや少ないといえます。
とくに、測定デバイスやカメラをつなげてデータを自動で取得したり、ネット上のデータを自動取得し続けるなど、頻繁に書き込みを行うような用途で Raspberry Pi を活用しようとすると、システムごと破損する可能性が高まります。
一方、Raspberry Pi 3 ~ 5 では、基板に実装されている RAM (Random Access Memory) の容量は 1~8 GB 程度あります。
RAM は構造上、コンデンサでの電子の移動により情報を保持しており、フラッシュメモリ(SDカード、不揮発媒体)のように酸化膜に電子を流すといったことはしていません。SDカードと比較すると、RAM を使うことで、劣化はほぼ無視できるようになると考えられます。
ということで、Raspberry Pi の任意のフォルダ(ディレクトリ)を RAM 上に設定(RAM ディスク化)する手順についてまとめておくことにします。
なお、RAM 上のデータは、Raspberry Pi の電源を OFF にすると消えてしまいます。
そこで、測定や画像処理など、頻繁に読み書きを行うような用途では、RAM 上で読み書きを行うようにし、測定終了時などに必要なデータのみ USB につなげた媒体にバックアップを取る等により、劣化が進みやすい不揮発媒体(SDカード等)への書き込みを最小化することが可能となります。
RAM のフォルダを設定する手順
フォルダを作成する
① 以下を参考に RAM 上に設定するフォルダ(例:ram1)を作成します。
/home/pi/user1/ram1
フォルダを RAM 上に設定する
② 以下のコマンドを参考に、①のフォルダ(ram1)を RAM上に設定します。
$ sudo mount -t tmpfs -o size=32m tmpfs /home/pi/user1/ram1
→ Raspberry Pi 画面左上から「ファイルマネージャ」を開くと、左上の欄に、外部メディアの表示と並んで、RAM 化したフォルダが表示されます。
※ 上記で、”-t tmpfs” は、マウントするファイルシステムのタイプです。tmpfs(Temporary File System)を指定することで、指定したフォルダを RAM のメモリ上に設定(マウント)しています。
※ ”-o size=32m” の部分で、フォルダに確保できる最大容量(32MiB)を指定しています。以下の④~⑥でも確認します。
※ 上記のマウント後、フォルダにファイルを保存すると、(SDカードにではなく)RAM 上に書き込まれます。
※ RAM 上に書き込まれた内容は、Raspberry Pi の電源を OFF にすると消えます。
したがって、RAM 上に保存したファイルで必要なものは、電源を OFF にする前に、外部メディア等にコピーを取る必要があります。
RAM の設定を解除する手順
③ RAM の設定を解除するには、以下のコマンドを実行します。
$ sudo umount /home/pi/user1/ram1
※ 上記のコマンドを実行すると、②の RAM の設定が解除され、①の元のフォルダの状態に戻ります。電源を再投入しても同様です。
※ 最初は、②と③のコマンドを何度か実行し、フォルダ(ram1)に保存したファイルがどうなるか試してみてください。
参考: いくつか確認をしてみる
RAM 上に設定したフォルダに関して、いくつか確認をしておきます。
RAM の状態を確認してみる
④ ターミナルで、以下を実行します。
$ df -hT
※ ②で設定した RAM の状態等が表示されます。
タイプが tmpfs、残り容量が 32M (32 MiB)等の表示がされます。加えて、②のパスがマウント位置として表示されます。
⑤ つぎに RAM の総容量についても確認しておきます。
$ free -ht
※ Raspberry Pi 5 では、基板に実装されている RAM は、仕様上、2~8 GB となっています。Raspberry Pi 4 では、2~8 GB、Raspberry Pi 3 では 1GB となっています。この RAM の容量を確認できます。
※ 単位系を、メビバイト、キビバイトで表示する場合は、free -mt、free -kt としてください。
⑥ ②で RAM 化したフォルダで、すでに使用しているデータの容量を確認するには、以下を実行します。
$ du -k /home/pi/user1/ram1
※ フォルダ ram1 にファイルを入れると、どの程度、使用されているのか確認できます。
試しに、②で容量を size = 32k 等の小さな値で設定し、この設定値を超えるまで、ファイルを順次コピーしながら入れていくと、32k を超えるところでエラーが出ます。
※ 他方、size = … で設定する容量を大きくしすぎると、メモリスワップが発生することになり、SDカードへの無駄な書き込みがかえって増えることになります。
※ したがって、上記の size の設定は、大きすぎても小さすぎても問題が起こるため、用途に応じて、ちょうどよい値があることになります。
実際にしばらく RAM 化したフォルダを使ってみて、どれくらいの容量を使っているのか/使いたいのか確認し、②のコマンドの size=… の値を最適化してみてください。
単位系の確認
※ 上記の②~⑥で、Ki、Mi、Gi 等の単位系が出てきましたので、確認をしておくことにします。
Ki、Mi、Gi は、それぞれ、キビバイト(kibi bytes、KiB)、メビバイト(mebi bytes、MiB)、ギビバイト(gibi bytes、GiB)の意味です。
ざっくりでいえば、それぞれ、キロバイト、メガバイト、ギガバイトに対応しています。正確には、1,000倍ではなく、1,024倍を基準とした単位系になっています。
つまり、1024 bytes = 1 kibi byte、1024^2 bytes = 1 mebi byte、1024^3 bytes = 1 gibi byte となっています。
※ Raspberry Pi でファイルマネージャを開き、任意のファイルをタップすると、欄の下段にファイルサイズが表示されます。この表示を確認すると、KiB、MiB 等での表示となっています。
Raspberry Pi では、データ量の表示は、KiB、MiB、GiB 等で統一されているようです。
(ざっと見た限り、明らかに KB、MB、GB が使われていると思われる表示やコマンドは見つけられませんでした。)
RAM の設定を変えると、入れたファイルがどうなるかテストしてみる
テスト1
たとえば、①の状態で②の実行前にファイルAをフォルダ(ram1)に入れます。
この後、②を実行すると、ファイルAは非表示となります。フォルダは見かけ上、空になります。
この状態で③を実行すると、ファイルAが再度表示されます。ファイルAの実体は、SDカード上に保存されているので、RAM の設定を開放するとデータが残っている、ということがわかります。
テスト2
また、②の状態でフォルダにファイルBを入れ、③で解除すると、ファイルBは消えてしまいます。
②を再度実行しても、ファイルBは表示されない、といった動きとなっています。
つまり、ファイルBは RAM上に保存したので、メモリを解放するとデータは戻らない、ということがわかります。
電源の再投入時にも、同様の動きとなっています。
RAM の設定を自動化する
上記の②のコマンドを Raspberry Pi の起動後に毎回行うのは煩雑です。
そこで、crontab の機能を使って、Raspberry Pi を起動すると②の設定が自動で行われるよう設定してみます。
④ 以下のコマンドを実行します。
$ crontab -e
以下を参考に、前述のコマンドを編集画面の冒頭あたりに追記します。
@reboot sleep 10
@reboot sudo mount -t tmfs -o size=32m tmpfs /home/pi/user1/ram1
→ 追記が終了したら、[ctrl] + x → y で保存できます。
※ Linux の cron の仕様で、起動時に @reboot … と記載した行を順次自動するようになっています。
上記の例では、10秒の待ち時間(sleep 10)を入れています。起動直後はシステムが不安定となることがあるためです。多少の時間を置いたのち、RAM の設定をしています。
※ sudo を入れると、root 権限、root 所有者での RAM フォルダの設定がされます。このとき、一般ユーザーにも読み・書き・実行の権限が与えられています。したがって、RAM フォルダの設定が実行されると、ユーザーにかかわらず自由に RAM を利用できるようになります。
うまく動いたら
うまく動いたら、上記で RAM 上に設定したフォルダを活用してみてください。
特に、1日でデータを多数取得するような場合、処理を高速化したい場合などで有効です。
経験的には、以下のような用途で使うと便利です。
・ 1日の天気予報を数時間おきに取得し、RAM 上のフォルダに保存する。
予報であれば、翌日の電源再投入時に消えてしまっても問題ない。
また、天気が急変すると天気予報を取得する時間間隔を短くしたくなるが、RAM 上に保存することにすれば、SDカードの劣化を気にする必要がなくなる。
・ あらたな技術検討を行うとき、RAM 上のフォルダで行うようにする。
Python のプログラムを作っていて頻繁に読み書きをするとき、データは RAM 上のフォルダに一時保存する。
たとえば、温湿度データなどを数分起きに1日中取得し、RAM 上のフォルダに保存する。
うまく動いたら、SDカードの劣化やデータのバックアップの必要性などを考慮し、実運用を行うようにする。
・ USB カメラなどから画像データを多数取得する際、RAM 上のフォルダに保存する。この中で画像処理などの作業をするようにする。必要なデータだけ、バックアップを取るようにする。
・ Raspberry Pi でローカルサーバーなどを起動したとき、公開フォルダ内の一部のフォルダを RAM 化しておく。クライアントからの受領したデータ、クライアントからの要求で読み書きが生じるデータをこの中に入れる。これにより、SDカードへの影響を最小化する。
まとめ
Raspberry Pi のフォルダを RAM 上に設定する手順をまとめました。
RAM 化するフォルダを決めてしまって、データ取りやウェブスクレイピングなど、実験用に使うデータはこの中で読み書きするようにしてしまうと便利です。処理速度も高速化します。
他にも、Raspberry Pi を活用するスクリプトなどをまとめています。関心のある方は、下記の関連リンクなども参照してみてください。
関連リンク
・ Raspberry Pi を自動で起動、シャットダウンする
・ Raspberry Pi でローカルWebサーバー 【Python 活用】
・ Raspberry Pi で Flask を動かしてみる 【Python】
・ 起動、終了時にログを出力する 【Raspberry Pi】