Ubuntu下文件夹大小超出磁盘实际容量的异常问题求助
兄弟,这种情况确实让人一脸懵——明明源盘才2TB,怎么复制起来能跑出2.8TB的量?先别急,大概率不是硬件坑人,咱们一步步排查:
先理清楚你的背景:
- 有一块2TB的ext4备份盘,
df -h显示已用约1.7TB(90%+) - 新买4TB盘做成LVM+ext4,打算先复制数据再把2TB盘并入成6TB卷
- 用MC在screen里复制,结果MC显示正在复制2849GB,远超源盘总容量
最可能的原因:硬链接搞的鬼
ext4里的硬链接会让多个文件路径指向同一个实际数据块,df和du统计的时候会把这些硬链接合并计算(只算一次实际容量),但如果用普通的复制工具(比如MC默认的复制逻辑),会把每个硬链接当成独立文件复制,相当于重复拷贝同一份数据,总容量直接暴涨。
举个例子:你有一个10GB的文件,做了180个硬链接,du统计只算10GB,但复制后就会变成10*181=1810GB,加上其他文件就很容易突破2TB。
你可以先查源盘里的硬链接情况:
# 查找所有有多个硬链接的文件,先看前20个样本 find /path/to/2tb-mount-point -type f -links +1 | head -20
如果输出很多结果,那基本就是这个问题了。解决方法是换用支持保留硬链接的工具复制,比如:
# rsync默认保留硬链接,不会重复复制数据,还能看进度 rsync -av --progress /path/to/2tb-mount-point/ /path/to/4tb-mount-point/
其次,区分df和du的统计差异
df统计的是文件系统层面的已用空间,包括已删除但被进程占用的文件(比如某个日志文件被删了,但服务还在运行,没释放文件句柄,df就还会把它算进去,但du统计不到)。不过这种情况是df显示的已用空间比du大,和你的情况相反,但也可以排查确认:
# 查看源盘实际文件占用的总大小 sudo du -sh /path/to/2tb-mount-point # 对比df的统计结果 df -h /path/to/2tb-mount-point
如果du的结果接近2.8TB,那说明源盘里的文件实际占用就是这么多,df的1.7TB是因为硬链接被合并统计了。
另外,检查MC的统计是否准确
有时候MC的进度统计可能有bug,比如重复计算了正在复制的临时文件,或者对稀疏文件(文件里有大量空洞,实际占用空间小但逻辑大小大)的统计有误。你可以先暂停MC的复制,用命令看看已经复制的文件实际占用了多少空间:
du -sh /path/to/4tb-mount-point/copied-folder
如果是稀疏文件的问题,用rsync复制也能解决——它默认支持稀疏文件,不会把空洞填成0占用额外空间。
先试试上面的排查步骤,有结果了可以再补充信息,应该能找到问题根源!
备注:内容来源于stack exchange,提问作者Bert

