修改debian内核源码并打包

建议先看完后面的问题,把相关包安装上再操作,不然很麻烦

修改并重编内核

查看内核版本

假设我们有个debian系统,uname -a如下,5.10.0-26-amd64是debian版本号,5.10.197-1是内核版本号

root@XXX:/tmp/linux-5.10.197# uname -a
Linux XXX 5.10.0-26-amd64 #1 SMP Debian 5.10.197-1 (2023-09-29) x86_64 GNU/Linux

所以我们应该找的是5.10.197-1内核

下载对应源码

http://deb.debian.org/debian/pool/main/l/linux/

在这可以找到对应的源码版本

使用dget方式
apt install devscripts
dget http://deb.debian.org/debian/pool/main/l/linux/linux_5.10.197-1.dsc
直接下载

找到对应的源码和debian文件直接下载

这是一张图片

其中linux_5.10.197.orig.tar.xz就是内核源码,linux_5.10.197-1.debian.tar.xz中是debian的一些配置和内核patch之类的

解压

tar -xf linux_5.10.197.orig.tar.xz
tar -xf linux_5.10.197-1.debian.tar.xz
##解压出来应该是两个目录一个debian目录,一个linux-5.10.197目录,把debian目录放到linux-5.10.197/下
mv debian linux-5.10.197/

安装必要包

(前面那些行不知道是不是必要的,是当时搞ubuntu的时候需要的,就先安装上了)

sudo apt-get install libncurses5-dev openssl libssl-dev -y
sudo apt-get install build-essential openssl -y
sudo apt-get install pkg-config -y
sudo apt-get install libc6-dev -y
sudo apt-get install bison -y
sudo apt-get install flex -y
sudo apt-get install libelf-dev -y
sudo apt-get install zlibc minizip -y
sudo apt-get install libidn11-dev libidn11 -y
sudo apt install dwarves -y
sudo apt-get install imagemagick graphviz dvipng python3-venv fonts-noto-cjk latexmk librsvg2-bin texlive-lang-chinese texlive-xetex -y
pip install -r ./Documentation/sphinx/requirements.txt
sudo apt install quilt -y

应用patch

cd linux-5.10.197
export QUILT_PATCHES=debian/patches
quilt setup debian/patches/series	#初始化
quilt push -a	#应用


quilt applied	#查看应用状态,如果patch已经全部应用上了则成功

修改

这里可以直接对内核源码进行修改

小修验证一些内容的话就直接修改源码就好了

如果正规的修改应该还是打patch的方式,应该是写入debian/patches/series这个然后把patch放到对应的地方(我没试过猜的)

配置内核

debian/rules debian/control

构建内核

debian/rules binary

安装新内核

制作好的内核就在上一级目录中,比如linux-image-5.10.0-26-amd64-unsigned_5.10.197-1_amd64.deb

不过需要先把就内核卸载掉,如果是相同版本的内核的话

dpkg --purge --force-depends linux-image-5.10.0-26-amd64
dpkg -i linux-image-5.10.0-26-amd64-unsigned_5.10.197-1_amd64.deb

问题

构建内核时报错

loading translations [en]... done
WARNING: while setting up extension sphinx.addnodes: node class 'meta' is already registered, its visitors will be overridden

Sphinx version error:

可能是sphinx这些版本太低了,更新一下

pip install --upgrade sphinx sphinxcontrib-applehelp

构建内核时报错

Sphinx parallel build error:
AttributeError: module 'docutils.nodes' has no attribute 'reprunicode'
make[4]: *** [Documentation/Makefile:119: xmldocs] Error 2
make[3]: *** [Makefile:1712: xmldocs] Error 2

可能是docutils不兼容,升级一下

pip install --upgrade docutils

升级还不行的话,可以看看docutils版本是不是在0.21及以上了?

https://github.com/sphinx-doc/sphinx/issues/12340

这里提到0.21版本中删掉了reprunicode属性,因此可以重新安装0.20版本来解决此问题

pip install docutils==0.20

构建内核时出错

filterdiff --remove-timestamps --strip=1 --addoldprefix=a/ --addnewprefix=b/ | \
xz -c >debian/build/linux-patch-5.10-rt.patch.xz ||							\
(rm -f debian/build/linux-patch-5.10-rt.patch.xz; exit 1)
diff: source_none/patches: recursive directory loop
diff: source_none/quilt_patches: recursive directory loop
diff: source_rt/quilt_series: No such file or directory
diff: source_rt/series: No such file or directory
make[2]: *** [debian/rules.real:141: debian/build/linux-patch-5.10-rt.patch.xz] Error 1
make[2]: Leaving directory '/tmp/linux-5.10.197'
make[1]: *** [debian/rules.gen:414: binary-indep] Error 2
make[1]: Leaving directory '/tmp/linux-5.10.197'
make: *** [debian/rules:47: binary-indep] Error 2

这是因为rt的patch有些问题

看上去是这样,打包debian的deb时其实会产生两个不同的deb,一种none(大多数就是用这个),一种rt(加了real time补丁的)。。。但其实,看上去我们并不需要对rt补丁进行打包,这个可以看一下我们的内核是不是通用的那种

##如下,可见5.10.0-26-amd64中没有带rt字样,说明是none生成的
root@XX:/tmp/linux-5.10.197# uname -a
Linux XX 5.10.0-26-amd64 #1 SMP Debian 5.10.197-1 (2023-09-29) x86_64 GNU/Linux

##那么rt内核是什么样子的呢?如下,版本后面带着rt
root@XX:/tmp/linux-5.10.197# apt list linux-image* |grep rt
linux-image-5.10.0-25-rt-amd64/oldstable-security 5.10.191-1 amd64
linux-image-5.10.0-27-rt-amd64/oldstable-security 5.10.205-2 amd64
linux-image-5.10.0-29-rt-amd64-dbg/oldstable-security 5.10.216-1 amd64
linux-image-5.10.0-29-rt-amd64-unsigned/oldstable-security 5.10.216-1 amd64
linux-image-5.10.0-29-rt-amd64/oldstable-security 5.10.216-1 amd64
linux-image-5.10.0-30-rt-amd64-dbg/oldstable,oldstable-security 5.10.218-1 amd64
linux-image-5.10.0-30-rt-amd64-unsigned/oldstable,oldstable-security 5.10.218-1 amd64
linux-image-5.10.0-30-rt-amd64/oldstable,oldstable-security 5.10.218-1 amd64
linux-image-5.10.0-31-rt-amd64-dbg/oldstable-security 5.10.221-1 amd64
linux-image-5.10.0-31-rt-amd64-unsigned/oldstable-security 5.10.221-1 amd64
linux-image-5.10.0-31-rt-amd64/oldstable-security 5.10.221-1 amd64

所以这就好解决了,rt我们直接不编了就可以了

直接vim debian/rules.gen然后把ALL_FEATURESETS = ‘none rt’中的rt去掉

然后clean并重新编译

debian/rules clean
debian/rules binary

构建内核时报错

Can't exec "/tmp/linux-5.10.197/debian/linux-cpupower.install": No such file or directory at /usr/share/perl5/Debian/Debhelper/Dh_Lib.pm line 1538.
dh_install: error: cannot run debian/linux-cpupower.install: No such file or directory

解决,,可以看这里

https://askubuntu.com/questions/982078/install-non-executable-files-with-dh-install/1047319#1047319

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=901715

是因为这是 dh-install 的一个bug,dh_install tries to run files listed in my “.install” file instead of adding them when the “.install” file has executable permissions.

chmod -x debian/*.install

构建内核时报错

cp debian/lib/python/debian_linux/*.py debian/linux-support-5.10.0-26/usr/share/linux-support-5.10.0-26/lib/python/debian_linux
dh_python3
bash: line 1: dh_python3: command not found

解决

apt-get install dh-python

构建内核时报错

/bin/sh: 1: bc: not found
make[5]: *** [/tmp/linux-5.10.197/./Kbuild:24: include/generated/timeconst.h] Error 127
make[4]: *** [/tmp/linux-5.10.197/Makefile:1232: prepare0] Error 2

解决

apt install bc

构建内核时报错

13\002; } > arch/x86/boot/compressed/vmlinux.bin.lz4
/bin/sh: 1: lz4c: not found
make[6]: *** [/tmp/linux-5.10.197/arch/x86/boot/compressed/Makefile:138: arch/x86/boot/compressed/vmlinux.bin.lz4] Error 127
make[6]: *** Deleting file 'arch/x86/boot/compressed/vmlinux.bin.lz4'

解决

apt install liblz4-tool

构建内核时报错

/bin/sh: 1: rsync: not found
make[4]: *** [/tmp/linux-5.10.197/Makefile:1354: headers_install] Error 127
make[4]: Leaving directory '/tmp/linux-5.10.197/debian/build/build-tools/headers-tools'

解决

apt install rsync

构建内核时报错

/usr/bin/ld: cannot find -liberty
collect2: error: ld returned 1 exit status

解决

apt install libiberty-dev

构建内核时报错

/bin/sh: 2: asciidoctor: not found
make[4]: *** [Makefile:290: /tmp/linux-5.10.197/debian/build/build-tools/tools/perf/perf-annotate.1] Error 127

解决

apt install asciidoctor -y

构建内核时报错

make[5]: Entering directory '/tmp/linux-5.10.197/tools/bpf/bpftool/Documentation'
Makefile:44: *** "rst2man not found, but required to generate man pages".  Stop.
make[5]: Leaving directory '/tmp/linux-5.10.197/tools/bpf/bpftool/Documentation'

解决

apt install python3-docutils -y

构建内核时报错

configure: error: Missing /usr/include/libudev.h
make[3]: *** [/tmp/linux-5.10.197/debian/rules.d/tools/usb/usbip/Makefile:15: all] Error 1

解决

apt install libudev-dev -y

构建内核时报错

checking whether to use the libwrap (TCP wrappers) library... yes
checking for hosts_access in -lwrap... not found
make[3]: *** [/tmp/linux-5.10.197/debian/rules.d/tools/usb/usbip/Makefile:15: all] Error 1

解决

apt install libwrap0-dev

构建内核时报错

/build-tools/tools/power/cpupower/utils/helpers/amd.o -c utils/helpers/amd.c
utils/helpers/amd.c:8:10: fatal error: pci/pci.h: No such file or directory
    8 | #include <pci/pci.h>
      |          ^~~~~~~~~~~
compilation terminated.
make[4]: *** [Makefile:214: /tmp/linux-5.10.197/debian/build/build-tools/tools/power/cpupower/utils/helpers/amd.o] Error

解决

apt install libpci-dev

构建内核时报错

/tmp/linux-5.10.197/tools/power/x86/turbostat/turbostat.c:33:10: fatal error: sys/capability.h: No such file or directory
   33 | #include <sys/capability.h>
      |          ^~~~~~~~~~~~~~~~~~
compilation terminated.
make[4]: *** [<builtin>: turbostat] Error 1

解决

apt install libcap-dev

构建内核时报错

Can't exec "debian/linux-image-5.10.0-26-amd64-dbg.lintian-overrides": No such file or directory at /usr/share/perl5/Debian/Debhelper/Dh_Lib.pm line 2595.
dh_lintian: error: cannot run debian/linux-image-5.10.0-26-amd64-dbg.lintian-overrides: No such file or directory

容易猜到和https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=901715

可能是一个问题,都是不应该执行的内容有执行权限了,所以给它去掉执行权限

chmod -x debian/linux-image-5.10.0-26-amd64-dbg.lintian-overrides

构建内核时报错

Can't exec "debian/linux-image-5.10.0-26-cloud-amd64-dbg.lintian-overrides": No such file or directory at /usr/share/perl5/Debian/Debhelper/Dh_Lib.pm line 2595.
dh_lintian: error: cannot run debian/linux-image-5.10.0-26-cloud-amd64-dbg.lintian-overrides: No such file or directory

同上

chmod -x debian/linux-image-5.10.0-26-cloud-amd64-dbg.lintian-overrides

构建内核时报错

dh_installman
Can't exec "/tmp/linux-5.10.197/debian/linux-cpupower.manpages": No such file or directory at /usr/share/perl5/Debian/Debhelper/Dh_Lib.pm line 1538.
dh_installman: error: cannot run debian/linux-cpupower.manpages: No such file or directory

同上

chmod -x debian/linux-cpupower.manpages

构建内核时报错

dh_install --sourcedir=/tmp/linux-5.10.197/debian/cpupower-tmp
dh_install: warning: Cannot find (any matches for) "[i386" (tried in /tmp/linux-5.10.197/debian/cpupower-tmp, debian/tmp)

dh_install: warning: Cannot find (any matches for) "amd64" (tried in /tmp/linux-5.10.197/debian/cpupower-tmp, debian/tmp)

dh_install: warning: Cannot find (any matches for) "x32]" (tried in /tmp/linux-5.10.197/debian/cpupower-tmp, debian/tmp)

dh_install: warning: linux-cpupower missing files: [i386 amd64 x32]
dh_install: error: missing files, aborting

忽略了,这时候我的linux-image已经编译完了哈哈


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 857879363@qq.com