- 论坛徽章:
- 0
|
#先做一张能启动到应急方式的应急启动光盘或下载个光盘linux.
#测试环境:/dev/sda1及/dev/sda2分别是目标linux系统的boot及root,/dev/sdb1是swap,/dev/sdc1用来暂存dd结果:
#cdlinux启动或磁盘启动到单用户方式
mount /dev/sdc1 /mnt
#备份硬盘前8M,含分区表,直接恢复可省去fdisk
dd if=/dev/sda bs=100k count=80|gzip -9>/mnt/sda-8M.dd.gz
#备份boot
dd if=/dev/sda1 bs=100k |gzip -9>/mnt/boot.dd.gz
#分段dd root,(一般为sda3,我的虚拟机将swap放在第2块盘上,root在sda2,mount看确认一下)每段2G.
ROOT=/dev/sda2
#以k为单位查一下root的大小:
set -x
mkdir /sda2
mount /dev/sda2 /sda2
rootsize=`df -k $ROOT|awk '$1=="'$ROOT'"{print $2;exit;}'`
#rootsize=5052060
n=`awk 'BEGIN{print int('$rootsize'/100)+2}'`
umount /sda2
echo "#restore root from dd">/mnt/restore-root.sh
i=0
while [ $i -le $n ];do
echo "gzip -dc </mnt/root-$i.dd.gz|dd bs=100k seek=$i of=$ROOT">>/mnt/restore-root-dd.sh
time dd if=$ROOT bs=100k skip=$i count=20000 |gzip -9>/mnt/root-$i.dd.gz
i=`expr $i + 20000`
done
#恢复测试:
#恢复时,hd00每道扇区数及磁头数应与原来一样,磁道数大于等于原来的。应急盘启动,mount好/mnt
#我不会做linux应急启动盘,主要不知道怎么做个小root。用CDlinux启动,新建虚拟机第1块硬盘
#恢复磁盘前8M,含分区表,省去fdisk。你也可以fdisk进行分区,跳过下一行。
mount /dev/sdc1 /mnt
#先用fdisk -l看了一下,/dev/sda包含非法分区
gzip -dc </mnt/sda-8M.dd.gz>/dev/sda
#再fdisk -l看一下,/dev/sda的分区表已有,与原来的一样。
#写一下分区表,以便访问boot及root
fdisk /dev/sda
w
#恢复boot
gzip -dc</mnt/boot.dd.gz>/dev/sda1
#恢复root
sh -x /mnt/restore-root-dd.sh
#拿掉光盘重启动硬盘,OK。
cpio备份方案:
#启动cdlinux,或其它应急盘方式(不推荐启动目标系统):
#假定/mnt是mount好的文件系统,用来暂存备份结果文件:
set -x
mkdir /sda1;mount /dev/sda1 /sda1
mkdir /sda2;mount /dev/sda2 /sda2
mkdir /mnt;mount /dev/sdc1 /mnt
#备份所有盘分区结构(文本方式)
fdisk -l >/mnt/fdisk.txt
#备份第1块盘前8M,含分区表:
dd if=/dev/sda bs=100k count=80|gzip -9>/mnt/sda-8M.dd.gz
#cdlinux带的cpio(BusyBox v1.15.3)结果必须存文件,无法使用输出管道进行压缩.用我目标机上的cpio
echo "/bin/ls"|cpio -ovB 2>&1 >/dev/null
cp /sda2/bin/cpio /mnt/cpio
cp /sda2/bin/cpio /bin/cpio
#备份boot
cd /sda1;
find . -mount -depth -print|/mnt/cpio -ovB 2>/mnt/boot.cpio.log |gzip -9>/mnt/boot.cpio.gz
#备份root,SCO及FAT32有2G文件大小限制,linux我不知道.我采用2G大小(压缩前)分块备份保存.
i=0
ROOT=/dev/sda2
#cpio结果文件压缩前可能比原来文件的大.测试时按原文件大小计算dd次数结果没备份全.
#推荐按使用空间放大2-3倍计算dd次数(*3为放大3倍).
n=`df -k $ROOT|awk '$1=="'$ROOT'"{print int($3/100)*3}'`
echo "
#restore root from cpio
mkdir /sda2;mount /dev/sda2 /sda2
cd /sda2
(">/mnt/restore-root-cpio.sh
cd /sda2;
find . -mount -depth -print>/mnt/root.files
cat /mnt/root.files|/mnt/cpio -ovB 2>/mnt/root.cpio.log|while [ $i -le $n ];do
echo "doing:gzip -9>/mnt/root-$i.cpio.gz" 1>&2
echo "gzip -d </mnt/root-$i.cpio.gz">>/mnt/restore-root-cpio.sh
dd bs=100k count=20000 2>/mnt/root-$i.dd.log|gzip -9>/mnt/root-$i.cpio.gz
i=`expr $i + 20000`
done
echo ')|/mnt/cpio -iuvdmB 2>/mnt/root-restorefromcpio.log2 >/mnt/root-restorefromcpio.log'>>/mnt/restore-root-cpio.sh
#恢复测试 提醒:破坏第1块硬盘全盘数据!!!)
#cdlinux或应急盘启动:
mount /dev/sdc1 /mnt
#恢复磁盘前8M,可以省去fdisk。你也可以自己手工fdisk分区。
gzip -d </mnt/sda-8M.dd.gz>/dev/sda
#写一下分区表,以便访问sda1及sda2(手工mknod建/dev/sda1也访问不了。谁知道更直接的命令使sda1可访问?)
fdisk /dev/sda
w
#格式化并恢复boot
mkfs.ext3 /dev/sda1
mkdir /sda1;mount /dev/sda1 /sda1;
cd /sda1;gzip -d </mnt/boot.cpio.gz|/mnt/cpio -iuvdmB 2>&1 >/mnt/boot.restorefromcpio.log
#格式化并恢复root
mkfs.ext3 /dev/sda2
mkdir /sda2;mount /dev/sda2 /sda2
cd /sda2;
sh -x /mnt/restore-root-cpio.sh
#修复grub启动
/sda2/sbin/grub
root (hd0,0)
setup (hd0)
quit
#拿走光盘重启动,OK。
sync
reboot
================================
几种备份方法比较:
1、cpio:传统、通用、可靠;但不包含磁盘分区结构。要fdisk分好区才能恢复。
兼容性好,磁盘结构可以不同,要恢复的分区大小可以随便调。可以选择性恢复部分文件。
慢!
2、ghost:省事,会的人也多。恢复时要求每道磁头数及扇区数与原盘不同会有问题吧?我不知道。
ghost整盘最省事,但拉圾全在上面,但太大了;
3、dd:每道磁头数及扇区数最好与原盘相同,与ghost差不多原理。
dd sda相当于ghost整盘;比ghost优点是可以选择文件系统进行备份。 |
|