如何在不重新启动的情况下使用脚本从命令行重置硬盘(删除Mbr并删除分区)?


8

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

这与运行擦除工具无关,数据不必被覆盖。

这个问题与从命令行删除所有分区非常相似

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

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
除了重启之外,它还建议您做什么?这里的背景是什么?
Michael Hampton

我不确定我是否理解您的问题。我想使用bash脚本来引导Debian系统,该脚本正在使用setup-storage。为确保脚本始终有效,应先清空/重置目标系统中的硬盘。是您要求的上下文吗?那么我会扩展我的问题。它似乎与我无关,因为我只是在寻找一个能够从硬盘删除mbr和分区的命令...
c33s

设置分区之前,应先擦除MBR 。似乎在这里,设置好之后就可以了!
Michael Hampton

啊哈!我知道了。为了使其能够工作(从LiveCD),我首先必须这样做:sudo wetfs -a / dev / sdb-fdisk -l在/ dev / sdb上没有分区表-然后-sudo dd if = / dev / sda of = / dev / sdb用于制作主驱动器的可引导副本。
SDsolar

Answers:


5

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

wipefs -a /dev/sda

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

man wipefs

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

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

当擦除分区表签名以将更改通知内核时,wipefs调用BLKRRPART ioctl。


2

我一直只是简单地为此分开。它可以很好地用于更改disklabel类型和添加/删除分区,特别是因为它可以处理与fdisk不同的现代大型HDD。

你可以跑

$ sudo parted /dev/sda

这将使事情开始,并使您进入分开的终端。然后,您可以运行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等指定它。

6)使用print查看您的新分区表信息检查结果

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

就是这样

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

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

编辑:

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

例如命令

$ sudo parted /dev/sda print

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


我需要从终端上不
手动

等待您的原始帖子没有提及脚本。您在编写脚本的哪一部分?我认为您可以运行parted命令,而无需进入parted终端。我不确定。
KroniK907 '16

只是为了确认,您可以从单行命令中分开运行。例如parted /dev/sda print将打印出/ dev / sda的分区表。如果您需要在bash脚本中执行上述操作,则可以使用单行命令执行与上面所述相同的操作。
KroniK907 '16

但是我必须知道使用该命令的设备名称是什么,parted /dev/sda我还必须知道要调用的驱动器上有多少个分区rm 1,我正在寻找一个仅清理磁盘的命令,以便可以对其进行重新分区,无需执行关闭md移除lv等的所有手动操作。
c33s

1)您仍然必须知道用于运行dd命令的设备的名称...不确定在那里得到的是什么。df如果已安装驱动器,则只需grep即可。如果无法获取驱动器的位置,您如何计划创建“脚本”?2)它很容易运行,parted $drive print并且可以对结果进行grep查找以找到所有可用的分区号,然后将它们存储在数组中。然后使用这些值运行parted $drive rm $partition。所有这些东西都是非常简单的bash脚本。
KroniK907 '16

0

使用改进的非交互式版本的fdisk,即sfdisk

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

sfdisk --delete /dev/sda

0

基本上,这个错误

错误:/ dev / sdc上的分区1已被写入,但我们无法将更改通知内核,可能是因为它们正在使用中。结果,旧分区将继续使用。在进行进一步更改之前,您应该立即重新启动。

当您在分区磁盘时错过某些参数时显示。您可以通过仔细查看分区时定义的参数来解决此错误。

使用: fdisk -l检查磁盘的参数:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.