RHEL5:无法在tmpfs中创build大于256GB的稀疏文件

/var/log/lastlog在您login时被写入。此文件的大小取决于系统中最大的UID。 最大的UID越大,这个文件就越大。 谢天谢地,这是一个稀疏文件,所以磁盘上的大小比ls报告的大小要小( ls -s报告磁盘上的大小)。

在我们的系统上,我们正在对Active Directory服务器进行身份validation,而UID用户的分配最终确实非常大。 比如说,第一个AD用户的UID为9000000,第二个为90万,001等。

这很奇怪,但应该没问题。 这导致/var/log/lastlog被huuuuuge,但是 – 一旦AD用户loginlastlog显示为280GB。 谢天谢地,它的实际尺寸还是很小的。

/var/log/lastlog存储在ext3文件系统上的硬盘上时,这个工作正常。 但是,如果lastlog存储在tmpfs文件系统中,则会中断。 那么看起来,tmpfs上的任何文件的最大文件大小都是256GB,所以sessreg程序出错尝试写入lastlog

这个256GB限制从哪里来,我该如何增加?

作为创build大型稀疏文件的简单testing,我一直在做:

 dd if=/dev/zero of=sparse-file bs=1 count=1 seek=300GB 

我试过谷歌search“tmpfs最大文件大小”,“256GB文件系统限制”,“Linux最大文件大小”,这样的事情。 我一直没有find很多。 我唯一能够发现的是256GB的ext3文件系统仅限于256GB的文件。 但是,我们的硬盘驱动器被格式化为4K块,所以似乎并不是这样 – 更不用说,这是发生在一个tmpfs安装在硬盘驱动器的顶部,所以ext3分区不应该是一个因素。

这一切都发生在64位的红帽企业Linux 5.4系统上。 有趣的是,在我的个人开发机器上,这是一个32位的Fedora Core 6盒,我可以在tmpfs文件系统中创build300GB +文件没有问题。 在RHEL5.4系统上,这是不行的。

答案可以在Linux源代码find,特别是/usr/src/linux/mm/shmem.c ,从我的系统(Gentoo 2.6.31-ish)的第70行开始:

 /* * The maximum size of a shmem/tmpfs file is limited by the maximum size of * its triple-indirect swap vector - see illustration at shmem_swp_entry(). * * With 4kB page size, maximum file size is just over 2TB on a 32-bit kernel, * but one eighth of that on a 64-bit kernel. With 8kB page size, maximum * file size is just over 4TB on a 64-bit kernel, but 16TB on a 32-bit kernel, * MAX_LFS_FILESIZE being then more restrictive than swap vector layout. 

2TB的八分之一正好是256GB。 使用32位内核可以获得更大的尺寸,就像您在32位FC6testing系统中发现的那样。

看来改变页面大小可能与在内核中启用HugeTLB文件系统支持有关。 但是,我不太了解内核的内容,不知道如何或为什么,或者需要采取哪些步骤来利用它,或者可能会有什么其他的影响。 要启用它,请运行make menuconfig ,导航到文件系统 ,然后导航到伪文件系统 。 有问题的选项是HugeTLB文件系统支持 。 在线帮助说:

 CONFIG_HUGETLBFS: hugetlbfs is a filesystem backing for HugeTLB pages, based on ramfs. For architectures that support it, say Y here and read <file:Documentation/vm/hugetlbpage.txt> for details. If unsure, say N. 

这也可能值得通过StackOverflow来运行。 我希望这有帮助。

一个build议…你可以在tmpfs中创build一个ext3镜像并挂载它,并把lastlog放在那里? 就像是:

 cd /tmp dd if=/dev/zero of=lastlog.img bs=1024k count=10 losetup /dev/loop1 lastlog.img mkfs.ext3 /dev/loop1 mount /dev/loop1 /var/lastlog