写在前面
为了保护孱弱的SD卡,许多人在使用树莓派时会将文件系统设置为 OverlayFS,将对磁盘的写入转移到内存中。显然,这样做会导致树莓派无法永久存储写入的信息,设备重启后写入内容将全部丢失。
那么有没有可能既要又要在开启 OverlayFS 且不额外增添外设(U盘、移动硬盘等)的前提下,单独划出一小块区域供用户写入持久数据呢?这里介绍一种相对简单的方法。
未被完全开发的 /boot
树莓派的 /boot 分区在烧录SD卡时预留了512Mb,且在开启了 OverlayFS 时依然能够被设置为可写。这给了我们很大的操作空间。
注:以下操作请在开启 OverlayFS 前完成,且需要确保 /boot 未被设置为只读模式。
1. 创建磁盘镜像
- 在
/boot分区中创建用于写入的磁盘镜像:
# 假设 boot 分区挂载在 /boot/firmware(新版系统)
# 这里我们创建一个256Mb的
sudo dd if=/dev/zero of=/boot/firmware/data.img bs=1M count=0 seek=256
sudo mkfs.ext4 /boot/firmware/data.img
2. 创建挂载服务
- 用
mkdir /data在根目录创建挂载点 -
用
nano /etc/systemd/system/data.mount创建服务文件,写入以下内容:
[Unit]
Description=Persistent data image
# 确保 /boot/firmware 已经挂载完成后再挂载本镜像
After=local-fs.target boot-firmware.mount
Before=multi-user.target
[Mount]
What=/boot/firmware/data.img
Where=/data
Type=ext4
Options=loop,noatime,nofail
[Install]
WantedBy=multi-user.target
几点说明:
After=local-fs.target boot-firmware.mount:保证本地文件系统以及/boot/firmware已经挂载完成,避免在 boot 分区尚未就绪时就去挂载镜像。Before=multi-user.target:让本挂载单元在进入多用户目标之前完成,避免依赖/data的服务过早启动。Options中加上了nofail:当镜像损坏或挂载失败时,不会阻塞系统启动进入 emergency mode。如果你希望挂载失败时能明显感知并手动处理,可以去掉nofail,但那样系统可能无法正常启动。- 注意:systemd 的
.mount单元名必须与挂载点路径严格对应。挂载点是/data,所以单元名是data.mount;如果改成/mnt/data,单元名就要写成mnt-data.mount。 -
注册服务并使之生效:
sudo systemctl daemon-reload
sudo systemctl enable --now data.mount
3. 开启 OverlayFS 文件系统
到这里就可以开启 OverlayFS 文件系统(注意不要把 /boot 设置为只读)并重启树莓派了。重启后,/data 目录为可写状态,重启后写入数据不会丢失。
如果挂载失败,由于加了 nofail,系统仍能正常启动,你可以通过以下命令排查:
systemctl status data.mount
journalctl -u data.mount
确认镜像和文件系统没问题后,再手动 sudo systemctl start data.mount 即可。
