我应该如何理解 dd 命令的“seek”和“count”?

我应该如何理解 dd 命令的“seek”和“count”?

请参阅下面的 dd 命令和输出。

dd if=/dev/null of=./VirtualDisk.img bs=1M count=1024  
0+0 records in   
0+0 records out   
0 bytes copied, 0.000281296 s, 0.0 kB/s   

我预计输出文件将写入 1024 个大小为 1MB 的块。但为什么 VirtualDisk.img 的输出文件大小为 0?

另请参见另一个示例。

dd if=/dev/null of=./VirtualDisk.img bs=1M seek=1024
0+0 records in
0+0 records out
0 bytes copied, 0.000254032 s, 0.0 kB/s

根据手册,应该从输出文件的开头跳过 1024 个大小为 1MB 的块。但是 VirtualDisk.img 生成的输出文件大小为 1073741824 (1MB * 1024)。我可以看到跳过的区域用零填充。

这是 dd 手册:https://man7.org/linux/man-pages/man1/dd.1.html
count对我来说,和 的行为seek与手册上说的不同。我该如何吸收这种行为?

答案1

seek= 在输出文件中前进多远

skip= 在输入文件中前进多远

count= 复制了多少个片段(可以通过 bs= 设置)

假设你有 2 个 16 字节文件,如下所示:

file1: 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF

file2: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01

以下是一些命令和示例输出:

dd if=file1 of=file2 count=12 bs=1 seek=4
file2: 01 01 01 01 [00 11 22 33 44 55 66 77 88 99 AA BB]


dd if=file1 of=file2 count=12 bs=1 skip=4
file2: [44 55 66 77 88 99 AA BB CC DD EE FF] 01 01 01 01

dd if=file1 of=file2 count=12 bs=1 skip=4 seek=4 count=8
file2: 01 01 01 01 [44 55 66 77 88 99 AA BB] 01 01 01 01

答案2

您刚刚创建了一个该大小的文件。

https://en.wikipedia.org/wiki/Sparse_file

这意味着应用程序可以从该文件读取大量零,但在应用程序实际向其中写入数据之前,它不会占用太多的磁盘空间。

在这种情况下,该seek参数的意思是“跳过 n 个块,然后开始写入”,在文件的开头留下一个“洞”,即,没有磁盘空间(尚未)分配给文件的该部分。

用作/dev/zero输入文件似乎具有相同的效果。(尽管我承认我没有想到这一点;我本来希望文件充满实际的零并占用实际的磁盘空间)。

相关内容