我写了一个简单的程序,并在ext4和xfs上运行。
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int
main(int argc, char *argv[])
{
int fd;
char *file_name = argv[1];
struct stat buf;
fd = open (file_name, O_RDWR|O_CREAT);
if (fd == -1) {
printf ("Error: %sn", strerror(errno));
return -1;
}
write (fd, "hello", sizeof ("hello"));
fstat (fd, &buf);
printf ("st_blocks: %lun", buf.st_blocks);
stat (file_name, &buf);
printf ("st_blocks: %lun", buf.st_blocks);
close (fd);
stat (file_name, &buf);
printf ("st_blocks: %lun", buf.st_blocks);
return 0;
}
ext4上的输出:
st_blocks: 8st_blocks: 8st_blocks: 8
xfs上的输出:
st_blocks: 128st_blocks: 128st_blocks: 8
然后我研究了xfs,发现了一个在运行mkfs.xfs时更改区段大小的选项。
例子:mkfs。XFS -r extsize=4096/dev/sda1
但是在XFS上我仍然得到相同的输出。谁能提供更多关于如何更改st_blocks的见解?
我找到了答案,把答案贴在这里,以便其他遇到问题的人可以参考。
mount -t XFS -o allocsize=4096设备挂载点
allocsize选项用于调整缓冲区大小
您所看到的是xfs推测性预分配,这是一种启发式方法,用于避免文件增长时出现碎片。要了解更多信息,请参阅此FAQ条目。
你是正确的,"-o allocsize=XXX"选项禁用启发式。您尝试使用"-r extsize=XXX"失败了,因为该选项仅适用于实时子卷,您几乎肯定不会使用该子卷。