1,查看磁盘挂载状态:df -h
2,开始备份磁盘分区,命令格式为:
dd if=“设备或文件名” of=“备份文件的路径”,下文示例的磁盘分区为/dev/sda1,挂载点为/boot,备份文件设定为/data2/boot.disk;
dd if=/dev/sda1 of=/tmp/boot.disk
备份出来的文件甚至可以用mount 挂载:mount -o loop /tmp/boot.disk /mnt
然后进入/boot 分区肆无忌惮的乱删一气……,重启机器,grub 找到vmlinuz 了……
如果是恢复和系统无关的分区,可以在工作模式下进行恢复,如果无法启动了,使用Linux启动盘进入救援模式:
切记,要选择挂载的硬盘为可读写。(如不想在救援模式挂载磁盘请看文尾的小top)
救援模式下,默认会将硬盘数据挂载到live CD 的/mnt/sysimage 目录。
这是当前的挂载点信息。
我们可以考虑chroot,也可以不做。
现在看看挂载信息。
恢复的时候用同样的命令格式,只是源和目标变了:dd if=/tmp/boot.disk of=/dev/sda1
严重警告!如果你的恢复路径指定错误,比如说指定到/dev/sda2或者/dev/sda,那一场救援就会变成一场新的灾难,其他磁盘分区的数据会被抹掉!!!
磁盘MBR/分区表的备份恢复。
首先了解下磁盘的结构,前512K 的内容是MBR+分区表。
然后再执行dd 命令做备份时备份的对象是/dev/sda,而非具体分区,另需要加上参数bs=512 count=1.
bs=BYTES force ibs=BYTES and obs=BYTES
count=BLOCKS copy only BLOCKS input blocks
dd if=/dev/sda of=/tmp/mbr.disk bs=512 count=1
备份完成后用fdisk 删掉/dev/sda1 分区,重启后服务器肯定起不来了。同样用救援模式从光盘引导系统,新引导的系统已经没有/dev/sda1 了。
可选的环节,chroot
再次检查磁盘挂载情况;
恢复的时候是同样的命令返回来用,如果是单独恢复分区表,请将后缀参数改成bs=512 skip=446 count=66;
dd if=/tmp/mbr.disk of=/dev/sda bs=512 count=1
重启服务器,就会加载新的分区表并正常启动计算机,被我通过fdisk 删除的/boot 分区又出现出现了。如果还有磁盘的损坏,请重启后继续进入救援模式继续修复。
生产应用中的小技巧
1,利用jobs 队列将dd 扔到后台执行;
如果我们早有打算,在执行dd 命令的结尾加上“&”就直接将dd 扔到了后台执行,但
很多情况是当前窗口开始dd 一段时间以后,我们突然想断开shell 了。这种情况重新dd 是
挺可惜的,可以用下面的方法来将运行中的dd 扔到后台执行:
A. 首先按ctrl+z,暂停dd 的执行,回到shell 里。
B. 执行jobs,看看被你暂停掉的dd 命令的job id 是多少。如果之前你没有ctrl+z 暂停
过其他任务,则其job id 为1。
C. 使用bg + %{job id} 可以让暂停的进程在后台执行,使用fg + %{job id} 可以让暂
停的进程在前台执行。下面的实验中我们肯定是用后台执行了,执行完成后再看下jobs,状态已经变成running 了。
请注意上图中的“1”是job id,dd 进程的运行状态是running 了。
2,如果在后台运行的dd,我们想看看它的执行进度该怎么看哪?其实dd 的help 里已经提到了这个功能了:
[root@caotest-1 ~]# dd --help
…………
Sending a USR1 signal to a running `dd' process makes it
print I/O statistics to standard error and then resume copying.
英文我们看不太懂,那就看看实际执行的方法和结果吧。
首先我们用ps 命令找到dd 的pid,然后将pid 写到这个命令里就可以了
命令是: kill -USR1 {dd-pid}。
从输出内容里我们可以看到,现在已经复制了多少数据,以用了多少时间,当前的
速度是多少。
3,救援模式默认会挂载磁盘内系统的根分区,而且无法强制卸载,这个时候需要在引导linux
的时候就加上一个参数,进入救援模式的命令变成:
linux rescue nomount
2017-11-18
Linux dd命令备份和恢复分区与磁盘、分区表、MBR等
评论
发表评论
姓 名: