总结:

总结:

我执行了命令 apt autoremove 但这些文件夹仍然存在。

正如命令“du -h -x --max-depth=1 /usr/lib | sort -hr | head -n 10”向我显示的那样,它们目前每个使用了近 1G:

858M    /usr/lib/modules
823M    /usr/lib/x86_64-linux-gnu

我该如何清理它?谢谢。

答案1

我需要这样做,因为在 Chromebook 上使用 Linux 一年多以来,/usr/lib/modules 占用了超过 10GiB 的磁盘空间(这在这个设备上非常宝贵),而且无论如何我只会运行一个内核实例。磁盘空间必要的运行单个内核仅占用~500MiB,相比之下,实际使用的磁盘空间约为5%。

根据我的发行版(KDE Neon,基于 Ubuntu LTS),我自己想出了一个解决方案,它包含多个 Bash 命令来执行以下操作:

  • 检测当前运行的 Linux 版本
  • 检测linux-modules-*属于 Linux 版本的软件包不是目前正在运行
  • 卸载所有未运行的linux-modules-*软件包(及其依赖的软件包)linux-image-*

请注意,我只测试了这个当已经运行时我的发行版上安装的最新 Linux 内核。您的发行版可能附带依赖于元包的软件包,例如基于linux-generic-hwe-20.04Ubuntu 20.04 LTS 的发行版,并且我还没有在安装较新的 Linux 后运行较旧的 Linux 时测试过此脚本。

总结:

sudo apt remove $(dpkg-query --show 'linux-modules-*' | cut -f1 | grep -v "$(uname -r)")

好的,但是那是什么意思呢?

要运行的第一个命令是uname -r。它将打印当前正在运行的 Linux 内核的版本号,格式如下:

$ uname -r
5.15.0-48-generic

了解更多信息man uname

要查看的第二个命令是dpkg-query,它允许我们以不同的方式查询已安装的软件包。您可以使用--list来获得漂亮的交互式显示,但我选择使用--show来简化脚本编写。

$ dpkg-query --show 'linux-modules-*'
linux-modules-5.11.0-44-generic 5.11.0-44.48~20.04.2
linux-modules-5.11.0-46-generic 5.11.0-46.51~20.04.1
# etc.

了解更多信息man dpkg-query

有决心的读者可能会想出如何使用选项--showformat跳过此步骤,但我更喜欢更熟悉的方法 -cut命令。该cut命令仅接受标准输入、提供的可选分隔符-d(默认情况下为制表符)和提供的字段参数-f。在本例中,它获取命令的输出dpkg-query并返回第一列:

$ dpkg-query --show 'linux-modules-*' | cut -f1
linux-modules-5.11.0-44-generic
linux-modules-5.11.0-46-generic
# etc.

了解更多信息man cut

我们通过管道输出进入grep命令,它允许我们选择与特定模式匹配的行 - 或者,在本例中,选择使用选项匹配特定模式-v|--invert-match"$(uname -r)"返回类似于 的行5.15.0-48-generic,然后将其用作 的模式grep。 这就是我们选择所有linux-modules符合 的包的方式不是目前正在运行。

$ dpkg-query --show 'linux-modules-*' | cut -f1 | grep -v "$(uname -r)"
# = dpkg-query --show 'linux-modules-*' | cut -f1 | grep -v "5.15.0-48-generic"
linux-modules-5.11.0-44-generic
linux-modules-5.11.0-46-generic
# etc.

了解更多信息man grep

最后,我们只需将此列表用作命令的参数sudo apt remove,这对于人们来说可能非常熟悉,不需要太多解释:

$ sudo apt remove $(dpkg-query --show 'linux-modules-*' | cut -f1 | grep -v "$(uname -r)")
# = sudo apt remove linux-modules-5.11.0-44-generic linux-modules-5.11.0-46-generic [...]

...但如果是不是对你来说很熟悉,man sudo允许您以 root 身份(系统管理员(或理论上是另一个用户))运行命令,这是使用所必需的man apt,它管理基于 Debian(因此称为 Ubuntu)的发行版上的软件包和依赖项。

答案2

我试图清空 /usr/lib 并想出一种方法:

apt-show-versions |grep "No available version in archive"

将显示任何 sources.list 当前未提供的软件包(针对此 Ubuntu 版本)。如果您一直在进行升级,它包括以前 Ubuntu 版本中手动安装的软件包。问题是,还有一些我想保留的软件包,例如 slack、draw.io 等,因此您需要手动检查不再需要的软件包。

如果您在软件包中找到了确实想要删除的模式,例如 Ubuntu 22.04 上的 Ubuntu 16.04 软件包,您可以运行:

apt-show-versions |grep "No available version in archive" |grep 16.04 |cut -d " " -f1 |xargs apt remove --purge

答案3

简单的说:

理论上,你可以删除你正在使用的机器上不需要的模块,但是如果你在某个地方做错了一步,机器就有可能无法再启动。而且每次内核更新你都必须重复这一步。

容量是 1 GB。磁盘很便宜。可以忍受。

相关内容