0

我写了一个简单的程序,并在 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: %s\n", strerror(errno));
                return -1;
        }

        write (fd, "hello", sizeof ("hello"));

        fstat (fd, &buf);
        printf ("st_blocks: %lu\n", buf.st_blocks);

        stat (file_name, &buf);
        printf ("st_blocks: %lu\n", buf.st_blocks);

        close (fd);

        stat (file_name, &buf);
        printf ("st_blocks: %lu\n", buf.st_blocks);

        return 0;
}

ext4 上的输出:

st_blocks:8 st_blocks:8 st_blocks:8

xfs 上的输出:

st_blocks:128 st_blocks:128 st_blocks:8

然后我探索了 xfs 并找到了一个在运行 mkfs.xfs 时更改范围大小的选项。

示例:mkfs.xfs -r extsize=4096 /dev/sda1

但我仍然在 XFS 上得到相同的输出。谁能提供有关如何更改 st_blocks 的更多见解。提前致谢。

4

2 回答 2

1

我找到了答案,在这里发布答案,以便其他面临问题的人可以参考。

mount -t xfs -o allocsize=4096 设备挂载点

allocsize 选项用于调整缓冲区大小。

于 2011-11-03T16:33:17.550 回答
1

您所看到的是 xfs 推测性预分配,这是一种启发式方法,用于避免文件在增长时出现碎片。有关详细信息,请参阅此常见问题解答条目

您是正确的,“-o allocsize=XXX”选项禁用了该启发式。您尝试使用“-r extsize=XXX”失败了,因为该选项仅适用于您几乎肯定不会使用的实时子卷。

于 2016-06-25T17:53:25.593 回答