我正在编写一个实用程序,它需要运行 mkfs
来格式化 block 设备。
我使用 go 的 exec
包为每种文件系统类型运行正确的 mkfs
命令,例如在 ext2 的情况下:
err := exec.CommandContext(ctx, "mkfs.ext2", "-F", path).Run()
不幸的是,如果 block 设备已经格式化,mkfs
将要求确认(并挂起)。这意味着我被迫传递危险的 -F
标志以跳过此检查,如果设备已经格式化则丢失数据。
我无法为上下文添加超时,因为除此确认之外,格式化可能需要一段时间。
我找不到一个 mkfs
标志,如果 block 设备已经格式化,它会返回错误而不是确认检查。
我宁愿不依赖于解析 mkfs
命令的输出来查看它是否要求确认检查,因为如果 mkfs
输出发生变化,这会使它中断。
如果 block 设备已经格式化而不是卡在这个确认检查上,有没有办法用正确的错误消息中止命令?
最佳答案
事实证明,如果我们在没有终端 (tty) 的情况下运行该命令,则假定使用 -F
选项并且无论目标设备是否已有文件系统都会格式化设备.
这发生在 mkfs.ext2
、mkfs.ext3
和 mkfs.ext4
这实际上是遗留行为,如 here 所示
mkfs.xfs
和 mkfs.btrfs
行为正确,如果 block 设备是
已经格式化。
我将此作为答案发布,因为我认为这意味着没有实际的解决方案...如果设备上已有数据,则在终端外运行 mkfs.ext2
将始终删除数据。
关于linux - 如果 block 设备已经格式化,则退出 mkfs 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56525397/