我想创建一个 2GB 的文件,但我不在乎它的内容。我目前使用dd
,/dev/zero
但这相当慢。
是否可以创建一个文件并建立到它的硬链接,而无需初始化该文件的内容(它可能包含之前位于 HDD 上该位置的垃圾数据)?
注:我真的很想分配存储。我不想要稀疏文件。
答案1
您所指的文件被称为“稀疏”文件。
从这一页
稀疏文件基本上与其他文件一样,只是只包含零(即没有内容)的块实际上不存储在磁盘上。这意味着您可以拥有一个看似 16G 的文件(包含 16G 的“数据”),但只占用 1G 的磁盘空间。
要创建一个,dd
您可以使用以下seek=
参数:
dd if=/dev/zero of=sparse-file bs=1 count=1 seek=1024k
seek
和参数bs
简单地告诉它在 1 个块之后寻找文件末尾,这将为您提供一个稀疏文件,然后您可以根据需要热链接到该文件。
这将生成一个完全空的文件,该文件在实际写入之前不占用磁盘空间。它的创建也应该几乎是即时的。
-=编辑=-
如果您想要分配一个文件而在写入之前不关心其内容,那么您需要一个稀疏文件,但通常出于文件系统安全原因,允许非特权应用程序使用磁盘上已存在的数据创建文件被认为是“不好的形式”。
这是因为,如果用户空间应用程序可以做到这一点,它就可能会通过分配一个与磁盘上所有可用空间大小相同的文件,并在其中搜索其他用户可能已保存、复制或删除的密码和其他敏感数据,从而潜在地暴露其他用户的敏感数据。
这显然是那些认为自己是安全的操作系统的错误设计,而没有现代的多用户操作系统会这样做。
这是为什么稀疏文件在读取时默认为零而不是允许分配磁盘区域的另一个原因。
如果你想快速创建一个任意数据的文件而不预先分配块,那么你需要一个稀疏文件,如果你想真正分配这些块,你需要明确地写某物进入他们。
答案2
它可能就是您所需要的,即时原始文件:
qemu-img create yourfile.img 2G
Formatting 'yourfile.img', fmt=raw size=2147483648
$ls -all
-rw-r--r-- 1 mugen users 2147483648 Aug 8 23:48 yourfile.img
Mokubai:“这是因为,如果用户空间应用程序能够做到这一点,它就有可能通过分配一个与磁盘上所有可用空间大小相同的文件,并在其中搜索其他用户可能已保存、复制或删除的密码和其他敏感数据,从而泄露其他用户的敏感数据。这在那些认为自己是安全的操作系统中被认为是明显的不良设计,现代的多用户操作系统都不会这样做。”
确实,这就是shred
被发明的原因。