错误信息提示“too many links”,文件系统对目录数量的限制。
问题调查
-
目录数量限制
- 在Linux的ext3文件系统中,一级子目录的默认数量限制是32000个。这个限制是为了优化CPU搜索效率而设置的。
- 实际上,由于每个新目录都会自动创建两个特殊的目录(
.
和..
),所以实际可创建的目录数量是31998个。
-
实验验证
- 我编写了一个Bash脚本来尝试创建超过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
- 运行这个脚本后,我得到了预期的错误信息,确认了限制的存在。
- 我编写了一个Bash脚本来尝试创建超过31998个目录,脚本如下:
-
性能考虑
- 过多的目录和文件会降低文件系统的性能,因此不建议在一个目录下创建大量文件或目录。
- 例如,阿里巴巴的图片服务器将图片存储按年月分目录存储,这也是为了提高性能。
文件系统限制
-
文件数量限制
- 在ext3文件系统中,单个目录下文件的数量没有特别限制,但受到文件系统inode数量的限制。
- 我在一个RHEL5u5的ext3文件系统中测试,创建了100万个文件,没有遇到问题。
-
查看inode数量
- 可以使用以下命令查看inode数量:
df -i /dev/sdaX
tune2fs -l /dev/sdaX
dumpe2fs -h /dev/sdaX
- 可以使用以下命令查看inode数量:
-
解决inode限制的方法
- 重新格式化文件系统,增加inode数量。
- 使用loopback文件系统临时解决,将文件移动到一个大文件创建的文件系统中。
系统限制
- 打开文件数量限制
- 默认情况下,Linux系统允许打开的文件数量限制是1024个。
- 可以使用
ulimit -n
命令查看当前限制,使用ulimit -SHn 65535
命令修改限制。 - 也可以在
/etc/security/limit.conf
中设置用户打开文件数、进程数、CPU等信息。
文件名长度限制
- 文件名长度
- 在ext3文件系统中,文件名的最大长度是255个英文字符。
- 我尝试创建一个长度为255个字符的文件名,成功创建。但当尝试创建256个字符的文件名时,系统报错“File name too long”。
- 在Linux系统中,文件名支持的最大中文字符长度是127个。
通过这次排查,我不仅解决了KVM构建系统中的问题,还加深了对Linux文件系统限制的理解。