如何用文件洞创build文件?

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

但是,我不知道如何创build一个带有文件洞的文件来进行实验。

Solutions Collecting From Web of "如何用文件洞创build文件?"

使用带命令参数的dd命令。

 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 

这将创建一个文件,从字节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 

正如你所看到的,尽管尺寸相同,带孔的文件占用的磁盘块也更少。

如果你想要一个程序,它是这样的:

 #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; } 
  1. 创建一个文件。
  2. 寻求N位置。
  3. 写一些数据。

文件开头会有一个漏洞(直到N位置,但不包括位置N )。 您可以同样在中间创建带有孔的文件。

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

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

这个问题在W.Richard Stevens着名的着作“UNIX环境下的高级编程”(简称APUE)的3.6节中有详细的讨论。 包含在unistd.h中的lseek函数在这里被使用,它被设计成明确地设置一个打开文件的偏移量。 lseek函数的原型如下:

 off_t lseek(int filedes, off_t offset, int whence); 

在这里,filedes是文件描述符,offset是我们愿意设置的值,并且是头文件中设置的常量,具体来说是SEEK_SET,意思是从文件的开始处设置偏移量; SEEK_CUR,这意味着偏移量被设置为当前值加上参数列表中的偏移量; SEEK_END,这意味着文件的偏移量被设置为文件的大小加上参数列表中的偏移量。

在UNIX下创建一个在C下有空洞的文件的例子如下:

 /*Creating a file with a hole of size 810*/ #include <fcntl.h> /*Two strings to write to the file*/ char buf1[] = "abcde"; char buf2[] = "ABCDE"; int main() { int fd; /*file descriptor*/ if((fd = creat("file_with_hole", FILE_MODE)) < 0) err_sys("creat error"); if(write(fd, buf1, 5) != 5) err_sys("buf1 write error"); /*offset now 5*/ if(lseek(fd, 815, SEEK_SET) == -1) err_sys("lseek error"); /*offset now 815*/ if(write(fd, buf2, 5) !=5) err_sys("buf2 write error"); /*offset now 820*/ return 0; } 

在上面的代码中,err_sys是处理与系统调用有关的致命错误的函数。

有关如何创建文件洞的信息,请参阅此手册页: srec_binary 。 另外看看这个LWN文件上的文件洞。

你可以拿一个coredump文件。 由于内存包含孔,您将有一个带孔的文件。