読み取り専用の /etc を書き込み可能にする

読み取り専用の /etc を書き込み可能にする

私は Linux を実行する組み込みデバイスを扱っています。このデバイスのメーカーは、ルート ファイルシステムを読み取り専用としてロードするように設定しています。

/etc/mtab から:

rootfs / rootfs rw 0 0
/dev/root / squashfs ro,relatime 0 0

つまり、新しいユーザーを追加するなど、/etc 内のファイルを変更することはできません。

ルートディレクトリの再マウントを試みました:

mount -o remount,rw -t squashfs /dev/root /

しかしエラーが発生します

mount: cannot remount block device /dev/root read-write, is write-protected

このエラーを調べたところ、blockdevを使うように言われていました。システムにはblockdevがインストールされていないので、クロスコンパイルしてコピーしました。そして、

blockdev --setrw rootfs

しかし、再びエラーが発生しました:

blockdev: cannot open rootfs: No such file or directory

/etc がまだ書き込み可能になっていない場合、書き込み可能にすることは可能ですか? システムのルート アクセス権はありますが、ファイル システムに「オフライン」でアクセスすることはできません。すべての変更は Bash コマンドを使用して行う必要があります。

答え1

squashfsは読み取り専用の圧縮ファイルシステムです。一度作成すると変更する手段はありません。そのため、基礎となるブロックデバイスが書き込み可能になったとしても、書き込むことはできません。変更を加えたファイルシステム全体の新しいsquashfsイメージを作成し、やけどそのファイル システムが保存されているストレージ デバイスにコピーしますが、ライブ システムから実行すると問題が発生します。

もう一つの選択肢は、異なるファイルシステムをマウントすることです/etc。カーネルがサポートしている場合は、ユニオンマウントを介して行うことができます。ユニオンマウントは、通常、1つのファイルシステムが1つのファイルシステムへの変更のみを記録し、2つのファイルシステムを結合します。ベース読み取り専用ファイルシステム。

カーネル設定で AUFS_FS または OVERLAY_FS のサポートを確認します。

たとえば、システムに永続的な書き込み可能なストレージがない場合、ディレクトリをユニオンマウントします/tmp(メモリ内にある可能性があるため、再起動後は保持されませんが、できれば書き込み可能)。tmpfs

mkdir -p /tmp/etc/work /tmp/etc/upper
mount -t overlay \
      -o lowerdir=/etc,upperdir=/tmp/etc/upper,workdir=/tmp/etc/work \
       overlay /etc

すると/etc書き込み可能になり、それに加えた変更は実際に に保存されます/tmp/etc/upper

あるいは、変更したいファイルが少数だけであれば、書き込み可能なファイル システムに保存されているバージョンからそれらをバインド マウントできます (ディレクトリだけでなく、任意のファイルにマウントできます)。

cp /etc/passwd /tmp
mount --bind /tmp/passwd /etc/passwd

すると/etc/passwd書き込み可能になります。もちろん、代わりに 全体に対してこれを行うこともできます/etc。 ( cp -a /etc /tmp && mount --bind /tmp/etc /etc)。

関連情報