Как создать файл с файловыми отверстиями?
Отверстия файла - это пустые места в файле, которые, однако, не занимают места на диске и содержат пустые байты. Поэтому размер файла больше, чем его фактический размер на диске.
Однако я не знаю, как создать файл с файловыми отверстиями для экспериментов.
Ответы
Ответ 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
Ответ 3
Помимо создания файлов с дырками, начиная с ~ 2 месяцев назад (в середине января 2011 года), вы можете пробивать дыры в существующих файлах в Linux, используя fallocate(2)
FALLOC_FL_PUNCH_HOLE
LWN статья, git зафиксировать на дереве Linus, патч для Linux manpages.
Ответ 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. Поскольку в памяти есть отверстия, у вас будет файл с отверстиями.