FreeBSD 硬盘系统和数据的复制迁移实战
陈海青
(joson chen) http://www.chq.name
2006.09.09
最近,为更换硬盘,参照有关资料,进行了一次
FreeBSD
下的硬盘数据迁移,具体情况如下:
1
:起因:
原有的硬盘容量小、有坏区、
swap
设置不合理、
/var
太小,所以需要进行更换
2
:计划:
1
)使用
sysinstall--fdisk
划分好新硬盘的
slice
(片段,一块硬盘分成最多四个
),本次划分为
2
个
slice,
用其中的
19GB
用于
Freebsd
); 2)
使用
sysinstall--label
划分新硬盘的
partition
(分区,每一个
slice
上又可以分成最多
8
个
partition
):
/ (512MB),swap (512MB),/tmp (1GB),/var (2G,
数据库等
)
,
/usr (10GB),(/home (rest of the hdd));
3:
操作步骤:
1
)将新硬盘装上并让系统正确识别。原硬盘为
IDE0
口上的
Master,FreeBSD
识别为
ad0
。为了不用设硬盘跳线,这里将新硬盘到
IDE1
接口的
Master
,系统识别为
ad2
;如果你想和旧硬盘接在同一数据线线上,即
IDE0
接口,则必须将跳线设为
slave,
系统识别为
ad1
。
1
、关机,将新硬盘装上,重新开机。
2
、开机后查看是否系统是否已经识别到新硬盘了:
http://www.chq.name
# dmesg | grep ad2
2
)记下旧硬盘文件系统所对应的
mount
点:查看
/etc/fstab
,并且运行命令
df,
记录结果。新硬盘分区次序基本按照旧的一样,避免混淆。
3
4
)创建临时的目录用来作临时
mount
点,用于以下步骤挂载文件系统。
http://www.chq.name#
mkdir /backup
http://www.chq.name# mkdir /backup/root
http://www.chq.name# mkdir /backup/usr
http://www.chq.name# mkdir /backup/var
http://www.chq.name# mkdir /backup/root
http://www.chq.name# mkdir /backup/usr
http://www.chq.name# mkdir /backup/var
http://www.chq.name#
mkdir /backup/tmp
5
)停止原系统的主要服务,如
APACHE
,
MYSQL
等,或者重启后进入单用户状态,准备复制。
进入单用户模式的方法:1.重启,在启动菜单开始倒计时的时候按下空格(space)键,输入boot -s ,然后在#后输入
fsck -p
mount -u /
mount -a
swapon -a
adjkerntz -i
fsck -p
mount -u /
mount -a
swapon -a
adjkerntz -i
6
)运行以下脚本,执行硬盘数据和系统的复制。要注意根据前面记录的
/etc/fstab
和
df
结果查看文件系统的对应关系,修改
mount等
脚本。
#1 - create new filesystems (newfs the drive)
#2 - mount the partitions
#3 - dump the data from my old drive, and restore it to my new one
#4 - unmount the new drives partitions
#5 - enable softupdates on the new drive (optional)
#!/bin/sh
newfs /dev/ad1s1a
newfs /dev/ad1s1e
newfs /dev/ad1s1f
newfs /dev/ad1s1g
mount /dev/ad1s1a /backup/root
mount /dev/ad1s1e /backup/var
mount /dev/ad1s1f /backup/tmp
mount /dev/ad1s1g /backup/usr
( dump -0f - / ) | ( cd /backup/root ; restore -rf - )
( dump -0f - /var ) | ( cd /backup/var ; restore -rf - )
( dump -0f - /usr ) | ( cd /backup/usr ; restore -rf - )
( dump -0f - /tmp ) | ( cd /backup/tmp ; restore -rf - )
# umount /backup/root
# umount /backup/var
# umount /backup/usr
# umount /backup/tmp
# tunefs -n enable /dev/ad2s1a
# tunefs -n enable /dev/ad2s1e
# tunefs -n enable /dev/ad2s1f
# tunefs -n enable /dev/ad2s1g
#end
#2 - mount the partitions
#3 - dump the data from my old drive, and restore it to my new one
#4 - unmount the new drives partitions
#5 - enable softupdates on the new drive (optional)
#!/bin/sh
newfs /dev/ad1s1a
newfs /dev/ad1s1e
newfs /dev/ad1s1f
newfs /dev/ad1s1g
mount /dev/ad1s1a /backup/root
mount /dev/ad1s1e /backup/var
mount /dev/ad1s1f /backup/tmp
mount /dev/ad1s1g /backup/usr
( dump -0f - / ) | ( cd /backup/root ; restore -rf - )
( dump -0f - /var ) | ( cd /backup/var ; restore -rf - )
( dump -0f - /usr ) | ( cd /backup/usr ; restore -rf - )
( dump -0f - /tmp ) | ( cd /backup/tmp ; restore -rf - )
# umount /backup/root
# umount /backup/var
# umount /backup/usr
# umount /backup/tmp
# tunefs -n enable /dev/ad2s1a
# tunefs -n enable /dev/ad2s1e
# tunefs -n enable /dev/ad2s1f
# tunefs -n enable /dev/ad2s1g
#end
其中:(
1
):
( dump -0f - / ) | ( cd /backup/root ; restore -rf - )
,
这是把老的根目录下所有内容复制输出到管道
, restore
从管道里读数据
,
写入当前目录所在目录
.
(2):进行dump/restore的操作可能会花点时间,需耐心等待,我迁移了3GB数据,运行脚本用了大约40分钟。
7
)调整新硬盘中的
/etc/fstab,
将
Device
等修正,我原来使用的是第二块
slice,
现在使用第一个
slice,
于是修改了
Device
列:
(
http://www.chq.name
)
#
mount /dev/ad1s1a /backup/root
( http://www.chq.name ) # vi /backup/root/etc/fstab
( http://www.chq.name ) # vi /backup/root/etc/fstab
8
)关机,摘掉原来的硬盘,把新硬盘挂到旧硬盘原来的位置
,这步不要省略了,如果你不换位置,系统还是认为新硬盘是
ad2
,由于你的
/etc/fstab
里面是对应
ad0
的,所以启动会找不到
/usr
和
/var
等文件系统。
9)
注意事项
:
重新启动,如果没有什么异常,那恭喜你,数据迁移已经成功,否则,请再看看有什么操作错误或者忘记做哪一步了。建议,让新的系统运行几天,正常后再处置旧硬盘。
切记,数据迁移的是一件比较危险的事情,操作过程中不能有差错,否则可能导致你原来的数据丢失,所以必须非常谨慎。
# cd /
# mkdir backup
# cd backup
# mkdir root
。。。
www# newfs /dev/ad2s1a
/dev/ad2s1a: 1024.0MB (2097152 sectors) block size 16384, fragment size 2048
using 6 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
super-block backups (for fsck -b #) at:
160, 376512, 752864, 1129216, 1505568, 1881920
。。。
# sh restore.sh
DUMP: WARNING: should use -L when dumping live read-write filesystems!
DUMP: Date of this level 0 dump: Thu Sep 7 22:22:40 2006
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping /dev/ad0s2a (/) to standard output
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 37230 tape blocks.
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
warning: ./.snap: File exists
DUMP: DUMP: 37868 tape blocks
DUMP: finished in 7 seconds, throughput 5409 KBytes/sec
DUMP: DUMP IS DONE
DUMP: WARNING: should use -L when dumping live read-write filesystems!
DUMP: Date of this level 0 dump: Thu Sep 7 22:22:49 2006
DUMP: Date of last level 0 dump: the epoch
……
DUMP: finished in 1 seconds, throughput 7128 KBytes/sec
DUMP: DUMP IS DONE
tunefs: soft updates set
参考资料:
FreeBSD硬盘分区和数据迁移相关资料