您的位置:首页 > 运维架构 > Linux

[转]Linux dd命令备份和恢复分区与磁盘、分区表、MBR等

2013-01-08 22:53 302 查看
Page from: http://blog.sina.com.cn/s/blog_70b8886401011q5j.html
1,查看磁盘挂载状态:df
-h

2,开始备份磁盘分区,命令格式为:

dd if=“设备或文件名” of=“备份文件的路径”,下文示例的磁盘分区为/dev/sda1,挂载点为/boot,备份文件设定为/data2/boot.disk;

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: