我正在编写一个需要运行mkfs来格式化块设备的实用程序。

我使用go的exec包为每种文件系统类型运行正确的mkfs命令,例如在ext2的情况下:

err := exec.CommandContext(ctx, "mkfs.ext2", "-F", path).Run()

不幸的是,如果块设备已经格式化,mkfs会要求确认(并挂起)。这意味着我被迫通过危险的-F标志以跳过此检查,如果设备已经格式化,则会丢失数据。

我无法在上下文中添加超时,因为除此确认外,格式化可能会花费一些时间。

我找不到mkfs标志,该标志使它返回错误,而不是确认是否已格式化块设备。

我不想不依赖于解析mkfs命令的输出来查看它是否要求确认检查,因为如果mkfs输出发生更改,这会使它中断。

如果已格式化块设备而不是挂在此确认检查上,是否可以通过正确的错误消息中止命令?

最佳答案

事实证明,如果我们在不带终端(tty)的情况下运行命令,那么将假定使用-F选项,并且将格式化设备,而不管目标设备是否已具有文件系统。

这发生在mkfs.ext2mkfs.ext3mkfs.ext4
here所示,这实际上是传统行为

如果块设备是mkfs.xfsmkfs.btrfs,则行为正确且错误
已经格式化。

我将其发布为答案,因为我认为这意味着没有实际的解决方案...如果设备上已经存在某些数据,则在终端外部运行mkfs.ext2总是会删除数据。

10-04 19:45