Tenho experimentado compilar meu próprio kernel e estou tendo dificuldade em adicionar um modificador de versão local ao seguir as instruções de BuildYourOwnKernel . Esta é a "maneira Debian" de compilar um kernel usando fakefoot debian/rules binary-generic
em vez de compilar a partir da linha principal usando make bindeb-pkg
.
Ao seguir as instruções, consigo compilar o kernel com sucesso. No entanto, o +test1
sufixo que adicionei como modificador de versão local só é adicionado ao .deb
arquivo e não em nenhum dos pacotes binários. Como resultado, tenho um conflito durante a instalação, porque o nome corresponde ao kernel atualmente instalado.
Estou usando o servidor Ubuntu 22.04.
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.4 LTS
Release: 22.04
Codename: jammy
Kernel atual:
$ uname -r
5.15.0-113-generic
Aqui estão os passos que segui:
1. Instale dependências
sudo apt build-dep linux linux-image-unsigned-$(uname -r)
sudo apt install fakeroot crash kexec-tools kernel-wedge libncurses5 libncurses5-dev binutils-dev
2. Baixe a fonte
apt source linux-image-unsigned-$(uname -r)
3. Mude para o diretório de origem
cd linux-5.15.0
4. Modificardebian.master/changelog
De acordo com as instruções :
Para tornar seu kernel "mais novo" que o kernel padrão do Ubuntu no qual você se baseia, você deve adicionar um modificador de versão local. Adicione algo como "+test1" ao final do número da primeira versão no arquivo debian.master/changelog, antes de compilar.
Portanto, adicionei +test1
ao final do primeiro número de versão o seguinte:
$ head -n1 debian.master/changelog
linux (5.15.0-113.123+test1) jammy; urgency=medium
5. Construa o kernel
fakeroot debian/rules clean
fakeroot debian/rules binary-headers binary-generic
Após a compilação, você verá que o +test1
sufixo foi adicionado a todos .deb
os arquivos:
$ tree -L 1 /home/mike
/home/mike
├── linux-5.15.0
├── linux_5.15.0-113.123.diff.gz
├── linux_5.15.0-113.123.dsc
├── linux_5.15.0.orig.tar.gz
├── linux-buildinfo-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
├── linux-cloud-tools-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
├── linux-headers-5.15.0-113_5.15.0-113.123+test1_all.deb
├── linux-headers-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
├── linux-image-unsigned-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
├── linux-modules-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
├── linux-modules-extra-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
├── linux-modules-iwlwifi-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
└── linux-tools-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
O problema, entretanto, é que o +test1
sufixo não foi adicionado a nenhum arquivo dentro do .deb
arquivo e, como resultado, há um conflito durante a instalação do kernel.
$ sudo dpkg -i linux-image-unsigned-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
dpkg: regarding linux-image-unsigned-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb containing linux-image-unsigned-5.15.0-113-generic:
linux-image-unsigned-5.15.0-113-generic conflicts with linux-image-5.15.0-113-generic
linux-image-5.15.0-113-generic (version 5.15.0-113.123) is present and installed.
dpkg: error processing archive linux-image-unsigned-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb (--install):
conflicting packages - not installing linux-image-unsigned-5.15.0-113-generic
Errors were encountered while processing:
linux-image-unsigned-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
Os cabeçalhos, no entanto, estão instalados:
$ sudo dpkg -i linux-headers-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
(Reading database ... 138403 files and directories currently installed.)
Preparing to unpack linux-headers-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb ...
Unpacking linux-headers-5.15.0-113-generic (5.15.0-113.123+test1) over (5.15.0-113.123+test1) ...
Setting up linux-headers-5.15.0-113-generic (5.15.0-113.123+test1) ...
/etc/kernel/header_postinst.d/dkms:
* dkms: running auto installation service for kernel 5.15.0-113-generic
...done.
Mas observe que nenhum diretório inclui o sufixo da versão local +test
. Parece que simplesmente substitui os cabeçalhos existentes.
$ tree -L 1 /usr/src
/usr/src
├── linux-headers-5.15.0-113-generic
└── python3.10
Aqui está um trecho do conteúdo de linux-headers-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
:
$ dpkg -c linux-headers-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb | head -n20
drwxr-xr-x root/root 0 2024-07-07 16:31 ./
drwxr-xr-x root/root 0 2024-07-07 16:27 ./lib/
drwxr-xr-x root/root 0 2024-07-07 16:27 ./lib/modules/
drwxr-xr-x root/root 0 2024-07-07 16:27 ./lib/modules/5.15.0-113-generic/
drwxr-xr-x root/root 0 2024-07-07 16:31 ./usr/
drwxr-xr-x root/root 0 2024-07-07 16:31 ./usr/share/
drwxr-xr-x root/root 0 2024-07-07 16:31 ./usr/share/doc/
drwxr-xr-x root/root 0 2024-07-07 16:31 ./usr/share/doc/linux-headers-5.15.0-113-generic/
-rw-r--r-- root/root 714273 2024-07-07 15:58 ./usr/share/doc/linux-headers-5.15.0-113-generic/changelog.Debian.gz
-rw-r--r-- root/root 1292 2024-07-07 15:58 ./usr/share/doc/linux-headers-5.15.0-113-generic/copyright
drwxr-xr-x root/root 0 2024-07-07 16:27 ./usr/src/
drwxr-xr-x root/root 0 2024-07-07 16:27 ./usr/src/linux-headers-5.15.0-113-generic/
-rw-r--r-- root/root 261963 2024-07-07 16:27 ./usr/src/linux-headers-5.15.0-113-generic/.config
-rw-r--r-- root/root 39 2024-07-07 16:27 ./usr/src/linux-headers-5.15.0-113-generic/.gitignore
-rw-r--r-- root/root 1013 2024-07-07 16:27 ./usr/src/linux-headers-5.15.0-113-generic/.missing-syscalls.d
-rw-r--r-- root/root 1818060 2024-07-07 16:27 ./usr/src/linux-headers-5.15.0-113-generic/Module.symvers
drwxr-xr-x root/root 0 2024-07-07 16:27 ./usr/src/linux-headers-5.15.0-113-generic/arch/
drwxr-xr-x root/root 0 2024-07-07 16:27 ./usr/src/linux-headers-5.15.0-113-generic/arch/x86/
drwxr-xr-x root/root 0 2024-07-07 16:27 ./usr/src/linux-headers-5.15.0-113-generic/arch/x86/entry/
drwxr-xr-x root/root 0 2024-07-07 16:27 ./usr/src/linux-headers-5.15.0-113-generic/arch/x86/entry/syscalls/
Aqui está o conteúdo de linux-image-unsigned-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
:
$ dpkg -c linux-image-unsigned-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb
drwxr-xr-x root/root 0 2024-07-07 16:29 ./
drwxr-xr-x root/root 0 2024-07-07 16:26 ./boot/
-rw------- root/root 11680480 2024-07-07 16:26 ./boot/vmlinuz-5.15.0-113-generic
drwxr-xr-x root/root 0 2024-07-07 16:29 ./usr/
drwxr-xr-x root/root 0 2024-07-07 16:27 ./usr/lib/
drwxr-xr-x root/root 0 2024-07-07 16:27 ./usr/lib/linux/
drwxr-xr-x root/root 0 2024-07-07 16:27 ./usr/lib/linux/triggers/
drwxr-xr-x root/root 0 2024-07-07 16:29 ./usr/share/
drwxr-xr-x root/root 0 2024-07-07 16:29 ./usr/share/doc/
drwxr-xr-x root/root 0 2024-07-07 16:29 ./usr/share/doc/linux-image-unsigned-5.15.0-113-generic/
-rw-r--r-- root/root 714273 2024-07-07 15:58 ./usr/share/doc/linux-image-unsigned-5.15.0-113-generic/changelog.Debian.gz
-rw-r--r-- root/root 1292 2024-07-07 15:58 ./usr/share/doc/linux-image-unsigned-5.15.0-113-generic/copyright
Aqui estão alguns resultados finais no final do processo de construção. Tome nota das linhas que indicam a construção do pacote onde o pacote ainda não contém +test1
o .deb
faz.
dpkg-deb: building package 'linux-image-unsigned-5.15.0-113-generic' in '../linux-image-unsigned-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb'.
dh_installchangelogs -plinux-modules-5.15.0-113-generic
dh_installdocs -plinux-modules-5.15.0-113-generic
dh_compress -plinux-modules-5.15.0-113-generic
dh_fixperms -plinux-modules-5.15.0-113-generic -X/boot/
dh_shlibdeps -plinux-modules-5.15.0-113-generic
dh_installdeb -plinux-modules-5.15.0-113-generic
dh_installdebconf -plinux-modules-5.15.0-113-generic
flock -w 60 /home/mike/linux-5.15.0/debian/.LOCK dh_gencontrol -plinux-modules-5.15.0-113-generic -- -Vlinux:rprovides='spl-modules, spl-dkms, zfs-modules, zfs-dkms, v4l2loopback-modules, v4l2loopback-dkms, '
dpkg-gencontrol: warning: Depends field of package linux-modules-5.15.0-113-generic: substitution variable ${shlibs:Depends} used, but is not defined
dpkg-gencontrol: warning: Built-Using field of package linux-modules-5.15.0-113-generic: substitution variable ${linux:BuiltUsing} used, but is not defined
dh_md5sums -plinux-modules-5.15.0-113-generic
dh_builddeb -plinux-modules-5.15.0-113-generic
dpkg-deb: building package 'linux-modules-5.15.0-113-generic' in '../linux-modules-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb'.
if [ -f debian.master/control.d/generic.inclusion-list ] ; then \
dh_installchangelogs -plinux-modules-extra-5.15.0-113-generic; \
dh_installdocs -plinux-modules-extra-5.15.0-113-generic; \
dh_compress -plinux-modules-extra-5.15.0-113-generic; \
dh_fixperms -plinux-modules-extra-5.15.0-113-generic -X/boot/; \
dh_shlibdeps -plinux-modules-extra-5.15.0-113-generic ; \
dh_installdeb -plinux-modules-extra-5.15.0-113-generic; \
dh_installdebconf -plinux-modules-extra-5.15.0-113-generic; \
flock -w 60 /home/mike/linux-5.15.0/debian/.LOCK dh_gencontrol -plinux-modules-extra-5.15.0-113-generic -- -Vlinux:rprovides='spl-modules, spl-dkms, zfs-modules, zfs-dkms, v4l2loopback-modules, v4l2loopback-dkms, ' ; \
dh_md5sums -plinux-modules-extra-5.15.0-113-generic; \
dh_builddeb -plinux-modules-extra-5.15.0-113-generic; \
fi
dpkg-gencontrol: warning: Depends field of package linux-modules-extra-5.15.0-113-generic: substitution variable ${shlibs:Depends} used, but is not defined
dpkg-deb: building package 'linux-modules-extra-5.15.0-113-generic' in '../linux-modules-extra-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb'.
dh_installchangelogs -plinux-modules-iwlwifi-5.15.0-113-generic
dh_installdocs -plinux-modules-iwlwifi-5.15.0-113-generic
dh_compress -plinux-modules-iwlwifi-5.15.0-113-generic
dh_fixperms -plinux-modules-iwlwifi-5.15.0-113-generic -X/boot/
dh_shlibdeps -plinux-modules-iwlwifi-5.15.0-113-generic
dh_installdeb -plinux-modules-iwlwifi-5.15.0-113-generic
dh_installdebconf -plinux-modules-iwlwifi-5.15.0-113-generic
flock -w 60 /home/mike/linux-5.15.0/debian/.LOCK dh_gencontrol -plinux-modules-iwlwifi-5.15.0-113-generic -- -Vlinux:rprovides='spl-modules, spl-dkms, zfs-modules, zfs-dkms, v4l2loopback-modules, v4l2loopback-dkms, '
dpkg-gencontrol: warning: Built-Using field of package linux-modules-iwlwifi-5.15.0-113-generic: substitution variable ${linux:BuiltUsing} used, but is not defined
dh_md5sums -plinux-modules-iwlwifi-5.15.0-113-generic
dh_builddeb -plinux-modules-iwlwifi-5.15.0-113-generic;
dpkg-deb: building package 'linux-modules-iwlwifi-5.15.0-113-generic' in '../linux-modules-iwlwifi-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb'.
dh_installchangelogs -plinux-buildinfo-5.15.0-113-generic
dh_installdocs -plinux-buildinfo-5.15.0-113-generic
dh_compress -plinux-buildinfo-5.15.0-113-generic
dh_fixperms -plinux-buildinfo-5.15.0-113-generic -X/boot/
dh_shlibdeps -plinux-buildinfo-5.15.0-113-generic
dh_installdeb -plinux-buildinfo-5.15.0-113-generic
dh_installdebconf -plinux-buildinfo-5.15.0-113-generic
flock -w 60 /home/mike/linux-5.15.0/debian/.LOCK dh_gencontrol -plinux-buildinfo-5.15.0-113-generic -- -Vlinux:rprovides='spl-modules, spl-dkms, zfs-modules, zfs-dkms, v4l2loopback-modules, v4l2loopback-dkms, '
dpkg-gencontrol: warning: Depends field of package linux-buildinfo-5.15.0-113-generic: substitution variable ${shlibs:Depends} used, but is not defined
dpkg-gencontrol: warning: Built-Using field of package linux-buildinfo-5.15.0-113-generic: substitution variable ${linux:BuiltUsing} used, but is not defined
dh_md5sums -plinux-buildinfo-5.15.0-113-generic
dh_builddeb -plinux-buildinfo-5.15.0-113-generic
dpkg-deb: building package 'linux-buildinfo-5.15.0-113-generic' in '../linux-buildinfo-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb'.
dh_installchangelogs -plinux-headers-5.15.0-113-generic
dh_installdocs -plinux-headers-5.15.0-113-generic
dh_compress -plinux-headers-5.15.0-113-generic
dh_fixperms -plinux-headers-5.15.0-113-generic -X/boot/
dh_shlibdeps -plinux-headers-5.15.0-113-generic
dh_installdeb -plinux-headers-5.15.0-113-generic
dh_installdebconf -plinux-headers-5.15.0-113-generic
flock -w 60 /home/mike/linux-5.15.0/debian/.LOCK dh_gencontrol -plinux-headers-5.15.0-113-generic -- -Vlinux:rprovides='spl-modules, spl-dkms, zfs-modules, zfs-dkms, v4l2loopback-modules, v4l2loopback-dkms, '
dh_md5sums -plinux-headers-5.15.0-113-generic
dh_builddeb -plinux-headers-5.15.0-113-generic
dpkg-deb: building package 'linux-headers-5.15.0-113-generic' in '../linux-headers-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb'.
dh_installchangelogs -plinux-tools-5.15.0-113-generic
dh_installdocs -plinux-tools-5.15.0-113-generic
dh_compress -plinux-tools-5.15.0-113-generic
dh_fixperms -plinux-tools-5.15.0-113-generic -X/boot/
dh_shlibdeps -plinux-tools-5.15.0-113-generic
dh_installdeb -plinux-tools-5.15.0-113-generic
dh_installdebconf -plinux-tools-5.15.0-113-generic
flock -w 60 /home/mike/linux-5.15.0/debian/.LOCK dh_gencontrol -plinux-tools-5.15.0-113-generic -- -Vlinux:rprovides='spl-modules, spl-dkms, zfs-modules, zfs-dkms, v4l2loopback-modules, v4l2loopback-dkms, '
dh_md5sums -plinux-tools-5.15.0-113-generic
dh_builddeb -plinux-tools-5.15.0-113-generic
dpkg-deb: building package 'linux-tools-5.15.0-113-generic' in '../linux-tools-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb'.
dh_installchangelogs -plinux-cloud-tools-5.15.0-113-generic
dh_installdocs -plinux-cloud-tools-5.15.0-113-generic
dh_compress -plinux-cloud-tools-5.15.0-113-generic
dh_fixperms -plinux-cloud-tools-5.15.0-113-generic -X/boot/
dh_shlibdeps -plinux-cloud-tools-5.15.0-113-generic
dh_installdeb -plinux-cloud-tools-5.15.0-113-generic
dh_installdebconf -plinux-cloud-tools-5.15.0-113-generic
flock -w 60 /home/mike/linux-5.15.0/debian/.LOCK dh_gencontrol -plinux-cloud-tools-5.15.0-113-generic -- -Vlinux:rprovides='spl-modules, spl-dkms, zfs-modules, zfs-dkms, v4l2loopback-modules, v4l2loopback-dkms, '
dh_md5sums -plinux-cloud-tools-5.15.0-113-generic
dh_builddeb -plinux-cloud-tools-5.15.0-113-generic
dpkg-deb: building package 'linux-cloud-tools-5.15.0-113-generic' in '../linux-cloud-tools-5.15.0-113-generic_5.15.0-113.123+test1_amd64.deb'.
Então o que está acontecendo?
- Isso é um inseto?
- Isso é intencional e não entendi o processo corretamente?
- Ou estou fazendo algo errado?
O tutorial que mencionei afirmou:
Meu entendimento inicial foi editar a primeira linha da
debian.master/changelog
seguinte forma:No entanto, acho que coloquei o modificador de versão local no local errado. Quando eu o adiciono ao final do número ABI em vez de após o número de upload, o arquivo .deb e todos os pacotes são nomeados de acordo.
Esquema de nomenclatura do kernel
Para explicar as diferentes partes do esquema de nomenclatura do kernel, a pergunta: O que significa um número de versão específico do kernel do Ubuntu? , do wiki do Ubuntu explica:
Lendo o código fonte
Para entender melhor o processo, li vários arquivos de código-fonte onde a versão do kernel
debian.master/changelog
é lida e dividida em várias partes e atribuída a variáveis. Eles são então usados para nomear e construir os pacotes binários.A primeira definição a ser observada é de
debian/debian.env
:Em seguida, o nome do pacote fonte será o primeiro token do
debian.master/changelog
. Isso é definido na linha 7 dedebian/rules.d/0-common-vars.mk
:Na linha 13 de
debian/rules.d/0-common-vars.mk
:Na linha 82 de
debian/rules.d/0-common-vars.mk
:Na linha 84 de
debian/rules.d/0-common-vars.mk
:Na linha 141 de
debian/rules.d/0-common-vars.mk
:Na linha 57 de
debian/rules.d/2-binary-arch.mk
:Na linha 582 de
debian/rules.d/2-binary-arch.mk
:Na linha 600 de
debian/rules.d/2-binary-arch.mk
:Esta linha chama
dh_all
, que é uma diretiva define que começa na linha 550 dedebian/rules.d/2.binary-arch.mk
:A última linha chama
dh_builddeb
, que constrói o pacote binário Debian. (Veja man dh_builddeb para mais informações.)De qualquer forma, para ver os valores de algumas dessas variáveis-chave, você pode executar
debian/rules printenv
a partir do diretório fonte do kernel:Nota Final
Não consegui encontrar muitas informações sobre este tópico específico detalhando a adição de um modificador de versão local. A única fonte que descobri que essencialmente fez a mesma coisa que descrevi aqui é um repositório GitHub, build-ubuntu-kernel . Em seu script de construção , a seção a seguir modifica o número ABI em
debian.master/changelog
: