首先,我不是内核黑客,所以如果我的术语有误等,我深表歉意。
其次,我必须解释一下我们的环境:一台小型单板计算机(不,不是一个 Raspberry pi,但类似的风格),它基于由(无私的)SoC 制造商提供的 SDK/开发堆栈运行 Linux/Busybox,并且基本上是由一大群人一起黑客攻击的埃尔博尼亚代码奴隶零支持。
老式的内核构建和 Busybox 意味着我们无法访问大量常用的更现代的 Linux 命令/工具,modprobe
而这里尤其重要。
虽然我们已尽最大努力驱除大部分 WTFery,但这项工作仍在进行中。
这让我想到了我们现在所处的位置:
在尝试通过删除/禁用不需要的东西来清理内核构建时,我遇到了一个障碍,如果我禁用一些我们可以不需要的东西(例如 CONFIG_DEBUG_FS),则整个堆模块将无法加载(insmod
使用启动过程),例如:
[ 16.490979] loop: disagrees about version of symbol set_blocksize
[ 16.497116] loop: Unknown symbol set_blocksize (err -22)
[ 16.503304] loop: disagrees about version of symbol ioctl_by_bdev
[ 16.509440] loop: Unknown symbol ioctl_by_bdev (err -22)
[ 16.515656] loop: disagrees about version of symbol set_user_nice
[ 16.521898] loop: Unknown symbol set_user_nice (err -22)
[ 16.527686] loop: disagrees about version of symbol add_disk
问题在于内核本身驻留在设备闪存的一个分区中,而用户文件系统(包括 Busybox 和上述模块)以及闪存升级工具驻留在另一分区中。升级例程一次下载并刷新一个分区。
所以我们遇到了第 22 条军规的情况:如果我们更新内核镜像,我们面临主板无法启动的风险,因为 .ko 模块文件系统映像尚未更新,但如果我们更新文件系统映像,我们将面临主板无法启动的风险,因为核心尚未更新。
尽管我们可以通过一些方法来解决这个问题,但它们可能会给客户带来机会,因为他们不遵循说明而破坏主板(如果是的话)可能的打破它,某人将要管理它)。
所以我的问题是:
(如何)我们可以修改内核(主要是删除一些东西)和/或重建模块,以便我们可以从内核+模块等的一个版本转移到更新的版本没有严重破损和失败的临时风险?