Сделать доступным только для чтения / etc

11

Я имею дело со встроенным устройством под управлением 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.

Джошуа Уолш
источник

Ответы:

19

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.

В качестве альтернативы, если вы хотите изменить только несколько файлов, вы можете связать их монтировать (да, вы можете монтировать любой файл, не только каталоги) из версии, хранящейся в записываемых файловых системах:

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

Тогда /etc/passwdбудет доступно для записи. Конечно, вы можете сделать это для всего /etcвместо. ( cp -a /etc /tmp && mount --bind /tmp/etc /etc).

Стефан Шазелас
источник
Некоторые встроенные системы могут перезаписывать файлы во /etcвремя загрузки на основе определенных настроек в nvram. Таким образом, чтобы изменить файл, /etcвы должны установить «волшебную» системную переменную, зафиксировать ее в nvram, затем перезагрузить конфигурацию или перезагрузить компьютер. Подавляющее большинство домашних маршрутизаторов работают именно так. Но точные механизмы и команды зависят от системы.
Satō Katsura
Отлично! Устройство не поддерживает наложения, но привязка пользовательских файлов к файлам в / etc работает очень хорошо! Спасибо за вашу помощь.
Джошуа Уолш