我正在编写一个需要运行mkfs
来格式化块设备的实用程序。
我使用go的exec
包为每种文件系统类型运行正确的mkfs
命令,例如在ext2的情况下:
err := exec.CommandContext(ctx, "mkfs.ext2", "-F", path).Run()
不幸的是,如果块设备已经格式化,
mkfs
会要求确认(并挂起)。这意味着我被迫通过危险的-F
标志以跳过此检查,如果设备已经格式化,则会丢失数据。我无法在上下文中添加超时,因为除此确认外,格式化可能会花费一些时间。
我找不到
mkfs
标志,该标志使它返回错误,而不是确认是否已格式化块设备。我不想不依赖于解析
mkfs
命令的输出来查看它是否要求确认检查,因为如果mkfs
输出发生更改,这会使它中断。如果已格式化块设备而不是挂在此确认检查上,是否可以通过正确的错误消息中止命令?
最佳答案
事实证明,如果我们在不带终端(tty)的情况下运行命令,那么将假定使用-F
选项,并且将格式化设备,而不管目标设备是否已具有文件系统。
这发生在mkfs.ext2
,mkfs.ext3
和mkfs.ext4
如here所示,这实际上是传统行为
如果块设备是mkfs.xfs
和mkfs.btrfs
,则行为正确且错误
已经格式化。
我将其发布为答案,因为我认为这意味着没有实际的解决方案...如果设备上已经存在某些数据,则在终端外部运行mkfs.ext2
总是会删除数据。