正确处理只读 rootfs 的持久文件
Correct handling of persistent files for readonly rootfs
我希望我的 rootfs 是只读的。据我所知,在 EXTRA_IMAGE_FEATURES
中设置 "readonly-rootfs"
之前,需要采取一些措施来实现这一点。
现在,我正在尝试将文件 passwd
、shadow
、gshadow
和 group
从 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 工作...
- 使用绑定挂载
将/etc 复制到可写分区中的目录,在示例中名为/data。请注意,您必须复制整个 /etc,因为 passwd 需要在更新期间在其中创建多个文件
执行一次(在构建时)
cp -a /etc /data
在启动时执行此操作
mount --bind /data/etc /etc
- 使用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 方法来实施这些解决方案中的任何一个,因为更改非常微不足道,但取决于您正在构建的确切配置
我希望我的 rootfs 是只读的。据我所知,在 EXTRA_IMAGE_FEATURES
中设置 "readonly-rootfs"
之前,需要采取一些措施来实现这一点。
现在,我正在尝试将文件 passwd
、shadow
、gshadow
和 group
从 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 工作...
- 使用绑定挂载
将/etc 复制到可写分区中的目录,在示例中名为/data。请注意,您必须复制整个 /etc,因为 passwd 需要在更新期间在其中创建多个文件
执行一次(在构建时)
cp -a /etc /data
在启动时执行此操作
mount --bind /data/etc /etc
- 使用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 方法来实施这些解决方案中的任何一个,因为更改非常微不足道,但取决于您正在构建的确切配置