[Bug 1303903] [NEW] sgdisk zap/clear doesn't wipe all GPT tables
Ryan Harper
1303903 at bugs.launchpad.net
Mon Apr 7 16:25:03 UTC 2014
Public bug reported:
1)
root at oil-maas-node-2:~# lsb_release -rd
Description: Ubuntu 12.04.4 LTS
Release: 12.04
2)
root at oil-maas-node-2:~# apt-cache policy gdisk
gdisk:
Installed: 0.8.1-1build1
Candidate: 0.8.1-1build1
Version table:
*** 0.8.1-1build1 0
500 http://archive.ubuntu.com/ubuntu/ precise/universe amd64 Packages
100 /var/lib/dpkg/status
3) sgdisk --zap-all --clear --mbrtogpt should remove all partitions and
GPT table signatures
4) partitions are removed, but the GPT table signature is still present
as detected by fdisk and pvcreate
5) Verbose details here:
I'm reusing real disks between ceph and cinder in openstack installs,
ceph creates GPT tables for large disks (>2TB); when we reinstall with
cinder, it uses pvcreate to make a large volume. pvcreate fails due to
a GPT signature remaining on the disk. The bug is in sgdisk which is
used in the ceph/cinder charms to clear the disk. While sgdisk does
clean out the GPT tables, it doesn't remove the GTP signatures, fdisk
and pvcreate detect this.
Using dd and some math to calculate where the GPT tables live, I can
manually clear them up to allow fdisk and pvcreate see a clean disk.
Here is the workflow:
# ceph install will run:
% ceph-disk-prepare /dev/vdb
Information: Moved requested sector from 34 to 2048 in
order to align on 2048-sector boundaries.
The operation has completed successfully.
Information: Moved requested sector from 2097153 to 2099200 in
order to align on 2048-sector boundaries.
The operation has completed successfully.
meta-data=/dev/vdb1 isize=2048 agcount=4, agsize=1245119 blks
= sectsz=512 attr=2, projid32bit=0
data = bsize=4096 blocks=4980475, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
The operation has completed successfully.
% parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
2 1049kB 1074MB 1073MB ceph journal
1 1075MB 21.5GB 20.4GB xfs ceph data
# here you can see fdisk detect the GTP table after a successful ceph-prepare-disk
% fdisk -l /dev/vdb
WARNING: GPT (GUID Partition Table) detected on '/dev/vdb'! The util
fdisk doesn't support GPT. Use GNU Parted.
Disk /dev/vdb: 21.5 GB, 21474836480 bytes
256 heads, 63 sectors/track, 2600 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/vdb1 1 41943039 20971519+ ee GPT
# let's use the sgdisk command in the ceph/cinder charm to wipe out the disk
% cat zapdisk.sh
#!/bin/bash -x
sgdisk --zap-all --clear --mbrtogpt $1
% bash -x zapdisk.sh /dev/vdb
+ sgdisk --zap-all --clear --mbrtogpt /dev/vdb
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
The operation has completed successfully.
# parted shows that it's call clear
% parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
# But fdisk still sees the GPT signature.
% fdisk -l /dev/vdb
WARNING: GPT (GUID Partition Table) detected on '/dev/vdb'! The util fdisk doesn't support GPT. Use GNU Parted.
Disk /dev/vdb: 21.5 GB, 21474836480 bytes
256 heads, 63 sectors/track, 2600 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/vdb1 1 41943039 20971519+ ee GPT
# now let's try to create a PV with the same disk; this is what cinder charm would do to initialize storage.
# note the 'Partition table signature found'
% pvcreate -d -vvv /dev/vdb
Processing: pvcreate -d -vvv /dev/vdb
O_DIRECT will be used
Setting global/locking_type to 1
Setting global/wait_for_locks to 1
File-based locking selected.
Setting global/locking_dir to /var/lock/lvm
metadata/pvmetadatasize not found in config: defaulting to 255
metadata/pvmetadatacopies not found in config: defaulting to 1
Locking /var/lock/lvm/P_orphans WB
_do_flock /var/lock/lvm/P_orphans:aux WB
_do_flock /var/lock/lvm/P_orphans WB
_undo_flock /var/lock/lvm/P_orphans:aux
Opened /dev/vdb RO
/dev/vdb: size is 41943040 sectors
/dev/vdb: block size is 4096 bytes
/dev/vdb: Skipping: Partition table signature found
Closed /dev/vdb
/dev/vdb: Skipping (cached)
Matcher built with 3 dfa states
Setting devices/ignore_suspended_devices to 0
Setting devices/cache_dir to /etc/lvm/cache
Setting devices/write_cache_state to 1
Opened /dev/vdb RO
/dev/vdb: size is 41943040 sectors
/dev/vdb: block size is 4096 bytes
/dev/vdb: Skipping: Partition table signature found
Closed /dev/vdb
Device /dev/vdb not found (or ignored by filtering).
Unlocking /var/lock/lvm/P_orphans
_undo_flock /var/lock/lvm/P_orphans
# Here is a script that will properly wipe the GPT tables and signatures
% cat ddwipe.sh
#!/bin/bash
DEV="${1}"
END="$(sudo blockdev --getsz ${DEV})"
GPT_END=$(($END - 100))
dd if=/dev/zero of=${DEV} bs=1M count=1
dd if=/dev/zero of=${DEV} bs=512 seek=${GPT_END}
% bash -x ddwipe.sh /dev/vdb
+ DEV=/dev/vdb
++ sudo blockdev --getsz /dev/vdb
+ END=41943040
+ GPT_END=41942940
+ dd if=/dev/zero of=/dev/vdb bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00194759 s, 538 MB/s
+ dd if=/dev/zero of=/dev/vdb bs=512 seek=41942940
dd: writing `/dev/vdb': No space left on device
101+0 records in
100+0 records out
51200 bytes (51 kB) copied, 0.00659633 s, 7.8 MB/s
# confirm the wipe in parted...
% parted /dev/vdb print
Error: /dev/vdb: unrecognised disk label
# fdisk doesn't print the GPT warning any more
% fdisk -l /dev/vdb
Disk /dev/vdb doesn't contain a valid partition table
Disk /dev/vdb: 21.5 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
# and pvcreate now works correctly.
% pvcreate -d -vvv /dev/vdb
Processing: pvcreate -d -vvv /dev/vdb
O_DIRECT will be used
Setting global/locking_type to 1
Setting global/wait_for_locks to 1
File-based locking selected.
Setting global/locking_dir to /var/lock/lvm
metadata/pvmetadatasize not found in config: defaulting to 255
metadata/pvmetadatacopies not found in config: defaulting to 1
Locking /var/lock/lvm/P_orphans WB
_do_flock /var/lock/lvm/P_orphans:aux WB
_do_flock /var/lock/lvm/P_orphans WB
_undo_flock /var/lock/lvm/P_orphans:aux
Opened /dev/vdb RO
/dev/vdb: size is 41943040 sectors
/dev/vdb: block size is 4096 bytes
Closed /dev/vdb
/dev/vdb: size is 41943040 sectors
Opened /dev/vdb RO O_DIRECT
/dev/vdb: block size is 4096 bytes
Closed /dev/vdb
Using /dev/vdb
Opened /dev/vdb RO O_DIRECT
/dev/vdb: block size is 4096 bytes
/dev/vdb: No label detected
Closed /dev/vdb
Opened /dev/vdb RW O_EXCL O_DIRECT
Closed /dev/vdb
/dev/vdb: size is 41943040 sectors
Opened /dev/vdb RO O_DIRECT
/dev/vdb: block size is 4096 bytes
Closed /dev/vdb
/dev/vdb: size is 41943040 sectors
Opened /dev/vdb RW O_DIRECT
/dev/vdb: block size is 4096 bytes
Closed /dev/vdb
/dev/vdb: size is 41943040 sectors
Setting devices/data_alignment to 0
Device /dev/vdb queue/minimum_io_size is 512 bytes.
Device /dev/vdb queue/optimal_io_size is 0 bytes.
/dev/vdb: Setting PE alignment to 128 sectors.
Device /dev/vdb alignment_offset is 0 bytes.
/dev/vdb: Setting PE alignment offset to 0 sectors.
Opened /dev/vdb RW O_DIRECT
Wiping /dev/vdb at 4096 length 1
/dev/vdb: block size is 4096 bytes
Closed /dev/vdb
Set up physical volume for "/dev/vdb" with 41943040 available sectors
Scanning for labels to wipe from /dev/vdb
Opened /dev/vdb RW O_DIRECT
/dev/vdb: block size is 4096 bytes
Closed /dev/vdb
Zeroing start of device /dev/vdb
Opened /dev/vdb RW O_DIRECT
Wiping /dev/vdb at sector 0 length 4 sectors
/dev/vdb: block size is 4096 bytes
Closed /dev/vdb
Writing physical volume data to disk "/dev/vdb"
lvmcache: /dev/vdb: now in VG #orphans_lvm2 (#orphans_lvm2)
Creating metadata area on /dev/vdb at sector 8 size 376 sectors
/dev/vdb: setting pe_start=384 (orig_pe_start=384, pe_align=128, pe_align_offset=0, adjustment=0)
Opened /dev/vdb RW O_DIRECT
/dev/vdb: block size is 4096 bytes
/dev/vdb: Preparing PV label header Crb9aw-5dC5-c2OG-GUbO-8Fdv-Tp0S-HaeUSB size 21474836480 with da1 (384s, 0s) mda1 (8s, 376s)
/dev/vdb: Writing label to sector 1 with stored offset 32.
Unlocking /var/lock/lvm/P_orphans
_undo_flock /var/lock/lvm/P_orphans
Closed /dev/vdb
Physical volume "/dev/vdb" successfully created
ProblemType: Bug
DistroRelease: Ubuntu 12.04
Package: gdisk 0.8.1-1build1
ProcVersionSignature: Ubuntu 3.2.0-54.82-generic 3.2.50
Uname: Linux 3.2.0-54-generic x86_64
ApportVersion: 2.0.1-0ubuntu17.6
Architecture: amd64
Date: Mon Apr 7 16:14:51 2014
Ec2AMI: ami-0000002d
Ec2AMIManifest: FIXME
Ec2AvailabilityZone: serverstack-az-1
Ec2InstanceType: m1.medium
Ec2Kernel: aki-00000002
Ec2Ramdisk: ari-00000002
MarkForUpload: True
ProcEnviron:
TERM=xterm
PATH=(custom, no user)
LANG=en_US.UTF-8
SHELL=/bin/bash
SourcePackage: gdisk
UpgradeStatus: No upgrade log present (probably fresh install)
** Affects: gdisk (Ubuntu)
Importance: Undecided
Status: New
** Tags: amd64 apport-bug ec2-images precise
--
You received this bug notification because you are a member of Ubuntu
Server Team, which is subscribed to gdisk in Ubuntu.
https://bugs.launchpad.net/bugs/1303903
Title:
sgdisk zap/clear doesn't wipe all GPT tables
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/gdisk/+bug/1303903/+subscriptions
More information about the Ubuntu-server-bugs
mailing list