[RFC][patch] GPT recovering support

Andrey V. Elsukov bu7cher at yandex.ru
Tue Oct 19 18:15:42 UTC 2010


On 15.10.2010 20:15, Marcel Moolenaar wrote:
> It's better to implement a force option to destroy that forces
> a scheme to be destroyed in a way that prevents undo. This
> allows you to (effectively) wipe sectors and start over. This
> is exactly what you want if you're stuck with a detected scheme
> that is corrupt to the point that you can't do anything with

I rewrite forced destroying. Now it does all work in kernel.
http://people.freebsd.org/~ae/gpart_recover_20101019.diff

> It would be good if you can list the corruption cases that are
> being handled and how you recover. While we need to be friendly
> to the GEOM flexibility, we do need to respect the GPT spec
> to the extend that we remain compatible.

1. Wiped first several sectors.
//------------------------------------------------------------
# truncate -s 100m disk
# mdconfig -f disk
md0
# gpart create -s gpt md0
md0 created
# gpart add -t freebsd md0
md0s1 added
# gpart show md0
=>    34  204733  md0  GPT  (100M)
      34  204733    1  freebsd  (100M)

# dd if=/dev/zero of=/dev/md0 bs=512 count=10
10+0 records in
10+0 records out
5120 bytes transferred in 0.169473 secs (30211 bytes/sec)
# gpart show md0
gpart: No such geom: md0.

// First of we should rewrite PMBR.
# dd if=/boot/pmbr of=/dev/md0
1+0 records in
1+0 records out
512 bytes transferred in 0.046906 secs (10915 bytes/sec)
GEOM: md0: the primary GPT table is corrupt or invalid.
GEOM: md0: using the secondary instead -- recovery strongly advised.
# gpart show md0
=>    34  204733  md0  GPT  (100M) [CORRUPT]
      34  204733    1  freebsd  (100M)

# gpart status md0
 Name   Status  Components
md0s1  CORRUPT  md0

// Now we can recover it
# gpart recover md0
md0 recovered
# gpart show md0
=>    34  204733  md0  GPT  (100M)
      34  204733    1  freebsd  (100M)

//------------------------------------------------------------

2. Wiped last several sectors.
//------------------------------------------------------------
# gpart list md0 | grep last
last: 204766
# dd if=/dev/zero of=/dev/md0 bs=512 oseek=204767
dd: /dev/md0: end of device
34+0 records in
33+0 records out
16896 bytes transferred in 0.345195 secs (48946 bytes/sec)
GEOM: md0: the secondary GPT table is corrupt or invalid.
GEOM: md0: using the primary only -- recovery suggested.

# gpart show md0
=>    34  204733  md0  GPT  (100M) [CORRUPT]
      34  204733    1  freebsd  (100M)

// We can recover this GPT again, also we can destroy it.
// But we can not modify it.
# gpart delete -i 1 md0
gpart: table 'md0' is corrupt: Operation not permitted
# gpart modify -i 1 -l TEST -f x md0
gpart: table 'md0' is corrupt: Operation not permitted
# gpart destroy md0
gpart: Device busy
# gpart destroy -F md0
md0 destroyed
# gpart show md0
gpart: No such geom: md0.
//------------------------------------------------------------

3. Changed mediasize.
//------------------------------------------------------------
# gpart create -s gpt md0
md0 created
# gpart add -t freebsd md0
md0s1 added
# gpart show md0
=>    34  204733  md0  GPT  (100M)
      34  204733    1  freebsd  (100M)

# mdconfig -du 0
# truncate -s +10m disk
# mdconfig -f disk
md0
GEOM: md0: the secondary GPT header is not in the last LBA.
# gpart show md0
=>    34  204733  md0  GPT  (110M) [CORRUPT]
      34  204733    1  freebsd  (100M)

// Secondary GPT header must be in the last LBA.
// When it is not here you can lost GPT if primary copy will
// become corrupt. Also you may want to extend your table to
// all mediasize.
# gpart list md0 | grep last
last: 204766
# gpart recover md0
md0 recovered
# gpart list md0 | grep last
last: 225246
# gpart show md0
=>    34  225213  md0  GPT  (110M)
      34  204733    1  freebsd  (100M)
  204767   20480       - free -  (10M)

//------------------------------------------------------------

4. As the side effect now some of tasted copies of the same table
will be read-only.

//------------------------------------------------------------
# gpart destroy -F md0
md0 destroyed
# glabel label -v TEST md0
Metadata value stored on md0.
Done.
# gpart create -s gpt label/TEST
label/TEST created
# gpart show
=>    34  225212  label/TEST  GPT  (110M)
      34  225212              - free -  (110M)

=>    34  225212  md0  GPT  (110M) [CORRUPT]
      34  225212       - free -  (110M)

# gpart add -t freebsd-ufs md0
gpart: table 'md0' is corrupt: Operation not permitted
# gpart add -t freebsd-ufs label/TEST
label/TESTp1 added
# gpart show
=>    34  225212  label/TEST  GPT  (110M)
      34  225212           1  freebsd-ufs  (110M)

//------------------------------------------------------------

Any comments?

-- 
WBR, Andrey V. Elsukov

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
Url : http://lists.freebsd.org/pipermail/freebsd-geom/attachments/20101019/5bc428bc/signature.pgp


More information about the freebsd-geom mailing list