/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