Linux:这啥命令?这台服务器我说了算-磁盘空间——“硬盘明明很大,怎么又提示没地方了?”
第十章:磁盘空间——“硬盘明明很大,怎么又提示没地方了?”
昨天服务器还好好的,今天突然弹出:
No space left on device
你一看硬盘:几百 GB 啊!怎么说满就满?
别急着删文件。Linux 的“没地方了”可能是容量用完,也可能是inode(文件索引节点)耗尽,甚至文件删了,空间却还没还回来。
这一章,我们当一回磁盘侦探。
以下命令以 Ubuntu 等常见 Linux 系统为例。排查命令可放心练习;涉及删除、清理时,先确认目标路径。
1. df:先看硬盘到底满没满
df -h
-h 会把容量显示成 GB、MB 等易读单位。输出类似:
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 50G 46G 1.5G 97% /
重点看三列:
- Avail:还剩多少可用空间
- Use%:使用率
- Mounted on:挂载到哪个目录
只看根分区:
df -h /
注意:df 看的是文件系统的整体使用情况,不是“某个目录有多大”。
2. du:到底谁吃了我的空间?
df 告诉你“房子快塞满了”,du 负责揪出“谁把杂物堆到了天花板”。
查看当前目录总大小:
du -sh .
查看当前目录下各项大小:
du -sh ./*
想查 /var 哪个子目录最胖:
sudo du -xhd1 /var 2>/dev/null | sort -h
这里:
-h:人类可读的大小-d1:只统计一层子目录-x:不跨越其他文件系统sort -h:按大小排序
/var/log、/var/cache、应用数据目录经常值得关注,但大不等于可以删。
3. lsblk:盘在哪儿、挂在哪儿?
lsblk -f
能看到磁盘、分区、文件系统类型和挂载点。
再看根分区的文件系统类型:
df -T /
你可能会看到 ext4、xfs 等。别把“磁盘设备”“分区”“挂载目录”混成一锅粥:一块盘可以有多个分区,一个文件系统可以挂载在某个目录下。
别看到新磁盘就手痒执行 mkfs——格式化可不是“刷新一下”,数据可能直接毕业。
4. 找出大文件:谁才是真正的饭桶?
在自己的家目录里找超过 100 MB 的普通文件:
find "$HOME" -type f -size +100M
查某目录最占空间的前十项:
du -ah ~/Downloads 2>/dev/null | sort -h | tail -n 10
其中 -a 会把文件也列出来。
排查日志目录里的大文件:
sudo find /var/log -type f -size +100M
只找,不删。 日志可能是故障现场的唯一目击证人,先看内容和用途再处理。
5. 明明还有 GB,却说没空间?
除了数据块,文件系统还需要 inode 来记录文件信息。海量小文件可能让 inode 先耗尽。
df -i
关注 IUse%;如果接近 100%,就要怀疑是不是某个目录制造了成千上万个小文件。
排查时可以从已知应用目录入手,例如:
find ~/ -type f | wc -l
这只是统计家目录中的文件数,不代表它就是元凶;大型目录还可能扫描得很慢。
一句话:容量是仓库面积,inode 像货物标签;有空地没标签,也放不进新货。
6. 文件删了,空间怎么没回来?
这是很经典的 Linux 悬案。
某个进程正在写日志,你把日志文件删了;目录里看不到它,但进程还握着文件句柄。此时磁盘空间可能仍被占用。
安装 lsof(若尚未安装):
sudo apt install lsof
查找已删除、但仍被进程打开的文件:
sudo lsof +L1
看清进程、文件大小和业务影响后,优先按服务自身的日志轮转方式处理;必要时安排安全重启相关服务,让文件句柄释放。
不要为了省几个 GB,就在生产机器上随手杀进程。服务器不是俄罗斯方块,不能乱消行。
7. 安全清理:先止血,别把病人也清了
Ubuntu 上可以先查看包缓存:
sudo du -sh /var/cache/apt/archives
清理已下载的软件包缓存:
sudo apt clean
查看 systemd 日志占用:
journalctl --disk-usage
如果确认日志保留策略允许,可以清理已归档的旧日志,例如:
sudo journalctl --vacuum-time=7d
这不保证立刻腾出指定容量,也不会把所有正在写入的日志清掉。
绝对不要为腾空间直接执行:
# 危险示例,请勿执行
sudo rm -rf /var/log/*
日志、数据库、上传文件、容器数据各有自己的管理方式。尤其不要不明所以地删除 /var/lib 下的数据。
8. 实战:自己制造并找出“空间小偷”
我们只在家目录做实验,创建约 20 MB 文件,不碰系统分区配置。
① 建实验目录:
mkdir -p ~/linux-disk-lab
cd ~/linux-disk-lab
② 制造一个大文件:
dd if=/dev/zero of=test.img bs=1M count=20 status=progress
③ 看文件与目录大小:
ls -lh test.img
du -sh .
df -h .
ls 看文件的逻辑大小,du 看占用空间;df 看整个文件系统。它们不是同一把尺。
④ 找到“大户”:
find . -type f -size +10M
⑤ 再造一些小文件:
for i in $(seq 1 20); do : > "file-$i.txt"; done
find . -type f | wc -l
df -i .
⑥ 清理自己的实验目录:
cd ~
rm -ri ~/linux-disk-lab
-i 会询问确认,留点后悔的机会。确保目录中没有自己想保留的东西。
9. 排障口诀
以后遇到磁盘报警,按这个顺序:
1. df -h:哪个文件系统满了?
2. df -i:是容量还是 inode?
3. lsblk -f:盘和挂载关系对吗?
4. du / find:谁占了空间?
5. lsof +L1:是不是删了还被占着?
6. 核对用途、备份与保留策略
7. 清理后再次 df -h 验证
再送一句:先定位,再清理;先确认,再回车。
本章速查
df -h /
df -i /
lsblk -f
df -T /
du -sh .
sudo du -xhd1 /var 2>/dev/null | sort -h
find "$HOME" -type f -size +100M
sudo lsof +L1
sudo apt clean
journalctl --disk-usage
下一章:
《第十一章:内存与性能——“CPU 没摸鱼,服务器怎么还是卡成 PPT?”》
- 点赞
- 收藏
- 关注作者
评论(0)