Как создать файл с файловыми отверстиями?

Отверстия файла - это пустые места в файле, которые, однако, не занимают места на диске и содержат пустые байты. Поэтому размер файла больше, чем его фактический размер на диске.

Однако я не знаю, как создать файл с файловыми отверстиями для экспериментов.

Ответ 1

Используйте команду 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

Это создает файл с хорошим отверстием от байта 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;
}

Ответ 2

  • Создайте файл.
  • Искать позицию N.
  • Напишите некоторые данные.

В начале файла будет отверстие (вплоть до и без позиции N). Аналогичным образом вы можете создавать файлы с отверстиями посередине.

В следующем документе приведен пример кода C (поиск "разреженных файлов" ): http://www.win.tue.nl/~aeb/linux/lk/lk-6.html

Ответ 4

Проблема тщательно обсуждается в разделе 3.6 знаменитой книги W.Richard Stevens "Расширенное программирование в среде UNIX" (APUE для краткости). Здесь используется функция lseek funstion, включенная в unistd.h, которая предназначена для явного определения открытого файла. Прототип функции lseek выглядит следующим образом:

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

Здесь filedes - это дескриптор файла, смещение - это значение, которое мы желаем установить, и откуда указано постоянное значение в файле заголовка, в частности SEEK_SET, что означает, что смещение задано с начала файла; SEEK_CUR, что означает, что смещение установлено на его текущее значение плюс смещение в списке аргументов; SEEK_END, что означает, что смещение файла задает размер файла плюс смещение в списке аргументов.

Пример создания файла с дырками в C под UNIX, например ОС, выглядит следующим образом:

/*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 - это функция для обработки фатальной ошибки, связанной с системным вызовом.

Ответ 5

См. эту страницу руководства для информации о том, как создаются отверстия для файлов: srec_binary. Также посмотрите на статью статью LWN о файлах.

Ответ 6

Вы можете взять файл coredump. Поскольку в памяти есть отверстия, у вас будет файл с отверстиями.