Я имею дело с встраиваемым устройством под управлением Linux. Производители этого устройства настроили его так, что оно загружает корневую файловую систему как read-only.
Из /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.
решение1
squashfs
это сжатая файловая система только для чтения. Она не предусматривает внесение изменений после ее создания. Поэтому вы не сможете записывать в нее, даже если базовое блочное устройство можно сделать доступным для записи. Вам нужно будет создать новый образ squashfs всей файловой системы с вашими изменениями игоретьего на устройство хранения, где хранится эта файловая система, что было бы проблематично сделать из работающей системы.
Другой вариант — смонтировать другую файловую систему на /etc
. Это можно сделать с помощью объединения монтирования, если оно поддерживается ядром, которое обычно объединяет две файловые системы, при этом одна файловая система записывает только изменения вбазаФайловая система только для чтения.
Проверьте поддержку 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
.
В качестве альтернативы, если вы хотите изменить только несколько файлов, вы можете смонтировать их с помощью bind-mount (да, вы можете смонтировать любой файл, а не только каталоги) из версии, хранящейся в файловой системе, доступной для записи:
cp /etc/passwd /tmp
mount --bind /tmp/passwd /etc/passwd
Тогда /etc/passwd
это будет доступно для записи. Конечно, вы также можете сделать это для всего /etc
вместо этого. ( cp -a /etc /tmp && mount --bind /tmp/etc /etc
).