我正在按照构建你自己的内核
我从 Ubuntu 的 git main 中获取了一个原始内核
git clone git://kernel.ubuntu.com/ubuntu/ubuntu-focal.git
然后继续配置内核
LANG=C fakeroot debian/rules clean
LANG=C fakeroot debian/rules editconfigs
转至“常规设置/定时器子系统/定时器滴答处理”
点击“完整 Dynticks 系统”
转至“抢占模型”
选择“无强制抢占(服务器)”
对低延迟内核重复此操作,退出时出现这些配置错误
check-config: /tmp/tmp.B1SJkC9a1n/CONFIGS/amd64-config.flavour.generic: loading config
check-config: /src/ubuntu-focal/debian.master/config/annotations loading annotations
check-config: FAIL (n != y): CONFIG_NO_HZ policy<{'amd64': 'y', 'arm64': 'y', 'armhf':
'y', 'i386': 'y', 'ppc64el': 'y', 's390x': 'y'}>
check-config: FAIL (n != -): CONFIG_CONTEXT_TRACKING_FORCE policy<{'amd64': '-',
'arm64': '-', 'armhf': '-', 'i386': '-', 'ppc64el': '-', 's390x': '-'}>
note<LP:1349028> mark<ENFORCED>
check-config: FAIL (n != y): CONFIG_NO_HZ_IDLE policy<{'amd64': 'y', 'arm64': 'y',
'armhf': 'y', 'i386': 'y', 'ppc64el': 'y', 's390x': 'y'}> note<LP:1413968>
check-config: FAIL (y != n): CONFIG_NO_HZ_FULL policy<{'amd64': 'n', 'arm64': 'n',
'armhf': 'n', 'ppc64el': 'n'}>
check-config: FAIL (- != y): CONFIG_TICK_CPU_ACCOUNTING policy<{'amd64': 'y', 'arm64': 'y',
'armhf': 'y', 'i386': 'y', 'ppc64el': 'y', }>
check-config: FAIL (y != n): CONFIG_VIRT_CPU_ACCOUNTING_GEN policy<{'amd64': 'n',
'arm64': 'n', 'armhf': 'n', 'ppc64el': 'n'}>
如果我继续编译二进制文件,它最终将失败。
我感觉我尝试手动调整参数是徒劳无功。这里是不是漏掉了什么步骤?
这些检查配置消息让我很困惑,我不确定它们是什么意思。
注意:我确信我可以完全编译内核而无需上述修改。它可以工作。
答案1
我使用引用的方法编译内核从未取得过多的成功。您尝试进行的配置更改有一些后续配置依赖项,它们似乎对来说是一个挑战check-config
。如果我只进行一项更改,然后让编译过程解决其余部分,我会得到:
doug@s19:~/kernel/linux$ scripts/diffconfig .config-6.0-rc5 .config
-TICK_CPU_ACCOUNTING y
NO_HZ_FULL n -> y
NO_HZ_IDLE y -> n
VIRT_CPU_ACCOUNTING_GEN n -> y
+CONTEXT_TRACKING_USER y
+CONTEXT_TRACKING_USER_FORCE n
+RCU_NOCB_CPU y
+RCU_NOCB_CPU_DEFAULT_ALL n
+VIRT_CPU_ACCOUNTING y
您可以在错误列表中看到其中一些check-config
。使用这方法,内核对我来说编译得很好,尽管 6.0-rc5 延迟较低。
答案2
Canonical 发布了一个有用的指导作为可接受的答案这里:
“注释文件由 Canonical 管理,用于防止在维护期间出现内核配置错误。如果有人修改了内核配置,我们会假设他们知道自己在做什么,并建议他们禁用注释检查。
<...>
要禁用注释检查,可以运行以下命令:
fakeroot debian/rules editconfigs do_enforce_all=false
因此,大多数情况下,不需要实际手动编辑注释,并且可以(并且应该)跳过这些检查do_enforce_all=false
。
注意:当以非交互方式更改配置时,例如使用
scripts/config
,可以将相同的参数传递给fakeroot debian/rules updateconfigs do_enforce_all=false
例外情况是,标有 的规则mark<ENFORCED>
无论如何都会执行。具体来说,CONTEXT_TRACKING_FORCE
被强制执行为未定义。这已完成以防止用户无意中启用它,但是必须在NO_HZ_FULL
启用时定义它。因此,尽管禁用它是正确的做法,但没有办法通过检查。解决方法是注释掉强制执行它的注释行:
sed -e '/LP:1349028/ s/^#*/#/' -i ./debian.master/config/annotations
do_enforce_all=false
请注意,还应传递相同的设置以在构建过程中跳过注释检查:
fakeroot debian/rules do_enforce_all=false binary
答案3
好的,问题解决了。如果您按照该内核指南遇到此问题,则问题在于脚本check-config
会检查内核中的配置是否与他们发布的黄金配置完全相同。
这意味着如果您更改单个配置条目,您将必须编辑文件debian.master/config/annotations
,搜索相应的条目并更改您的平台的设置(在我的情况下是 amd64)。
我犯的另一个错误是debian.master/config/annotations
在尝试编译分支时进行编辑origin/hwe-5.15.0
。如果您不在 master 中,则应该进行编辑debian.hwe-5.15.0/config/annotations
。
一旦您手动完成所有更改,您就可以毫无问题地编译内核。
报告: https://lucisqr.substack.com/p/compiling-a-tickless-kernel-on-ubuntu