因为准备从U-NAS 更换到Fnos NAS,需要将软RAID阵列中的数据迁移到一个临时挂载的大

容量移动硬盘上。

1.查了下U-NAS与Fnos NAS 都是基于Linux debain发行版,

2. 磁盘阵列基于软RAID构建,数据存储在/mnt/raid/目录下。

3.移动硬盘通过USB连接并挂载到/mnt/backup/。

4.整个过程通过第三方PC使用SSH远程操作NAS完成。迁移涉及多个大目录(如home, ,work,others),总数据量较大2T。

一、技术背景与需求痛点

2025年7月,我在部署家庭NAS时面临问题:如何在系统重启后自动挂载LVM逻辑卷到指定目录,同时确保挂载时序正确。传统方案(如/etc/fstab)因缺乏依赖控制常导致挂载失败,这促使我探索更健壮的持久化方案。

二、三大方案对比实验

1. 传统fstab方案

/dev/mapper/myzone-homefile /vol1/1000/homefile ext4 defaults 0 0

缺陷:无法处理LVM设备未就绪时的竞态条件,需手动mount -a补救。

2. udev规则方案

创建/etc/udev/rules.d/99-mount.rules

ACTION=="add", ENV{DM_NAME}=="myzone-*", RUN+="/bin/mount /dev/%k /vol1/1000/%E{DM_NAME#myzone-}"

问题:缺乏目录创建逻辑,且权限控制复杂。

3. Systemd服务+定时器方案

最终采用的分层解决方案:

(1)服务单元设计

/etc/systemd/system/delay-mount.service

[Unit] Description=Delayed LVM Mount Service After=lvm2-pvscan@.service [Service] Type=oneshot ExecStart=/bin/sh -c 'mkdir -p /vol1/1000/{others,homefile,workfile} && mount -a' TimeoutSec=300

优化点

  • 通过After确保LVM设备就绪

  • 使用{}通配符简化目录创建

  • 组合命令减少进程开销

(2)延迟触发机制

/etc/systemd/system/delay-mount.timer

[Timer] OnBootSec=3min # 预留设备初始化时间 Unit=delay-mount.service

价值:完美解决系统启动时序依赖问题。

三、典型问题与解决实录

1. 引号嵌套陷阱

原始错误命令:

ExecStart=/bin/sh -c "mkdir -p /vol1/1000/others" # 引发Unbalanced quoting

修正方案:统一使用单引号包裹完整命令块。

2. 定时器启动失败

关键日志:

Jul 27 08:07:46 mynas systemd[1]: Refusing to start, unit delay-mount.service not loaded

根因:服务单元文件语法错误导致加载失败,通过systemd-analyze verify定位修复。

四、方案效果验证

  • 可靠性:经历20+次重启测试,挂载成功率达100%

  • 性能:3分钟延迟触发对启动时间影响可忽略

  • 可维护性:日志通过journalctl -u delay-mount.*集中监控

五、其他权限问题

未来可考虑:

  1. 通过RequiresMountsFor强化路径依赖声明

  2. 集成ConditionPathExists预检机制

  3. 增加邮件报警通知功能

六、挂载错误导致无法进入系统问题

因为fstab 挂载错误原因导致无法进入系统,报give root password for maintence (or press ctrl-d to continue), 而且默认也没开启root账号,设置root密码;

经查询linux 系统下确实可通过修改 GRUB 引导参数绕过密码验证进行重置,本案采用init=/bin/sh 应急模式‌。

# ⚙️ 方法一:rd.break 救援模式(推荐)‌
‌# 重启进入 GRUB 菜单‌
# 开机时按住 Shift/Esc 键进入 GRUB 菜单,选择系统内核项后按 e 进入编辑模式。

#‌ 修改内核参数‌
# 找到以 linux 或 linux16 开头的行,在行末追加 ‌rd.break‌ 参数(注意与前面内容用空格分隔)。
# 修改示例(图示:在 ro 后添加 rd.break)

‌# 挂载并重置密码‌
# 按 Ctrl+X 启动后,依次执行
mount -o remount,rw /sysroot      # 挂载为读写模式
chroot /sysroot                   # 切换根目录 ‌
passwd root                       # 设置新密码(输入两次)‌
touch /.autorelabel               # 重建 SELinux 标签(关键!)‌
exit                              # 退出 chroot
exit                              # 重启系统
# ⚙️ 方法二:init=/bin/sh 应急模式‌
‌# 编辑 GRUB 参数‌
# 同上进入 GRUB 编辑模式,找到内核行:

# 将 ro 改为 rw(启用读写权限)
# 行尾追加 ‌init=/bin/sh‌
‌# 直接重置密码‌
# 按 Ctrl+X 启动后执行:
mount -o remount,rw /          # 确保根目录可写
passwd root                    # 重置密码
touch /.autorelabel            # 修复 SELinux 标签
exec /sbin/init                # 正常启动系统

1.修改 GRUB 引导参数init=/bin/sh 应急模式‌

1.1、正常开机选项 按”e”进入编辑模式

1.2、将ro修改为rw 然后在末尾加入 init=/bin/bash

1.3、按F10 或 Ctrl+x 重启进入shell界面

2、修改密码并重启

passwd root 更改root密码

exec /sbin/init 重启

有时候,exec /sbin/init 无法重启电脑;
可以用:echo b > /proc/sysrq-trigger 试下

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐