我在 TS412 (QNAP) 上运行 Debian Bookworm;它将内核和 initrd 存储在闪存中。它总共有 16MB 闪存。因此,即使在调整 MD 分区之后,我能得到的最好的也是 12MB initrd 。我正在使用 xz 压缩。但即便如此,最初的 initrd 也有 12.5MB。我知道常见的解决方法是减少模块,但它们不是真正的问题。
2984 .../usr/lib/modules
6036 .../usr/share
18824 .../usr/lib/arm-linux-gnueabi
在arm-linux-gnueabi中查看它有像libX11这样的东西...这台机器甚至没有控制台(即使获得串行线也很困难)它当然不需要“X”。
因此,我完全删除了很多软件包(apt-get remove ...),实际上比我应该删除的要多。但结果是一个小得多的 initrd(大约 5MB IIRC),它启动和运行得很好。
问题是,如果我 ssh 到盒子上并运行 emacs(1) ,那么将 GUI 版本投影回我的普通桌面(有大量内存和大显示器等)会很好,但这需要安装TS412 上的 X 客户端库。
现在我不明白为什么仅仅因为我安装了带有 X 客户端库的软件包,就需要在 initrd 上保留一个副本,而在启动过程中不需要它们。有没有办法限制其他东西进入 initrd,而不仅仅是模块(这不是罪魁祸首)
我已经尝试过在文档中搜索限制 initrd 的指南。
可能有一个二进制文件旨在在引导期间显示图形信息,该二进制文件将在initramfs文件中提取它所依赖的库。
大多数架构上都提供这样的二进制文件,其中包括
armel
作为Plymouth插件label.so
提供的插件,以便在启动期间显示带有文本的图形显示。该插件依赖于各种X11库,用于渲染文本。当这个插件被添加到initramfs时,它所依赖的所有库也会被添加,以便它可以在启动阶段使用。这是通过包的依赖项来通告的:depends本身依赖于各种 X11 库包,包括提供库。plymouth-label
plymouth-label
libcairo2
libx11-6
libX11.so.6
添加的 initramfs 钩子
label.so
是/usr/share/initramfs-tools/hooks/plymouth
:copy_exec
是一个 shell 函数(由 提供initramfs-tools-core
),除了复制二进制文件之外,它还会在需要时提取依赖项,依赖于ldd
发现需要的内容。因此,只有在普利茅斯使用非文本设置时才会拉动它......以便显示文本。
由于 QNAP 的主要用途不是视频,因此应避免安装plymouth,尤其是此插件,避免将 X11 库拉入initramfs文件中。
我看不出造成这种行为的任何其他原因。可能有其他类似的包出于类似的原因导致此行为。
遵循@AB有用回复的逻辑。我敲出了一对快速而肮脏的脚本来帮助跟踪依赖树。(AB答案仍然是具体问题的答案)