Создать разреженный файл с альтернативными данными и дырой в ext3 и XFS - PullRequest
1 голос
/ 04 августа 2011

Я создал 1 программу для создания разреженного файла, который содержит альтернативные пустые блоки и блоки данных. Например, block1 = пусто, block2 = данные, block3 = пусто .....

#define BLOCK_SIZE 4096
void *buf;
int main(int argc, char **argv)
{
buf=malloc(512);
memset(buf,"a",512);
int fd=0;
int i;
int sector_per_block=BLOCK_SIZE/512;
int block_count=4;
if(argc !=2 ){
        printf("Wrong usage\n USAGE: program absolute_path_to_write\n");
        _exit(-1);
}
fd=open(argv[1],O_RDWR | O_CREAT,0666);
if(fd <= 0){
        printf("file open failed\n");
        _exit(0);
}
while(block_count > 0){
        lseek(fd,BLOCK_SIZE,SEEK_CUR);
        block_count--;
        for(i=0;i<sector_per_block;i++)
        write(fd,buf,512);
        block_count--;
}
close(fd);
return 0;
}

Предположим, я создаю new_sparse_file, используя этот код выше.

Когда я запускаю эту программу, на ext3 FS с размером блока 4 КБ ls -lh показывает размер new_sparse_file как 16 КБ, тогда как du -h показывает 8 КБ, что, я думаю, правильно.

На xfs, размер блока 4 КБ, ls -lh показывает 16 КБ, но `du -h * показывает 12 КБ.

Почему существуют разные виды поведения?

Ответы [ 2 ]

1 голос
/ 15 марта 2012
0 голосов
/ 04 августа 2011

Разреженные файлы - это просто оптимизация пространства, и любая ФС может не создавать разреженный файл для оптимизации фрагментации файла и скорости доступа к файлу. Таким образом, вы не можете зависеть от того, насколько запасной файл будет на некоторых ФС.

Итак, 12 Кбайт в XFS тоже правильно.

...