私の使命は、組み込みデバイスでLinuxをオペレーティングシステムとして実行することです。
ターゲットには、x86プロセッサと8GB CompactFlashストレージデバイスがあります。
私はカーネルイメージとクロスコンパイルツールを生成するためにbuildrootを正常に使用しました。 CFデバイスをカーネルイメージとブートsyslinux
構成、ext3
ファイルシステムを含む小さなFATパーティションに分割し、そこにbuildrootによって生成されたルートファイルシステムを抽出しました。
syslinux
ビルドルートファイルシステムを含むCF ext3パーティションにルートディレクトリを設定すると、システムは正常に起動します。
私の質問は、停電後にデバイスが正常に起動することが重要であるため、即時で頻繁な停電が発生した場合の堅牢性の必要性に焦点を当てています。ルートファイルシステムを読み取り専用でマウントすることがデータの整合性を保証する1つの方法であることがわかりました。続行するのが賢明な方法ですか?
また、同じ目的を達成するためにルートファイルシステムをRAMにロードする可能性についても読みましたが、まだこれを行う方法がわかりません。
これを達成するための好ましい方法はありますか?それでは、私が前に進むための最良の方法は何ですか?
答え1
新しい回答(2015-03-22)
(メモ:この回答は以前よりも簡単ですが、より安全ではありません。ファイルを保存できるので、最初の答えはより強力です。読み取り専用渡すファイルシステムのマウントオプション 今後許可フラグ。だから力許可なくファイルに書き込むことはまったく機能しません。 )
うん、降りてダーバン、パッケージがあります:FS保護(ホームページ)。
aufs
(デフォルトでは他のunionfs
ツールを使用することもできます)を使用して許可します。ライブセッションの変更ただし、デフォルトではRAMにあるため、再起動時にすべての内容が消去されます。
次のコマンドを実行して簡単にインストールできます。
apt-get install fsprotect
完了したら、オンラインマニュアルで次の操作を行います。
以来:
/boot/grub/menu.lst
または、編集して/etc/default/grub2
カーネルパラメータに/etc/lilo.conf
""を追加します。fsprotect=1G
- 必要に応じて1Gを修正してください。
- 変更を適用する(例:run
update-grub
)/etc/default/fsprotect
保護したい場合/
。- 再起動
grubブートローダをパスワードで保護したり、変更を無効にしたりすることもできます。
ここで特定のファイルが変更されないように保護されている場合(例:
chmod ugo-w myfile
例を使用しvi myfile
てコマンドを使用して作成しようとすると、これが機能し、:w!
内容が myfile
変更されます。未修正を検索するには、再起動できますmyfile
。
以下の最初の解決策では不可能です。
前(最初)の答え:
はい、これは強力なソリューションであり、うまく動作します!
r/o を有効にする
いくつかのディレクトリをインストールする必要があります。読み書き、おそらく、/var
これは次のように行うことができます。/etc
/home
オブまたは同盟。私はこれが好きです他の方法、使用、/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から再マウントすると、ほとんどのファイルがRAMに移動され、シンボリックリンクのみがコピーされるため、コピーが大量のスペースを占有しません/var
。/dev/shm
/static-var
これを詳細に実行するより良い方法は、フルパワーサイクル、一日中作業を実行し、次のコマンドを詳細に実行することです。
find / -type f -o -type f -mtime -1
したがって、読み取り/書き込みパーティションにどのファイルが必要かを確認できます。
記録
このホストには書き込み可能な静的メモリがないため、履歴やその他のログを保存するにはリモートサーバーを設定する必要がありますsyslog
。
echo >/etc/syslog.conf '*.* @mySyslogServer.localdomain'
これにより、何らかの理由でシステムがクラッシュした場合に以前の内容がすべて記録されます。
アップグレード中
使用中のアイテムを実行するときにシステムが使用中mount --bind
(ダウンタイムを減らすために実行せず)、これらのアップグレードを実行するには、init 1
きれいなシステムを再構築する方が簡単です。根、アップグレード可能:
「/」を再度マウントした後読み書きモデル:
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
答え2
私は最新のビルドルート(2014-02)についてのみ経験があります。このバージョンでは、設定ファイルで「起動時にルートファイルシステムの読み取り/書き込みを再マウントする」を無効にできます。
BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW が設定されていません。
ext4/パーティションを読み取り専用として使用するイメージを作成することができたため、システムを取り外してもまったく破損しません。うまく動作するので、ファイルシステムに書き込む必要がない場合は、上記のものよりも簡単な解決策かもしれません(apt -getを参照しているので、Debianシステムである程度動作するようです)。