使只读 /etc 可写

使只读 /etc 可写

我正在处理运行 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 命令完成。

答案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.

或者,如果您只想修改几个文件,您可以从存储在可写文件系统中的版本绑定挂载它们(是的,您可以挂载在任何文件上,而不仅仅是目录):

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

然后/etc/passwd就可以写了。当然,您也可以整体这样做/etc。 ( cp -a /etc /tmp && mount --bind /tmp/etc /etc)。

相关内容