web-dev-qa-db-ja.com

組み込みセットアップでは、読み取り専用のルートファイルシステムを使用することをお勧めしますか?

組み込みデバイスのオペレーティングシステムとしてLinuxを実行する必要があります。

ターゲットにはx86プロセッサーがあり、ストレージ用に8 GBのコンパクトフラッシュデバイスがあります。

Buildrootを使用してカーネルイメージとクロスコンパイルツールを作成できました。 CFデバイスを、カーネルイメージが存在する小さなFATパーティションと、syslinuxブート構成とext3 buildrootによって生成されたルートファイルシステムを解凍したファイルシステム。

ルートディレクトリを私のbuildrootファイルシステムが配置されているCF ext3パーティションに設定することにより、システムはsyslinuxを使用して正常に起動します。

私の質問は、停電後にデバイスが正常に起動することが重要であるため、即時の(そして頻繁な)電力損失に直面した場合の堅牢性の必要性に集中しています。ルートファイルシステムを読み取り専用としてマウントすることは、データの整合性を保証する方法であると私は読んだ。これは私が進めるための賢明な方法ですか?

同じことを達成するためにルートファイルシステムをRAMにロードする可能性についても読みましたが、まだその方法がわかりません。

この目標を達成するための好ましい方法はありますか。もしそうなら、私が進むための最良の方法は何ですか?

15

新しい答え(2015-03-22)

注:この答えは以前よりも簡単ですが、安全ではありません。ファイルを保存できるため、最初の答えはより強力です読み取り専用byfsマウントオプションbefore許可フラグ。したがって、forcing書き込みの許可なしにファイルを書き込むことは、まったく機能しません。)

はい、 Debian の下に、パッケージがあります: fsprotecthomepage )。

aufs(デフォルトでは、別のunionfsツールを使用できます)を使用してライブセッションの変更を許可しますが、RAMデフォルトでは、再起動時にすべてが忘れられます。

あなたは単に実行することによってそれらをインストールすることができます:

_apt-get install fsprotect
_

完了したら、オンラインドキュメントから:

その後:

  • _/boot/grub/menu.lst_または_/etc/default/grub2_または_/etc/lilo.conf_を編集し、カーネルパラメータに「_fsprotect=1G_」を追加します。
  • 必要に応じて1Gを変更します。
  • 変更を適用(つまり、_update-grub_を実行)
  • _/etc/default/fsprotect_以外のファイルシステムを保護する場合は、_/_を編集します。
  • リブート

また、GRUBブートローダーをパスワードで保護したり、変更を禁止したりすることもできます。

そこから、いくつかのファイルが変更から保護されている場合、サンプル

_chmod ugo-w myfile
_

サンプル_vi myfile_に使用し、コマンド_:w!_でそれを書き込もうとすると、これは機能し、myfileが変更されました。変更されていないmyfileを取得するために再起動できます。

それは私の次の最初の解決策では不可能です:

古い(最初の)答え:

はい、それは強力なソリューションですが、強力です!

R/Oを使用可能にする

_/var_、_/etc_、そして多分_/home_のようなrwにいくつかのディレクトリをマウントする必要があります。これは、aufsまたはunionfsを使用して行うことができます。私はこれが好きです別の方法、_/dev/shm_と_mount --bind_を使用:

_cp -a /var /dev/shm/
mount --bind /dev/shm/var /var
_

以前は、通常の操作で変更する必要のないすべてのディレクトリを_static-var_に移動し、/ varにシンボリックリンクを作成することもできます。

_mkdir /static-var
mkdir /static-var/cache
mkdir /static-var/lib
mv /var/lib/dpkg /static-var/lib/dpkg
ln -s /static-var/lib/dpkg /var/lib/dpkg
mv /var/cache/apt /static-var/cache/apt
ln -s /static-var/cache/apt /var/cache/apt
... # an so on
_

したがって、roで再マウントする場合、_/var_に_/dev/shm_をコピーしても、ほとんどのファイルが_/static-var_に移動され、シンボリックリンクのみがramにコピーされるため、それほど多くのスペースを必要としません。

これをうまく行うためのより良い方法は、完全な電源サイクル、1日の完全な作業を行い、次のようなコマンドを細かく実行することです。

_find / -type f -o -type f -mtime -1
_

したがって、読み取り/書き込みパーティションに配置する必要があるファイルが表示されます。

ロギング

このホストには書き込み可能な静的メモリが存在しないため、履歴やその他のログを保存するには、リモートsyslogサーバーを構成する必要があります。

_echo >/etc/syslog.conf '*.* @mySyslogServer.localdomain'
_

このようにして、システムが何らかの理由で壊れた場合、それ以前のすべてがログに記録されます。

アップグレード

一部の_mount --bind_を使用して実行する場合、システムの使用中にこのようなアップグレードを行うため(ダウンタイムを短縮するために_init 1_を実行する必要はありません)、最も簡単な方法は、クリーンroot、アップグレードが可能:

read-writeモードで「/」を再マウントした後:

_mount -o remount,rw /

for mpnt in /{,proc,sys,dev{,/pts}};do
    mount --bind $mnpt /$mnt$mpnt;
    done

chroot /mnt

apt-get update && apt-get dist-upgrade

exit

umount /mnt/{dev{/pts,},proc,sys,}

sync
mount -o remount,ro /
_

そして今:

_shutdown -r now
_
11
F. Hauri

最近のビルドルート(2014-02)の使用経験しかありません。そのバージョンでは、次のコマンドを使用して、構成ファイルで「ルートファイルシステムの再書き込み、読み取り、書き込み、起動」を無効にできます。

BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RWが設定されていません

Ext4 /パーティションを読み取り専用として使用するイメージを作成できたため、システムの電源を抜いても害はありません。それはうまく機能するので、ファイルシステムに書き込む必要がない場合は、これは上記のものよりもはるかに単純な解決策です(apt-getを参照するため、Debianシステムに適用できるようです)。

3
stacksake