根目录的磁盘空间快要用完了。我该如何释放空间?

我正在使用Ubuntu 11.04,并且我想要释放一些根目录中的空间,因为它已经超载了。我特别想更改用于安装应用程序的路径(它们直接安装到根驱动器)。
另一个考虑因素是我正在使用MySQL数据库服务器。服务器安装在根目录中本身,因此我不想冒失失去任何数据。
请给我一些提示来帮助解决这个问题。
16个回答

我成功地通过删除旧的头文件和图像来清除了3.5 GB的空间。

请注意,在某些系统上,这也会尝试删除 当前 内核,这并不是一个好主意 - 请查看下面的评论以了解如何进行检查。

我使用了以下命令:

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

您可以通过执行命令的第一部分来查看将被清除的软件包。
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

参考资料


1其他方法都没用,但这个帮我省了大约5G。谢啦。 - baltasvejas
4在apt-get命令中,选项-y并不是真正必要的。如果你省略它,apt-get会询问你(只问一次),是否要删除所有通过管道传输的软件包。我个人认为最好不要使用-y,这样你就有了另外一个检查的机会(除了上面提到的第二个命令)。对我来说,这样做在根分区上释放了15GB的空间! - Boris Däppen
4命令 dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge 试图移除我系统中当前安装的内核版本。请小心,避免使您的系统无法启动。 - HelloWorld101
@Antony 哎呀!我正准备尝试这个。我怎么知道哪些是可以删除的? - Sonic Soul
7@SonicSoul 最终我最终采取了下面一个答案(https://askubuntu.com/a/778442/333806)建议的做法。基本上,运行 uname -r 查找当前内核并确保不要移除它。如果由 homebrand 提供的检查将被清除的包未显示出当前内核,则可以安全地运行他提到的清除命令。 - HelloWorld101
非常好。但请注意,您的系统可能会像我的一样认为它可以清除当前正在使用的内核。Debian在清除之前会发出警报,幸运的是。 - Jos
@Antony 这是一个很好的安全检查。 - Carmine
不小心忽略了警告,意外删除了我所有的Kali内核 :( 现在我无法使用我的笔记本电脑了 - BlueBeret

最近我遇到了类似的情况。安装了太多应用程序,它们开始占用我的根挂载空间。我列出了一些我采取的步骤,并希望你也可以使用相同的方法。
1. 清理 apt-get 缓存。以下命令将从 apt-get 缓存目录中删除所有已下载的 deb 文件。 运行此命令:sudo apt-get clean
2. 将 /home 挂载点移动到不同的驱动器。以前,我的主文件夹位于根驱动器上。所以我将我的主文件夹移动到了独立的驱动器上。这帮助我释放了根挂载的很多压力,因为大多数应用程序都将它们的数据存储在 /home/user_name/ 文件夹中。阅读如何将主文件夹移动到独立驱动器
3. 增加根分区的大小。我知道这是一个非常明显的答案。但请相信我,我们的数据会随着时间的推移而发生变化。我原本认为 20 GB 的根挂载足够了,但在一年内,我重新调整了根挂载的大小,增加到了 50 GB。

14sudo apt-get clean释放了比预期更多的空间,+1 - btk
请注意,apt-get clean 命令会连同已安装的软件包一并删除。如果升级失败,您可能希望保留这些软件包。 - timss
我清理了缓存,释放了10 Gb的空间!+1 - Numeri
1根据apt-get的手册,你可以在APT的配置文件(/etc/apt/apt.conf)中添加APT::Clean-Installed "off";,然后使用apt-get autoclean命令。这样安装的软件包就不会被删除了。 - Giuseppe

使用dpkg-query查找最大的软件包并删除您不再需要的软件包(source):
dpkg-query --show --showformat='${Package;-50}\t${Installed-Size}\n' | sort -k 2 -n | grep -v deinstall | awk '{printf "%.3f MB \t %s\n", $2/(1024), $1}'

2现在这是一个非常有用的一行代码。非常适合快速总结最大的安装包。来看看我的dotfiles吧! - arainone
你可以通过wajig sizes获得这个。 - Pablo Bianchi
有没有关于如何学习以掌握这样的指令写作的建议? - Carmine
这对于查找大型软件包非常有用,但我想补充一点,即使在卸载后,您可能会发现未安装的软件包仍然列在其中。要完全删除它们,您需要使用sudo apt purge packagename而不仅仅是sudo apt remove packagename - stragu
我正在努力为这个创建一个别名,但是遇到了错误:bash: syntax error near unexpected token \(' 。我尝试使用\转义'"`字符,但没有起作用。 - Paidoo

这是我运行的一个脚本,用来释放根分区上的空间。
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
    snap list --all | while read snapname ver rev trk pub notes; do
        if [[ $notes = *disabled* ]]; then
            snap remove "$snapname" --revision="$rev"
        fi
    done
    ## Set snap versions retain settings
    if [[ $(snap get system refresh.retain) -ne 2 ]]; then snap set system refresh.retain=2; fi
    rm -f /var/lib/snapd/cache/*

    ## Remove old versions of Linux Kernel
    # This one-liner is deprecated since 18.04
    # dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs apt-get -y purge
    # New 2 lines to remove old kernels
    dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs apt-get -y purge
    dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs apt-get -y purge

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

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

编辑:新的两行旧内核清除程序 - cmak.fr
谢谢!"旋转并删除旧日志"可以清理我的驱动器上的几个G的空间。 - SaTa
4不错。开发者们也可以考虑删除未使用的Docker镜像docker system prune - Pablo Bianchi
1@Pablo A 他们也可以查看/var/crash/*.crash文件夹下的内容。 - cmak.fr
由于您需要使用sudo来调用该函数,函数内部的sudo似乎是多余的。另外,vacuum-time=1s可能并不总是有效,但我不确定,因为我使用的是vacuum size而不是vacuum-time=1s:https://forum.manjaro.org/t/does-journalctl-vacuum-time-ever-worked-for-you/45872/4 - WinEunuuchs2Unix
1我按照上述步骤使用了以下命令,成功释放了3.5GB的空间,现在我的根目录已经填满了60%。感谢命令:find / -xdev -name core -ls -o -path "/lib*" -pruneapt-get autoremove --purgedpkg -l "linux*" |grep ^.i,然后使用sudo apt-get purge linux-**-oldversion清理了旧版本的Linux安装,并通过apt-get install -f验证了安装。 - Doogle
1请不要运行这个!https://i.imgur.com/LjxyWsN.png - kellogs

sudo apt autoclean  # clean /var/cache/apt/archives folder which save packages while install.
sudo apt autoremove # this command remove unused packages.

sudo shutdown -rf   # it will restart your PC immediately and check filesystem in next boot.

30你没有提供任何解释。如果有人只是复制/粘贴你的代码,那么系统将会在没有警告的情况下关闭,可能导致数据丢失。请不要提供没有任何解释的命令。-1 - Jo-Erlend Schinstad
10为什么需要检查文件系统? - Nathan Osman

当我需要在服务器上释放更多的空间时,我使用这个命令:
find / -type f -size +50M -exec du -h {} \; | sort -n

它查找所有大于50 MB的文件,"du -h"会创建一个更好的文件列表,并且在管道后面使用"sort -n"可以按文件大小进行数字排序。


根据您的系统大小,这可能需要一些时间。在HDD上处理大约500GB的数据花费了我15分钟。 - Gabriel Fair
3如果你想要在根目录下释放空间,可以添加“-mount”参数,例如将上述命令修改为“find / -mount -type ...”,这样可以限制只搜索根分区上的文件(而不会列出其他挂载在根目录下的分区或目录中的文件)。 - Bob

如果你还没有去做的话,删除旧的内核版本(如homebrand所建议)可以释放相当多的空间。

有很多方法可以删除旧的内核版本,而且在如何删除旧的内核版本以清理启动菜单?的回答中可以找到各种不同的选项。

我更喜欢penreturns的这个答案,它将步骤分解得相当简单易懂:

打开终端并检查当前的内核: uname -r 不要删除这个内核!
接下来,输入以下命令以查看/列出系统上安装的所有内核。 dpkg --list | grep linux-image 找到所有低于当前内核版本的内核。 当你知道要删除哪个内核时,请继续以下步骤进行删除。
运行以下命令以删除您选择的内核。 sudo apt-get purge linux-image-x.x.x.x-generic
完成清除后,答案中建议执行'update-grub2',但这可能已经过时了:对于Ubuntu 14.04及更高版本,只需执行sudo update-grub即可。然后他们说要“重新启动系统”(这似乎是为了让您看到清理后的启动菜单),所以在这种情况下不是必需的。
引导加载程序菜单以前在主页上显示所有旧的内核版本,但现在它们被放在一个子菜单后面。这样更整洁,但对于新来的Ubuntu/Linux用户可能不知道它们占用了空间。
建议不要删除当前的内核,并且也建议保留先前的内核版本,以防需要回滚到那个版本。
有更快的方法可以做到这一点,但我更喜欢这种简单的方法,主要是因为我可以理解每个命令的含义:
“我正在使用哪个内核版本?我有哪些内核版本?好的,清除掉那个。”
反复操作,欣赏你所释放出的空间。
从终端中使用dpkg --list | grep linux-image命令得到的结果中,很容易复制想要删除的特定旧内核的名称,然后使用sudo apt-get purge并粘贴复制的名称。
删除3或4个旧内核通常会在根目录中释放约1GB的空间。

1除了 linux-image 之外,您还可以使用 grep 命令查找并清除 linux-headers。 - kdopen
提示:您可以将多个标题名称作为参数传递给sudo apt-get,以一次性删除它们。 - redDevil

根据Ubuntu社区文档上的指示,我发现了一个庞大的垃圾文件,看起来像是/var/log/syslog.1的备份。很可能有什么东西在向syslog不断输出大量内容...
找到它的命令是:
sudo find / -size +1G

然后,文件夹中名为.Trash的任何大文件都可以删除...


对我来说,问题是悬空和未使用的Docker镜像和卷。
我使用以下命令来查找可以回收多少空间:
docker system df

接下来,如果您只想修剪悬挂的图像:

docker system prune 

如果你想彻底清洁并进行深度修剪,那就要用力修剪:
docker system prune -af --volumes

我成功回收了大约70GB的空间。我的日常工作涉及很多与Docker相关的工作。

我已经回收了大约3GB的空间。谢谢。 - arshovon

在Ubuntu中,每个文件夹都可以拥有自己的文件系统。这意味着你可以将任何文件夹移动到自己的分区、另一个磁盘甚至远程网络上。这在家庭目录中特别受欢迎,因为这意味着你可以重新安装Ubuntu而不改变个人设置或丢失任何文件。它在需要用户能够登录不同机器并获取其个人设置和文件的网络中也很受欢迎。但它在许多不同情况下都非常有用,比如你的情况。
应用程序并不是安装在特定的文件夹中,就像你所认为的那样。应用程序的不同部分被放置在文件系统的不同位置。主程序通常放置在/usr/bin目录下,而配置文件则放置在/etc目录下,例如。在你的情况下,MySQL数据库本身被放置在/var某个位置。我想是/var/mysql。
由于/usr和/var都是根文件系统中的目录,它们将使用根文件系统的空间。但正如我所说,你可以将它们移动到不同的文件系统中。在MySQL的情况下,你可以配置数据库的存储位置。例如,你可以轻松地将数据库移动到/home/username/.mysql/databases。