我需要编译并安装自己的仿生内核来修复 xhci-pci.c 中的拼写错误
我过去曾成功完成此操作,我想最晚是在 18.04,按照以下说明进行操作:
https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel
但是现在,当我尝试安装新内核(以及开发人员试图帮助我运行修复程序的测试内核)时,dpkg -i 会报错,而且似乎我的更改在重启时没有反映出来。我该如何修复这个问题?
更新:将我在桌面上编译的内核安装到另一台服务器上似乎有效。我推测这是因为服务器上运行的内核版本比桌面上运行的内核版本落后了一些小修订。我认为桌面上运行的小修订号与我尝试编译和安装的相同。相反,开发人员提供的测试内核是一些小修订在后面我的台式机和服务器的问题。之前我把责任归咎于“未签名”的软件包,现在我认为问题出在 dpkg 上。如何强制 dpkg 安装“冲突”的软件包?如何强制它安装倒退的内核?
错误(在桌面系统上)如下:
dpkg: regarding linux-image-unsigned-4.15.0-29-generic_4.15.0-29.31+jeff_amd64.deb containing linux-image-unsigned-4.15.0-29-generic:
linux-image-unsigned-4.15.0-29-generic conflicts with linux-image-4.15.0-29-generic
linux-image-4.15.0-29-generic (version 4.15.0-29.31) is present and installed.
dpkg: error processing archive linux-image-unsigned-4.15.0-29-generic_4.15.0-29.31+jeff_amd64.deb (--install):
conflicting packages - not installing linux-image-unsigned-4.15.0-29-generic
dpkg: regarding linux-image-unsigned-4.15.0-29-lowlatency_4.15.0-29.31+jeff_amd64.deb containing linux-image-unsigned-4.15.0-29-lowlatency:
linux-image-unsigned-4.15.0-29-lowlatency conflicts with linux-image-4.15.0-29-lowlatency
linux-image-4.15.0-29-lowlatency (version 4.15.0-29.31) is present and installed.
dpkg: error processing archive linux-image-unsigned-4.15.0-29-lowlatency_4.15.0-29.31+jeff_amd64.deb (--install):
conflicting packages - not installing linux-image-unsigned-4.15.0-29-lowlatency
答案1
apt-get remove linux-image-4.15.0-29-lowlatency
说不,你不想中止删除正在运行的内核,所以它会被删除。然后
dpkg -i $new-kernel+jeff
将会成功。
答案2
你的猜测基本正确。内核镜像有两种类型的软件包,签名的和未签名的。如果你编译自己的内核,内核镜像不会被签名,并且会被打包成一个名为 的 deb linux-image-unsigned-<version>-generic
,而带有签名镜像的软件包就像 和 一样linux-image-<version>-generic
,是 Ubuntu 中内核镜像的默认选择。似乎只有签名的内核映像可以通过安全启动。
这里要注意的是,这个包linux-image-unsigned-<version>-generic
互相冲突与linux-image-<version>-generic
相同<version>
。自己看看,其中<version>
= 5.4.0-65。特别注意“冲突”字段。
> apt show linux-image-5.4.0-65-generic
Package: linux-image-5.4.0-65-generic
Version: 5.4.0-65.73
Built-Using: linux (= 5.4.0-65.73)
Priority: optional
Section: kernel
Source: linux-signed
Origin: Ubuntu
Maintainer: Canonical Kernel Team <[email protected]>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 11.7 MB
Provides: aufs-dkms, fuse-module, ivtv-modules, kvm-api-4, linux-image, redhat-cluster-modules, spl-dkms, spl-modules, virtualbox-guest-dkms, virtualbox-guest-modules, zfs-dkms, zfs-modules
Depends: kmod, linux-base (>= 4.5ubuntu1~16.04.1), linux-modules-5.4.0-65-generic
Recommends: grub-pc | grub-efi-amd64 | grub-efi-ia32 | grub | lilo, initramfs-tools | linux-initramfs-tool
Suggests: fdutils, linux-doc | linux-source-5.4.0, linux-tools, linux-headers-5.4.0-65-generic
Conflicts: linux-image-unsigned-5.4.0-65-generic
Download-Size: 8,898 kB
APT-Sources: http://us.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages
Description: Signed kernel image generic
A kernel image for generic. This version of it is signed with
Canonical's UEFI/Opal signing key.
有了这些知识,解码原始错误消息就相当容易了。第一个错误消息
dpkg: regarding linux-image-unsigned-4.15.0-29-generic_4.15.0-29.31+jeff_amd64.deb containing linux-image-unsigned-4.15.0-29-generic:
linux-image-unsigned-4.15.0-29-generic conflicts with linux-image-4.15.0-29-generic
linux-image-4.15.0-29-generic (version 4.15.0-29.31) is present and installed.
简单地说,两种类型的内核映像包发生冲突,其中<version>
= 4.15.0-29。当已安装签名的软件包时,无法安装未签名的软件包。第二条错误消息警告有关另一个版本的软件包的相同问题。
现在进入解决方案部分。您可以linux-image-4.15.0-29-generic
先安全地卸载,然后安装linux-image-unsigned-4.15.0-29-generic_4.15.0-29.31+jeff_amd64.deb
。更一般地说,要安装linux-image-unsigned-<version>-generic
,请先卸载linux-image-<version>-generic
相应的<version>
。
但有时事情并不那么简单。就我而言,我无法卸载签名的软件包,因为它是元软件包的依赖项linux-image-generic
。该元软件包始终依赖于最新的内核映像包,它是的依赖项linux-generic
,它是一个引入完整内核安装的元包(它的依赖树)。要卸载签名的软件包,我还必须删除linux-image-generic
和linux-generic
,这可能会导致更新出现问题。
答案3
您的 Deb 软件包包含与旧的同名软件包冲突的相同文件。您应该删除旧软件包,或者在编译内核时更改 debian 文件夹中的版本设置。这可能会使文件名唯一化。但很难预测。我会删除旧的冲突内核。
请记住,您已有的内核是在工厂的安全环境中构建的。您构建的内核可能存在显著差异,因为它会记录您系统的内容,甚至可能使用不同的编译器和 dpkg 构建策略。即使使用原始系统的源包,您构建的内核也无法互换。