使用 CONFIG_NO_HZ_FULL 编译 Ubuntu 20.04 内核会导致多个配置错误

使用 CONFIG_NO_HZ_FULL 编译 Ubuntu 20.04 内核会导致多个配置错误

我正在按照构建你自己的内核

我从 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

相关内容