Debian Linux下软RAID NAS数据迁移实战经验分享(三)
2025年7月,我在部署家庭NAS时面临核心挑战:如何在系统重启后自动挂载LVM逻辑卷到指定目录,同时确保挂载时序正确。迁移涉及多个大目录(如home, ,ork),总数据量较大2T。因为准备从U-NAS 更换到Fnos NAS,需要将软RAID阵列中的数据迁移到一个临时挂载的大。2. 磁盘阵列基于软RAID构建,数据存储在/mnt/raid/目录下。)因缺乏依赖控制常导致挂载失败,这促使我探索更
因为准备从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.*集中监控
五、其他权限问题
未来可考虑:
-
通过
RequiresMountsFor强化路径依赖声明 -
集成
ConditionPathExists预检机制 -
增加邮件报警通知功能
六、挂载错误导致无法进入系统问题
因为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 试下

更多推荐



所有评论(0)