我使用的是CentOS5.8,带有XFS文件系统扩展存储磁盘。我想要做的是,预先分配许多文件,在文件系统中使用连续的 block ,包括单个文件和交叉文件。
我可以通过posix_allocate()进行分配,问题是API将所有磁盘空间清零,我无法承受耗时。然后我尝试了 XFS 指定 API xfsctl() ,使用 XFS_IOC_RESVSP" 标志,我可以更快地预留空间。
xfsctl() 的问题是,它可以使单个文件的 block 连续,但文件上的 block 不连续。例如10个文件,a/b/c/d/e/f...保留。当我对这些文件进行真正的写入后,结果发现文件“b”并不位于文件“a”旁边,并且某些文件可能与前一个和下一个文件都相距很远,尽管其他文件可能彼此相邻,但这种情况很少见。
我使用以下代码进行预分配:
ftruncate(fd, FILE_SIZE);
xfs_flock_t flag = {0};
flag.l_whence = SEEK_SET;
flag.l_start = 0;
flag.l_len = 512*1024*1024;
xfsctl(fileName, fd, XFS_IOC_RESVSP64, &flag);
我的问题是,如何保证文件系统 block 上的文件连续?感谢您的宝贵时间并感谢您的回答。
从XFS邮件列表得到答案,原来是默认inode分配器的问题。使用inode64挂载,如果AG中有足够的可用磁盘空间,文件在内部和外部都是连续的。由于默认的 inode32 分配器,请始终尝试在每个分配的 AG 之间轮换。
我是一名优秀的程序员,十分优秀!