256.ラズパイ無双[4.SDカード延命]
初回:2022/5/11
Raspberry Pi (ラズベリーパイ、通称"ラズパイ")で何か作ってみようという新シリーズです。今回はラズパイのOSを格納しているSDカードの延命設定を行いたいと思います。
P子「SDカードの延命って?」※1
SDカードには『書き換え寿命』というのがあります。NANDフラッシュメモリの構造にもよりますが、1000回から数千回の書き込み寿命と言われています。ラズパイでは、OSや記録領域に標準でmicroSDカードを使用します。USB起動なども可能ですが、NANDフラッシュメモリ構造が共通であれば、やはり書き換え寿命が存在します。
≪参考資料≫
https://direct.sanwa.co.jp/contents/sp/clm/sdcard_life/?ac_p=footer_sq_bnr
【2022年度版】SDカードには寿命がある!?
「容量」と「転送速度」「価格」以外のメモリ選びのポイント
2.テンポラリ領域をtmpfs(Ramdisk上)にする
3.ログ出力を減らす
4.ログファイルをtmpfs(Ramdisk上)にする
5.容量の大きなSDカードを使う(参考)
6.その他の設定(参考)
1.スワップを無効にする
メモリに入りきらないアプリケーションなどを一時的にディスクに移すスワップですが、当然処理速度は激減します。ラズパイ 4B を買うなら、8Gbyte版が良いでしょう。めったにスワップはしないと思いますが、スワップを無効にすると同時に、スワップ領域も開放しておきます。
①スワップを無効にする
$ sudo swapoff --all
$ free -h
②自動起動を停止します。(Raspbery Pi 独自らしい)
$ sudo systemctl stop dphys-swapfile
$ sudo systemctl disable dphys-swapfile
$ systemctl status dphys-swapfile
③スワップファイルを削除します。
$ sudo rm -f /var/swap
④再起動
$ sudo reboot
ちなみに、後で出てきます、openCVのインストール、コンパイル時には、スワップ領域を拡大しておかないとエラーになるケースがあります。ご注意ください。
⑤再度有効化と容量アップ
$ sudo systemctl start dphys-swapfile
$ sudo systemctl enable dphys-swapfile
$ systemctl status dphys-swapfile
$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE=100を2048に変更。
2.テンポラリ領域をtmpfs(Ramdisk上)にする
ラムディスク上にファイルを移すという事は、再起動などすると消えてしまうという事です。テンポラリ領域なら、消えても問題にならないでしょう。
①fstabを修正して、/tmp と /var/tmp をtmpfs(Ramdisk上)に設定します。
$ sudo nano /etc/fstab
下記の2行を追加します。(4Gタイプの場合の目安)
tmpfs /tmp tmpfs defaults,size=64m,noatime,mode=1777 0 0
tmpfs /var/tmp tmpfs defaults,size=32m,noatime,mode=1777 0 0
②SDカード上の /tmp と /var/tmp を消して、再起動すればOKです。
$ sudo rm -rf /var/tmp
$ sudo rm -rf /tmp && sudo reboot
※ VNC上で /tmp を削除すると、VNCが固まります。
削除後に再起動を順次行います。
③再起動後の確認
$ df -h
3.ログ出力を減らす
/etc/rsyslog.conf を編集して、RULES以下に記載されている設定の先頭に#をつけてコメントアウトします。
①/etc/rsyslog.conf を編集
$ sudo nano /etc/rsyslog.conf
#daemon.* -/var/log/daemon.log
#kern.* -/var/log/kern.log
#lpr.* -/var/log/lpr.log
#mail.* -/var/log/mail.log
#user.* -/var/log/user.log
#mail.info -/var/log/mail.info
#mail.warn -/var/log/mail.warn
#mail.err /var/log/mail.err
#news.crit /var/log/news/news.crit ← ないかも
#news.err /var/log/news/news.err ← ないかも
#news.notice -/var/log/news/news.notice ← ないかも
#*.=debug;\
# auth,authpriv.none;\
# news.none;mail.none -/var/log/debug
②サービスの再起動
$ sudo systemctl restart rsyslog
4.ログファイルをtmpfs(Ramdisk上)にする
ログファイルそのものをラムディスク上に移すことで、ディスクアクセスを減らします。ただし、/var/log 以下は、フォルダ構成を再現しないとアプリケーションが起動しなくなるので、ラズパイ再起動時にフォルダ構成を再生する機能が必要になります。
この『フォルダ構成の再生』ですが、色々な方法があります。
≪参考資料≫
https://azriton.github.io/2017/03/16/Raspbian-Jessie-Lite%E3%81%AESD%E3%82%AB%E3%83%BC%E3%83%89%E5%BB%B6%E5%91%BD%E5%8C%96/
ログ出力ディレクトリ を RAM へ 配置する
https://qiita.com/s8ta/items/9e08242e30ec7929fa89
ラズパイの/var/logを簡単にRAMディスク化
2番目の方法が簡単そうなので、そちらの方法で対応したいと思います。
① /var/logのディレクトリ構造を保存
シェルスクリプトで/var/logの内容を一時ディレクトリにコピーし、
各ログファイルを空(0バイト)にした後、/var/log.tarに保存。
1) Windwosにファイル作成 (var-log-save.sh)
2) ラズパイのscripts フォルダにコピーする
3) /usr/sbin に、コピーする
$ sudo cp /home/xxx/scripts/var-log-save.sh /usr/sbin
② /var/log保存用スクリプトの実行
1) $ sudo chmod 700 /usr/sbin/var-log-save.sh
2) $ sudo var-log-save.sh
③ /var/logのRAMディスク化
1) tmpfsでマウントするように設定
/etc/fstab を編集して、tmpfsの1行を追加します。
$ sudo nano /etc/fstab
tmpfs /var/log tmpfs defaults,size=32m,noatime,mode=0755 0 0
④ OS起動時の/var/log復元設定
/var/log.tarに保存したディレクトリ構造を、OS起動時に/var/logに復元するサービスを作成する。
1) Windwosにファイル作成 (var-log-load.service)
2) ラズパイのscripts フォルダにコピーする
3) /etc/systemd/system に、コピーする
$ sudo cp /home/xxx/scripts/var-log-load.service /etc/systemd/system
※ var-log-load.service の解説
・/etc/fstabによるファイルシステムのマウント後に実行するため、After=local-fs.targetを指定。
・/var/logの復元完了後にrsyslogを起動するため、Before=rsyslog.serviceを指定。
・tarによる/var/log.tarの展開時、既に出力されたログファイルを空ファイルで上書きしないために、--skip-old-filesを指定。
(この指定が無いと、boot.logなどが上書きされて空になった。)
⑤ var-log-load.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable var-log-load.service
1) systemdを使ってサービスを起動する
$ sudo systemctl stop var-log-load.service
$ sudo systemctl start var-log-load.service
2) 自動起動を設定
$ sudo systemctl disable var-log-load.service
$ sudo systemctl enable var-log-load.service
⑥ OS再起動
既存の /var/log を削除して、再起動
(RDPが停止するかもしれないので、コマンドは投げっぱなしにしておく)
$ sudo rm -rf /var/log ; sudo reboot
⑦ /var/logのRAMディスク化・ディレクトリ復元確認
$ df -h | grep /var/log
$ ls -l /var | grep log
$ ls -l /var/log
⑧ アプリケーションインストール時の作業
今後、アプリケーションをインストールした際に、下記コマンドを実行する。
「/var/log/nginx/access.log」など、新たなログディレクトリやファイルが/var/log.tarに追加される。
$ sudo var-log-save.sh
5.容量の大きなSDカードを使う(参考)
容量の大きなSDカードを使うと寿命が増えるというのは、同じ個所ではなく、違う個所に書き込むことで、全体的に書き込み回数を減らせるという理屈です。
ただし、昔のラズパイの場合、32GB の壁というのがあり、それ以上の容量のSDカードを使うには、秘密の呪文が必要でした。
現在のラズパイ 4B のOSのインストールに、Imagerというツールを使えば、32GB 以上のSDカードへのOS焼きも問題なくできるそうです。
残念ながら、まだ実機でテストしていませんので、ここでは参考情報としてだけ、取り上げておきます。
6.その他の設定(参考)
この先の説明は、実機テストしていませんので、自己責任で行ってください。
① folder2ram は、特定のディレクトリをラムディスクに移すことができます。また、システム終了時に変更をディスクへ反映させます。
この機能を使う場合は、先のログファイルのラム化の代わりになります。
$ sudo wget -O /sbin/folder2ram https://raw.githubusercontent.com/bobafetthotmail/folder2ram/master/debian_package/sbin/folder2ram
$ sudo chmod +x /sbin/folder2ram
$ sudo folder2ram -configure
$ sudo nano /etc/folder2ram/folder2ram.conf
一番下に追記
tmpfs /var/log
tmpfs /var/tmp
tmpfs /var/spool
tmpfs /var/cache/samba
マウント、自動起動化
$ sudo folder2ram -mountall
$ sudo folder2ram -enablesystemd
② ジャーナルを保存しない。
$ sudo nano /etc/systemd/journald.conf
一番下に追記
Storage=none
7.最後に
今回は、ラズパイ設定で良く出てくるSDカードの延命処置を行いました。
一番厄介なのが、ログファイルの移動です。これは再起動時にメモリから消えるとアプリケーションが起動失敗する為、復帰処理が必要です。しかも暴走とかして再起動した場合、ログが消えてしまうため、調査出来ない場合もあります。
とはいうものの、ラズパイなんて、重要な処理を行わないとか、その場限りの動きをすればよいと割り切るのであれば、こういう設定は有りだと思っています。
ほな、さいなら
======= <<注釈>>=======
※1 P子「SDカードの延命って?」
P子とは、私があこがれているツンデレPythonの仮想女性の心の声です。