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

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

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

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

这个问题与从命令行删除所有分区

那里的解决方案非常有效,

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

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

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

或者

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.

所以我必须手动禁用设备上的所有东西

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

此后partprobe命令有效。

有没有更简单的命令?比如

harddiskreset /dev/sda

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

答案1

wipefs(Debian/Ubuntu 软件包:util-linux)程序可让您轻松删除分区表签名:

wipefs -a /dev/sda

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

man wipefs

wipefs 可以从指定设备中删除文件系统、raid 或分区表签名(魔术字符串),以使 libblkid 看不到这些签名。

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

当 wipefs 删除分区表签名时,它会调用 BLKRRPART ioctl 来通知内核有关更改。

答案2

我一直只使用 parted 来完成此操作。它可以很好地更改磁盘标签类型和添加/删除分区,尤其是因为它可以处理现代大型硬盘(与 fdisk 不同)。

你可以运行

$ sudo parted /dev/sda

这将启动并进入 parted 终端。然后您可以运行 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退出 parted 终端,然后使用mkfs格式化分区。请记住在 /dev/sda1 而不是 /dev/sda 上运行“mkfs”,因为您要格式化分区而不是整个磁盘。

就是这样。

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

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

编辑:

OP 想要通过脚本而不是终端来执行此类操作。您可以通过脚本通过单行命令运行 parted 来执行相同类型的过程,而不是在 parted 终端内运行。

例如命令

$ sudo parted /dev/sda print

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

答案3

使用改进的非交互式 fdisk 版本,它磁盘管理

要擦除分区表,请使用以下命令:

sfdisk --delete /dev/sda

答案4

一个非常延迟的答案,希望能帮助别人:

我一直在使用以下脚本擦除整个磁盘,并重新创建一个利用率为 100% 的单个分区,如下所示:

#!/bin/bash

DEVICE=$1
TARGET=$2

sudo dd if=/dev/zero of=${DEVICE} bs=1M count=10
sudo partprobe -s "${DEVICE}"
echo -e 'mktable gpt\nmkpart primary xfs 0% 100%\nquit' | sudo parted "${DEVICE}"
sudo partprobe -s "${DEVICE}"
sudo mkfs.xfs "${DEVICE}"1
sudo partprobe -s "${DEVICE}"
sleep 3
echo $(sudo lsblk -o UUID "${DEVICE}"1 |fmt -w 2000 |tr ' ' =) "${TARGET}" xfs defaults 0 0 | sudo tee -a /etc/fstab

笔记:

  • dd在磁盘的前 10M 上使用来擦除 GPT
  • 使用创建一个新的 GPT 和一个从 开始到 结束的parted单个主分区,使用将命令导入 parted。0%100%echo -e
  • 制作并XFS分区
  • 将其添加到/etc/fstab
  • 还要求sudo systemctl daemon-reload使用最近的系统systemd-mountd
  • partprobe穿插在更新内核的命令中
  • 在格式化和使用新的 UUID 信息之间添加了一个小的延迟,以便让更改渗透到内核接口(如果没有,则可能会出现损坏的条目/etc/fstab
  • 参数化以使用设备和新的挂载点。
  • 警告: 请勿在启动盘上使用,这些信息都会被清除,不会有任何疑问。

相关内容