Linux 编译还挺麻烦。本人还比较菜,不知道哪种方法才比较正确。

删除内核

删除 /boot/ 目录下相关的内核镜像,然后更新一下启动项。

Linux 系统下删除无用的旧内核 - Ming’s Blog (inkuang.com)

可以查看一下当前装了什么内核镜像 (可能当初 make -deb-pkg 才会有这个选项,如果是 debian 系的话,还是比较推荐生成 deb 包)

dpkg --list | grep linux-image

可以直接用 apt 管理

sudo apt purge linux-image-?????

如果当初是 make install 安装的话,就手动删除相关的内核文件 (initrd.img, System.map, vmlinux , 后面都有版本名) 就好了,然后更新一下 initrd 啥的,手动更更新吧。。。。

sudo update-grub

由于安装内核也会在 update-initramfs 加入内核的信息。

最后也需要在 /var/lib/initramfs-tools/ 删除不用的 kernel 。

或者 update-initramfs -ck KERNEL_VERSION

锁定 Linux 版本

要十分小心,因为 sudo apt upgrage 会更新内核版本。

可以锁定系统的版本。因为要做实验,系统这样更新 kernel 就很混乱。

正常用户就无所谓了。

uname -r 
>> 5.4.124-generic 
sudo apt-mark hold 5.4.124-generic

关闭 Crash Report

这个功能好像没什么用。有问题直接去 Ubuntu 的 forum 去问就好了。

https://www.youtube.com/watch?v=6GYgrnZUI6Q

  • /var/crash 下删掉所有 .crash 的文件
  • 修改 /etc/default/apportenabled=1 改成 enabled=0

学习 Linux

Gentoo update kernel on the T website (tiimmm.com)

配置

8.10. Compiling a Kernel (debian-handbook.info)

If you copied the configuration from /boot/, you must change the system trusted keys option, providing an empty string is enough: CONFIG_SYSTEM_TRUSTED_KEYS = "".

编译

总体而言,

  • 第一种是 make 命令编译。
  • 第二种是 make deb-pkg 顺带生成一系列的 deb 包。

我比较倾向于第二种。

安装依赖

sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

Kernel Hacking

这个功能是给 Kernel 开发人员看的,里面有个 compile with debug info 需要关闭。

否则会出现如下错误 https://stackoverflow.com/questions/61657707/btf-tmp-vmlinux-btf-pahole-pahole-is-not-available

BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF
make: *** [Makefile:1106: vmlinux] Error 1

直接关闭 compile time debug info 或者安装这个东东

make

Gentoo update kernel on the T website (tiimmm.com)

wsl 安装内核头文件 (listera.top)

需要完整安装 vmzline, initramfs, linux-header 才算完整的安装。

cd /usr/src/linux

#保持干净源码
make clean
make mrproper
make distclean

#复制旧的系统已有的配置文件
cp /boot/config-????? ./.config 
#使用旧内核配置,所有新的配置选项设置为推荐(即默认)值
make olddefconfig
#查看微调内核配置
make menuconfig
#重新安装外部内核模块(可选)
make modules_prepare
#编译
make -j8
make headers -j8

#可选择安装或者不安装header (通常是向前兼容的,所以一般只能安装较新的 kernel)
make headers_install
#安装modules到/lib/modules下
make modules_install
#安装 initramfs 和 vmzlinux 到 /boot 下
make install

缺少头文件的情况在 WSL2 也会经常发生。

#查看内核版本 
uname -r
#下载内核源码
wget https://github.com/microsoft/WSL2-Linux-Kernel/?????? 
tar vzxf *.tar.gz
#安装依赖
sudo apt install libelf-dev build-essential pkg-config bison build-essential flex libssl-dev libelf-dev bc
#配置(复制旧配置)
cd WLS2*
zcat /proc/config.gz > .config 
#编译(仅编译头文件)
#make -j$(nproc)
make headers -j$(nproc) 
#安装(仅安装头文件)
#sudo make install
#sudo make modules_install
sudo make headers_install

这样 vscode 就可以自动识别 Linux API (也就是 system call ) 了

make deb-pkg

主要可以参考 Kali 的做法。

Kali 的做法更好,能够顺便生成 header, image 。这样即使改了 local version 在用 dkpg-query linux-header-$(uname -r) 也不会出错。

解压源码

sudo tar -xvJf archive.tar.xz

一般而言,应该是 -xzf 或者 -xJf

比较新的 Linux Kernel 用了 zstd 压缩。要安装

command-not-found.com – zstd

有几种设置配置的方法

# 清除
sudo make mrproper
# 配置 .config 文件
cp /boot/config-????? ./.config
sudo make oldconfig
sudo make menuconfig 
sudo make clean 
sudo make deb-pkg -j8 LOCALVERSION=-kouka KDEB_PKGVERSION=$(make kernelversion)-1

记得用四核编译啊………………可以看到 一个 Kernel 的本体有 kernel (modules), image, 还有 headers。按照 Recompiling the Kali Linux Kernel - Kali Linux Documentation 把 header 也一起装就可以了。至于 libc 应该不需要。至此,如果有人让你检测是否安装了 Kernel Headers, 就不会再报错了。

dpkg-query -s linux-headers-$(uname -r)

什么是 Kernel Header ? Linux-headers - Gentoo Wiki

The headers act as an interface between internal kernel components and also between userspace and the kernel.

可能遇到的问题

Secure Boot

可能会因为没有证书而停止编译。网上很多人并不了解这个,要知道 Secure Boot 才知道 X509 certificate。

Compiling the kernel 5.11.11 - Ask Ubuntu

Ask Ubuntu 的第二个答案就是自己创建证书 (不过还需要手动把 shim 文件之类的加到 Securte Boot Whitelist) 。一般自己用的话,把这个功能当成不存在就好 。。。

自己签名

用 SSH 生成一个安全证书。只要在 BIOS 将证书加入到白名单就可以顺利启动。

https://ubuntu.com/blog/how-to-sign-things-for-secure-boot

https://github.com/andikleen/simple-pt/issues/8

无证书 (unsigned)

https://blog.ishikawa.tech/entry/2019/09/03/174858

https://wiki.debian.org/BuildADebianKernelPackage

搜索一下所有公钥的配置选项

cat .config | grep ".pem" 

会搜出一堆使用公钥的东西,全部去掉即可 (Build 的时候会自动随机生成)。

CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
CONFIG_SYSTEM_REVOCATION_KEYS="debian/canonical-revoked-certs.pem"
# CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"

替换掉后面的东西 (最后一个不需要删除,会自动根据 x509 生成这个文件。主要是 canonical 的文件我们是没有的)

sudo sed -i  "s/debian\/canonical-certs\.pem//g" ./.config
sudo sed -i  "s/debian\/canonical-revoked-certs\.pem//g" ./.config

最后一个不需要删除 (如果仍然缺少可以手动生成 signing_key.pem ,话说 GitHub 一下子就看出问题了,CSDN 那些人还说是缺少 packages….)

https://github.com/andikleen/simple-pt/issues/8

https://blog.csdn.net/enlaihe/article/details/121947748

与 Azure 联动

关于 Azure 上的内核配置

可以按照 Gentoo 的 configuration 开始

准备 VM 文件

总结起来 (下面只是框架,需要跟 https://docs.microsoft.com/en-us/azure/virtual-machines/linux/create-upload-ubuntu 操作)

技巧:

可以利用 Switch 和 SSH 进行内网连接。用 ssh 操作虚拟机更方便 。

可以活用 GitHub 和 写.sh脚本 (需要 chmod +x 添加 execution 的权限)

GRUB 启动项

https://askubuntu.com/questions/216398/set-older-kernel-as-default-grub-entry

两种做法:

  • 需要知道顺序
    • GRUB_DEFAULT="1>2"
    • 第二个选项 (Advanced options for Ubuntu),第三个选项 (Ubuntu, with Linux 5.4.0-104-generic)
  • 需要知道名字
    • GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 3.13.0-53-generic"
    • Look at the menuentry definitions in /boot/grub/grub.cfg
    • ‘Advanced options for Ubuntu’
      • ‘Ubuntu, with Linux 5.16.14’
      • ‘Ubuntu, with Linux 5.4.0-104-generic’

打开 grub 的启动文件

sudo vim /etc/default/grub

改完后更新

sudo update-grub