Chinaunix

标题: 关于用dd备份或恢复分区表,有个问题? [打印本页]

作者: sfrost    时间: 2010-11-29 12:32
标题: 关于用dd备份或恢复分区表,有个问题?
看书上的用dd备份分区表,但是没写恢复,后来就用GOOGLE找了下,找到一个很多网站都有的例子:
首先使用fdisk -l 确定MBR位置。
备份MBR:
dd if=/dev/sda1 of=/root/mbr bs=512 count=1
恢复MBR:
dd if=/root/mbr of=/dev/sda1 bs=512 count=1
恢复分区表:
dd if=/root/mbr of=/dev/sda1 bs=512 skip=446 count=66
注:mbr大小512 所以bs=512 count=1
bs=512 skip=446 count=66 用来确定分区表在备份文件中的位置


其中有疑问的地方就是恢复分区表,按我的理解,前面在恢复MBR的时候,给的bs=512,很明显已经是磁盘主引导区的大小了(启动代码[446]+磁盘分区表[64]+结束标志[2]),也就是说MBR通过这样已经恢复了。

那下面的恢复分区表是什么意思呢?难道说作者不知道MBR是什么且包括什么?而且,基于bs=512的前提条件下,skip=446表示跳过输入文件开头的446个块,而备份的文件一共才count=1个块,它是怎么做到从备份的mbr文件中跳过446个块并且复制剩下的66个块的呢?

我最初对这条命令的疑问是:从输入文件跳过446个块开始复制,基于块大小为512的前提条件,复制66个,我就奇了怪了,你这样复制回去的时候,难道dd命令也会基于块大小为512的前提下在of文件中跳过446个块将你复制的66个覆盖进去?

所以到目前为止,我理解的恢复MBR,还是停留在自己想像的交换备份的if和of就行了!
作者: wlforyou1    时间: 2010-11-29 12:33
本帖最后由 wlforyou1 于 2010-11-29 12:40 编辑

沙发·~楼主要做备份?
哇,前辈06年注册的啊。差不多一年发一个帖子。。嘻嘻,我咋就这么喜欢讲话呢。认真学习linux……
作者: sfrost    时间: 2010-11-29 12:35
本帖最后由 sfrost 于 2010-11-29 12:36 编辑

回复 2# wlforyou1
感谢您对我贴子的快速回复,麻烦您看一下我贴子的内容,谢谢您的支持!

我也编辑一下回复您的第二个问题:当时注册这个论坛是因为学PHP,搜到一篇文章觉得这个论坛不错,所以注册了,结果发现主要不是PHP,饿,所以一直没咋上,到现在学LINUX,所以就到这儿来学习了。
作者: wlforyou1    时间: 2010-11-29 12:36
回复  wlforyou1
感谢您对我贴子的快速回复,麻烦您看一下我贴子的内容,谢谢您的支持!
sfrost 发表于 2010-11-29 12:35



    我不会哦。要是会的,我肯定写出来了。帮你顶。希望你能得到解决的方法。
作者: sfrost    时间: 2010-11-29 12:38
回复 4# wlforyou1
非常感谢,说话有些尖酸的地方还请理解。因为个人喜欢技术贴子里面只有讨论,而没有无意义的回复,所以冒犯的地方还请原谅哈!
作者: wlforyou1    时间: 2010-11-29 12:40
回复  wlforyou1
非常感谢,说话有些尖酸的地方还请理解。因为个人喜欢技术贴子里面只有讨论,而没有无意 ...
sfrost 发表于 2010-11-29 12:38



    没有没有,是我说话不好听。你请原谅,我下次不这样了。我向您道歉。
作者: taojie2000    时间: 2010-11-29 13:20
本帖最后由 taojie2000 于 2010-11-29 13:25 编辑

回复 1# sfrost


  dd 参数   skip=blocks   从输入文件开头跳过 blocks 个块后再开始复制    skip=80 count=8  跳过80个字节且复制8个字节

你是问这命令的原理?还是?

他下面是举个例子单独修复分区表的!  第2个命令已经恢复完整了!
作者: sfrost    时间: 2010-11-29 13:50
回复 7# taojie2000
哦。。。其实我错理解skip=446了,这儿的446单位是字节,是吧?
而且,bs=512有点类似于文件系统在对磁盘进行格式化时选择的block大小,是吧?

而备份分区表的时候,复制了512字节。在恢复的时候,要单独恢复mbr中的分区表,就跳过[skip=446]mbr中的引导部份,复制剩下的64+2字节,以此来恢复分区表信息,是吧?

那就剩最后一个问题了:单独恢复分区表信息,通过skip=446跳过输入文件的前446字节,然后开始复制64+2字节,复制的内容会放在of文件的哪个位置?
作者: sfrost    时间: 2010-11-29 15:01
你这个回答让我很无语,本来还想请教你关于skip单位的事。
唉,算了,我还是自己作测试吧!
作者: taojie2000    时间: 2010-11-29 15:04
回复 10# sfrost


   
作者: joe9i0    时间: 2010-11-29 16:21
count=BLOCKS
              copy only BLOCKS input blocks

ibs=BYTES
              read BYTES bytes at a time

seek=BLOCKS
              skip BLOCKS obs-sized blocks at start of output

skip=BLOCKS
              skip BLOCKS ibs-sized blocks at start of input
作者: L_kernel    时间: 2010-11-29 16:39
难道dd命令也会基于块大小为512的前提下在of文件中跳过446个块将你复制的66个覆盖进去

这个是肯定的。dd同时控制输入和输出。if和of
Input File
Output File
这也体现了Linux中的虚拟文件系统的强大之处。
作者: 转瞬繁华    时间: 2010-11-29 16:40
支持一下。。
作者: jerrywjl    时间: 2010-11-29 17:25
我不用dd来备份,我只这么干:

sfdisk -d /dev/sdx > partition_table

sfdisk /dev/sdx < partition_table
作者: sfrost    时间: 2010-11-29 17:46
这个是肯定的。dd同时控制输入和输出。if和of
Input File
Output File
这也体现了Linux中的虚拟文件系 ...
L_kernel 发表于 2010-11-29 16:39


非常感谢,我会去试试的。照这样说,这命令就TM太好用了,哈哈!
作者: nagaregawa    时间: 2010-11-29 18:21
而且,bs=512有点类似于文件系统在对磁盘进行格式化时选择的block大小,是吧?

这个跟磁盘的block没关系。
而备份分区表的时候,复制了512字节。在恢复的时候,要单独恢复mbr中的分区表,就跳过[skip=446]mbr中的引导部份,复制剩下的64+2字节,以此来恢复分区表信息,是吧?

其实这个命令是错的。
恢复分区表:
dd if=/root/mbr of=/dev/sda1 bs=512 skip=446 count=66

你回覆分区表的时候,单位是 512 字节,skip 了 446 个 512字节,你一共才dd了512个字节,明白为什么错了吧!
改成 bs=1 ,skip=446。
同时还得加上 seek=446,seek 的含义你man一下吧。
那就剩最后一个问题了:单独恢复分区表信息,通过skip=446跳过输入文件的前446字节,然后开始复制64+2字节,复制的内容会放在of文件的哪个位置?

这个问题你应该也知道了。

顺便提醒一下,这种方式只能备份主分区表。
作者: taojie2000    时间: 2010-11-29 19:15
本帖最后由 taojie2000 于 2010-11-29 19:16 编辑

回复 17# nagaregawa


    刚那还原出错的地方 seek  skip  同时要有吗?

    恢复时候直接  seek   不用再skip了吧?
作者: nagaregawa    时间: 2010-11-29 22:15
回复 18# taojie2000


    个人认为都要用!skip 和 seek 管的是不同的地方。
作者: sfrost    时间: 2010-11-30 10:30
回复 19# nagaregawa
你回覆分区表的时候,单位是 512 字节,skip 了 446 个 512字节,你一共才dd了512个字节,明白为什么错了吧!
改成 bs=1 ,skip=446。
同时还得加上 seek=446,seek 的含义你man一下吧。

就是这个意思了,哈哈,还好我又上来看了下。
还有啊,这个例子不是我的,是网上到处都搜得到的,我只是觉得有点问题,所以就上来问了,毕竟书上只说了备份,没说还原。不过目前按你这样说的,我基本上懂了,而且skip和seek肯定都要用,因为一个管if,一个管of的。

我昨天已经man了看了,而且我当时其实还有个疑问,那就是dd里面的bs,skip,seek的单位,都是字节吗?bs就不说了,因为man里面很清楚:bs=bytes,但是skip和seek却是blocks,而它的解释就是:skip blocks obs-sized blocks at start of output。抱歉,英语不会,只得再看obs和ibs,结果还是bytes,呵呵。

麻烦能否再帮忙解释一下这个单位方面的问题?是否dd的单位都是字节?而skip/ibs和seek/obs是否有某种意义上的关系?还是?
作者: sfrost    时间: 2010-11-30 10:45
回复 17# nagaregawa
顺便提醒一下,这种方式只能备份主分区表。

应该把if=/dev/sda1改为if=/dev/sda,也就是整个磁盘的分区表了,是吧?
作者: sfrost    时间: 2010-11-30 10:54
哇哈,我知道了,skip和seek跳过的块是基于bs的单位的。

如果bs=1,那么skip=512,那么就是每个块大小为1字节,skip跳过512个块,也就定位到513字节开始。
如果bs=512,那么skip=2,那么就是每个块大小为512字节,skip跳过2个块,也就是定位到1025字节开始。
作者: taojie2000    时间: 2010-11-30 11:06
回复 19# nagaregawa


    今天拿机器实验下 恢复某一部分 seek skip 是必须同时指定!     幸好版主指出错误之处!
作者: nagaregawa    时间: 2010-11-30 13:26
回复 21# sfrost

应该把if=/dev/sda1改为if=/dev/sda,也就是整个磁盘的分区表了,是吧?

    也不是。只有主分区表在第一个block里。
作者: nagaregawa    时间: 2010-11-30 13:26
麻烦能否再帮忙解释一下这个单位方面的问题?是否dd的单位都是字节?而skip/ibs和seek/obs是否有某种意义上的关系?还是?

dd的单位你可以用bs去指定。
作者: sfrost    时间: 2010-11-30 13:42
回复  sfrost
    也不是。只有主分区表在第一个block里。
nagaregawa 发表于 2010-11-30 13:26


晕,要备份的不就是主分区表吗?主分区表备份出来就行了啊,还要备份什么?
作者: nagaregawa    时间: 2010-11-30 16:35
回复 26# sfrost


    逻辑分区表!
作者: sfrost    时间: 2010-11-30 22:05
回复 27# nagaregawa
嘿嘿,那我就继续请教下去哈...

逻辑分区表怎么备份呢?不会是接着512字节后面的内容吧?而且不同的系统,逻辑分区的数量都不一样,怎么来确定和备份呢?
作者: nagaregawa    时间: 2010-11-30 22:30
回复 28# sfrost

逻辑分区表怎么备份呢?不会是接着512字节后面的内容吧?而且不同的系统,逻辑分区的数量都不一样,怎么来确定和备份呢?

    其实你把 fdisk -l 的结果备份了就 OK 了。
作者: sfrost    时间: 2010-11-30 23:04
回复 29# nagaregawa
原来如此...
作者: cst05001    时间: 2010-11-30 23:05
回复 1# sfrost


    dd备份分区表?悔死你!

MBR 446-512 bytes 只记录了主分区的信息,而扩展分区中的逻辑分区是链式存储,根本不在这里。

如果你没有逻辑分区还好,有逻辑分区就哭吧。

备份分区表,建议参考 sfdisk 命令。
作者: slippp    时间: 2010-12-01 14:45
楼主找到的命令是错的,误人子弟。
作者: redhatluotao    时间: 2010-12-02 11:59
前面446个自己是MBR信息,后面到512个字节是分区表的信息。  其实第一个命令恢复就够了。
作者: troyme    时间: 2010-12-04 13:49
dd if=/root/mbr of=/dev/sda1 bs=1 skip=446 count=66
作者: yjq635    时间: 2010-12-18 13:34
马克一下,
作者: a55569769    时间: 2010-12-18 21:46
楼主要明白 字节    kb 块

8字节=1Bytes  1024B=1Kb   一块一般都是1k 2k 或者4k
作者: taojie2000    时间: 2010-12-18 22:05
回复 36# a55569769


    1B(字节)= 8b(bit)

   1024bytes = 1KB

     你觉得呢
作者: seanking1987    时间: 2010-12-19 14:25
回复  taojie2000
哦。。。其实我错理解skip=446了,这儿的446单位是字节,是吧?
而且,bs=512有点类似 ...
sfrost 发表于 2010-11-29 13:50

我认为就是恢复到/dev/sda1的前446-512的位置啊
就是把原来磁盘的分区表和结束位置覆盖掉
作者: seanking1987    时间: 2010-12-19 23:40
本帖最后由 seanking1987 于 2010-12-19 23:54 编辑

又看了一遍,发现我错的很厉害啊,
自我总结一下:
应该用dd if=/root/mbr of=/dev/sda1 bs=512 skip=446 seek=446 count=66
而且只适用于主分区的,逻辑分区无法恢复
备份分区表用sfdisk
sfdisk -d /dev/sdx > partition_table

sfdisk /dev/sdx < partition_table
作者: jerrywjl    时间: 2010-12-21 00:08
唉,我说什么来着。。。。。。
作者: 流氓无产者    时间: 2010-12-30 09:13
这个例子应该是错的,正确说法应该是备份/恢复主分区表
作者: bo8362    时间: 2010-12-30 12:00
我先说啊 我是个菜鸟

这个用 dd  恢复mbr的时候不是就已经恢复分区表了吗,干嘛还跳来跳去的恢复分区表啊
作者: quaiy2004    时间: 2011-01-14 08:35
我也感到这样做有问题,在MBR恢复中,第一个block为512byte,已经将64byte的分区表恢复了。
我想作者的意思是想在不影响启动代码和结束符的前提下,单独恢复分区表吧。
dd if=/dev/sda of=/usr/mbr.bin bs=512 count=1 将整个MBR进行了备份。
如果用 dd if=/usr/mbr.bin of=/dev/sda bs=1 skip=446 count=66这样如何?
作者: saiforunix    时间: 2011-10-19 00:13
本帖最后由 saiforunix 于 2011-10-19 00:19 编辑

大小是bs*count
如百科上所说
确定硬盘的最佳块大小方式为
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
在此
我觉得正确应该为
dd if=/root/mbr of=/dev/sda1 bs=1 skip=446 count=66
看了一下前面的回复  看来我的理解没有错




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2