私はDietPi OSを実行するRaspberry Pi CM4を使用して組み込みアプリケーションを開発しています。可能な限り最長寿命を達成するために、MMCフラッシュへの書き込み回数をできるだけ減らしたいと思います。私のインストールには、/varディレクトリ全体(/var/logおよび/var/tmpの一般的な違反者だけでなく)にデータを頻繁に書き込むいくつかのアプリケーションがあります。 / varにあるこの新しいデータは仕事にとって重要ではないので、すべての/ varをoverlayfsとしてマウントし、シャットダウンスクリプトを使用して変更をディスクに一度同期させようとします。私のオーバーレイ部分はうまくいきます。これは私の起動スクリプトです。
#!/bin/bash
#Startup script to mount /var as an overlay to minimize eMMC writes
if mount | grep "overlay on /var type overlay"; then
echo Mount Point at /var already exists, exiting.
exit 1
else
if [ ! -d "/var.tmpfs" ]
then
mkdir -p /var.tmpfs
fi
mount -t tmpfs -o rw,nosuid,nodev,noexec,relatime,size=256m,mode=0775 tmpfs /var.tmpfs
mkdir -p /var.tmpfs/upper
mkdir -p /var.tmpfs/work
chown -R root:root /var.tmpfs
chmod -R u=rwX,g=rwX,o=rX /var.tmpfs
if [ ! -d "/tmp/realvar" ]
then
mkdir -p /tmp/realvar
fi
mount --bind /var /tmp/realvar
sudo mount -t overlay -o rw,lowerdir=/tmp/realvar,upperdir=/var.tmpfs/upper,workdir=/var.tmpfs/work overlay /var
fi
exit 0
これにより、/ varに書き込まれたすべてのエントリに対するMMC書き込みは発生しませんが、overlayfsを介して書き込まれたデータは引き続き使用できます。最も難しい部分はうまくいくことです。今、計画された再起動/終了イベントが続くように、親ディレクトリの更新をディスクに同期させたいと思います。停電が発生すると、upperdirのすべてのデータが失われることを知っていますが、大丈夫です。
同期スクリプト:
#!/bin/bash
#Shutdown script to sync the contents of the temporary overlay to actual /var on disk
if [ -d "/tmp/realvar" ]
then
rsync -vaz --delete /var/ /tmp/realvar
fi
exit 0
上記のほとんどは非常に関連性がありますが、古いスレッドでLeonidMewとTobby Foxによって書かれています。/var/logs を tmpfs としてマウントし、時には overlayfs を使用して変更を保存します。
問題は、rsyncが機能しないため、その理由を理解できないことです。テスト用にオーバーレイを設定した後、/var/libにファイルを作成しました。次に、期待どおりに実行されるように見えるrsyncコマンド文字列を実行します。再起動しましたが、テストファイルが消えました。つまり、upperdirの内容は私が望む方法でディスクに書き込まれません。
興味深い観察:/var/libにテストファイルを作成した後、/var.tmpfs/upper/libと/tmp/realvar/libにすぐに存在します。私はそれがオーバーレイの「サブ」ディレクトリである/tmp/realvar/libにあることを望んでいません。これが関係しているかどうかはわかりませんが、奇妙なことであることがわかりました。
次のコマンドを使用して、すべてのアプリケーションが/ varオーバーレイを読み書きすることを観察し、私のオーバーレイが実際に機能していることを確認し、このコマンドの結果が変更されないことを確認しました。
cat /sys/fs/ext4/mmcblk0p2/lifetime_write_kbytes
私のrsync機能が機能しないため、再起動後に/ varのすべての変更が失われます。 / varにオーバーレイを適用し、DietPiを使用して最小インストールを実行した場合、MMCは起動後にゼロを記録しますが、/ etcで設定を変更するか、/ usrに含まれるアプリケーションを変更するとすぐに記録され、再起動後も保持されます。 / varオーバーレイで動作するようにrsyncを取得できる場合は、完全な組み込みファイルシステム構成を持つことになります。
どんなアイデアにも感謝します!