web-dev-qa-db-ja.com

Linuxが読み取り専用ルートファイルシステムで起動できるのはいつですか

私は、ブートローダーとしてのu-bootとsystemd initシステムを備えた組み込みLinuxに取り組んでいます。ツールは標準的なbusyboxに限定されています。

いくつかの問題を分析しているときに、ルートファイルシステムが読み取り専用であり、これが問題の原因であることがわかりました。その理由は、一部のサービスとプログラムが書き込み可能なルートファイルに依存し、誤動作を引き起こしているためです。

しばらく調査したところ、停電が発生した場合にのみルートファイルシステムが読み取り専用であることがわかりました。 (何らかのエラーが発生すると、メインユニットが電源の再投入をトリガーします。)私は、ルートfsが重要なファイルへの書き込みまたはサービス/プロセスの更新を試みると、電源障害時にファイルシステムにエラーフラグが設定されると思います。次回の起動時に、fsckはフラグを読み取り、読み取り専用としてルートをマウントまたは再マウントします。または、fsckは強制的にいくつかの回復モードに入ります(回復モードが存在するかどうかはわかりません)。

私の仮説は正しいですか?もしそうなら、FSエラー時に設定されるfsフラグとは何ですか?ルートがROとしてブートするのを防ぐにはどうすればよいですか?

注意:

  1. ルートファイルシステムは「errors = continue」でマウントされています。そのため、fsckが再マウントオプションのスーパーブロックを読み取る場合、エラーを無視してRWとして再マウントする必要があります。

  2. Ddコマンドを実行中に電源を切ってケースを再現しようとしたが再現できなかった。

追加質問:どのudev/systemdマジックがルートfsをマウントしますか?

4
dDebug

起動時に、ファイルシステムをチェックして、システムが適切にシャットダウンされたかどうか、またはクラッシュしたかどうかを確認し、後者の場合は必要な回復アクションを実行する必要があります。最新のジャーナルファイルシステムでは、これは通常、自動的に実行できるシンプルで迅速なジャーナルリカバリ操作を意味します。

ルートファイルシステムのチェックとマウントは通常initramfs/initrdによって行われますが、組み込みシステムではそれがある場合とない場合があります。

Initramfsを使用していない場合、従来の方法は、カーネルにalwaysルートファイルシステムを最初に読み取り専用としてマウントすることです(ブートオプションを使用してroot=/dev/<whatever> ro、そして起動スクリプトは最初にfsckを実行し(使用するファイルシステムタイプに必要であると想定)、他の操作を行う前にルートファイルシステムを読み取り/書き込みモードに再マウントします。

Initramfsがルートファイルシステムをチェックしなかった場合(おそらく使用されていないため)、ルートファイルシステムでファイルシステムチェックを実行するための標準のsystemdサービス名はsystemd-fsck-root.service。チェック後、systemdでルートファイルシステムを再マウントするサービスの名前を見つけることができませんでした。

ブート時のルートファイルシステムチェックでルートファイルシステムを変更する必要がある場合、カーネルがすでに読み取ってキャッシュしているものに変更が影響した可能性があるため、通常は後で別の再起動がトリガーされます。 fsckによるディスク。

2
telcoM