|
| 1 | +--- |
| 2 | +date: 2026-04-05 |
| 3 | +topic: fnos-portable-disk-mounting |
| 4 | +--- |
| 5 | + |
| 6 | +# FNOS 跨发行版可复用的数据盘挂载方案 |
| 7 | + |
| 8 | +## Problem Frame |
| 9 | + |
| 10 | +当前机器上的外接数据盘挂载同时混用了 `fstab`、开机重挂载 service、以及登录 shell 里的 `mount -a`,导致启动阶段容易互相打断,也让方案难以复制到别的机器。 |
| 11 | + |
| 12 | +这次要定义的是一套更稳、更简单、可迁移的挂载管理方案,用于 FNOS 及其他常见 systemd Linux 发行版上的外接数据盘。目标不是做自动识别一切硬盘的“智能系统”,而是沉淀一套低维护成本的约定:仓库里保留可提交模板,本机保留私有配置,通过单一管理脚本统一生成与应用挂载配置,运行时仍然只依赖 `fstab` 作为系统挂载真相来源,并兼顾 Samba 与本地文件管理访问。 |
| 13 | + |
| 14 | +## Requirements |
| 15 | + |
| 16 | +**Configuration Source** |
| 17 | +- R1. 数据盘挂载配置必须以 `linux/fnos/` 下的结构化 shell 配置清单作为单一真相来源,并采用“仓库模板 + 本机私有配置”的双文件模式。 |
| 18 | +- R2. 仓库内必须保留可提交的示例配置文件,供新机器复制后生成本机私有配置;机器私有配置不能要求直接纳入 Git 管理。 |
| 19 | +- R3. 结构化清单必须支持在同一份配置中混合使用 `LABEL=` 与 `UUID=` 标识磁盘:能统一卷标的磁盘优先使用 `LABEL=`,少数不能稳定统一的磁盘允许继续使用 `UUID=`。 |
| 20 | +- R4. 挂载路径必须使用显式配置的固定业务路径,例如 `/vol00/bookDisk`,并且路径命名必须独立于磁盘卷标,允许后续调整而不要求改卷标。 |
| 21 | +- R5. 挂载根目录必须支持配置,默认值为 `/vol00`,以便同一套方案迁移到其他 Linux 机器时无需改脚本代码。 |
| 22 | + |
| 23 | +**Management Workflow** |
| 24 | +- R6. `linux/fnos/` 下必须拆分为多文件模块化源码,并通过一个 `build.sh` 产出单文件管理脚本,方便在目标机器上分发与执行。 |
| 25 | +- R7. 管理脚本必须作为唯一推荐操作入口,常规的生成、校验、应用、修复都通过该脚本执行,而不是要求用户直接手改系统文件。 |
| 26 | +- R8. 管理脚本必须采用显式两步流程:先 `build/generate` 生成结果与预览,再由用户执行 `apply` 写入系统文件;不能默认一步到位直接改 `/etc/fstab`。 |
| 27 | +- R9. 运行时必须只有一套自动挂载真相来源;管理脚本负责生成和应用配置,但常规挂载行为仍由 `fstab` 定义,不能依赖第二套开机自动重挂载机制来维持正常工作。 |
| 28 | + |
| 29 | +**Mount Behavior** |
| 30 | +- R10. 方案必须支持两种挂载模式:默认按需自动挂载,以及按盘可选的开机立即挂载。 |
| 31 | +- R11. 默认推荐模式必须是按需自动挂载,以降低启动阶段的挂载竞争和慢盘拖慢开机的问题。 |
| 32 | +- R12. 少数对“开机后立即可见”有明确要求的磁盘,必须允许通过配置切换为开机立即挂载,而不影响其他磁盘继续使用按需自动挂载。 |
| 33 | + |
| 34 | +| 模式 | 默认性 | 触发方式 | 适用场景 | 主要代价 | |
| 35 | +|---|---|---|---|---| |
| 36 | +| 按需自动挂载 | 默认 | 首次访问挂载点时触发 | 大多数外接数据盘、冷数据盘、慢盘 | 首次访问会有一次挂载延迟 | |
| 37 | +| 开机立即挂载 | 可选 | 开机阶段主动挂载 | 需要开机后立刻在线的少数磁盘 | 更容易暴露慢盘、脏盘、竞争挂载问题 | |
| 38 | + |
| 39 | +**Access and Recovery** |
| 40 | +- R13. Samba 共享与本地文件管理访问必须基于固定挂载点路径,而不是依赖桌面环境或其他组件临时生成的自动挂载路径。 |
| 41 | +- R14. 管理脚本必须包含统一的修复能力,用于处理磁盘未挂载、被其他进程占用、或 NTFS 状态不干净等异常;现有 `linux/fnos/remount.sh` 只作为历史功能来源,不再单独保留为最终入口文件。 |
| 42 | +- R15. 管理脚本必须包含校验能力,能够检查挂载点、磁盘标识匹配情况、重复自动挂载来源,以及当前系统状态与配置清单是否一致。 |
| 43 | +- R16. 文档与工具必须明确要求移除或禁用与 `fstab` 冲突的重复自动挂载来源,例如开机重挂载 service、登录 shell 中的 `mount -a`,以及在需要时关闭抢占相同磁盘的其他自动挂载行为。 |
| 44 | + |
| 45 | +**Portability** |
| 46 | +- R17. 方案必须优先依赖常见 systemd Linux 发行版都具备的标准能力,避免把发行版私有 UI、桌面自动挂载策略或 NAS 厂商界面行为作为必需前提。 |
| 47 | +- R18. 方案必须保持“复制成本低于自动化复杂度”的原则:允许每台机器做少量本地编辑,但不为了完全零配置复制而引入新的长期守护进程或多套运行时配置体系。 |
| 48 | +- R19. 管理脚本与主配置清单必须基于纯 shell 能力可运行,不要求 `jq`、`yq` 或其他额外解析依赖作为前置条件。 |
| 49 | +- R20. 管理脚本的构建产物必须是单文件脚本,便于复制到其他机器执行,而不要求在目标机器上保留完整源码目录。 |
| 50 | + |
| 51 | +## Success Criteria |
| 52 | +- 新机器可以通过复制仓库中的示例配置、做少量本地调整、运行单文件管理脚本,快速得到可工作的挂载配置。 |
| 53 | +- 正常启动时不再依赖额外的重挂载 service 或 shell 登录脚本来补救挂载。 |
| 54 | +- 大多数外接数据盘在首次通过 Samba、文件管理器或命令行访问固定挂载点时可以自动挂载。 |
| 55 | +- 需要“开机后立即在线”的个别磁盘可以单独配置为 eager 模式,而不会迫使所有磁盘都采用同一策略。 |
| 56 | +- 故障排查路径清晰:运维者知道唯一该修改的主配置在哪里,也知道生成、应用、校验、修复分别通过哪个管理命令完成。 |
| 57 | + |
| 58 | +## Scope Boundaries |
| 59 | +- 本次不追求“插到任意机器自动识别所有外接盘并零配置完成挂载”。 |
| 60 | +- 本次不尝试覆盖所有文件系统类型,优先服务当前以 NTFS 外接数据盘为主的场景。 |
| 61 | +- 本次不把 NAS 文件管理器的 UI 展示逻辑作为保证对象;保证的是对固定挂载点的访问行为与共享路径稳定。 |
| 62 | +- 本次不把机器私有配置直接纳入 Git 管理。 |
| 63 | +- 本次不让管理脚本接管系统开机后的常驻挂载调度;脚本是管理入口,不是常驻守护进程。 |
| 64 | + |
| 65 | +## Key Decisions |
| 66 | +- 采用“结构化 shell 清单为单一真相来源 + 仓库模板 + 本机私有配置”的方式,而不是直接把 `fstab` 模板当主配置。 |
| 67 | +- 采用“固定业务挂载点 + 可配置磁盘标识 + 可配置挂载根目录”的方式,而不是让挂载路径跟着卷标变化或把根目录写死。 |
| 68 | +- 采用“多文件源码 + `build.sh` 生成单文件管理脚本”的方式,而不是让目标机器直接依赖完整源码目录运行。 |
| 69 | +- 采用“管理脚本作为唯一推荐入口 + 显式 generate/apply 两步流”的方式,而不是继续手工拼改多个文件。 |
| 70 | +- 采用“默认 automount、按盘可切 eager”的混合模式,而不是强制所有磁盘统一开机挂载或统一按需挂载。 |
| 71 | +- 采用“`fstab` 作为唯一运行时自动挂载来源 + 管理脚本内置校验与修复能力”的方案,而不是继续保留独立的开机重挂载脚本参与正常启动流程。 |
| 72 | + |
| 73 | +## Dependencies / Assumptions |
| 74 | +- 目标机器为采用 systemd 的 Linux 发行版;按需自动挂载能力依赖 `x-systemd.automount` 这一类 systemd `fstab` 行为。 |
| 75 | +- Samba 等上层访问会直接命中固定挂载点路径,从而在按需模式下触发自动挂载。 |
| 76 | +- 个别桌面环境或 NAS 组件如果会抢占同一块磁盘的自动挂载,需要在落地时按机器情况关闭或绕开。 |
| 77 | +- 目标机器可以执行标准 POSIX/Bash shell 脚本,并允许管理脚本在显式 `apply` 阶段写入系统级 `fstab`。 |
| 78 | + |
| 79 | +## Outstanding Questions |
| 80 | + |
| 81 | +### Resolve Before Planning |
| 82 | +- 暂无。 |
| 83 | + |
| 84 | +### Deferred to Planning |
| 85 | +- [Affects R1,R2,R6,R20][Technical] `linux/fnos/` 下的源码目录、模块边界和 `build.sh` 产物命名如何设计,才能既利于维护又便于分发。 |
| 86 | +- [Affects R1,R3,R5,R19][Technical] 结构化 shell 配置清单的字段格式、注释约定和加载方式如何设计,才能既便于复制又不容易填错。 |
| 87 | +- [Affects R8,R9,R10,R11,R12][Technical] 默认 automount 与 eager 两种模式在生成 `fstab` 时分别采用哪些推荐挂载选项,才能兼顾稳定性、权限和可读性。 |
| 88 | +- [Affects R14,R15,R16][Technical] 管理脚本的子命令边界如何划分,例如 `generate`、`apply`、`check`、`repair`、`status` 是否都需要首版提供。 |
| 89 | +- [Affects R14,R15,R16,R17][Needs research] 对 FNOS 当前文件管理器、Samba 与其他潜在自动挂载组件,需要给出多强的兼容指导,才能避免与目标方案相冲突。 |
| 90 | + |
| 91 | +## Next Steps |
| 92 | + |
| 93 | +→ /prompts:ce-plan for structured implementation planning |
0 commit comments