请参阅下面的 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.htmlcount
对我来说,和 的行为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
输入文件似乎具有相同的效果。(尽管我承认我没有想到这一点;我本来希望文件充满实际的零并占用实际的磁盘空间)。