[Linux]overlayroot后无法写入TF卡

1. 进入底层模式 (Chroot)
sudo overlayroot-chroot
2. 彻底清理 /etc/fstab (关键)
执行 vi /etc/fstab,删除或用 # 注释掉所有包含 0018-D0BC 或 /mnt/tfcard 的行。
原理:只要 fstab 里没有它,overlayroot 启动时就不会去“预占”这个目录,这是成功的核心。
3. 创建强力挂载脚本
执行 vi /usr/local/bin/mount-tf.sh,写入以下内容:
#!/bin/bash
# 等待硬件就绪和 overlayroot 初始化完成
sleep 10
# 强制创建物理目录
mkdir -p /mnt/tfcard
# 彻底清除可能存在的任何挂载(包括只读层残留)
umount -f /mnt/tfcard 2>/dev/null
umount -l /mnt/tfcard 2>/dev/null
# 执行物理挂载(加上参数确保读写)
mount -t exfat -o defaults,uid=1000,gid=1000,umask=000,noatime /dev/mmcblk1p1 /mnt/tfcard
赋予权限:chmod +x /usr/local/bin/mount-tf.sh

4. 创建 Systemd 服务文件
执行 vi /etc/systemd/system/mount-tfcard.service,写入:
[Unit]
Description=Mount TF Card for Overlayroot
After=multi-user.target
DefaultDependencies=no

[Service]
Type=idle
ExecStart=/usr/local/bin/mount-tf.sh
# 确保即使脚本退出,挂载依然保留
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
5. 启用并重启
在 chroot 环境内执行:
systemctl daemon-reload
systemctl enable mount-tfcard.service
exit
sudo reboot

///////////////////////////////////////////

要保证 mount-tfcard.service 在上电后自动运行,核心在于 Systemd 的注册机制 和 依赖关系控制。

你只需要在底层模式(chroot)下完成以下三个关键动作:

1. 必须包含 [Install] 区块
在你的 .service 文件末尾,必须有这段代码。它告诉系统:当执行“启用”命令时,要把这个服务挂载到哪个启动阶段(Target)。

代码段
[Install]
WantedBy=multi-user.target
multi-user.target:相当于传统的“运行级别 3”,是系统完成基础引导、进入多用户模式(命令行界面)的标志。

2. 执行启用命令 (最关键的一步)
仅仅写好文件是不够的,你必须在 sudo overlayroot-chroot 环境下运行以下命令:

Bash
# 重新加载系统服务配置
systemctl daemon-reload

# 设置开机自启
systemctl enable mount-tfcard.service
这一步做了什么?
它会在 /etc/systemd/system/multi-user.target.wants/ 目录下创建一个指向你 service 文件的软链接。上电后,系统扫描到这个链接,就会自动启动它。

3. 检查服务是否“真的”被设为自启
运行以下命令验证:

Bash
systemctl is-enabled mount-tfcard.service
如果输出 enabled,说明配置正确,上电会运行。

如果输出 disabled 或 static,说明 [Install] 部分有问题或没执行 enable。

4. 解决“运行了但没挂载成功”的问题
很多时候服务运行了,但因为执行太快报错。为了保证 100% 成功,请确保你的 [Service] 区块包含以下参数:

代码段
[Service]
Type=idle
ExecStart=/usr/local/bin/mount-tf.sh
# 即使脚本运行完退出了,也保持服务状态为 active,防止系统回收挂载点
RemainAfterExit=yes
Type=idle:这是 Systemd 的一个“必杀技”。它会等所有其他的启动任务(比如磁盘扫描、网络启动)全部彻底完成后,才最后运行你的脚本。这能有效避开 overlayroot 启动时的各种冲突。

总结:完整的检查清单
如果你已经按照之前的建议写好了文件,请按顺序执行:

sudo overlayroot-chroot

vi /etc/systemd/system/mount-tfcard.service (检查是否有 [Install] 部分)

systemctl daemon-reload

systemctl enable mount-tfcard.service

exit

sudo reboot

重启后,如果还没挂载,执行:
sudo systemctl status mount-tfcard.service
如果看到 Active: active (exited),说明它上电后确实运行了。此时如果还没挂载,那就不是“自动运行”的问题,而是脚本里的 mount 命令报错了(可能是 UUID 没对上或 /dev/mmcblk1p1 路径在那个瞬间还没生成)。

发表评论

邮箱地址不会被公开。 必填项已用*标注