随着服务器的不断运行、更新,服务器上的磁盘空间也逐渐变少,因而有时需要对磁盘空间进行清理,以免磁盘空间不足,并保证系统的正常运行。

磁盘剩余空间报告

df -h

df 命令可以报告当前系统上各文件系统的空间使用情况。如:

Filesystem      Size  Used Avail Use% Mounted on
dev             488M     0  488M   0% /dev
run             496M  452K  496M   1% /run
/dev/xvda1      7.8G  7.0G  411M  95% /
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           496M  760K  495M   1% /tmp
tmpfs           100M     0  100M   0% /run/user/1000

检查磁盘文件系统、容量与挂载情况

blkid, lsblk, mount 是一些可以用于检查磁盘文件系统、容量与挂载情况的工具。

对当前系统上的磁盘情况有一个整体的了解有助于我们后续的问题分析与解决。

样例输出如下:

$ blkid
/dev/xvda1: UUID="059220c2-a56f-411e-aefb-8e978baa2540" TYPE="ext4" PARTUUID="f693efef-01"
/dev/xvdf1: UUID="3ed71966-b9b5-41cd-b316-31bc8c5e5708" TYPE="swap" PARTUUID="a15ee26f-01"

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  15G  0 disk
└─xvda1 202:1    0  15G  0 part /
xvdf    202:80   0   2G  0 disk
└─xvdf1 202:81   0   2G  0 part [SWAP]

$ mount
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sys on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
dev on /dev type devtmpfs (rw,nosuid,relatime,size=499692k,nr_inodes=124923,mode=755)
run on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755)
/dev/xvda1 on / type ext4 (rw,relatime,data=ordered)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=101480k,mode=700,uid=1000,gid=1000)

其中,尤其要注意的是 / 目录下还有挂载点的情况。如 /dev/sda1 挂载在 /,而另有 /dev/sdb1 挂载在 /home 下。在这种情况下,在挂载 /dev/sdb1/home 之前,往 /home 目录写入的文件是存放在 /dev/sda1 上,而在挂载 /dev/sdb1/home 之后,则是存放在 /dev/sdb1 上。

此时,要想删除在挂载 /dev/sdb1 之前写入到 /dev/sda1/home 路径下的文件,就需要先通过命令 umount /dev/sdb1umount /home 解除 /dev/sdb1 的磁盘挂载,随后就能够看到位于 /dev/sda1 上的 /home,进行相应的删除操作以释放空间,最后再通过命令 mount /dev/sdb1 /homemount -a 挂载回磁盘。

磁盘空间占用情况检查

在清理磁盘之前,我们首先需要清楚系统空间是被哪些文件所占据,随后才能有有效的应对措施。

使用 du

du -h -d4 / 2> /dev/null | sort -rh | less

上述命令从根目录开始进行检查,报告每个文件夹的磁盘占用情况,目录报告深度最深为 4 层,并对结果进行排序,将占用空间最多的目录列在最上方。

根据实际需求,可以将 / 改为 ~ 以从 home 目录开始检查;或是将 -d4 改为 -d2 或其他值,从而改变报告最深的目录深度。

使用 ncdu

另外我们也可以安装使用交互式命令行界面工具 ncdu 来检查当前目录或指定目录的磁盘占用情况。

# 检查当前目录
ncdu

# 检查 HOME 目录
ncdu ~

清理 ~/.cache 缓存目录

用户目录(~)下的 .cache 目录通常会被各软件用于缓存临时数据。使用命令查看该目录所用空间:

du -h -d1 ~/.cache | sort -rh

清理包管理工具的缓存

当我们使用 apt, yum, pacman 等包管理工具更新系统中的软件包时,会将更新的软件包下载到本地,随着时间的积累,这些包可能会占据大量的磁盘空间。删除不必要的包文件可以减少空间占用。

Arch Linux / pacman

如所安装的系统为 Arch Linux 的话,可以执行命令

sudo pacman -Sc

来清理系统中的软件包文件缓存。该命令只会删除当前未安装的软件包缓存,或是已安装包的旧版本包文件缓存,而不会删除目前系统中正安装着的包的包文件缓存。

执行示例:

[[email protected] ~]$ sudo pacman -Sc
Packages to keep:
  All locally installed packages

Cache directory: /var/cache/pacman/pkg/
:: Do you want to remove all other packages from cache? [Y/n]
removing old packages from cache...

Database directory: /var/lib/pacman/
:: Do you want to remove unused repositories? [Y/n]
removing unused sync repositories...

如果磁盘空间紧张,且急需额外的磁盘空间,还可以考虑执行以下命令:

sudo pacman -Scc

该命令不仅会删除未安装或旧版本的包文件缓存,也会将安装着的包的包文件缓存也一并删除。因此,执行此命令后,如果需要重新安装已安装的包,就需要重新下载相应的包文件。

此外,除了下载的软件包缓存,系统中可能还存在作为其他软件包依赖而安装的包,而依赖该包的包已被卸载的情况。

对于这种情况,我们可以执行命令:

sudo pacman -Rns $(pacman -Qtdq)

来删除这些孤立的软件包。

Arch Linux / yay

如果有用 yay 来安装 AUR 中的软件包的话,还可以清理 yay 的缓存目录:

rm -rf ~/.cache/yay

清理 Docker 占用的空间

如果系统中安装了 Docker,那我们也可以注意下 Docker Image 是否占据了很多系统空间。

docker images 命令可以查看当前系统中的所有 Docker Image。

docker image prune -a 命令则可以删除所有未与 Docker Container 关联的 Docker Image。

参考阅读