输出重定向到块设备是否会覆盖字节或整个块?

输出重定向到块设备是否会覆盖字节或整个块?

A评论另一个问题让我想知道:

假设我将命令的输出重定向到块设备,并且该输出的长度小于块设备的块大小:

% blockdev --getbsz /dev/sda
4096

% head -c 100 /dev/zero > /dev/sda

这会覆盖 /dev/sda 的前 100 个字节,还是前 4096 个字节(即一个完整的块)?
行为是否取决于 shell、输出缓冲设置,甚至 *nix 风格(可能使用字符设备而不是块设备,如 *BSD)?

答案1

如果您使用小于底层块大小的某个大小 N 写入块设备,那么我希望操作系统(1)从设备读取完整块,(2)更新前 N 个块(假设零偏移)与您正在写入的内容,以及(3)将整个块重新写入设备。最终结果是它看起来已经写入了前 N 个字节。

答案2

根据我的经验dd,至少有些软件只写入指定数量的字节(而不是完整的块)。例如,可以写入驱动器的最前端来修改 BIOS 引导扇区 (MBR) 和分区表。

但其他一些软件也可能被用来写入整个块。

我建议您测试特定程序的行为方式(或寻求帮助来测试它)。

相关内容