Armadilloフォーラム

ext4でフォーマットしたSDカードのジャーナリングモード

k.sato

2025年6月6日 11時56分

==========
製品型番:
ABOSバージョン:3.21.3-at.12
カーネルバージョン:5.10.237-0-at
==========

佐藤と申します。
お世話になっております。

現在、SDカード書込中のArmadillo電源断の検証をしています。
SDカードへ毎分平均値ファイルへ追記、
アラーム発生時にアラームファイルへ追記としています。

●コンテナ内からSDカードをフォーマット
https://armadillo.atmark-techno.com/forum/armadillo/19531

上記で教えていただきこのような動作になっているかと思います。

1. /var/app/volumes/sd ディレクトリを作成

2. /etc/fstabに下記を追加

/dev/mmcblk1p1  /var/app/volumes/sd             ext4    defaults,noauto                 0 0

3. app.confにて

mount /var/app/volumes/sd

①現在のジャーナリングモードはどうやって確認できますか?
何も指定していないのでorderedなのでしょうか?

②どうやってjournalに設定できますか?

mount -t ext4,data=journal /var/app/volumes/sd

上記のように変更してArmadilloを再起動してみましたが
mountコマンドではジャーナリングモードは確認できないのでしょうか?

armadillo:~# mount | grep ext4
/dev/mmcblk0p3 on /var/log type ext4 (rw,noatime)
/dev/mmcblk1p1 on /var/app/volumes/sd type ext4 (rw,relatime)
armadillo:~#

journalとすることでファイルが壊れることを軽減できるのでしょうか?

以上、よろしくお願い致します。

コメント

at_dominique.m…

2025年6月6日 12時29分

佐藤さん

お世話になっています、
マルティネです。

> ①現在のジャーナリングモードはどうやって確認できますか?
> 何も指定していないのでorderedなのでしょうか?

はい、デフォルトは data=ordered となります。
mount コマンドの出力になに data=xx が表示されなければ ordered です。
変更した場合は表示されます:

armadillo:~# mount | grep /mnt
/dev/loop0 on /mnt type ext4 (rw,relatime,nodelalloc,data=journal)

②どうやってjournalに設定できますか?

> mount -t ext4,data=journal /var/app/volumes/sd

エラーするべきコマンドです。busybox mount の確認不足でエラーしませんが、 -t は type (ext4 だけ), data=journal を -o で設定してください。
また、 /etc/fstab のオプション(「defaults,noauto」を記載した値)にも追加できます。

> ③journalとすることでファイルが壊れることを軽減できるのでしょうか?

ファイルが「壊れる」という言葉の意味によりますが、そうですね。
デフォルトでは metadata だけを journal に書いて data は直接に書いてますので、fsync 等の同期命令を利用しない場合は電源切断の際にファイルを読んでもデータがなかったり、上書きの場合は途中で上書きされたデータが保存されてる可能性もありますので、ファイルが壊れます。
data=journal ではデータも journal に書いてからファイル内にもう一度かいてますので、再起動後にマウントする時に journal が書き込まれていたデータを確認して再適用されます。
ただし、大量のデータを書く場合(例えばアーカイブを展開するなど)は一部のファイルしか書いてない状態、あるいはファイルは途中までしか書いてない状態はまだ可能ですので、個人的ンは data=ordered のままでもデータを一時的に書いて、書き込み完了後にファイルをリネームするなどの2段書き込みの方が明確でわかりやすいと思います(データの書き込みも半分になるので性能もいいはずです)

また、データの保証がきになる場合はチェックサムを計算する btrfs を検討するのもいいかと思います。
(btrfs の場合は data=journal オプションがないですが、sync を明確に実行しない場合は「flushoncommit」と「commit=<間隔>」をご確認ください)

よろしくお願いします。

マルティネ様

佐藤です。

> エラーするべきコマンドです。busybox mount の確認不足でエラーしませんが、 -t は type (ext4 だけ), data=journal を -o で設定してください。
> また、 /etc/fstab のオプション(「defaults,noauto」を記載した値)にも追加できます。
ありがとうございます。

mount -o data=journal /var/app/volumes/sd

-oオプションでdata=journalを設定することでmountで表示されるようになりました。

armadillo:~# mount | grep ext4
/dev/mmcblk0p3 on /var/log type ext4 (rw,noatime)
/dev/mmcblk1p1 on /var/app/volumes/sd type ext4 (rw,relatime,nodelalloc,data=journal)

> > ③journalとすることでファイルが壊れることを軽減できるのでしょうか?
> ファイルが「壊れる」という言葉の意味によりますが、そうですね。
> デフォルトでは metadata だけを journal に書いて data は直接に書いてますので、fsync 等の同期命令を利用しない場合は電源切断の際にファイルを読んでもデータがなかったり、上書きの場合は途中で上書きされたデータが保存されてる可能性もありますので、ファイルが壊れます。
> data=journal ではデータも journal に書いてからファイル内にもう一度かいてますので、再起動後にマウントする時に journal が書き込まれていたデータを確認して再適用されます。
> ただし、大量のデータを書く場合(例えばアーカイブを展開するなど)は一部のファイルしか書いてない状態、あるいはファイルは途中までしか書いてない状態はまだ可能ですので、個人的ンは data=ordered のままでもデータを一時的に書いて、書き込み完了後にファイルをリネームするなどの2段書き込みの方が明確でわかりやすいと思います(データの書き込みも半分になるので性能もいいはずです)
> また、データの保証がきになる場合はチェックサムを計算する btrfs を検討するのもいいかと思います。
> (btrfs の場合は data=journal オプションがないですが、sync を明確に実行しない場合は「flushoncommit」と「commit=<間隔>」をご確認ください)
他の方法についても検討してみます。

ありがとうございました。