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.