RHEL5:無法在 tmpfs 中創建大於 256GB 的稀疏文件
/var/log/lastlog
登錄時寫入。此文件的大小基於系統中最大的 UID。最大 UID 越大,這個文件就越大。值得慶幸的是,它是一個稀疏文件,因此磁碟上的大小遠小於大小ls
報告(ls -s
報告磁碟上的大小)。在我們的系統上,我們針對 Active Directory 伺服器進行身份驗證,並且最終分配給使用者的 UID 非常非常大。比如,第一個 AD 使用者的 UID 900,000,000,第二個使用者的 UID 900,000,001,等等。
這很奇怪,但應該沒問題。但是,它會導致
/var/log/lastlog
huuuuuge——一旦 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 系統上是不行的。
答案可以在 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 位 FC6 測試系統中發現的那樣,使用 32 位核心可以實現更大的大小。
似乎更改頁面大小可能與在核心中啟用HugeTLB 文件系統支持有關。但是,我對核心的內容了解不多,無法說明如何或為什麼,或者您需要採取哪些步驟來利用它,或者它可能具有什麼其他含義。要啟用它,執行
make menuconfig
,導航到File systems,然後是Pseudo filesystems。有問題的選項是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 也可能值得執行它。我希望這有幫助。