在 PL-R5 Trixie 环境中验证只读模式

工业级树莓派系统在硬件和软件方面都必须具备高可靠性。
特别是,将系统文件设置为只读状态可以降低因意外关机导致的文件损坏风险,并防止非预期的更改被永久保留,从而提高系统的可靠性。

Raspberry Pi OS Trixie 与之前的版本有显著不同,因此部分旧信息已不再适用。
在本文中,我再次在 Trixie 环境中测试了只读配置。

测试环境

本次测试所使用的树莓派系统专为工业应用设计,因此与市面上的基于树莓派CM的系统略有不同。

  • PL-R5 USB IP20(https://pilink.jp/product/pl-r5-usb-ip20/)
  • 32 GB microSD卡
  • 型号:树莓派计算模块 5 Rev 1.0
  • 操作系统:Debian GNU/Linux 13 (Trixie)
  • 内核:6.18.29+rpt-rpi-2712

检查网络设置

在启用 OverlayFS 之前,请确保 `sudo apt update ` 命令已成功执行。

由于raspi-config 会在后台安装overlayroot 软件包,因此如果网络或DNS连接不稳定,配置过程可能会失败。
为检查网络设置,我使用了ipnmcli 命令,如下所示。

ip route
default via 192.168.0.1 dev eth0 proto static metric 100 
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.10 metric 100

使用nmcli 命令来检查连接名称。

nmcli connection show

如果没有网络连接,请通过指定“NAME”下所列的连接名称来配置网络。
以下是配置 eth0 网络的示例。
此外,您还可以通过桌面图形界面(GUI)配置网络。

sudo nmcli connection modify "Wired connection 1" \
  ipv4.method manual \
  ipv4.addresses 192.168.0.10/24 \
  ipv4.gateway 192.168.0.1 \
  ipv4.dns 192.168.0.1 \
  ipv4.never-default no

从这一步开始,您可以通过 SSH 继续进行设置。

数据存储区

PL-R5 还配备了一个 microSD 卡插槽(不可用于启动)。
即使将 eMMC 用作启动盘,microSD 卡仍可挂载为可写入的数据存储区域。
此外,还可以在 PL-R5 上添加 SSD。

请注意,在市售的树莓派 CM5 系统上,eMMC 和 microSD 是互斥的,因此只能使用其中一种。

这种行为取决于载板的設計,因此务必检查您所用系统的规格。
在此 PL-R5 配置中,eMMC 用作启动盘,microSD 卡用作数据存储区域。

■ 注:
。由于 PL-R5 运行的是 Raspberry Pi OS Trixie,我不得不将dtoverlay=sdio-pi5 添加到/boot/firmware/config.txt 中,才能让 microSD 卡被识别。
将该行添加在[ALL] 之后。

创建一个可写存储位置

当我使用lsblk 命令检查那张独立的microSD卡时,系统将其识别为mmcblk2p1 。我创建了一个/data 目录,并在fstab 中添加了一条条目,以便在系统启动时自动挂载该microSD卡。

lsblk

NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0          7:0    0    2G  0 loop 
mmcblk0      179:0    0 29.1G  0 disk 
├─mmcblk0p1  179:1    0  512M  0 part /boot/firmware
└─mmcblk0p2  179:2    0 28.6G  0 part /
mmcblk0boot0 179:32   0    4M  1 disk 
mmcblk0boot1 179:64   0    4M  1 disk 
mmcblk2      179:96   0 28.8G  0 disk 
└─mmcblk2p1  179:97   0 28.8G  0 part 
zram0        254:0    0    2G  0 disk [SWAP]

创建/data 目录,并挂载该分区。

sudo mkdir -p /data
sudo mount /dev/mmcblk2p1 /data

请检查 UUID。
将条目添加到fstab 时,必须提供该 UUID。

sudo blkid /dev/mmcblk2p1
/dev/mmcblk2p1: LABEL="data" UUID="76a0c4e4-5072-411f-ae8e-4daf55604603" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3dfbf2f1-01"

将 /data 添加到 fstab 中

指定 UUID,并将以下条目添加到fstab 文件末尾。

sudo nano /etc/fstab

UUID=76a0c4e4-5072-411f-ae8e-4daf55604603 /data ext4 defaults 0 2

自动挂载配置现已完成。请重启系统,并使用lsblk 命令验证分区是否已正确挂载。

准备工作现已完成。下一步是启用 OverlayFS 并将系统文件设为只读。

启用 OverlayFS

可以通过在raspi-config 菜单中运行sudo raspi-config 来配置OverlayFS。

启用 OverlayFS 的步骤

菜单:性能选项 → 覆盖文件系统 → 启用

请将 /boot 分区设置为可写。

通常情况下,OverlayFS 此时应该已经启用。然而,在该环境(官方 Raspberry Pi 操作系统和 PL-R5)中,它并未正常工作。
原因在于 overlay 该模块尚未加载。
此行为可能因版本而异。如果重启后 OverlayFS 仍未启用,请尝试以下解决方法。

OverlayFS 无法正常工作时的故障排除

我遇到过这样一种情况:即使已经正确配置了 OverlayFS 并重启了系统,它仍然无法正常工作。可能还有其他原因,因此以下解决方案并不适用于所有情况。
overlay 模块未被加载时,此解决方法适用。

在撰写本文时,我通过显式配置系统来加载该模块,成功解决了这个问题。
这可能取决于具体环境,但 我发现所需的模块并未被自动加载。

# Edit the modules file
sudo nano /etc/initramfs-tools/modules

# Add the following
overlay

# Update initramfs
sudo update-initramfs -u

# Reboot
sudo reboot

OverlayFS 现应已启用。
如果该问题在未来的 Raspberry Pi OS 更新中得到修复,则不再需要此解决方法。

将 /data 从 OverlayFS 中排除

当通过raspi-config 启用OverlayFS时,之前创建的/data 目录也会被设为只读。
根据具体用途,这可能并不理想,因此我们将配置/data ,使其不被纳入OverlayFS。

编辑cmdline.txt

sudo nano /boot/firmware/cmdline.txt

如下所示,在overlayroot=tmpfs 行首添加:recurse=0

overlayroot=tmpfs:recurse=0

然后重启系统。
在将/data 排除在外之前,以下命令的输出显示该文件位于root-ro 下,且为只读状态。

mount | grep /data

/dev/mmcblk2p1 on /media/root-ro/data type ext4 (ro,relatime)
/media/root-ro/data on /data type overlay (rw,relatime,lowerdir=/media/root-ro/data,upperdir=/media/root-rw/overlay/data,workdir=/media/root-rw/overlay-workdir/data,uuid=on)

应用排除设置后,输出显示为“rw ”,这意味着可以正常读写/data

/dev/mmcblk2p1 on /data type ext4 (rw,relatime)

与此同时,根文件系统仍挂载在overlayroot on / type overlay 上。这是预期的行为,不会造成任何问题。

mount | grep " on / "

overlayroot on / type overlay (rw,relatime,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_,uuid=on)

使用以下两个命令来检查/data 和根文件系统的状态。

mount | grep /data
mount | grep " on / "

■ 注:
当指定recurse=0 时,OverlayFS 仅适用于根文件系统 (/)。
由于在此配置中,microSD 卡上的/data 被挂载为一个独立的文件系统,因此它被排除在 OverlayFS 之外,数据将直接写入 microSD 卡。
尽管配置中未明确写明,但内部默认设置实际上等同于overlayroot=tmpfs:recurse=1

进行更改时禁用 OverlayFS

此配置的一种可能用途是将可写入的/data 目录用作应用程序的输出目标。
如果在启用 OverlayFS 的情况下后续需要安装应用程序或更改系统设置,对根文件系统所做的更改将在重启后丢失。
因此,我们建议暂时禁用 OverlayFS,进行必要的更改或添加,然后再次启用它。

在更改操作系统设置或更新软件包时,也必须禁用 OverlayFS。

要禁用 OverlayFS,请按照启用时相同的步骤操作:raspi-config
这次,请选择“禁用”。

禁用 OverlayFS 的步骤

菜单:性能选项 → 覆盖文件系统 → 禁用

在此环境下, 仅靠raspi-config 无法完全禁用OverlayFS,还需检查配置文件。
要完成此过程,请按照以下解决方法操作。

当无法禁用 OverlayFS 时的故障排除

通常情况下,通过执行raspi-config 禁用OverlayFS后,cmdline.txt 中添加的overlayroot=tmpfs 条目也应被删除。
然而,在此环境中,该条目仍然存在。无论我尝试多少次,OverlayFS都未能被禁用,文件系统也未能恢复到正常的可写状态。

作为一种临时解决方案,在按照常规步骤禁用 OverlayFS 之后,我不得不手动删除相关条目。

sudo nano /boot/firmware/cmdline.txt

从该行的开头删除以下条目。

overlayroot=tmpfs:recurse=0

与启用 OverlayFS 的临时解决方案一样,如果该问题在未来的 Raspberry Pi OS 更新中得到修复,则此步骤将不再必要。

操作流程至关重要

在用于个人用途的系统中,用户可能会频繁更改设置,以及安装或卸载应用程序。
因此,以这种方式使用 OverlayFS 可能会比较麻烦。

然而,在工业应用中(而非个人桌面环境中),此类变更通常较为罕见。
由于在禁用 OverlayFS 后可能会忘记将其重新启用,因此一种做法是每月指定一个维护日,集中进行操作系统更新、配置更改和软件安装。

即使启用了 OverlayFS,仍可执行命令。
例如,执行sudo apt install ~ 时,系统可能会显示包已成功安装,且已安装的软件实际上也可以使用。但是,这些更改仅写入临时存储,重启后将会消失。

OverlayFS 的一个缺点是,无法立即直观地判断它是否已启用或禁用。
正因如此,系统配置完成后的操作流程尤为重要。

在 SSH 登录时显示 OverlayFS 状态

为系统管理员显示状态消息可能会很有用。
虽然这仅适用于 SSH 登录,但显示当前的 OverlayFS 状态有助于防止管理员在必要时忘记禁用或重新启用它。

sudo nano ~/.bashrc
# OverlayFS status

if mount | grep -q "overlayroot on /"; then
    echo ""
    echo "======================================"
    echo " The system is currently in read-only mode (OverlayFS enabled)"
    echo " Changes will be lost after reboot"
    echo "======================================"
    echo ""
fi

这样应该能让人更容易注意到当前状态。

“系统当前处于只读模式(已启用 OverlayFS)”
“重启后所有更改都将丢失”

raspi-config 方法存在的问题

在 Trixie 环境中,仅通过 `raspi-config ` 启用 OverlayFS 可能并不总能确保其正常运行。

至少在本文撰写时的测试环境中,必须将overlay 内核模块显式添加到/etc/initramfs-tools/modules 中。
此外,在按照相关步骤禁用OverlayFS后,还必须编辑cmdline.txt 文件。

■ 启用:
raspi-config

启用

确认overlay 是否已列在/etc/initramfs-tools/modules
中。若已添加,请运行sudo update-initramfs -u

:recurse=0 添加到cmdline.txt 中(每次启用 OverlayFS 时均需执行此操作)

重启

■ 禁用:
raspi-config

禁用

cmdline.txt 中删除overlayroot=tmpfs:recurse=0 (每次禁用 OverlayFS 时都需执行此操作)

重启

简而言之,在该环境下仅靠raspi-config 无法完成该过程。
由于没有显示错误信息,这个问题很容易被忽略。

请注意,随着 Raspberry Pi OS 的更新,本文所述的解决方法可能已不再必要。
希望未来的 Raspberry Pi OS 更新能让整个过程仅通过raspi-config 即可完成。


由Raspida供稿

Raspida 运营 raspida.com,这是一个旨在让非工程师也能乐在其中的树莓派信息网站。基于多年对树莓派的实践经验,该网站发布了大量实用文章和专题内容,既适合经验丰富的树莓派用户,也适合有兴趣入门的新手。Raspida 还向 PiLink 网站供稿,发布关于工业级树莓派产品的技术博客文章