2022年9月4日星期日

使用dd对linux系统进行备份与还原操作

 神奇的ghost的原理是什么呢?不就是数据复制吗?

Linux下的dd命令不就是最强大的数据复制工具!

查看磁盘分区情况
lsblk
查询硬盘使用情况

df -h 

为避免网络中断,以screen 窗口运行,

创建后台执行窗口      恢复后台窗口           结束后台窗口

screen -S dd           screen -r dd       screen -S dd -X quit

多个同名的screen会话,可以执行:screen -ls 查看对应会话的session_id,然后使用screen -D -r + session_id 进行恢复。
screen -D -r session_id
退出指定会话 screen -X -S + session id quit


查看查看/dev/sdb磁盘上的所有分区的尺寸和布局情况。
-u,让start和end中数字的单位是512字节,也就是一个sector扇区的大小,
示例:(红色字体即 fdisk命令中最大的end数 )
fdisk -u -l /dev/sdb

root@22-4-200537:~# fdisk -u -l /dev/sdb
Disk /dev/sdb: 47 GiB, 50465865728 bytes, 98566144 sectors
Disk model: BlockVolume
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 1048576 bytes
Disklabel type: gpt
Disk identifier: C955719C-61F9-47FC-AFBC-6B8424F213B9
Device      Start           End      Sectors    Size Type
/dev/sdb1 206848 98566110 98359263 46.9G Linux filesystem
/dev/sdb15 2048 204800 202753 99M EFI System

镜像的命令格式说明
执行:
dd bs=512 count=[fdisk命令中最大的end数+1] if=/dev/sda of=/root/ubuntu.img

使用 dd 和 gzip 生成压缩的镜像文件的执行命令:
dd bs=512 count=[fdisk命令中最大的end数+1] if=/dev/sda | gzip -6 > /root/ubuntu.img.gz

这样,就可以把需要的分区数据全部copy到ubuntu.img或ubuntu.img.gz文件中,
还原用LiveCD引导进入打开命令行,

备份系统盘镜像.img.gz到/root目录下面,压缩和不压缩的执行示例命令:
dd的count=参数98566120(只要比上面的加1就可以了,这里加了个10)

未压缩:
dd   bs=512  count=98566120 if=/dev/sdb  of/=/root/ubuntu.img.gz
压缩:
dd   bs=512  count=98566120 if=/dev/sdb | gzip -6 > /root/ubuntu.img.gz


gzip参数:
-c 表示输出到stdout
-d 表示解压缩
-1 表示最快压缩
-9 表示最好压缩
默认使用的是-6压缩级别。

注意:
不要直接在计算机上用本地磁盘启动系统后执行dd命令生成本地磁盘的镜像。而应该使用livecd启动计算机。
因计算机运行时会对系统盘产生大量写操作。 直接对运行中的系统盘生成的镜像,在恢复到其他硬盘上时,很可能会无法启动!

未压缩镜像格式还原硬盘:
dd if=/root/ubuntu.img.gz of=/dev/sda

压缩镜像还原格式还原硬盘:执行下列命令:
gzip -dc /root/ubuntu.img.gz | dd of=/dev/sdb


创建挂载目录把和sda挂载到LIVE系统下
mkdir /mnt/sda
mkdir /mnt/sdb

挂载成功
mount /dev/sdb1 /mnt/sdb
mount /dev/sda1 /mnt/sda

取消挂载
umount mnt/sdb

查看dd备份的进度
重新打开一个Shell,然后执行如下命令,即可输出一次进度信息
killall -s SIGUSR1 dd

重新打开一个Shell,然后执行如下命令,即可每3秒输出一次进度信息
watch -n 3 pkill -USR1 -x dd