使只读/ 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可写,是否有可能?我具有对系统的超级用户访问权限,但无法访问文件系统“脱机”,所有更改都必须通过Bash命令来完成。

Answers:


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,然后重新加载配置或重新启动。绝大多数家用路由器都是这样工作的。但是确切的机制和命令是特定于系统的。
佐藤桂

完善!该设备不支持覆盖挂载,但是将自定义文件绑定到/ etc中的文件非常有效!谢谢你的帮助。
约书亚·沃尔什
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.