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がまだ書き込み可能でない場合、書き込み可能にすることはできますか?システムにrootアクセスできますが、「オフライン」でファイルシステムにアクセスできません。すべての変更はBashコマンドを使用して行う必要があります。
squashfs
は読み取り専用の圧縮ファイルシステムです。それが作成された後、それを変更する規定はありません。そのため、基盤となるブロックデバイスを書き込み可能にしたとしても、それに書き込むことはできません。変更を加えたファイルシステム全体の新しいsquashfsイメージを作成し、そのファイルシステムが格納されているストレージデバイスにburnイメージを作成する必要があります。これは、ライブシステムから行うには問題があります。
別のオプションは、/etc
に別のファイルシステムをマウントすることです。カーネルでサポートされている場合、ユニオンマウントを介する可能性があります。これは、通常2つのファイルシステムを1つのファイルシステムとマージし、変更のみをbase読み取り専用ファイルシステムに記録します。
カーネル構成でAUFS_FSまたはOVERLAY_FSのサポートを確認します。
たとえば、システムに永続的な書き込み可能なストレージがない場合、/tmp
のディレクトリをunionマウントします(おそらく、メモリ内の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
)。