私は 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
)。