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 布局的系统?
该wipefs
程序可让您轻松删除分区表签名:
wipefs -a /dev/sda
Run Code Online (Sandbox Code Playgroud)
不过,您仍然必须停止使用该设备的任何进程,例如 LVM。
从 man wipefs
wipefs 可以从指定的设备上擦除文件系统、raid 或分区表签名(魔术字符串),以使 libblkid 的签名不可见。
wipefs 不会擦除文件系统本身或设备中的任何其他数据。在不带任何选项的情况下使用时,wipefs 会列出所有可见的文件系统及其基本签名的偏移量。
当擦除分区表签名时,wipefs 会调用 BLKRRPART ioctl 以通知内核有关更改的信息。
我一直只是简单地使用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 等单位指定它。
print
6) 使用查看新分区表信息来检查结果
7)然后您需要格式化分区。尽管有一些选项可用,但不应通过 parted 来完成此操作。我建议改为运行quit
退出分开的终端,然后使用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
Run Code Online (Sandbox Code Playgroud)
将把驱动器信息和分区表打印到 bash 控制台上,然后可以使用 grep 等操作它来创建变量或在 bash 脚本中创建您想要的任何内容。