要从干净状态开始,我需要从命令行将硬盘重置为空状态。
这与运行擦除实用程序无关,数据不必被覆盖。
这个问题与从命令行删除所有分区
那里的解决方案非常有效,
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 等为单位指定它。
print
6)使用查看新分区表信息检查结果
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
答案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
) - 参数化以使用设备和新的挂载点。
- 警告: 请勿在启动盘上使用,这些信息都会被清除,不会有任何疑问。