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

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

/var/log/lastlog登录时写入。此文件的大小基于系统中最大的 UID。最大 UID 越大,此文件越大。幸运的是,它是一个稀疏文件,因此磁盘上的大小比大小ls报告的要小得多(ls -s报告磁盘上的大小)。

在我们的系统中,我们针对 Active Directory 服务器进行身份验证,并且分配给用户的 UID 最终非常非常大。例如,第一个 AD 用户的 UID 为 900,000,000,第二个 AD 用户的 UID 为 900,000,001,等等。

这很奇怪,但应该没问题。/var/log/lastlog不过,结果非常大——一旦 AD 用户登录,lastlog就会显示 280GB。幸运的是,它的实际大小仍然很小。

/var/log/lastlog当存储在 ext3 文件系统的硬盘上时,此方法可以正常工作。但是,如果lastlog存储在 tmpfs 文件系统中,则会出现问题。然后,似乎 tmpfs 上任何文件的最大文件大小都是 256GB,因此程序sessreg在尝试写入 时会出错lastlog

这个 256GB 的限制从何而来,我该如何增加它?

作为创建大型稀疏文件的简单测试,我一直在做:

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

我尝试在 Google 上搜索“tmpfs 最大文件大小”、“256GB 文件系统限制”、“linux 最大文件大小”等内容。但我没能找到太多信息。我找到的唯一提到 256GB 的信息是,具有 2KB 块的 ext3 文件系统限制为 256GB 文件。但我们的硬盘驱动器格式化为 4K 块,所以似乎不是这样——更不用说这是在安装在硬盘驱动器顶部的 tmpfs 中发生的,所以 ext3 分区不应该是一个因素。

这一切都发生在 64 位 Red Hat Enterprise Linux 5.4 系统上。有趣的是,在我的个人开发机器(32 位 Fedora Core 6 盒)上,我可以在 tmpfs 文件系统中创建 300GB 以上的文件,没有任何问题。但在 RHEL5.4 系统上,就不行了。

答案1

答案可以在 Linux 源代码中找到,具体来说,/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.

2 TB 的八分之一正好是 256 GB。使用 32 位内核可以实现更大的容量,正如您在 32 位 FC6 测试系统中发现的那样。

看来改变页面大小可能相关使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 运行此操作。希望这会有所帮助。

答案2

一个建议...你能在 tmpfs 中创建一个 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

相关内容