How to reset a Harddisk (delete Mbr & delete Partitions) from the Command Line with a script without rebooting?

To start from a clean state I need to reset the hard disk to an empty state from command line.

It is not about running a wipe utility, the data don't have to be overwritten.

This question is quite similar to Deleting All Partitions From the Command Line

The solution there works quite well,

dd if=/dev/zero of=/dev/sda bs=512 count=1 conv=notrunc

but if I want to work with such an overwritten disk, I get the error that the device is still in use.

root@grml ~ # blockdev --rereadpt /dev/sda
BLKRRPART: Device or resource busy

or

root@grml ~ # partprobe
Error: Partition(s) 2, 3 on /dev/sda have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use.  As a result, the old partition(s) will remain in use.  You should reboot now before making further changes.
Error: Partition(s) 2, 3 on /dev/sdb have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use.  As a result, the old partition(s) will remain in use.  You should reboot now before making further changes.

So I have to manually disable everything which "sits" on the device

umount /mnt/debootstrap
umount /mnt/debootstrap/tmp
umount /mnt/debootstrap/var/log
umount /mnt/debootstrap/var
umount /mnt/debootstrap/home
service mdadm stop
service lvm2 stop
vgremove vg_main
pvremove /dev/md1
mdadm --stop /dev/md0
mdadm --stop /dev/md1
mdadm --remove /dev/md0
mdadm --remove /dev/md1

after that the partprobe command works.

is there some command which works simpler? like

harddiskreset /dev/sda

so it can easily be used on systems with different partition/lvm/md layout?


The wipefs program lets you easily delete the partition-table signature:

wipefs -a /dev/sda

You still have to stop any process using the device though, such as LVM.

From man wipefs

wipefs can erase filesystem, raid or partition-table signatures (magic strings) from the specified device to make the signatures invisible for libblkid.

wipefs does not erase the filesystem itself nor any other data from the device. When used without any options, wipefs lists all visible filesystems and the offsets of their basic signatures.

wipefs calls the BLKRRPART ioctl when it has erased a partition-table signature to inform the kernel about the change.


I have always simply used parted for this. It works well for changing the disklabel type and adding/removing partitions, especially since it can handle modern large HDDs unlike fdisk.

You can run

$ sudo parted /dev/sda

This will get things started and get you into the parted terminal. You can then run the help command to show all the available commands. Its very self explanatory.

I will mention that yes you do have to have all partitions of the disk you want to format unmounted. If you were simply looking for a quicker way to unmount all the partitions, I guess you could do it with a regex in the umount command but that seems silly.

Using parted to manage the HDD I have never had to force a refresh of the disk or anything similar.

To completely refresh a drive for brand new use, I usually do the following:

1) start parted by running sudo parted /dev/sda

2) find any existing partitions by running print

3) remove existing partitions by running rm 1 replacing 1 with the partition number you want to remove. Then repeat for all remaining partitions on the disk.

4) reset the disklabel by running mklabel gpt I use the gpt label type but you could use the standard msdos or whatever your preference is. Here is a list of disklabel types

5) Create new partitions by running mkpart This will run you through the create partition wizard. The start and end points are defaulted to sectors. You can change this by running the unit command before you run mkpart This way you can specify it in GB or TB or MB etc.

6) check your results using print to view your new partition table info

7) You then need to format the partitions. This shouldn't be done through parted although some options for this are available. I would suggest instead running quit to exit the parted terminal and then using mkfs to format the partitions. Remember to run 'mkfs' on /dev/sda1 instead of /dev/sda because you are formatting the partition and not the disk as a whole.

That's about it.

I hope this answers your question.

Also, here is the online parted manual for reference: https://www.gnu.org/software/parted/manual/html_node/index.html

EDIT:

The OP wanted to do this sort of thing from a script and not from a terminal. You can do the same sort of procedure via a script by running parted via single line commands instead of within the parted terminal.

For example the command

$ sudo parted /dev/sda print

Will print out the drive information and partition table onto the bash console which can then be manipulated using grep etc to create variables or whatever you want in a bash script.