linux - 如果 block 设备已经格式化,则退出 mkfs 命令

标签 linux file go filesystems

我正在编写一个实用程序,它需要运行 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.ext2mkfs.ext3mkfs.ext4

这实际上是遗留行为,如 here 所示

mkfs.xfsmkfs.btrfs 行为正确,如果 block 设备是 已经格式化。

我将此作为答案发布,因为我认为这意味着没有实际的解决方案...如果设备上已有数据,则在终端外运行 mkfs.ext2 将始终删除数据。

关于linux - 如果 block 设备已经格式化,则退出 mkfs 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56525397/

相关文章:

linux - 循环直到在列表中选择

linux - Apache RPM 目录列表

java - 在 Android 中创建文件夹

python - 在 python 中使用 file.seek() 时通常将多少字节加载到内存中?

c++ - 使用指向文件的指针从 vector 中保存对象

testing - 如何在单元测试中处理新服务器功能

go - 为什么 request.ParseForm() 耗尽 request.Body?

python - Linux 阻塞信号到 Python init

linux - Sed - 修改第一列中的单个字符而不触及其他字符

php - 用于 nginx、php、mysql、golang 的 Docker-compose