1. 程式人生 > >Linux 目錄個數和檔案個數限制(單個目錄下最大檔案數)

Linux 目錄個數和檔案個數限制(單個目錄下最大檔案數)

昨晚排查了在KVM的build系統中的一個問題,跟蹤到後面發現在一個目錄下mkdir建立目錄失敗。我手動試了一下,提示如下:cannot create directory `/home/master/jaytemp` too many links
我發現是在一個目錄下的一級子目錄數量是有限制的,遂做了點實驗和調查,結合網上其他人寫的部落格,得到如下的一些關於目錄個數和檔案個數限制的結論。
1.ext3檔案系統一級子目錄的個數預設為31998(個),準確地說是32000個。
Linux為了cpu的搜尋效率而規定的,要想改變數目限制需要重新編譯核心。我看到在kernel程式碼中有這樣的:
include/linux/ext2_fs.h:#define EXT2_LINK_MAX           32000

include/linux/ext3_fs.h:#define EXT3_LINK_MAX           32000
為什麼說31998個呢?這是因為mkdir建立一個目錄時,目錄下預設就會建立兩個子目錄的,一個是.目錄(代表當前目錄),另一個是..目錄(代表上級目錄)。這兩個子目錄是刪除不掉的,“ rm . ” 會得到“rm: cannot remove `.' or `..'”的提示。所以32000-2=31998。
另外,你可以通過如下的指令碼來嘗試。
#!/bin/bash
mkdir tmp
cd tmp
i=1
while [ $i -lt 35000 ]
do
    mkdir $i
    if [ $? -ne 0 ]; then
       echo "cannot make dir $i"
       exit
    fi
    ((i++))
done
執行這個指令碼,你最後將得到“mkdir: cannot create directory `31999': Too many links”的錯誤資訊。
另外,不建議在一個目錄下有太多的檔案或者目錄,這回降低檔案系統查詢檔案或目錄的效能。忽然想起阿里巴巴的圖片伺服器中將圖片的儲存按照年月等分為不同的各級子目錄而不是在一個目錄下,其中一個原因也是出於效能的Linux作業系統考慮。
2.ext3檔案系統下單個目錄裡的最大檔案數無特別的限制,是受限於所在檔案系統的inode數。
我在RHEL5u5的ext3檔案系統中測試,在一個目錄下,touch了100萬個檔案是沒有問題的。但是肯定會受到所在檔案系統的inode數的限制。

df -i /dev/sdaX或者使用tune2fs -l /dev/sdaX或者dumpe2fs -h /dev/sdaX檢視可用inode數,後兩個命令輸出結果是一樣的,但是跟df所得出的可用inode數會有些誤差,其中原因,我也沒搞清楚。
網上有兩種解決inode數限制的辦法如下,不過我沒試過了。
  2.1 重新mkfs,mkfs時將inode數調的多一些(根據你fs中檔案的總數而定),塊尺寸調得小一些(根據每個檔案的平均大小而定)
  2.2 使用loopback檔案系統臨時解決:在/usr中(也可以在別處)建立一個大檔案,然後做成loopback檔案系統,將原來的檔案移到這個檔案系統中,並將它mount到/usr下合適的位置。這樣可以大大減少你/usr中的檔案數目。但是系統性能會有點損失。
3.預設開啟檔案個數(檔案描述符)限制(預設是1024個)
ulimit -n 命令可以檢視
修改這個限制可以使用ulimt -SHn 65535 命令
還可以在/etc/security/limit.conf 裡設定使用者開啟檔案數、程序數、CPU等資訊
4.ext3檔案系統下filename最大字元長度(預設255個英文字元)
LENTH=`for i in {1..255};do for x in a;do echo -n $x;done;done`
touch $LENTH
當增加到256時,touch報錯,File name too long
linux系統下ext3檔案系統內給檔案/目錄命名,最長只能支援127箇中文字元,英文則可以支援255個字元

參考文件:
http://bbs.chinaunix.net/viewthread.php?tid=1972687
http://www.unixreference.net/articles/linux/fs/2007/1115/651.html
http://it.chinawin.net/os/article-3958.html