虚拟机上的Ubuntu最近竟然提示磁盘空间不足了,要知道我压根儿就没怎么用它,甚至也安装多少软件在上面,怎么就突然空间不足了呢?
df命令查看了一下磁盘的使用率,20G空间居然用了94%,究竟是哪里出问题了呢?
从根目录下,用du -h --max-depth=1$sudo du -hs *一层层往下找,占用最大的就是/var/lib/snapd目录,直接用掉了9G的空间,再加上/usr目录,七成的硬盘空间就这么没了。
注:如果你在Ubuntu桌面系统,那么还有一个叫做“磁盘使用情况分析器”的可视化工具,可以直观地显示磁盘占用的详细情况,如下图(这是已经清理过后截的图):
Ubuntu-Disk-Review.png
想办法瘦瘦身吧!

一、删除不再需要的软件包

日常使用中,安装以及升级软件都会自动安装很多依赖性的库和软件包,而如果删除了该软件包,那么随之安装的软件包在系统中就变得毫无用处。
此时我们就可以使用如下的命令来删除这些不需要的软件包和库:

sudo apt-get autoremove

同时,它还会删除系统升级中自动安装的旧Linux内核。

通过上述操作,找回500m左右的空间(感觉有点杯水车薪)。

二、删除旧的快照版本

既然知道最大的问题出在snapd目录,那么重点肯定是解决它了。

snap是Canoncial公司提出的新一代linux包管理工具,致力于将所有linux发行版上的包格式统一,做到“一次打包,到处使用”。目前snap已经可以在包括Ubuntu、Fedora、Mint等多个Linux发行版上使用。

看似方便,但是安装包更大,以及保存至少三个版本(当前版本和两个旧版)的做法让硬盘的容量更加捉襟见肘。
幸运的是,有人开发了一个小脚本可以用于解决此类问题,我们只需创建一个新的Shell脚本,然后在其中添加如下内容:

#!/bin/bash
# Removes old revisions of snaps
# CLOSE ALL SNAPS BEFORE RUNNING THIS
set -eu
snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        snap remove "$snapname" --revision="$revision"
    done

三、其他方法

1. 清理Ubuntu中的APT缓存

Ubuntu 使用 APT(高级软件包工具)在系统上安装、删除和管理软件,并且在软件卸载之后它还会保留先前下载和安装软件包的缓存。
APT 包管理系统会将下载的 DEB 包缓存在 /var/cache/apt/archives 文件中,随着时间的推移,由于拥有大量不需要的包这个缓存目录可以增长得相当大。
你可以使用以下命令查看此缓存的大小:

sudo du -sh /var/cache/apt

还好,我的APT缓存并不多(几十M左右),但清一点算一点吧。对于 APT 缓存我们有两种可选方式对其进行清理,其一为只删除过时的软件包:

sudo apt autoclean

另一种则是清理整个缓存(释放更多的磁盘空间):

sudo apt clean

2. 清理缩略图缓存

为方便用户预览图片,Ubuntu 会自动为图片文件创建一个缩略图,用于在文件管理器中查看,而这些这些缩略图其实也是以文件形式隐藏存储在用户账户的 ~/.cache/thumbnails 目录当中。
如果你是摄影爱好者或是图片收藏者,随着时间的推移,缩略图的数量将大大增加。特别需要注意的是,如果你删除了某些照片或图片,这些自动生成的缩略图缓存还是会存在于磁盘当中,而不会自动清除。

你可以使用以下命令检查缩略图缓存的大小:

du -sh ~/.cache/thumbnails

还好,我的虚拟机系统中几乎不存在缩略图,所以占用的空间也很小。
清理起来很方便,用rm命令删除其中的内容就可以了。

rm -rf ~/.cache/thumbnails/*

4. 手动删除老旧Linux内核(专业)

前面介绍第 1 种方法时就提到了可以自动删除那些老旧无用的 Linux Kernel,但如果你在 Ubuntu 中曾手动安装过内核,则 apt autoremove 命令选项则不适用了。但删除不使用的旧版内核确实又可节省大量磁盘空间,所以对于手动安装的 Ubuntu 内核可以进行手动卸载。
首先使用如下命令列出当前 Ubuntu 中所有已经安装的 Linux Kernel:

sudo dpkg --list 'linux-image*'*

删除旧版内核与删除任何其他软件包一样:

sudo apt remove linux-image-VERSION

请自行将上述 VERSION 替换为要清除的内核版本,建议保持至少两个或三个最新版本内核,这样在无法使用最新内核启动系统时至少还有那么几个可替代品救急。

5. 删除日志

每个Linux发行版都有一个日志记录机制,可以帮助你调查系统中正在发生的事情。问题在于,随着时间的流逝,这些日志会占用大量的磁盘空间。我们可以使用以下命令检查日志大小:

journalctl --disk-usage

还好,我的日志占用也不大。如果需要的话,可以参看《How to Clear Systemd Journal Logs》。

6. 卸载不必要的应用程序

不到万不得已是想不到去卸载程序的,当然如果你在很久以前因为好玩装了一堆软件,随着时间的流逝把它们忘了,那么还是建议卸载吧,用不到还占容量就是浪费。
可以通过软件中心卸载或者通过下述命令卸载:

sudo apt remove 软件包名

四、一键脚本

最后,放一个从网上找来的脚本文件(替换了原有的快照删除脚本),将上述几个清理方法也整合进去了。

function myclean {
    ## Show free space
    df -Th | grep -v fs
    # Will need English output for processing
    LANG=en_GB.UTF-8

    ## Clean apt cache
    apt-get update
    apt-get -f install
    apt-get -y autoremove
    apt-get clean

    ## Remove old versions of snap packages
    # CLOSE ALL SNAPS BEFORE RUNNING THIS
    set -eu
    snap list --all | awk '/disabled/{print $1, $3}' |
        while read snapname revision; do
            snap remove "$snapname" --revision="$revision"
        done

    ## Remove old versions of Linux Kernel
    dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs apt-get -y purge

    ## Rotate and delete old logs
    /etc/cron.daily/logrotate
    find /var/log -type f -iname *.gz -delete
    sudo journalctl --rotate
    sudo journalctl --vacuum-time=1s

    ## Show free space
    df -Th | grep -v fs
}

五、清理软件


如果懒得用上述方法的话,也可以考虑通过软件的方式进行。相对于Windows下数量繁多的清理软件,Linux能用的软件就少好多,但也不至于没有。常用的有BleachBitStacerUbuntu Cleaner、FSlint(可以查找和删除重复文件)等。

参考文章
Ubuntu系统释放磁盘空间的7种简单方法
How To Remove Old Snap Versions To Free Up Disk Space
根驱动器磁盘空间不足。我怎样才能腾出空间?
用于Ubuntu的6款最佳CCleaner替代品

最后修改:2021 年 05 月 18 日
如果觉得我的文章对你有用,请随意赞赏