飞牛NAS CLI手动创建EXT4存储空间及逆向研究报告
飞牛NAS手动创建EXT4硬盘分区及逆向研究报告
不同于常见的’修改 fstab 手动挂载’方案,本文通过逆向飞牛存储栈的完整抽象层,实现了新卷在 Web UI 中的原生识别与全功能管理。
为什么要逆向研究实现手动创建存储空间?
官方 Web UI 采用高度封装的向导式交互,虽降低了入门门槛,但严格限制了底层存储拓扑的灵活性。在实际场景中,手动创建存储空间具有不可替代的价值:
- 单盘多池划分:将一块大容量硬盘拆分为多个独立存储池,分别用于冷数据归档、Docker 持久化卷或虚拟机镜像,实现物理隔离与独立配额。
- 系统崩溃救援:当 Web UI 无法访问、数据库损坏或遭遇异常断电时,手动重建存储栈是抢救数据的唯一可靠途径。
- 规避自动装配干扰:NAS 后台守护进程可能误识别旧 RAID 签名导致卷状态异常。掌握底层逻辑可强制清理并精确对齐。
- 自动化运维基础:理解从裸盘到
/volX的完整路径,是编写批量初始化脚本、集成 CI/CD 或进行深度性能调优的前提。
以下为经过完整验证的逐步骤操作实录。请严格按照顺序执行,并将 /dev/sdb 替换为您的实际目标磁盘。
前置检查:确认目标磁盘状态
在执行任何破坏性操作前,必须确认磁盘路径且未被系统占用。
1 | |
预期输出:
1 | |
说明:确认 /dev/sdb 无分区、无挂载点。若显示已挂载,请先执行 umount /dev/sdb*。
步骤一:彻底清除磁盘残留签名
1 | |
预期输出:
1 | |
说明:此操作不可逆。确保未误选系统盘。
步骤二:创建 GPT 分区并设置 Linux RAID 类型
1 | |
预期输出:
1 | |
说明:类型 FD00 是底层 mdadm 识别的必要条件。udevadm settle 确保 /dev/sdb1 节点已就绪。
步骤三:构建单盘 RAID1 阵列
1 | |
预期输出:
1 | |
说明:飞牛NAS使用单盘 RAID1 作为设备抽象层,以便后续无缝插入第二块硬盘扩容。--metadata=1.2 和 --name="test:0" 是后端服务硬编码的识别特征。
1 | |
预期输出:
1 | |
步骤四:初始化 LVM 物理卷与卷组
1 | |
预期输出:
1 | |
说明:此处需手动输入 y 并回车。VG 名称必须以 trim_ 开头,后接 UUID 格式,否则 Web 端扫描时将直接过滤。
1 | |
预期输出:
1 | |
步骤五:创建逻辑卷 (LV)
1 | |
预期输出:
1 | |
说明:LV 名称固定为 0。系统将自动在 /dev/mapper/ 下生成 ${VG_NAME}-0 符号链接。
步骤六:格式化 ext4 并开启项目配额 (prjquota)
1 | |
预期输出:
1 | |
说明:tune2fs -O project 是核心步骤。缺失此特性会导致挂载参数无法加载 prjquota,进而触发 Web 端配额 API 拦截。
步骤七:挂载并严格同步系统权限
1 | |
预期输出:
1 | |
说明:系统卷根目录权限为 700 root:root。若手动创建后为默认的 755,后端文件服务将拒绝读取。
此时可以在web端看到我们创建的存储空间(67b-0)

步骤八:注入系统“指纹”目录
1 | |
预期输出:
1 | |
说明:Web 端文件管理器通过检查这三个目录判断卷是否完成初始化。
lost+found:ext4 标准目录,校验权限完整性。thumb:缩略图缓存根目录。缺失时 API 判定卷未就绪。1000:默认管理员(UID 1000)空间映射,用于建立用户索引。
此时刷新 Web UI 存储池与文件管理器页面,新卷应完全可用,显示为存储空间X。

关键技术约束对照表
| 层级 | 强制要求 | 偏离后果 |
|---|---|---|
| 分区表 | GPT,类型 FD00 (Linux RAID) |
mdadm 拒绝组装或内核不识别 |
| RAID元数据 | mdadm v1.2,单盘 --force,名称 test:0 |
后端正则过滤失败,卷不可见 |
| LVM命名 | VG前缀 trim_+UUID转下划线;LV名必须为 0 |
filestor_service 扫描丢弃 |
| 文件系统 | ext4,Block Size 4096,启用 project 特性 |
prjquota 挂载失败,配额API拦截 |
| 挂载参数 | rw,relatime,prjquota |
Web端返回“内部错误”或拒绝访问 |
| 根目录指纹 | 必须存在 lost+found、thumb、1000 且权限为 700 root:root |
文件管理器初始化中断 |
安全与运维警告
- 路径二次确认:所有命令中的
/dev/sdb必须与lsblk输出严格一致。误操作将导致系统盘或数据盘永久损毁。 - 无物理冗余:
--raid-devices=1仅为统一设备抽象层,不提供硬盘级容灾。重要数据需定期冷备份。 - 数据库清理:若多次创建失败,内部 SQLite 可能残留错误状态。需定位
/var/lib/fnos/*.db并清理volumes表中状态为error的记录。 - 版本差异:本流程基于当前版本逆向验证。大版本更新可能调整服务校验逻辑或引入 ZFS/Btrfs,生产环境请先在测试盘验证。