如何创建带文件孔的文件?

Amu*_*umu 20 c linux

文件孔是文件中的空白空间,但不占用任何磁盘空间并包含空字节.因此,文件大小大于磁盘上的实际大小.

但是,我不知道如何创建带有文件孔的文件进行试验.

Omn*_*ous 35

将该dd命令与seek参数一起使用.

dd if=/dev/urandom bs=4096 count=2 of=file_with_holes
dd if=/dev/urandom bs=4096 seek=7 count=2 of=file_with_holes
Run Code Online (Sandbox Code Playgroud)

这会为您创建一个文件,从字节8192到字节28671有一个很好的漏洞.

这是一个例子,证明文件确实有漏洞(该ls -s命令告诉你文件正在使用多少磁盘块):

$ dd if=/dev/urandom bs=4096 count=2 of=fwh # fwh = file with holes
2+0 records in
2+0 records out
8192 bytes (8.2 kB) copied, 0.00195565 s, 4.2 MB/s

$ dd if=/dev/urandom seek=7 bs=4096 count=2 of=fwh
2+0 records in
2+0 records out
8192 bytes (8.2 kB) copied, 0.00152742 s, 5.4 MB/s

$ dd if=/dev/zero bs=4096 count=9 of=fwnh # fwnh = file with no holes
9+0 records in
9+0 records out
36864 bytes (37 kB) copied, 0.000510568 s, 72.2 MB/s

$ ls -ls fw*
16 -rw-rw-r-- 1 hopper hopper 36864 Mar 15 10:25 fwh
36 -rw-rw-r-- 1 hopper hopper 36864 Mar 15 10:29 fwnh
Run Code Online (Sandbox Code Playgroud)

如您所见,带有空洞的文件占用的磁盘块较少,尽管大小相同.

如果你想要一个程序,它在这里是:

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>

int main(int argc, const char *argv[])
{
    char random_garbage[8192]; /* Don't even bother to initialize */
    int fd = -1;
    if (argc < 2) {
        fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
        return 1;
    }
    fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0666);
    if (fd < 0) {
        perror("Can't open file: ");
        return 2;
    }
    write(fd, random_garbage, 8192);
    lseek(fd, 5 * 4096, SEEK_CUR);
    write(fd, random_garbage, 8192);
    close(fd);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

以上应该适用于任何Unix.其他人回复了一个非常适合Linux的替代方法.我在这里强调它,因为它是一种与我给出的两种方法不同的方法,可以用来在现有文件中添加漏洞.

  • 有人低估了这一点,我不明白为什么.也许未初始化的记忆留下了不好的味道,因为它通常是如此愚蠢的事情. (3认同)

NPE*_*NPE 7

  1. 创建一个文件.
  2. 寻求定位N.
  3. 写一些数据.

文件的开头会有一个洞(最多,不包括位置N).您可以类似地创建中间有孔的文件.

以下文档包含一些示例C代码(搜索"稀疏文件"):http://www.win.tue.nl/~aeb/linux/lk/lk-6.html


nin*_*alj 6

除了创建带漏洞的文件之外,从大约2个月前(2011年1月中旬)开始,您可以使用fallocate(2) FALLOC_FL_PUNCH_HOLE LWN文章,Linus树上的git commit,Linux的联机帮助页面修补Linux上的现有文件.