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

75,404

Solution 1

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.

Solution 2

Use improved non-interactive version of fdisk, which is sfdisk

To erase partition table use this command:

sfdisk --delete /dev/sda

Solution 3

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.

Share:
75,404

Related videos on Youtube

c33s
Author by

c33s

/dev/null

Updated on September 18, 2022

Comments

  • c33s
    c33s over 1 year

    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?

    • Michael Hampton
      Michael Hampton over 8 years
      Besides rebooting, which is what it advised you to do? What is the context here?
    • c33s
      c33s over 8 years
      i am not sure if i understand your questions. i want to bootstrap a debian system with a bash script which is using setup-storage. to ensure the script always works, the harddisk in the target system should be emptied/reset before. is that the context you asked for? then i would extend my question. it has not seemed relevant to me, because i am just looking for a command which is able to delete mbr & partitions from the harddisk...
    • Michael Hampton
      Michael Hampton over 8 years
      You should wipe the MBR before you set up the partitions. It appears that here, you are doing so after you set them up!
    • SDsolar
      SDsolar almost 7 years
      Ah ha! I got it. To make it work (from a LiveCD) I first had to do this: sudo wipefs -a /dev/sdb -- fdisk -l showed no partition tables on /dev/sdb -- then -- sudo dd if=/dev/sda of=/dev/sdb worked to make a bootable copy of the primary drive.
  • c33s
    c33s over 8 years
    i need it automated from a script not manualy from the terminal
  • KroniK907
    KroniK907 over 8 years
    Wait your original post doesn't mention a script. What part of this are you scripting? I think you can run parted commands without going into the parted terminal. I'm not sure about that though.
  • KroniK907
    KroniK907 over 8 years
    Just to confirm, you can run parted from single line commands. For example parted /dev/sda print will print out the partition table for /dev/sda. You can do the same thing I describe above just with single line commands if you need to do it within a bash script.
  • c33s
    c33s over 8 years
    but i have to know what the name of the device will be to use the command parted /dev/sda also i have to know how many partitions are on the drive to call rm 1, i am looking for a command to simply clean the disk, so i can repartition it, without doing all the manual stuff of shutting down md's removing lv's and so on.
  • KroniK907
    KroniK907 over 8 years
    1) you still have to know what the name of the device will be for running a dd command... not sure what you are getting at there. Just grep through df if the drive is mounted. How do you plan on creating a "script" if you cant get the location of the drive? 2) its easy enough to run parted $drive print and grep the results to find all the available partition numbers and then store them in an array. Then use those values to run parted $drive rm $partition. All of this stuff is pretty simple bash scripting.
  • c33s
    c33s over 8 years
    thanks for your answer, but i am aware of the scripting way, i am looking for a simpler method. wondering why such a tool is missing.
  • Ale
    Ale about 7 years
    @c33s I think that this tool is missing for two main reasons: (a) doing that in a sufficiently universal (and safe) way might be very hard as it would have to take into account all possible situations (mounted partitions, LVM, RAID, etc.), and (b) This is not an operation that's so common... -- By the way, what would such a tool do if the disk is a RAID member? Degrade the array (or destroy if it is RAID0)?
  • SDsolar
    SDsolar almost 7 years
    This removes partitions just fine but does not remove the partitions table. wipefs -a /dev/sdb is required to do that properly before copying from the main disk with dd if=/dev/sda of=/dev/sdb
  • Admin
    Admin almost 2 years
    This is for me. Don't waste my time with unnecessary interactive, non-copy-pasteabble instructions!
  • Admin
    Admin almost 2 years
    Just in case it helps: The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).