1.du-sh和df的差异
du和df是两个不同的Linux命令,它们⽤于查看磁盘空间的使⽤情况。但是它们有⼀些区别:
• du(diskusage)会扫描每个⽂件和⽬录,并计算它们的总⼤⼩。[1]du-sh*会显⽰当前⽬录下每个⽂件或⽬录的⼤⼩,以⼈类可读的形式(如KB,MB,GB)。
• df(diskfree)会读取⽂件系统的元数据(superblock),并显⽰每个分区的总⼤⼩,已⽤空间,可⽤空间和使⽤百分⽐。[2]df-h会以⼈类可读的形式显⽰这些信息。
du和df可能不⼀致的原因有以下⼏种:
• du只能扫描已经挂载的⽂件系统,⽽df可以显⽰所有⽂件系统,包括远程或虚拟的。[3]
• du不能统计被删除但仍被进程占⽤的⽂件,⽽df可以。[1]
• du可能受到硬链接或⼦⽬录挂载点等因素的影响,⽽df不会。[1]
2.如何释放被删除但仍被进程占⽤的⽂件
释放被删除但仍被进程占⽤的⽂件的最佳(也是唯⼀)⽅法是结束或重启那些进程。[1]这样,内核就会关闭⽂件描述符,并释放磁盘空间。
如果你不想结束或重启进程,你也可以通过/proc/⽂件系统来截断这些⽂件,使它们的⼤⼩变为0。[2]
例如,如果进程ID是12345,⽂件描述符号是123,你可以执⾏以下命令:
: > "/proc/12345/fd/123" |
这样,⽂件就不会占⽤磁盘空间了,但仍然存在于内存中。[2]
如果你想恢复这些被删除的⽂件,你可以使⽤debugfs⼯具来查找它们的inode号,并使⽤dump命令将它们复制到另⼀个位置。[3]例如,如果你知道⽂件名是foo.txt,你可以执⾏以下命令:
sudo debugfs -w /dev/sda1 debugfs: lsdel debugfs: dump <inode_number> foo.txt |
这样,你就可以在当前⽬录下看到foo.txt了。
3.释放已被删除⽂件空间的案例
3.1查看空间⼤⼩
df-h查看根分区占⽤80%,100G的空间使⽤了80G。但是du-sh/*进⾏统计,实际的⽂件空间却很
少。
df -h du -sh /* |
3.2查看已被删除单仍然被进程占⽤的⽂件
lsof | grep delete | sort -nrk 7 |
可⻅已被删除的⽇志⽂件仍然被进程占⽤了,⽇志⽂件占⽤的空间达到70多G,所有空间⽆法释放。
3.3查看被删除⽂件的所在进程对应的FD
ll /proc/143579/fd ll /proc/142737/fd ll /proc/141304/fd |
可以看到已被删除的仍然被占⽤的⽂件的fd为5。
3.4截断清空已被删除的⽂件
: > "/proc/143579/fd/5" |
3.5查看清空后的效果
lsof | grep delete | sort -nrk 7 df -h |
参考资料:
- 【1】
- disk usage - df vs. du: why so much difference? - Unix & Linux Stack Exchange
- 【2】
- Linux tools: du vs. df | Enable Sysadmin
- 【3】
- linux - How to recover deleted file if it is still opened by some process? - Super User