Linux dd中ibs/obs/bs的目的

Linux dd中ibs/obs/bs的目的,linux,file-io,filesystems,Linux,File Io,Filesystems,我有一个脚本,可以在linux机器上的文件中创建文件系统。我看到,要创建文件系统,它使用带bs=x选项的'dd',从/dev/zero读取并写入文件。我认为,通常指定ibs/obs/bs对于从实际硬件设备读取有用,因为有特定的块大小限制。然而,在这种情况下,当它从虚拟设备读取数据并写入文件时,我看不出使用“bs=x字节”选项有什么意义。我的理解错了吗? (以防万一,如果有帮助的话,这个文件系统稍后将用于引导qemu vm)对于从/dev/zero读取,这并不重要。ibs/obs/bs指定一次读取

我有一个脚本,可以在linux机器上的文件中创建文件系统。我看到,要创建文件系统,它使用带bs=x选项的'dd',从/dev/zero读取并写入文件。我认为,通常指定ibs/obs/bs对于从实际硬件设备读取有用,因为有特定的块大小限制。然而,在这种情况下,当它从虚拟设备读取数据并写入文件时,我看不出使用“bs=x字节”选项有什么意义。我的理解错了吗?
(以防万一,如果有帮助的话,这个文件系统稍后将用于引导qemu vm)

对于从/dev/zero读取,这并不重要。ibs/obs/bs指定一次读取的字节数。根据操作系统中读取/写入字节的方式选择一个数字很有帮助。例如,Linux通常从硬盘读取4096字节的数据块。如果您至少对底层硬件的读写方式有所了解,那么最好指定ibs/obs/bs。顺便说一下,如果您指定bs,它将覆盖您为ibs和obs指定的任何内容。

块大小是一次读取和写入的字节数。大概有一个
count=
选项,它是以块大小为单位指定的。如果有
skip=
seek=
选项,则这些选项也将以块大小为单位。但是,如果您正在读取和写入一个常规文件,并且没有磁盘错误,那么块大小实际上并不重要,只要您可以相应地缩放这些参数,并且它们仍然是整数。但是,某些大小可能比其他大小更有效。

要了解块大小,您必须熟悉磁带机。如果你对磁带机不感兴趣——例如,你认为你永远不会使用磁带机——那么你现在可以回去睡觉了

还记得60年代、70年代甚至80年代电影中的磁带机吗?卷轴旋转的地方,等等?不是您的Exabyte,甚至不是QIC四分之一英寸盒式磁带;你的老式半英寸磁带机?在这些问题上,区块大小至关重要

磁带上的数据是以块的形式写入的。每个块与下一个块之间有一个记录间隔

----+-------+-----+-------+-----+----
... | block | IRG | block | IRG | ...
----+-------+-----+-------+-----+----
根据磁带机硬件和软件的不同,可能会出现各种各样的问题。例如,如果磁带以5120字节的块大小写入,而您以512字节的块大小读取磁带,则磁带机可能会读取第一个块,返回512字节,然后丢弃剩余数据;下一次读取将从下一个块开始。相反,如果磁带是以512字节的块大小写入的,而您请求的块是5120字节,则会得到短读;每次读取将只返回512字节,如果您的软件没有注意到,您将读取垃圾。还有一个问题是,磁带机必须提高读取数据块的速度,然后再降低速度。ASCII art表明IRG比数据块小;情况未必如此。阅读一个区块,超越IRG,倒带到下一个区块,然后再次向前,需要时间。而且,如果磁带机没有缓冲数据的内存(便宜的磁带机没有),那么您可能会严重影响磁带机的性能

战争故事:在更新的机器上准备的工作,带有稍微更现代的磁带机。我使用tar编写了一个磁带,但没有合理的块大小(因此默认为512字节)。这是一个很大的软件——哦,总容量肯定不到100MB(换句话说,很久以前)。磁带写得很好,因为这台机器足够现代化,只需几秒钟。但是,我必须在一台装有旧磁带机的机器上取出磁带上的材料,这台机器没有任何板载缓冲区。所以,它读取材料,一次读取512字节,卷轴向前摆动,读取一个块,然后向后摆动,可能只有半英寸,然后向前读取到下一个块,然后向后摆动,然后。。。你可以看到它这样做,因为读取每个512字节的数据块需要相当多的时间,所以所花费的总时间是惊人的。我的航班就要起飞了,我也需要把数据传出去。(那是很久以前的事了,而且在一个很远的地方,最后一分钟对航班的更改也不是什么好选择。)简而言之,它确实被读取了——但是如果我使用了合理的块大小(比如5120字节而不是默认的512字节),我会做很多事情,速度快得多,错过飞机的危险也小得多(但我确实赶上了飞机,虽然在高峰时间乘出租车横穿巴黎,但还有20分钟的时间)

对于更现代的磁带机,磁带机上有足够的内存进行缓冲,让磁带机连续进行流式写入而不反转是可行的。以前我会使用256KB的块大小来让QIC磁带流式传输。我最近在磁带机方面做得不多——让我们看看,在这个千年里,以及在那之前的几年里,我都做得不多;当然,自从CD和DVD成为首选的软件分发机制(在不使用电子下载的情况下)以来,情况就不多了

但在过去,区块大小确实很重要。而
dd
为其提供了良好的支持。您甚至可以通过将
ibs
(输入块大小)与
obs
(输出块大小)分开指定,将数据从使用(例如)4kb块写入的磁带驱动器传输到另一个要使用(例如)16kb块写入的磁带驱动器。该死的有用

此外,
count
参数与(输入)块大小有关。如果说“
dd bs=1024 count=1024 if=/dev/zero of=/my/file/of/zeroes
”,可以在周围复制1MB的零。或复制1 MB的文件