为什么今天的内核更新需要半 GB 的磁盘空间?

为什么今天的内核更新需要半 GB 的磁盘空间?

我收到了 Ubuntu 20.04 更新的通知。我总是检查更新列表,以确定在更新之前需要进行多认真的备份。今天的内核更新(5.13.0.28.31~20.04.15)需要半 GB 的额外磁盘空间:

$ sudo apt 升级
...
将会安装以下新软件包:
  linux-headers-5.13.0-28-通用 linux-hwe-5.13-headers-5.13.0-28
  Linux-镜像-5.13.0-28-通用 Linux-模块-5.13.0-28-通用
  Linux 模块额外-5.13.0-28-通用
以下软件包将会升级:
  Linux-通用-hwe-20.04 Linux-标头-通用-hwe-20.04
  linux-image-generic-hwe-20.04 linux-libc-dev
4 表示升级,5 表示全新安装,0 表示更新,0 表示不升级
需要获取 95.0 MB 的档案。
这次手术后,将使用 508 MB 的额外磁盘空间

我知道 Ubuntu 允许多个内核共存,因此这个内核必须使用新的磁盘空间,而不是替换现有软件,但它看起来仍然很大。我没有记笔记,但我认为内核更新通常有几百 MB。是我以前从未注意到内核的大小,还是今天的更新有什么不寻常的地方?

答案1

这里发生了一些不同的事情,取决于你的好奇心在哪里……

内核更新以独立包的形式提供,而不是简单的升级

您的大多数系统都以这样的方式打包:提取升级后,它会替换上一个版本。内核的版本号包含在软件包名称中。这样,如果出现问题,您就可以恢复到以前的版本。

您不需要保留旧内核。只要您知道新内核可以正常工作,就可以删除旧内核。sudo apt autoremove将为您完成此操作,但请确保新版本可以正常工作。

内核很大(并且还在不断变大)

我们已经确定了为什么安装更新的内核会占用额外的空间,但是为什么非常空间?

Ubuntu 的内核适用于多种硬件。Canonical 希望它在您插入设备时能够正常工作。每个次要版本都会添加更多驱动程序。删除旧驱动程序的速度通常要慢得多。

因此,随着时间的推移,我们预计内核的大小会大幅增加。Bionic 的 4.15.0-101.102 大小约为 Focal 的 HWE 5.13.0 的 60%。这主要体现在模块数量更少,尤其是在 中modules-extra

认为这是一种进步。对于我们大多数人来说,磁盘空间和带宽都很便宜,因此优先考虑驱动程序支持是有意义的。我认为我们在这里看到的情况并不异常。

但是为什么他们的软件包这么小?94MB的下载量怎么会占用508MB的磁盘空间呢?

它们的压缩效果确实很好。您可以通过下载软件包并使用一些脚本来查看其解压后的大小。

  • 获取软件包:apt download linux-generic-hwe-20.04 linux-headers-generic-hwe-20.04 linux-image-generic-hwe-20.04 linux-headers-5.13.0-28-generic linux-hwe-5.13-headers-5.13.0-28 linux-image-5.13.0-28-generic linux-modules-5.13.0-28-generic linux-modules-extra-5.13.0-28-generic
  • 将它们的“物理”大小与其内容大小进行比较:for f in *.deb; do stat --printf="%5n\t%s\t" "$f"; dpkg -c $f; done

此时,这还很原始。您可以将其放入 Calc 中以显示总计和百分比:

在此处输入图片描述

总计磁盘空间超过 508MB(DKMS 之前也是如此),但您可能已经下载了一些软件包。无论哪种方式,您都会发现有些软件包要大得多。

我想要更小的内核!

你可以拥有它们。只要看一下模块额外包的内容,我就能看到数百兆字节我不需要的东西。唉,不过有些东西我确实需要。

(相当容易)构建自己的内核。有构建脚本(我目前正在使用linux-tkg)。目前磁盘上占用 450MB,但我可以通过助手来运行它,以便将make localmodconfig其内置模块缩减为当前加载的内容。这将削减大约 95% 的模块。

这种方法的问题在于它需要 CPU 时间,而且当有更新时,我也会花时间更新它。你得自己想办法。大多数人都更喜欢使用维护的内核。

答案2

为什么今天的内核更新需要半 GB 的磁盘空间?

事情远比你想象的要复杂。尽管你看到磁盘中 508MB 会被使用,但这是否意味着这些存储空间是永久的?运行一个简单的命令后,将释放近 450MB 的存储空间。

通常,当内核升级时,必须放置新的文件和目录。但是,它不会自动删除旧文件和目录。因此,磁盘使用量会增加。

升级内核后,您可以通过运行以下命令删除一些旧内核模块:

sudo apt autoremove

总的来说,通过删除最旧的内核和模块,它将释放近 450MB 的磁盘空间。


问答

为什么今天的内核更新需要半 GB 的磁盘空间?

这是因为它必须放置新文件。它不会删除旧文件,从而导致磁盘使用时间延长。

我没有记笔记,但我认为内核更新通常需要几百 MB

是的,事实上,这次升级只有 60-80MB。

今天的更新有什么不寻常的吗?

是的,这是一次重大的内核升级。你可能不知道 Ubuntu 20.04 即将升级到第 4 阶段。所以你会得到很多这样的升级。为 Ubuntu 20.04.04 做好准备吧!!


内核为何这么大?

Linux 内核管理和控制硬件资源,如设备或计算机的 I/O(网络、存储、图形和各种用户界面设备等)、内存和 CPU。每次有新的升级时,您都会获得更新的驱动程序和资源,以获得更好的硬件资源。

如果您使用的是带有定制驱动程序的无线网卡,则必须在新内核启动后重新编译驱动程序。但是,其他模块怎么办?您不需要的模块仍在您的系统中。为什么iwlwifi我使用时要安装rtw99?Linux 内核附带数千种适用于各种设备的不同驱动程序。默认情况下,apt将安装所有驱动程序。这是您应该自己编译 Linux 内核的主要原因之一。要自己编译 Linux 内核而不需要不必要的东西,请参阅此主题,评论#2。


下载大小和安装大小之间的差异。

为什么会显示:

需要获取 95.0 MB 的档案。

即使它说“将使用 508 MB 的额外磁盘空间”?

这是因为压缩。

也称为“存档”格式,.deb使用无损压缩算法将大量文件放入一个文件中.deb而不会增加其大小。您可以运行以下命令来查看安装大小和下载大小之间的差异。

apt show linux-generic-hwe-20.04 linux-headers-generic-hwe-20.04 linux-image-generic-hwe-20.04 linux-headers-5.13.0-28-generic linux-hwe-5.13-headers-5.13.0-28 linux-image-5.13.0-28-generic linux-modules-5.13.0-28-generic linux-modules-extra-5.13.0-28-generic | egrep "Size|Package" | grep -v APT

下表显示了差异:

包裹 安装尺寸 下载大小
软件包:linux-generic-hwe-20.04 安装大小:19.5 kB 下载大小:1,928 B
软件包:linux-headers-generic-hwe-20.04 安装大小:19.5 kB 下载大小:2,516 B
软件包:linux-image-generic-hwe-20.04 安装大小:19.5 kB 下载大小:2,628 B
软件包:linux-headers-5.13.0-28-generic 安装大小:24.5 MB 下载大小:2,569 kB
软件包:linux-hwe-5.13-headers-5.13.0-28 安装大小:75.9 MB 下载大小:11.8 MB
软件包:linux-image-5.13.0-28-generic 安装大小:10.2 MB 下载大小:10.0 MB
软件包:linux-modules-5.13.0-28-generic 安装大小:99.3 MB 下载大小:18.3 MB
软件包:linux-modules-extra-5.13.0-28-generic 安装大小:298 MB 下载大小:51.1 MB

我应该删除旧内核吗?

是的,您可以删除旧内核,但这取决于您如何操作系统。

  • 如果您每周/每月有一次破坏系统的习惯,那么保留多个内核是个好主意。

  • 如果您真诚地使用您的系统而不做任何实验,那么删除旧内核是一个好主意。

如何彻底删除旧内核?

要彻底清除所有旧内核:

apt list --installed | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge

仅清除 EoSS 内核:

sudo apt autopurge

或者,拉吉 评论,您可以等待软件更新程序弹出并要求删除旧内核。

答案3

以上所有内容均完全正确。

然而,部分答案(以及上述答案为何有效)是基于 Linux 处理“已删除”文件的方式 - 它不会真的直到所有使用它的人都结束为止都被删除。

示例:
假设有一个应用程序“Super Duper Text Editor”,并且还假设您打开了几个窗口,其中包含您正在编辑的文本。

此外,假设安装了 Super Duper Text Editor 的更新。您现有的编辑会话不会立即被破坏,在您关闭它们后它们就会消失。

像这样:

  1. 您已打开多个文本编辑器实例。
  2. 你更新一下。
    • 更新程序“取消”目录条目与旧文件的链接(或重新创建它),并添加指向新文件的链接,并将原始目录条目标记为“已删除”
    • 您会话的现有链接将保留,直到现有会话关闭为止。
  3. 所有新文件都被添加,但是仍在使用的现有文件不会被销毁,因为它们仍在使用中。
  4. 最终,当您保存工作并关闭窗口时,指向旧文件的活动链接数量将降至零。(请记住,更新包时目录的链接已被删除。)

当指向某个文件的链接数降至零时,则认为该文件已被“删除”,并且该空间将被文件系统恢复以供重新使用,并在超级块和/或卷位图中标记为可用。

最终(或者特别是在重新启动后),所有旧文件都没有链接,并且可以被覆盖。

我确信我遗漏了一些细节,但这就是它的一般运作方式。

相关内容