我正在处理运行 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
)。