排查 ‘You don‘t have enough free space in /var/cache/apt/archives/‘ 错误

原文链接:https://www.marksayson.com/blog/investigating-space-issues-in-var-cache-apt-archives/

我最近在升级Debian Linux中遇到一些问题,因为 You don't have enough free space in /var/cache/apt/archives/ 这个错误,为了解决这个问题的根本原因,我花了一个钟左右的时间(一个程序占用太多空间)。希望这篇文章能够帮助遇到这个问题的其他人减少一些调试时间。

升级依赖包

Debian在升级依赖包上有一个完备的指南(请参阅升级稳定版测试版发布的指南),它能很好对常见问题追踪并给出一些解决办法。

我能够通过运行 sudo apt update 来拉取最新能用的包文件列表,通过运行 sudo apt-get upgrade 来升级包,以上命令不会删除或者安装其他包。然而,当运行 sudo apt full-upgrade 命令来完成操作系统升级的主要部分时,进程报错并且给出以下信息:

E: You don't have enough free space in /var/cache/apt/archives/

Debian指南有一些关于如何释放空间的提示,这是一个很好的开始,之后我必须进一步弄清楚到底是什么占用了/var中的全部空间。

从基本开始

第一步通过 sudo apt-get autoremove命令,是为了清楚无需要的包,下一步通过 sudo apt-get clean命令,来移除在包缓存中的旧的安装文件。

在这种情况下还不够,我仍然没有足够的空间来运行系统的升级程序。

卸载不再需要的包

StackOverflow上的答案提供了以下命令,用于列出手动安装的软件包,而不是来自基本Debian安装的软件包:

sudo grep -oP "Unpacking \K[^: ]+" /var/log/installer/syslog | sort -u | comm -13 /dev/stdin <(apt-mark showmanual | sort)

注意:生成的列表仍将包含一些可能无法安全卸载的软件包。然而,如果你看见你不再需要的包,你可以将它们标记为自动安装,以便向包管理器发出信号:如果没有其他已安装的包依赖于它们,则可以安全卸载它们。

# 用你觉得不再需要的包的包名替换PACKAGENAME,标记这个包是自动安装的
sudo apt-mark auto PACKAGENAME # eg. sudo apt-mark auto 2048-qt

经过标记几个包(例如mutt和2048-qt)为自动安装的操作之后,我运行 sudo apt-get autoremove 命令卸载所有标记为自动安装和不依赖于任何其他已安装包的包。

这样就清理了几百兆字节,但这不是我升级操作系统所需的千兆字节。

隔离占用最多空间的目录

df是一个有用的工具,用于报告挂载文件系统的磁盘空间使用情况,其中df -h以更可读的格式显示大小(例如:26G,而不是26G的27262976)。
df -h立即显示仅仅我的根文件系统就使用了26G中的23.8G,留下的空间不足以下载系统更新所需的所有包。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.9G     0  2.9G   0% /dev
tmpfs           586M  8.5M  577M   2% /run
/dev/sda6        26G  23.8G 2.2G  92% /
tmpfs           2.9G   45M  2.9G   2% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           2.9G     0  2.9G   0% /sys/fs/cgroup
/dev/sda2       256M   56M  201M  22% /boot/efi
/dev/sda8       157G   58G   91G  39% /home
tmpfs           586M   12K  586M   1% /run/user/1000

du 工具根据特定的文件或目录评估文件空间使用情况,我使用下面的命令检查 /var 中最大的磁盘空间消耗者是谁,因为我需要更多的空间用于 /var/cache/apt/archives/。

$ sudo du -h --max-depth=1 /var | sort -h | tail -n 10
[sudo] password for mark:
4.0K  /var/local
4.0K  /var/opt
1.4M  /var/mail
1.9M  /var/spool
12M /var/tmp
16M /var/backups
20M /var/log
1020M /var/cache
14.7G /var/lib
15.7G /var

/var/lib 是一个明显的异常值,它几乎占据了/var 中的所有空间。

通过在 /var/lib 上运行该命令,而不是在 /var 上,我们可以检查该目录中的最大占用者。

$ sudo du -h --max-depth=1 /var/lib | sort -h | tail -n 10
4.1M  /var/lib/aspell
8.3M  /var/lib/gems
8.5M  /var/lib/tor
8.7M  /var/lib/texmf
17M /var/lib/aptitude
26M /var/lib/mlocate
38M /var/lib/postgresql
85M /var/lib/dpkg
130M  /var/lib/apt
14.4G /var/lib/docker
14.7  /var/lib

啊哈,Docker正在吃掉我所有的根硬盘空间,可能它是通过程序文件和Docker映像的组合。

卸载 docker

我很乐意清除我的docker系统,因为我并没有积极地使用它,并且可以在以后再使用它。这篇AskUbuntu文章很有帮助,因为它收集了完全卸载docker的一系列步骤。

sudo apt-get purge -y docker*
sudo apt-get autoremove -y --purge docker*
sudo rm -rf /var/lib/docker /etc/docker
sudo rm /etc/apparmor.d/docker
sudo groupdel docker
sudo rm -rf /var/run/docker.sock
sudo rm /usr/local/bin/docker-compose

验证成功

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.9G     0  2.9G   0% /dev
tmpfs           586M  8.5M  577M   2% /run
/dev/sda6        26G  9.4G   15G  39% /
tmpfs           2.9G   45M  2.9G   2% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           2.9G     0  2.9G   0% /sys/fs/cgroup
/dev/sda2       256M   56M  201M  22% /boot/efi
/dev/sda8       157G   58G   91G  39% /home
tmpfs           586M   12K  586M   1% /run/user/1000

非常好,我们又回到了使用26G根文件系统中的9.4G

在这之后,我就可以继续 Debian升级指南 中的步骤来完成升级,并且没有任何问题。

参考

  • Debian 稳定发行版升级指南: https://www.debian.org/releases/stable/amd64/release-notes/ch-upgrading.en.html
  • StackOverflow上列出手动安装包的帖子: https://stackoverflow.com/a/60252818
  • AskUbuntu关于如何完全卸载docker的帖子: https://askubuntu.com/questions/935569/how-to-completely-uninstall-docker
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值