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


15

Linuxを組み込みデバイス上のオペレーティングシステムとして実行するという任務を負っています。

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

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

syslinuxbuildrootファイルシステムが存在するCF ext3パーティションにルートディレクトリを設定することにより、システムが正常に起動します。

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

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

この目標を達成する好ましい方法はありますか?もしそうなら、私にとって最善の方法は何ですか?

回答:


11

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

注:この答えは、以前よりも簡単ですが、より安全でないファイルを保つことができるので、私の最初の答えは強いですが、読み取り専用FSのオプションのマウント 前に許可フラグをそう。強制するわけではない仕事は書き込みに許可なくファイルを書き込みますまったく。)

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

これは、使用aufs(デフォルトではなく、別の使用できるunionfsツール)を可能にするために、ライブセッションの変更をすべてが、再起動時に忘れられているので、デフォルトではなく、RAMインチ

以下を実行するだけでインストールできます:

apt-get install fsprotect

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

その後:

  • 編集する/boot/grub/menu.lstか、/etc/default/grub2またはカーネルパラメータに/etc/lilo.conffsprotect=1G」を追加します。
  • 必要に応じて1Gを変更します。
  • 変更を適用する(つまり、実行するupdate-grub
  • /etc/default/fsprotect以外のファイルシステムを保護する場合は編集します/
  • リブート

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

そこから、一部のファイルが変更に対して保護されている場合、サンプルによって

chmod ugo-w myfile

サンプルに使用しvi myfile、command を使用して書き込みを試みると:w!、これが機能し、 myfile変更されます。変更されていないを取得するために再起動できますmyfile

私の次の最初の解決策では不可能です。

古い(最初の)答え:

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

r / oを使用可能にする

あなたには、いくつかのディレクトリをマウントする必要がRWのように、/var/etc、多分/home。これはaufsまたはunionfsを使用して実行できます。私はこれを別の方法で気に入って/dev/shmおり、and を使用していmount --bindます:

cp -a /var /dev/shm/
mount --bind /dev/shm/var /var

前に、static-var/ varにシンボリックリンクを作成するよりも、aの通常の操作で変更する必要のないすべてのディレクトリを移動できます。

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で再マウントする場合、ほとんどのファイルが移動され、ramでシンボリックリンクのみがコピー/var/dev/shmれるため、コピーインはスペースを取りすぎません/static-var

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

find / -type f -o -type f -mtime -1

したがって、どのファイルを読み取り/書き込みパーティションに配置する必要があるかがわかります。

ロギング

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

echo >/etc/syslog.conf '*.* @mySyslogServer.localdomain'

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

アップグレード

いくつかのwhith実行している場合mount --bind、システムが使用されている間、そのようなアップグレードを行うため、使用中の(ランニングの必要性はwhithout init 1、-ダウンタイムを削減するため)、simplierの方法は、再ビルドにクリーンであるルートし、アップグレードを実行することです:

読み取り / 書き込みモードで「/」を再マウントした後:

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

ご回答有難うございます。私のLinuxスキルは現時点では優れていないため、完全には理解していません。しかし、それはまだ非常に有用であり、研究のためのいくつかの領域を提供してくれます。
数学者

回答を編集しました!新しいソリューションと説明された差分!
F.ハウリ

これは質問に答えません。debianベースのシステムには最適な答えですが、Buildrootはdebianベースではありません。
LovesTha

@LovesTha 古い(最初の)答えを見てください !これはDebianベースではなく 、Uは原則を理解し、あらゆる種類の配布/インストールに対して同じメカニズムを実装できます。(アップグレードセクションにDebianコマンドが表示されている場合でも、Uは手動アップグレードまたはその他の
ディストリビューション

あなたの古い答えは、読み取り専用Linuxシステムのセットアップに関する一般的な質問に対する素晴らしい答えです。buildrootを読み取り専用にするための調査が終了したら、ここに戻って特定の質問に関する詳細な回答を提供したいと考えています。Buildrootには、tempfsである/ tmpにシンボリックリンクされた/ varの一時ビットが既にあります。/ etcはプログラムのスクラッチスペースとして使用しないでください。したがって、特別に処理する必要はありません。
-LovesTha

3

私は最近のbuildroot(2014-02)を使用した経験しかありません。そのバージョンでは、次のコマンドで設定ファイルの「ルートファイルシステムの読み取り/書き込み時のブートの再マウント」を無効にできます。

BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RWが設定されていません

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


答えてくれてありがとう-しかし、最終的には、データの永続化のためにCFドライブに同期オプション付きのディレクトリを2、3個だけマウントするinitramfsセットアップを選択しました。とりあえずこれは私にかなり役立っています。
数学者

これに追加するには、古いbuildrootバージョンを使用して/etc/inittab、再マウント/がそこで発生するかどうかを確認します。その場合は、必要に応じて変更してください。
evnu

この答えは、それを行うための「buildroot方法」の重要な部分です。より複雑なシステムを機能させるには、受け入れられた回答のアドバイスの多くが必要になります。ただし、実行する必要があるのは、/ tmp(tempfs)への追加のシンボリックリンクをいくつかセットアップするだけで、すべてが機能する可能性があります。
LovesTha
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.