迁移数据这件事,不少用户可能都考虑过:磁盘空间不足想添加新硬盘,或者旧硬盘容量偏小、出现故障需要更换。今天就来详细梳理具体的操作思路。当然,实际环境千差万别,这里仅提供一个可参考的框架,还需根据你手中的硬盘和系统实际情况进行调整。
无论采用哪种方法,第一步都是先安装新硬盘并让系统正确识别。为了省去调整硬盘跳线的麻烦(默认设置为Master),这里假设将新IDE硬盘连接到IDE1接口,即与旧硬盘使用不同数据线,系统会识别为ad2。如果必须与旧硬盘共用同一条数据线(IDE0),则需要将跳线设为Client,系统识别为ad1。具体步骤:关机、安装新硬盘、开机,然后执行下面命令确认系统是否识别到新硬盘:
hpserver# dmesg | grep ad2
如果成功识别,会看到类似如下的信息:
ad2: 9765MB [19841/16/63] at ata1-master UDMA33
若没有显示,则需要检查接线或硬件兼容性问题。新硬盘就位后,下面分别介绍两种常见的数据迁移场景。
一、增加一块硬盘,将原系统的 /var 数据迁移过来
FreeBSD 不像 Windows 的 PQMagic 那样可以自由调整分区大小且不丢失数据。因此,当 /var 空间紧张时,添加一块新硬盘并把旧数据搬过去是最稳妥的解决方案。
1. 对新硬盘进行分区
可以使用 sysinstall 或命令行 fdisk。虽然 fdisk 更灵活,但这里更推荐 sysinstall 的图形界面,分区完成后再利用它的 Label 功能创建文件系统。
2. 挂载文件系统到 /mnt
hpserver# mount /dev/ad1s1e /mnt
3. 迁移数据——两种主流方法
这里介绍两种方式:tar 和 dump/restore,大家可根据场景选择。
(1) 使用 tar 备份并还原
hpserver# cd /var
hpserver# tar cf - * | (cd /mnt; tar xf -)
(2) 使用 dump 备份并用 restore 还原
根据个人经验,推荐 dump + restore。曾经尝试用 tar 备份 /var 时,因为部分正在使用的文件或临时文件无法读取,导致中途中断。而 dump 按块操作,不受文件锁限制,可靠性更高。
hpserver# cd /mnt
hpserver# dump -f- /var | restore -f- -r
过程中会输出类似下面的信息,属于正常现象:
DUMP: Date of this level 0 dump: Wed Jan 14 23:44:35 2004
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping /dev/ad0s1e (/var) to standard output
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 305 tape blocks.
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: DUMP: 361 tape blocks
DUMP: finished in less than a second
DUMP: DUMP IS DONE
4. 确认与收尾
有一点需要提醒:备份过程中不要向原 /var 写入新数据,否则那些文件不会出现在新分区。完成后检查结果,然后卸载 /mnt:
hpserver# ls /mnt
hpserver# umount /mnt
5. 修改 /etc/fstab
将原来指向 /var 的设备路径改为新硬盘对应的分区(例如 /dev/ad1s1e),重启即可生效。
二、硬盘复制——旧盘换新盘
如果旧系统盘出现坏道、容量不足,打算整体更换,就可以将旧盘完整复制到新盘,然后移除旧盘。操作前有一个小技巧:先记下旧硬盘每个文件系统对应的挂载点(通过 /etc/fstab 查看),然后对新硬盘分区时完全按照旧盘的次序——这样后续挂载时不会混乱。
1. 对新硬盘分区并创建文件系统
用 sysinstall 分区,设置 MBR,然后按旧盘的次序逐一创建文件系统。例如,旧盘 /dev/ad0s1g 对应 /usr,新盘 /dev/ad2s1g 就设为 /usr;/dev/ad0s1e 对应 /var,新盘 /dev/ad2s1e 就设为 /var。关键一步:在 sysinstall 的 Label 界面中,按 M 清空所有文件系统的挂载点(因为我们尚未创建临时挂载目录),避免与系统原有挂载冲突。
2. 创建临时挂载点并挂载
hpserver# cd /mnt
hpserver# mkdir root
hpserver# mkdir usr
hpserver# mkdir var
然后根据 /etc/fstab 中旧盘的对应关系,挂载新盘的分区:
hpserver# mount /dev/ad2s1a /mnt/root
hpserver# mount /dev/ad2s1g /mnt/usr
hpserver# mount /dev/ad2s1e /mnt/var
3. 使用 dump+restore 复制数据
复制根分区时最好使用 dump,不要用 tar。因为 tar 如果不加排除参数会将所有内容(包括 /proc、/sys 等)都打包进去,这不是我们想要的结果。分别执行:
hpserver# cd /mnt/root
hpserver# dump -f- / | restore -f- -r
hpserver# cd /mnt/var
hpserver# dump -f- /var | restore -f- -r
hpserver# cd /mnt/usr
hpserver# dump -f- /usr | restore -f- -r
4. 检查并卸载
hpserver# umount /mnt/root
hpserver# umount /mnt/usr
hpserver# umount /mnt/var
5. 最后一步
关机,拆下旧硬盘,将新硬盘安装到旧硬盘原来的物理位置(例如 IDE0 接口)。这一步不能省略——如果不换位置,系统仍会把新盘识别为 ad2,而 /etc/fstab 中写的是 ad0,系统启动时就会报找不到 /usr、/var 等分区。启动后检查一切正常,恭喜你,数据迁移成功。如果出现问题,回顾之前的步骤看看是否有遗漏。无论如何,不要急着清空旧硬盘——让新系统运行几天,确认无误后再动手清理。
最后再提醒一句:数据迁移是有风险的操作,过程中任何失误都可能导致数据丢失,务必谨慎再谨慎。
