正确处理只读 rootfs 的持久文件

Correct handling of persistent files for readonly rootfs

我希望我的 rootfs 是只读的。据我所知,在 EXTRA_IMAGE_FEATURES 中设置 "readonly-rootfs" 之前,需要采取一些措施来实现这一点。 现在,我正在尝试将文件 passwdshadowgshadowgroup 从 rootfs 中的 /etc 移动到持久存储,即 /data/etc 以及下面的食谱是如何完成这项工作的:

ROOTFS_POSTPROCESS_COMMAND += "move_to_persistent;"

WANT_PERSISTENT = " \ 
    shadow \
    gshadow  \
    passwd  \
    group  \
"

PERSISTENT_TARGET_DIRECTORY = "${D}"

# Testing a different location here in rootfs with the same result
# as described in the stack overflow question
# PERSISTENT_TARGET_DIRECTORY = "${IMAGE_ROOTFS}/test"

FROM = "${IMAGE_ROOTFS}${sysconfdir}"
TO = "${PERSISTENT_TARGET_DIRECTORY}/data${sysconfdir}"

move_to_persistent () {
    install -d ${TO}

    for fn in ${WANT_PERSISTENT}; do
        mv ${FROM}/$fn ${TO}/$fn
        ln -r -s ${TO}/$fn ${FROM}/$fn
    done
}

不幸的是,我收到以下错误 useradd command did not succeed.。 事实上,当我检查移动文件的所有权时,我看到我的主机用户是那里的所有者:

[...]/my-image/1.0-r0/image/data/etc/
total 16
-rw-r--r-- 1 marius marius  639 Mai 19 12:47 group
-rw------- 1 marius marius  536 Mai 19 12:47 gshadow
-rw-r--r-- 1 marius marius 1025 Mai 19 12:47 passwd
-rw------- 1 marius marius  649 Mai 19 12:47 shadow

现在的问题是:我如何设置或保留文件的正确所有权,您是否发现这种方法存在其他问题? 提前谢谢大家!

经过一些研究和调查,食谱似乎正在做它应该做的事情。但正如 this thread passwd 中所讨论的那样,出于安全原因明确避免遵循符号链接。因此,问题出在其他地方。

简单地将 /etc/passwd 符号链接到可写存储是行不通的,因为 passwd 和其他工具会进行检查。有几件事是可行的,我将在下面提到。但在此之前,使用 passwd 意味着您正在使用密码进行身份验证,这不是最安全的方式。也许您可以使用某种证书(如 ssh 密钥)或某种网络身份验证

无论如何,这里有两种方法可以让 passwd 工作...

  1. 使用绑定挂载

将/etc 复制到可写分区中的目录,在示例中名为/data。请注意,您必须复制整个 /etc,因为 passwd 需要在更新期间在其中创建多个文件

执行一次(在构建时)

cp -a /etc /data

在启动时执行此操作

mount --bind /data/etc /etc
  1. 使用overlayfs

使用 CONFIG_OVERLAY_FS 构建您的内核。然后你可以做类似的事情 这个:

执行一次(在构建时)

mkdir -p /data/etc/work /data/etc/upper

在启动时执行此操作

mount -t overlay \
      -o lowerdir=/etc,upperdir=/data/etc/upper,workdir=/data/etc/work \
       overlay /etc

对 /etc 的任何更改实际上都记录在 /data/etc/upper 中,但会 似乎在 /etc.

我不会在这里提供 OpenEmbedded 方法来实施这些解决方案中的任何一个,因为更改非常微不足道,但取决于您正在构建的确切配置