如何使用脚本从命令行重置硬盘(删除 Mbr 和删除分区)而无需重新启动?

c33*_*33s 12 linux partition debian fdisk parted

要从干净状态开始,我需要从命令行将硬盘重置为空状态。

这与运行擦除实用程序无关,不必覆盖数据。

这个问题与Deleting All Partitions From the Command Line非常相似

那里的解决方案效果很好,

dd if=/dev/zero of=/dev/sda bs=512 count=1 conv=notrunc
Run Code Online (Sandbox Code Playgroud)

但是如果我想使用这样一个被覆盖的磁盘,我会收到设备仍在使用中的错误。

root@grml ~ # blockdev --rereadpt /dev/sda
BLKRRPART: Device or resource busy
Run Code Online (Sandbox Code Playgroud)

或者

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.
Run Code Online (Sandbox Code Playgroud)

所以我必须手动禁用“位于”设备上的所有内容

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
Run Code Online (Sandbox Code Playgroud)

之后该partprobe命令有效。

有没有更简单的命令?喜欢

harddiskreset /dev/sda
Run Code Online (Sandbox Code Playgroud)

所以它可以轻松地用于具有不同分区/lvm/md 布局的系统?

use*_*437 9

wipefs程序可让您轻松删除分区表签名:

wipefs -a /dev/sda
Run Code Online (Sandbox Code Playgroud)

不过,您仍然必须停止使用该设备的任何进程,例如 LVM。

man wipefs

wipefs 可以从指定的设备上擦除文件系统、raid 或分区表签名(魔术字符串),以使 libblkid 的签名不可见。

wipefs 不会擦除文件系统本身或设备中的任何其他数据。在不带任何选项的情况下使用时,wipefs 会列出所有可见的文件系统及其基本签名的偏移量。

当擦除分区表签名时,wipefs 会调用 BLKRRPART ioctl 以通知内核有关更改的信息。


Kro*_*907 5

我一直只是简单地使用parted来实现这一点。它非常适合更改磁盘标签类型和添加/删除分区,特别是因为它可以处理与 fdisk 不同的现代大型 HDD。

你可以运行

$ sudo parted /dev/sda
Run Code Online (Sandbox Code Playgroud)

这将使事情开始并让您进入分离的终端。然后您可以运行 help 命令来显示所有可用的命令。这是非常不言自明的。

我要提到的是,您确实必须卸载要格式化的磁盘的所有分区。如果您只是在寻找一种更快的方法来卸载所有分区,我想您可以在 umount 命令中使用正则表达式来完成,但这看起来很愚蠢。

使用parted 来管理HDD 我从来不需要强制刷新磁盘或类似的事情。

要完全刷新驱动器以供全新使用,我通常执行以下操作:

1)通过运行开始分离sudo parted /dev/sda

2)通过运行查找任何现有分区print

3) 通过运行rm 1将 1 替换为要删除的分区号来删除现有分区。然后对磁盘上的所有剩余分区重复此操作。

4) 通过运行重置磁盘标签mklabel gpt我使用 gpt 标签类型,但您可以使用标准 msdos 或任何您的偏好。这是磁盘标签类型的列表

5) 通过运行创建新分区mkpart这将​​运行创建分区向导。起点和终点默认为扇区。您可以通过unit在运行之前运行命令来更改此设置mkpart,这样您就可以以 GB、TB 或 MB 等单位指定它。

print6) 使用查看新分区表信息来检查结果

7)然后您需要格式化分区。尽管有一些选项可用,但不应通过 parted 来完成此操作。我建议改为运行quit退出分开的终端,然后使用mkfs格式化分区。请记住在 /dev/sda1 而不是 /dev/sda 上运行“mkfs”,因为您正在格式化分区而不是整个磁盘。

就是这样。

我希望这回答了你的问题。

另外,这里有在线p​​arted手册供参考:https://www.gnu.org/software/parted/manual/html_node/index.html

编辑:

OP 希望通过脚本而不是终端来完成此类操作。您可以通过脚本执行相同类型的过程,方法是通过单行命令运行parted,而不是在parted 终端中运行。

例如命令

$ sudo parted /dev/sda print
Run Code Online (Sandbox Code Playgroud)

将把驱动器信息和分区表打印到 bash 控制台上,然后可以使用 grep 等操作它来创建变量或在 bash 脚本中创建您想要的任何内容。