非交互方式配置
Linux 内核提供了一个脚本 scripts/config
,可用于非交互方式获取或设置内核的配置选项值。基于该脚本,实验环境增加了两个选项 kernel-getconfig
和 kernel-setconfig
,可用于调整内核的选项。基于该功能我们可以方便地实现类似 "enable/disable/setstr/setval/getstate" 内核选项的操作。
获取一个内核模块的状态:
$ make kernel-getconfig m=minix_fs
Getting kernel config: MINIX_FS ...
build/aarch64/linux-v5.1-virt/.config:CONFIG_MINIX_FS=m
复制代码
使能一个内核模块:
$ make kernel-setconfig m=minix_fs
Setting kernel config: m=minix_fs ...
build/aarch64/linux-v5.1-virt/.config:CONFIG_MINIX_FS=m
Enable new kernel config: minix_fs ...
复制代码
更多 kernel-setconfig
命令的控制选项:y, n, c, o, s, v
:
选项说明y
编译内核中的模块或者使能其他内核选项c
以插件方式编译内核模块,类似 m
选项o
以插件方式编译内核模块,类似 m
选项n
关闭一个内核选项s
RTC_SYSTOHC_DEVICE="rtc0"
,设置 rtc 设备为 rtc0v
v=PANIC_TIMEOUT=5
, 设置内核 panic 超时为 5 秒
在一条命令中使用多个选项:
make kernel-setconfig m=tun,minix_fs y=ikconfig v=panic_timeout=5 s=DEFAULT_HOSTNAME=linux-lab n=debug_info
make kernel-getconfig o=tun,minix,ikconfig,panic_timeout,hostname
复制代码
使用内核模块
编译所有的内部内核模块:
make modules
make modules-install
make root-rebuild // not need for nfs boot
make boot
复制代码
列出 src/modules/
和 boards/<BOARD>/bsp/modules/
路径下的所有模块:
如果加上 m
参数,除了列出 src/modules/
和 boards/<BOARD>/bsp/modules/
路径下的所有模块外,还会列出 src/linux-stable/
下的所有模块:
$ make modules-list m=hello
1 m=hello ; M=$PWD/src/modules/hello
$ make modules-list m=tun,minix
1 c=TUN ; m=tun ; M=drivers/net
2 c=MINIX_FS ; m=minix ; M=fs/minix
复制代码
使能一个内核模块:
$ make kernel-getconfig m=minix_fs
Getting kernel config: MINIX_FS ...
build/aarch64/linux-v5.1-virt/.config:CONFIG_MINIX_FS=m
$ make kernel-setconfig m=minix_fs
Setting kernel config: m=minix_fs ...
build/aarch64/linux-v5.1-virt/.config:CONFIG_MINIX_FS=m
Enable new kernel config: minix_fs ...
复制代码
编译一个内核模块(例如:minix.ko)
make modules M=fs/minix/
# 或
make modules m=minix
复制代码
安装和清理模块:
$ make modules-install M=fs/minix/
make modules-clean M=fs/minix/
复制代码
其他用法:
make kernel-setconfig m=tun
make kernel x=tun.ko M=drivers/net
make kernel x=drivers/net/tun.ko
make kernel-run drivers/net/tun.ko
复制代码
编译外部内核模块(类似编译内部模块):
make modules m=hello
# 或
make kernel x=$PWD/src/modules/hello/hello.ko
复制代码
使用内核特性
内核的众多特性都集中存放在 src/feature/linux/
,其中包括了特性的配置补丁,可以用于管理已合入内核主线的特性和未合入的特性功能。
$ make feature-list
[ /labs/linux-lab/src/feature/linux ]:
+ 9pnet
+ core
- debug
- module
+ ftrace
- v2.6.36
* env.g3beige
* env.malta
* env.pc
* env.versatilepb
- v2.6.37
* env.g3beige
+ gcs
- v2.6.36
* env.g3beige
* env.malta
* env.pc
* env.versatilepb
+ kft
- v2.6.36
* env.malta
* env.pc
+ uksm
- v2.6.38
复制代码
这里列出了针对某项特性验证时使用的内核版本,如果其他条件未改变的话该特性应该可以正常工作。
例如,为了使能内核模块支持,可以执行如下简单的操作:
make feature f=module
make kernel-olddefconfig
make kernel
复制代码
为了在 malta 开发板上验证基于 2.6.36 版本的 kft
特性,可以执行如下操作:
make BOARD=malta
export LINUX=v2.6.36
make kernel-checkout
make kernel-patch
make kernel-defconfig
make feature f=kft
make kernel-olddefconfig
make kernel
make boot
复制代码
新建开发分支
如果希望新建一个分支来做开发,那么可以参考如下步骤。
首先在 src/linux-stable
或配置的其他 KERNEL_SRC
目录下基于某个内核版本新建一个 git 分支,假设历史版本是 v5.1:
cd src/linux-stable
git checkout -b linux-v5.1-dev v5.1
复制代码
然后通过 kernel-clone
从 Linux Lab 的 v5.1 克隆一份配置和相应目录:
make kernel-clone LINUX=v5.1 LINUX_NEW=linux-v5.1-dev
复制代码
之后就可以跟往常一样开发。
如果基础版本不是 v5.1,那么可以从支持的版本中挑选一个比较接近的,以 i386/pc
为例:
make b=i386/pc list linux
# v2.6.10 v2.6.11.12 v2.6.12.6 v2.6.21.5 v2.6.24.7 v2.6.34.9 v2.6.35.14 v2.6.36 v4.6.7 [v5.1] v5.2
复制代码
例如,想进行 v2.6.38 开发,可以考虑从 v2.6.36 来克隆,就近的配置更接近,出问题可能更少。
cd src/linux-stable
git checkout -b linux-v2.6.38-dev v2.6.38
make kernel-clone LINUX=v2.6.36 LINUX_NEW=linux-v2.6.38-dev
复制代码
开发过程中,请及时 commit,另外,请慎重使用如下命令,避免清除重要变更:
kernel-checkout, 检出某个指定版本,可能会覆盖掉当前修改
kernel-cleanup, 清理 git 仓库,可能会清理掉当前修改
kernel-clean, 清除历史编译记录,可能会自动执行上述 cleanup 动作
评论