gpt4 book ai didi

unix - 如何测试是否支持稀疏文件

转载 作者:行者123 更新时间:2023-12-04 12:39:58 25 4
gpt4 key购买 nike

给定文件描述符或文件名,我如何知道是否可以写入任意位置而无需等待中间部分在磁盘上显式清零?

最佳答案

您可以 stat()文件获取文件大小和磁盘块数,在文件末尾寻找相对较少的磁盘块,写入已知数量的块,然后再次统计文件。将磁盘块的原始数量与最终数量进行比较。如果文件系统不支持稀疏文件,那么写入几个磁盘块应该不会花费太长时间。

给定原始和最终磁盘块数,然后尝试确定文件系统是否支持稀疏文件。我说“尝试”是因为某些文件系统可以使这变得困难 - 例如,启用压缩的 ZFS。

像这样的东西:

#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

int check( const char *filename )
{
struct stat sb;
long blocksize;
off_t filesize;
blkcnt_t origblocks;
char *buffer;
int fd;

fd = open( filename, O_CREAT | O_RDWR, 0644 );

fstat( fd, &sb );
blocksize = sb.st_blksize;
filesize = sb.st_size;
origblocks = sb.st_blocks;

lseek( fd, 16UL * blocksize, SEEK_END );

buffer = malloc( blocksize );
memset( buffer, 0xAA, blocksize );

write( fd, buffer, blocksize );
fsync( fd );

free( buffer );

// kludge to give ZFS time to update metadata
for ( ;; )
{
stat( filename, &sb );
if ( sb.st_blocks != origblocks )
{
break;
}
}

printf( "file: %s\n filesystem: %s\n blocksize: %d\n size: %zd\n"
" blocks: %zd\n orig blocks: %zd\n disk space: %zd\n",
filename, sb.st_fstype, blocksize, sb.st_size,
( size_t ) sb.st_blocks, ( size_t ) origblocks,
( size_t ) ( 512UL * sb.st_blocks ) );

// return file to original size
ftruncate( fd, filesize );
return( 0 );
}

int main( int argc, char **argv )
{
for ( int ii = 1; ii < argc; ii++ )
{
check( argv[ ii ] );
}

return( 0 );
}

(为清楚起见,省略了错误检查)

启用压缩的 ZFS 似乎不会快速更新文件元数据,因此等待更改出现的旋转。

在带有文件 asdf 的 Solaris 11 机器上运行时(ZFS 文件系统,启用压缩) /tmp/asdf (tmpfs 文件系统)和 /var/tmp/asdf (ZFS,无压缩),该代码产生以下输出:
file: asdf
filesystem: zfs
blocksize: 131072
size: 2228224
blocks: 10
orig blocks: 1
disk space: 5120
file: /tmp/asdf
filesystem: tmpfs
blocksize: 4096
size: 69632
blocks: 136
orig blocks: 0
disk space: 69632
file: /var/tmp/asdf
filesystem: zfs
blocksize: 131072
size: 2228224
blocks: 257
orig blocks: 1
disk space: 131584

从该输出中,很明显 /tmp/asdf位于不支持稀疏文件的文件系统上,并且 /var/tmp/asdf位于支持此类文件的文件系统中。

和平原 asdf完全是在别的东西上,写入 128 kB 的数据会添加所有 9 512 字节的磁盘块。由此,您可以推断文件系统中正在进行某种压缩。顺便说一句,我怀疑假设任何支持这种 native 压缩的文件系统也将支持稀疏文件是非常安全的。

在给出文件名或打开文件描述符时确定文件系统是否支持稀疏文件的最快方法是调用 stat()在文件名上或 fstat()在文件描述符上,获取 st_fstype来自 struct stat 的字段,并将文件的文件系统类型与一组已知支持稀疏文件的文件系统类型字符串进行比较。

关于unix - 如何测试是否支持稀疏文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38718864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com