在日常维护Linux系统时,磁盘空间不够用是个挺常见的麻烦事。如果磁盘满了,可能会导致程序出错、服务挂掉,严重时连系统都启动不了!不过别担心,学会几个常用的命令就能帮你快速定位问题,甚至轻松解决磁盘满的问题。接下来,我会介绍一些命令,帮你应对这种情况,确保系统稳定运行。
先看一眼磁盘空间
首先,要了解当前磁盘空间的使用情况,得使用df 命令:
df -h
-h 选项会以可读性较强的方式显示磁盘空间,输出类似:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 90G 5G 95% /
tmpfs 16G 4G 12G 25% /dev/shm
/dev/sdb1 200G 100G 100G 50% /data
从输出可以看出,/dev/sda1 分区的使用率达到了 95%,说明系统根分区的空间已经接近满了。此时我们要针对/ 分区进行排查。
查看每个目录占用的空间
想要找出哪些目录占用了大量磁盘空间,可以使用du 命令:
du -sh /* | sort -h
这个命令会显示每个顶级目录的空间占用情况,并通过sort 排序。输出大概是这样:
1.3G /snap
2.6G /opt
3.3G /usr
7.8G /var
通过上面的结果,我们可以快速发现/var 占用了7.8G空间,可能是我们需要关注的重点。
找出大文件并清理
如果我们需要深入了解某个目录或子目录的文件占用情况,可以进入目录后使用find 命令来查找大文件。例如,在/var目录下找出所有大于100MB的文件:
find /var -type f -size +100M
这将列出所有符合条件的文件,可以帮助我们快速定位大文件。接下来,根据文件的用途决定是否删除或者备份。
root@didiplus:~# find /var -type f -size +100M
/var/lib/docker/overlay2/d868589f060052fd1543bf393e4ebc0759e5f521384e34ead32a08f45352ba6b/diff/opt/java/openjdk/lib/modules
/var/lib/docker/overlay2/1a1009115bd48b6df32e87f305c5022ff191c45315baed88271d61c686264365/diff/opt/java/openjdk/lib/modules
/var/lib/docker/overlay2/e2b58562f389558a896f78855f4a3a4dab2967f614b054e8dc05b72aab8abe25/merged/opt/java/openjdk/lib/modules
root@didiplus:~# find /usr -type f -size +100M
/usr/local/bin/1panel
/usr/local/cloudmonitor/bin/argusagent
/usr/bin/dockerd
清理日志文件
日志文件是磁盘空间的另一个大敌,尤其是在生产环境中。我们可以通过以下命令查看哪些日志文件占用了大量空间:
root@didiplus:~# du -h /var/log/* | sort -rh
2.0G /var/log/journal/949ee72b23b94d4aa7e2f5f7612118d6
2.0G /var/log/journal
533M /var/log/atop
查了之后发现,日志文件里有两个文件夹特别大,一个是journal,另一个是atop。接下来可以根据具体情况来处理这些日志文件。
如果某些日志文件过大,可以根据需求进行清理。比如清空syslog 文件:
sudo truncate -s 0 /var/log/syslog
或者通过logrotate 工具设置日志轮换策略,避免日志文件无限制增长。
清理临时文件
临时文件夹通常会存放一些不必要的临时文件,定期清理这些文件可以有效释放空间。使用tmpwatch 或rm 命令清理/tmp 目录:
sudo rm -rf /tmp/*
注意,/tmp 目录中的文件一般都是不重要的临时文件,但清理前最好确认没有正在使用的程序或服务依赖其中的文件。
卸载不必要的软件包
除了清理文件,有时不再使用的软件包也是磁盘占用的一大来源。可以使用dpkg(Debian 系)或rpm(RedHat 系)来卸载不需要的软件包。
例如,在 Debian 系统中,我们可以通过以下命令查找并删除不必要的软件包:
sudo apt-get autoremove
sudo apt-get clean
autoremove 命令会删除那些自动安装的、现在不再需要的依赖包;clean 会清理缓存文件。
使用lsof 查找占用空间的文件
有时候,磁盘空间被占满是因为某些程序占用了太多的空间。你可以用lsof 命令(这个命令是用来列出所有被打开的文件)来看看哪些文件正被这些程序占用。
例如,通过lsof命令查看被删除的文件。
lsof | grep deleted
这个命令能帮你找出那些已经被删了但还被某些程序占着的文件。虽然这些文件看起来像是被删掉了,但实际上只要相关程序还在运行,它们就会继续占用硬盘空间。
如果发现有这种情况,可以尝试重启相关的程序,这样就能释放出被占用的空间了。
通过脚本方式检测磁盘情况
定期用脚本来检查服务器的磁盘空间是个不错的方法,这样可以早点发现磁盘快满的问题。下面有个简单的脚本,它能查看磁盘用了多少空间,如果使用率超过了80%,就会自动发警告到钉钉上。
#!/bin/bash
# 设置警告阈值
THRESHOLD=80
# 获取磁盘使用情况
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
# 获取当前日期时间并进行 URL 编码
DATE=$(date '+%Y-%m-%d %H:%M:%S')
ENCODED_DATE=$(echo "$DATE" | sed 's/ /%20/g; s/:/%3A/g')
# 检查磁盘使用情况是否超过阈值
if [ $DISK_USAGE -gt $THRESHOLD ]; then
# 如果超过阈值,输出警告信息
echo "$DATE - WARNING: Disk usage is above $THRESHOLD% - Current usage is $DISK_USAGE%"
# 用 curl 发送 HTTP 请求,代入编码后的日期时间
curl "https://push.spug.cc/send/1QGmWWdzmlRD?DATE=${ENCODED_DATE}&THRESHOLD=${THRESHOLD}&DISK_USAGE=${DISK_USAGE}"
else
# 如果没有超过阈值,输出正常信息
echo "$DATE - Disk usage is normal: $DISK_USAGE%"
# 用 curl 发送正常信息(也可以不发送)
curl "https://push.spug.cc/send/1QGmWWdzmlRD?DATE=${ENCODED_DATE}&THRESHOLD=${THRESHOLD}&DISK_USAGE=${DISK_USAGE}"
fi
当脚本发现服务的根目录使用量超过80%时,就会给钉钉发一条告警消息,如下图所示。
总结
当Linux磁盘空间不足时,首先通过df 和du 命令了解磁盘使用情况,然后使用find 查找大文件,清理不必要的日志和临时文件,卸载不必要的包,最后考虑扩展磁盘。掌握这些命令,你就能有效应对磁盘空间不足的问题,保证系统顺畅运行。遇到问题不要慌,这几个命令帮你轻松梭哈解决!