我收到了 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 的更新。您现有的编辑会话不会立即被破坏,在您关闭它们后它们就会消失。
像这样:
- 您已打开多个文本编辑器实例。
- 你更新一下。
- 更新程序“取消”目录条目与旧文件的链接(或重新创建它),并添加指向新文件的链接,并将原始目录条目标记为“已删除”
- 您会话的现有链接将保留,直到现有会话关闭为止。
- 所有新文件都被添加,但是仍在使用的现有文件不会被销毁,因为它们仍在使用中。
- 最终,当您保存工作并关闭窗口时,指向旧文件的活动链接数量将降至零。(请记住,更新包时目录的链接已被删除。)
当指向某个文件的链接数降至零时,则认为该文件已被“删除”,并且该空间将被文件系统恢复以供重新使用,并在超级块和/或卷位图中标记为可用。
最终(或者特别是在重新启动后),所有旧文件都没有链接,并且可以被覆盖。
我确信我遗漏了一些细节,但这就是它的一般运作方式。