5 创建只读根文件系统

假设出于安全原因,需要禁用目标设备根文件系统的写权限,即使用只读根文件系统; 或者设备的操作系统本来就运行在只读存储设备上。在这两种情况下,都可以定制 镜像以支持相应行为。

备注

要支持只读根文件系统,系统和应用程序就不能尝试写入根文件系统。 必须配置目标系统的所有部分,使其写入其他位置,或者在尝试写入根文件 系统时妥善处理失败。

5 创建根文件系统

要创建只读根文件系统,只需为镜像添加 "read-only-rootfs" 功能,通常有两种 方式。第一种是在镜像配方文件中,通过 IMAGE_FEATURES 变量添加 "read-only-rootfs" 镜像功能:

IMAGE_FEATURES += "read-only-rootfs"

另一种是在发行版的 configuration file 中,通过对应的 EXTRA_IMAGE_FEATURES 变量添加同一功能,例如:

EXTRA_IMAGE_FEATURES = "read-only-rootfs"

这些变量的用法详见 “通过自定义 IMAGE_FEATURES 和 EXTRA_IMAGE_FEATURES 定制镜像” 一节。变量本身的说明见 IMAGE_FEATURES 和 EXTRA_IMAGE_FEATURES。

5 安装后脚本与只读根文件系统

务必确保镜像中所有软件包的安装后脚本(pkg_postinst )都能在主机系统上 构建并创建根文件系统时运行。这些脚本不能留到目标设备首次启动时执行。 启用 "read-only-rootfs" 功能后,构建系统会确保所有安装后脚本在创建文件 系统时成功完成。如果仍有脚本需要在根文件系统创建之后运行,构建就会立即 失败。这些构建时检查使问题在构建阶段暴露,避免目标设备随后在首次启动时 才发生故障。

Yocto Project 默认构建系统生成的大多数常见安装后脚本,都经过设计,可以 在创建根文件系统时运行,例如建立字体缓存的安装后脚本。不过,如果创建并 添加了自定义脚本,就需要确保它们也能在创建文件系统时运行。

以下是导致安装后脚本无法在创建根文件系统时运行的常见问题:

  • 没有在绝对路径前使用 $D: 构建系统在创建根文件系统时定义 $D;而脚本在目标设备上运行时,$D 为空。因此,$D 有两个用途:一是确保路径在主机和目标环境中都有效,二是判断当前运行 环境,以便采取适当操作。

  • 尝试运行目标架构专用或依赖目标架构的进程: 可以使用在主机系统上运行 的本机工具完成相同任务,也可以通过 QEMU 的 qemu_run_binary 函数 运行这些进程。更多信息见 qemu 类。

5 可写区域

启用 "read-only-rootfs" 功能后,目标设备运行时任何写入根文件系统的尝试 都会失败。因此,必须将执行这类写操作的进程和应用程序配置为写入具有写权限 的目录,例如 /tmp 或 /var/run。