【问题标题】:Create sparse file with alternate data and hole on ext3 and XFS在 ext3 和 XFS 上创建具有备用数据和孔的稀疏文件
【发布时间】:2011-08-04 11:23:06
【问题描述】:

我创建了 1 个程序来创建包含备用空块和数据块的稀疏文件。 比如block1=empty,block2=data,block3=empty.....

#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。

当我运行这个程序时,在块大小为 4KB 的 ext3 FS 上,ls -lh 显示 new_sparse_file 的大小为 16KB,而du -h 显示为 8 kb,我认为这是正确的。

在 xfs 上,块大小为 4kb,ls -lh 显示为 16KB,但 `du -h* 显示为 12kb。

为什么会有不同种类的行为?

【问题讨论】:

    标签: linux filesystems block


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      稀疏文件只是空间的优化,任何FS都可能不会创建稀疏文件来优化文件碎片和文件访问速度。因此,您不能依赖文件在某些​​ FS 上的空闲程度。

      所以,XFS 上的 12kb 也是正确的。

      【讨论】:

      • 在同一个程序中,我增加了 block_count 以便写入 200MB 的文件。 ls -lh 显示两个 FS 为 200MB,但 du -h 在 XFS 上显示 187MB,在 ext3 上显示 100MB。优化文件碎片和文件访问速度有多大区别?
      • 尽量不要用 4kb 的最小块填充很多,而是增加块大小。我的意思是把#define BLOCK_SIZE 4096改成#define BLOCK_SIZE (4096*32)
      • 是的,增加块大小会起作用,但它不会创建一个文件,这样有 1blockhole,1blockdata,1blockhole,1blockdata.... 序列类型。
      • xfs 不是基于块的 fs,而是基于范围的。因此,extent 的大小可以大于单个块。
      猜你喜欢
      • 2021-10-17
      • 2014-10-03
      • 2011-04-30
      • 1970-01-01
      • 2018-08-03
      • 2015-06-11
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多