发布于 

编译高版本内核——玩客云折腾篇(2)

自己动手,丰衣足食

在我看来,在玩客云有限的硬件资源下,内核主要有两种:

  • 低版本内核(无法使用Docker)
  • 高版本内核(可以使用Docker)

如果还想开启一些功能(比如无线网卡),可以自己编译一个。我也刚接触编译不久,如有错误还请大佬指出🙏

了解交叉编译

交叉编译是在一个平台上生成另一个平台上的可执行代码。 同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。——百度百科

简单点说,你不会想在性能孱弱的玩客云上跑编译吧?

当然,对于不同的语言或者项目,交叉编译的配置可能略有不同,这里就主要介绍C/C++的交叉编译

内核编译

我的编译环境:WSL下的Ubuntu 20.04,使用root账户在/root下进行操作

配置交叉编译环境

手动安装。交叉编译工具下载,一般选择最新的版本

安装工具

1
2
3
4
5
#解压
xz -d gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz
tar -xvf gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar -C /usr/local/toolchain/
#编辑环境变量
vim ~/.bashrc

在文件末尾添加PATH=$PATH:"/usr/local/toolchain/gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf/bin"

添加后如图
添加后如图
1
2
3
4
#使环境变量生效
source ~/.bashrc
#检查是否生效
arm-none-linux-gnueabihf-gcc -v
环境变量生效
环境变量生效

获取源码与config文件

项目地址,选择有meson-mx-integration的分支,建议下载ZIP到本地再解压到/root

接着获取当前运行的Armbian编译配置文件,一般在/boot下有一个config文件,将其复制下来,重命名为.config,然后放在源码根目录下

编辑编译配置文件

在玩客云运行check-config.sh查看缺少运行Docker的模块,下载地址

1
chmod +x check-config.sh&&./check-config.sh

然后编辑.config

例如CONFIG_POSIX_MQUEUE: missing
在.config里搜索CONFIG_POSIX_MQUEUE这一项
将#CONFIG_POSIX_MQUEUE is not set
改为 CONFIG_POSIX_MQUEUE=y
如果遇到.config里没有的直接加到末尾即可。末尾的zfs用不到略过,不用管

开始编译

1
2
cd /root/linux-meson-mx-integration-5.17-20220131
make -j$(nproc) ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- LOCALVERSION="-aml-s812" LOADADDR=0x00208000 uImage modules

接着会进行各种询问,默认回车键摁到底,然后就是喜闻乐见的报错环节了。处理完错误,再次输入上面的make指令,编译会从上次中断的部分继续。下面是我遇到的一些问题

刚开始可能会提示Permission denied,只需要给足权限

1
chmod -R 777 /root/linux-meson-mx-integration-5.17-20220131/

后面的报错主要是缺少编译依赖,将报错复制给度娘,然后安装相应依赖即可

如果遇到一些无法解决的报错(我的都是编译小螃蟹的无线网卡报错),可以通过图形界面进行相关设置

1
2
apt install libncurses-dev
make menuconfig

安装内核

将整个源码文件夹上传至玩客云

1
2
cd /root/
rsync -av -e ssh --progress linux-meson-mx-integration-5.17-20220131 root@<玩客云ip>:/root/

然后SSH登录玩客云,输入以下命令,结束后断电重启

1
2
cd /root/linux-meson-mx-integration-5.17-20220131
make modules_install && make headers_install && make install

这里我没有进行备份操作,因为如果真出了问题起不来,那这备份又有何用呢

一般不会有大问题,但并不是所有系统都能安装内核,你可能需要注意/boot分区大小,也可能要注意对高版本内核的支持

参考资料

一次搞定 Arm Linux 交叉编译
Steps to build your own s8xx kernel (armhf) that works with Docker!
在玩客云Armbian上编译S8XX内核并开启docker