それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

raspberry pi のSDカードの寿命を意識した設定をする。microSDを長持ちさせる。

raspberry pi のSDカードはこわれます。

過去何枚も使い潰してきました。32GBを使うようになってからあまり壊れてないので、32GBぐらいがOSのログ頻度でも寿命を維持できるサイズなのかと思ってる。

それでも枚数を使い潰すと、安くない出費である。台数も増えてきたので設定を見直しておく。

単純に ramdisk にしてしまってもいいのだけれどね。

準備

ネットワーク設定関連を切り替えるまえに、ttyS0/ttyUSB0を使う。

sudo systemctl enable serial-getty@ttyUSB0
sudo systemctl start serial-getty@ttyUSB0
## 終わったら
sudo systemctl stop serial-getty@ttyUSB0

シリアルコンソールでトラブルがおきたときにネットワーク設定がうまくいくことを確認するためポートを用意しておく。

swap を無効にする

sudo systemctl status dphys-swapfile
sudo systemctl disable dphys-swapfile
## または
## sudo apt remove dphys-swapfile

/tmp をramdisk にする

tmp.mount で /tmp のramdisk 化が行われるはず。年のために確認。

sudo systemctl status tmp.mount

tmpfile になっていない場合は有効にする。

sudo systemctl enable tmp.mount
sudo systemctl status tmp.mount

fstab でやる場合は

tmpfs    /tmp    tmpfs   nodev,nosuid,size=90%,mode=1777 0   0

ext4 の同期タイミングを制御する。

takuya@pi-zero:~ $ sudo cat /etc/fstab  | grep ext4
PARTUUID=48c4552a-02  /               ext4    defaults,noatime,commit=200  0       1

なお、300秒以上はwarningが表示されるとのことなので290としています。
https://iot-plus.net/make/raspi/extend-sdcard-lifetime-5plus1/#toc_id_2_7

なお、この設定では不用意な電源切断でext4がおかしくなるので、起動時にfsckを掛けるとかで予防できるんじゃないかな。

起動時のext4 チェックを追加

/boot/firmware/cmdline.txt (以前は、/boot/cmdline.txt)にカーネルオプションを追加

fsck.mode=force

commit 間隔を長くしたのでデータ整合性を失う確率は格段に上がるので。

wifi 関連

WiFiは pi zero には搭載されてないので止めちゃう

sudo systemctl disable wpa_supplicant.service
sudo sed -i '2i\ \ \ \ \ \ \ \ exit 0' /etc/profile.d/wifi-check.sh

ログ関連/journalctl

みんな頑張ってログを設定してるんだろうけど、ログを揮発性にすれば終わりじゃね?

/etc/systemd/journald.conf:

[Journal]
#Storage=auto
Storage=volatile 

https://superuser.com/questions/1452659/how-can-i-set-quotas-for-var-log-journal

ログが残らないのが心配なら、何処か別の場所に転送しよう。

ログの保存場所について

systemd-journaldがあると、rsyslog にもログを転送する。

イベント発生 -> journald -> 転送 -> rsyslog -> ログ保存
        ↓     
       ログ保存    

どう考えても無駄である。

rsyslogで残す。

journald でもrsyslog でも同じものを残しても無駄。journald を volatileならrsyslog だけに残る。

そこで、先程の設定ではjournald を volatile (揮発性)にして、rsyslog だけにした。

さらに、rsyslog側でも余計なログを記録しないようにする。

rsyslog で別のマシンにsyslog転送を行えばいいので、ログの取り扱いとして王道だと思う。

#
# First some standard log files.  Log by facility.
#
# auth,authpriv.*                       /var/log/auth.log
#*.*;auth,authpriv.none         -/var/log/syslog # 2022-08-29
#cron.*                         /var/log/cron.log

逆に rsyslogへの転送を辞める

または、journalctl を信じて、rsyslog への転送をやめる

/etc/systemd/journald.conf

#ForwardToSyslog=yes
ForwardToSyslog=no

rsyslog は使わないとする。これもありだと思う。この場合ログは、syslogを使わない。journalctl のみで閲覧する。

ログをメモリに保存して再起動時に全部捨てる

ログが大量に書かれるとそれだけで遅いので、揮発性なログ(volatile)にして、メモリに乗せる。再起動で全部捨てる

Storage=volatile
SystemMaxUse=32M

HDMIオフ

電源チューニングをやろうと思ったが、tvservice がbullseyesに含まれないので、どうしようかな困った。

apt関連

apt install 時に doc locale man を使わないようにする。初心者はman 見たほうがいいのでやっちゃ駄目。manは別のサーバーで見るよってときはこれを設定する。

/etc/dpkg/dpkg.cfg.d/01-nodocを 新規作成 (/etc/dpkg/dpkg.cfg.d/ は、/etc/dpkg/dpkg.conf.d の場合もある。)

cat <<EOF > 01-nodoc
# Delete locales
path-exclude=/usr/share/locale/*

# Delete man pages
path-exclude=/usr/share/man/*

# Delete docs
path-exclude=/usr/share/doc/*
path-include=/usr/share/doc/*/copyrigh

EOF
sudo mv 01-nodoc /etc/dpkg/dpkg.cfg.d/01-nodoc

これでapt install 時に man が省略されるはずです。インストールするファイル数が減ってダメージを減らせる。

全体ramdisk 化←いらなくね?

ログファイルやtmp を ram 化すれば、全体をRamdiskにする必要はないんじゃないかなと。

ramdisk 化は定番だし、raspi-config でも出来る。しかし、殆どの場合、ログファイルの書き込みをへらすのが目的だとおもう。そこは journalctl を voliate (揮発性)にで代用できるので、ramdisk化は実行するか思案する。

私は、Ramdisk化による、OSへセキュリティパッチを自動適用できなくなるセキュリティ・リスクのほうが怖い。apt install でソフトウェア追加も煩雑になる。

ramdisk/tmpfsにログを書いても良いんだけど、そもそも揮発性にしたら再起動して消えるしね

/tmp (tmpfs) を活用する。

全体ramdisk 化じゃなくて必要なところだけ tmpfs に置き換えておけばパフォーマンスもあがるしmicroSDカードの寿命も上がる。

ramdisk なら firefox キャッシュがおすすめ

firefox 起動後に初期設定済みのプロファイルを作成

Raspberry Piを使っていてGUIを使ってFirefoxなどを使うのであれば、キャッシュ・フォルダをRAMDiskにすると良いと思う。

## tmpfs(=ramdisk) をマウントする。
echo tmpfs /home/takuya/.cache/mozilla tmpfs uid=$UID,defaults,nodiratime,noatime,mode=0700 0 0 | tee -a /etc/fstab

プロファイル・フォルダにも結構な量を書き込むのでProfileフォルダはUnionFSでRAMでラッピングしてもいいかなと思う。

tmpfs /home/takuya/.mozilla/volatile tmpfs uid=1000,defaults,nodiratime,noatime,mode=0700 0 0
none /home/takuya/.mozilla/firefox unionfs dirs=/home/takuya/.mozilla/volatile=rw:/home/takuya/.mozilla/firefox=ro 0 0

vi / vim の設定

vi / vimスワップファイルを無効にする。

set noswapfile

または、vi / vimスワップファイルを /tmp に作るようにする。

set directory=/tmp
set backupdir=/tmp

vim を頻繁に使うので、無駄な書き込みが起きないようにする。

2022-08-29 追記

journal と rsyslogd の関係を見直したら、2重でログが保存される仕様なので、言及

2022-02-18

man と ramdisk について修正。

2024-05-12

  • vimスワップファイルを無効にするアイディアを追加
  • firefox のキャッシュを ramdisk 化するアイディアを追加