linux 磁盘分区备份,关于GPT磁盘的分区表备份

发布于:2023-05-01 ⋅ 阅读:(479) ⋅ 点赞:(0)

hlhlinux 于 2012-10-05 00:27:28发表:

恩,很详细

okzokz123 于 2012-09-22 15:57:50发表:

6# iFuntoo

如你所说,可能我把纯MBR磁盘和GPT磁盘搞混淆了。下面用兄弟提供的方法用34个块来试验了一下。考虑到大容量磁盘的实际问题,改用KVM虚拟了块3TB的磁盘,用最后500M来做了试验。

第一阶段:用完整的34个块的备份和恢复,怎么来就怎么去的,第一阶段就是练习了dd,其实就没啥意义。[code]1. root@debian:/home/gg# parted /dev/sdb //先建立的分区,使用模拟 3TB 磁盘的最后500MB,应该可以排除保护MBR的作用了。

GNU Parted 2.3

Using /dev/sdb

Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) p

Model: ATA QEMU HARDDISK (scsi)

Disk /dev/sdb: 3221GB

Sector size (logical/physical): 512B/512B

Partition Table: gpt

Number Start End Size File system Name Flags

1 1049kB 525MB 524MB ext4 //这里考虑到对紧邻GPT分区表的分区内数据的影响后来多分了个区,所以后面有个sdb4就出现了

4 525MB 2500GB 2499GB

2 2500GB 3221GB 721GB

3 3221GB 3221GB 523MB ext4 //这是最后一个分区,超出了前2500G以外的500MB

(parted) q

在这里挂来挂去拷东西是为了第三阶段试验做准备。

2. root@debian:/home/gg# mount /dev/sdb3 /home/gg/gz //挂上去

root@debian:/home/gg# cp /usr/share/sounds/alsa/* /home/gg/gz/ //拷点东西

root@debian:/home/gg# umount /home/gg/gz //卸载掉

root@debian:/home/gg# mount /dev/sdb1 /home/gg/gz //挂上去

root@debian:/home/gg# cp /usr/share/sounds/alsa/* /home/gg/gz/ //也拷点东西

root@debian:/home/gg# umount /home/gg/gz //卸载掉

3. root@debian:/home/gg# dd if=/dev/sdb of=/home/gg/sdbfqb34.img bs=512 count=34 //备份34个块的分区表信息

记录了34+0 的读入

记录了34+0 的写出

17408字节(17 kB)已复制,0.00272314 秒,6.4 MB/秒

root@debian:/home/gg# dd if=/dev/sdb of=/home/gg/gpt33.img bs=512 count=33 skip=1 //备份除保护MBR以外的GPT分区表

记录了33+0 的读入

记录了33+0 的写出

16896字节(17 kB)已复制,0.0217134 秒,778 kB/秒

4. root@debian:/home/gg# dd if=/dev/urandom of=/dev/sdb bs=512 count=34 //清除分区表,34个块

记录了34+0 的读入

记录了34+0 的写出

17408字节(17 kB)已复制,0.0562062 秒,310 kB/秒

5. root@debian:/home/gg# parted /dev/sdb //看看,没认出来

GNU Parted 2.3

Using /dev/sdb

Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) p

Error: /dev/sdb: unrecognised disk label

(parted) q

6. root@debian:/home/gg# dd if=/home/gg/sdbfqb34.img of=/dev/sdb bs=512 count=34 //全部恢复34个块

记录了34+0 的读入

记录了34+0 的写出

17408字节(17 kB)已复制,0.0195889 秒,889 kB/秒

7.root@debian:/home/gg# parted /dev/sdb //看一下,都认出来了

GNU Parted 2.3

Using /dev/sdb

Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) p

Model: ATA QEMU HARDDISK (scsi)

Disk /dev/sdb: 3221GB

Sector size (logical/physical): 512B/512B

Partition Table: gpt

Number Start End Size File system Name Flags

1 1049kB 525MB 524MB ext4

4 525MB 2500GB 2499GB

2 2500GB 3221GB 721GB

3 3221GB 3221GB 523MB ext4

(parted) q

8. root@debian:/home/gg# mount /dev/sdb3 /home/gg/gz //挂上去验证一下,确实都回来了。

[/code]第一阶段完成。

第二阶段:这种情况有点像GPT分区表被破坏的样子了,尝试只还原GPT的33个块,不管保护MBR能不能用。[code]

1. root@debian:/home/gg# umount /home/gg/gz //卸载了

2. root@debian:/home/gg# dd if=/dev/urandom of=/dev/sdb bs=512 count=34 //删除分区表34个块,铁定是用不了了,就不看了,后面直接还原33个块

记录了34+0 的读入

记录了34+0 的写出

17408字节(17 kB)已复制,0.0556789 秒,313 kB/秒

3. root@debian:/home/gg# dd if=/home/gg/gpt33.img of=/dev/sdb bs=512 count=33 seek=1 //跳过保护MBR,只还原GPT分区表

记录了33+0 的读入

记录了33+0 的写出

16896字节(17 kB)已复制,0.0495798 秒,341 kB/秒

4.root@debian:/home/gg# parted /dev/sdb //开始没认出来,于是手动指定了GPT格式能看到已经回来了

GNU Parted 2.3

Using /dev/sdb

Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) p

Warning: /dev/sdb contains GPT signatures, indicating that it has a GPT table. However, it does not have a valid fake msdos

partition table, as it should. Perhaps it was corrupted -- possibly by a program that doesn't understand GPT partition tables.

Or perhaps you deleted the GPT table, and are now using an msdos partition table. Is this a GPT partition table?

Yes/No? yes

Error: The backup GPT table is corrupt, but the primary appears OK, so that will be used.

OK/Cancel? ok

Model: ATA QEMU HARDDISK (scsi)

Disk /dev/sdb: 3221GB

Sector size (logical/physical): 512B/512B

Partition Table: gpt

Number Start End Size File system Name Flags

1 1049kB 525MB 524MB ext4

4 525MB 2500GB 2499GB

2 2500GB 3221GB 721GB

3 3221GB 3221GB 523MB ext4

(parted) q

5. root@debian:/home/gg# mount /dev/sdb3 /home/gg/gz //想挂上去结果没识别,指定过了也不行,想想也许要重新识别一次磁盘

mount: special device /dev/sdb3 does not exist

root@debian:/home/gg# mount -t ext4 /dev/sdb3 /home/gg/gz

mount: special device /dev/sdb3 does not exist

6. root@debian:/home/gg# partprobe //刷一下,下面的提示大概是说可能是个GPT磁盘,但是没有保护MBR。因为还原的时候跳过了最前面一块

Warning: /dev/sdb contains GPT signatures, indicating that it has a GPT table. However, it does not have a valid fake msdos partition table, as it should. Perhaps it was corrupted -- possibly by a program that doesn't understand GPT partition tables. Or perhaps you deleted the GPT table, and are now using an msdos partition table. Is this a GPT partition table?

Error: The backup GPT table is corrupt, but the primary appears OK, so that will be used.

7. root@debian:/home/gg# mount /dev/sdb3 /home/gg/gz //挂上去,文件都是好的,能用

[/code]第二阶段完。

第三阶段,替换最前面一个分区的内容,看看用早先备份的34个块的信息恢复GPT分区表后会不会破坏紧靠GTP分区表的第一个分区里面的内容[code] root@debian:/home/gg# umount /home/gg/gz

root@debian:/home/gg# dd if=/home/gg/sdbfqb34.img of=/dev/sdb bs=512 count=34 //先用最早备份的34个块进行恢复

root@debian:/home/gg# mount /dev/sdb1 /home/gg/gz

root@debian:/home/gg# cp /usr/share/sounds/* /home/gg/gz/ //更新一些内容

root@debian:/home/gg# umount /home/gg/gz

root@debian:/home/gg# dd if=/dev/urandom of=/dev/sdb bs=512 count=34 //删除分区表

记录了34+0 的读入

记录了34+0 的写出

17408字节(17 kB)已复制,0.0562062 秒,310 kB/秒

root@debian:/home/gg# dd if=/home/gg/sdbfqb34.img of=/dev/sdb bs=512 count=34 //用最早的备份恢复

记录了34+0 的读入

记录了34+0 的写出

17408字节(17 kB)已复制,0.0206843 秒,842 kB/秒

root@debian:/home/gg# mount /dev/sdb1 /home/gg/gz //还都在,能正常用。

[/code]但是因为测试不可能都填满,所以是不是可靠待各位验证。其实整个试验就是在用那几个备份的块dd来dd去,也没啥技术含量,主要是要搞清楚对GPT分区的理解。希望大家共勉。

iFuntoo 于 2012-09-22 12:21:00发表:

不知兄台还有否更严谨的论证方法?我觉得目前的问题是,到底应该备份多少个扇区。

从Wiki看的话,LBA0,也就是第一个扇区是PMBR。LBA1,也就是第二扇区,是GPT头。LBA2-33也就是3-34扇区,才是分区表。

也就是说,包含PMBR在内的话,总共应该有34个扇区,这也就是为何我是用了count=33,而不是像你那样的count=32。我认为,如果跳过第一扇区的PMBR进行备份,采用count=32的话,你备份的分区表很可能是不完整的。

okzokz123 于 2012-09-22 11:33:59发表:

4# iFuntoo

MBR位于0柱面,0磁头,1扇区,所以我觉得还是应该从1扇区开始计算,而据能查到的资料看GPT的分区表位于2~33扇区,所以我破坏分区表是采用了33个块的计算(包含1扇区的MBR)。

另外也觉得应该不是GTP尾部的备份分区表起的作用,因为目前版本的 parted 没有自己恢复分区表的功能,是使用了 msdos 即MBR分区表来识别硬盘。

virtualbox的目前只能最大支持 2TB 的虚拟磁盘。我们做试验的数据其实都是在前 2TB 以内,所以即使GPT出问题了,而数据也可以由再生的 MBR 来识别到。

还有个问题是如果买到的是4K硬盘又该怎么办,目前好像4K硬盘还是512字节从固件模拟的,如果今后是默认4K一个块是不是简单计算,还是以块为标准。或者GPT本身定义又调整,那都是杞人忧天的事了。目前要解决的是现实的512字节的GPT分区表备份还原的问题。

iFuntoo 于 2012-09-21 21:46:01发表:

稍微研究了下,把我的全过程贴出来吧,和LZ一起探讨下。采用的是VirtualBox虚拟机+Ubuntu的LiveCD,不知道这样是否严谨。[code]root@ubuntu:~# parted /dev/sda

GNU Parted 2.3

使用 /dev/sda

欢迎使用 GNU Parted! 输入 'help'可获得命令列表.

(parted) p

Model: ATA VBOX HARDDISK (scsi)

磁盘 /dev/sda: 21.5GB

Sector size (logical/physical): 512B/512B

分区表:gpt

数字 开始: End 大小 文件系统 Name 标志

1 1049kB 21.5GB 21.5GB ext4

(parted) q

root@ubuntu:~# mount /dev/sda1 /mnt

root@ubuntu:~# cp -R /usr/share/sounds/* /mnt/

root@ubuntu:~# ls /mnt

alsa freedesktop gnome lost+found speech-dispatcher ubuntu[/code]到这里为止是把分区创建好了,顺便复制了点东西过去。当然,我是用gparted预先分好的,没用parted来分区。[code]root@ubuntu:~# umount /mnt

root@ubuntu:~# ls /mnt

root@ubuntu:~# dd if=/dev/sda of=/sda.img bs=512 skip=1 count=33

记录了33+0 的读入

记录了33+0 的写出

16896字节(17 kB)已复制,0.00303114 秒,5.6 MB/秒

root@ubuntu:~# dd if=/dev/zero of=/dev/sda bs=512 count=34

记录了34+0 的读入

记录了34+0 的写出

17408字节(17 kB)已复制,0.00230562 秒,7.6 MB/秒

root@ubuntu:~# parted /dev/sda

GNU Parted 2.3

使用 /dev/sda

欢迎使用 GNU Parted! 输入 'help'可获得命令列表.

(parted) p

错误: /dev/sda:未确认磁盘标签

(parted) q [/code]我跳过PMBR,把分区表头和表项一起进行了备份,然后再把LBA0-33全部抹掉,果然无法识别分区表了。[code]root@ubuntu:~# dd if=/sda.img of=/dev/sda bs=512 count=33 seek=1

记录了33+0 的读入

记录了33+0 的写出

16896字节(17 kB)已复制,0.00091962 秒,18.4 MB/秒

root@ubuntu:~# parted /dev/sda

GNU Parted 2.3

使用 /dev/sda

欢迎使用 GNU Parted! 输入 'help'可获得命令列表.

(parted) p

警告: /dev/sda 含有 GPT 签名,表明它含有 GPT 表。然而,它并不像应该的那样含有有效的伪 msdos 分区表。可能它已经损坏 -

可能是由不理解 GPT 分区表的程序导致的。或者您删除了 GPT 表,现在使用 msdos 分区表。这是 GPT 分区表吗?

是/Yes/否/No? yes

Model: ATA VBOX HARDDISK (scsi)

磁盘 /dev/sda: 21.5GB

Sector size (logical/physical): 512B/512B

分区表:gpt

数字 开始: End 大小 文件系统 Name 标志

1 1049kB 21.5GB 21.5GB ext4

(parted) q

root@ubuntu:~# mount /dev/sda1 /mnt

root@ubuntu:~# ls /mnt

alsa freedesktop gnome lost+found speech-dispatcher ubuntu[/code]在我把备份文件恢复回去以后,再用gparted查看,就又回来了。不过这里可能有疑惑,不知道这是我自己手动备份的LBA1-33起的作用,还是GPT尾巴上的备份分区表起的作用。这方面来看的话,我的论证还不严谨。

dfwclm 于 2012-09-21 16:31:23发表:

中标麒麟6属于linux的核心不

iFuntoo 于 2012-09-21 15:26:45发表:

我觉得有点问题,LBA0是PMBR,LBA1是分区表头,LBA2-33才是分区表项,这么看来,我们需要备份的应该就是LBA2-33的部分。也就是说,需要跳过的不光是PMBR,还有分区表头也需要。

当然,只是个人猜测,我会抽空按照你的步骤验证一下。

本文含有隐藏内容,请 开通VIP 后查看