不希望編譯全部?jī)?nèi)核谭溉,只編譯內(nèi)核相應(yīng)驅(qū)動(dòng)模塊扮念,操作如下:
下文以系統(tǒng)4.9.87-linuxkit-aufs
為例碧库,對(duì)應(yīng)源碼包linux-4.9.87.tar.xz
.官網(wǎng)下載與系統(tǒng)內(nèi)核版本對(duì)應(yīng)的源碼包 https://www.kernel.org (注意版本號(hào)一致)
.解壓內(nèi)核源碼包,注意為了減小壓縮包大小弄匕,源碼包使用了xz
壓縮沽瞭,先使用 xz
解壓源碼包 xz -d xxxx.tar.xz
秕脓, 再使用 tar
解壓 tar xvf xxx.tar
.
ubuntu@one$ ls
linux-4.9.87.tar.xz
ubuntu@one$ sudo xz -d linux-4.9.87.tar.xz
ubuntu@one$ tar xvf linux-4.9.87.tar
ubuntu@one$ ls
linux-4.9.87 linux-4.9.87.tar
. 查看當(dāng)前系統(tǒng)的內(nèi)核版本信息uname -r
, 注意Local信息芙贫,后面需要修改內(nèi)核源碼Makefile文件中的版本信息傍药,已確保與當(dāng)前的Local信息一致.
ubuntu@one$ uname -r
4.9.87-linuxkit-aufs
#-linuxkit-aufs 為L(zhǎng)ocal描述
.進(jìn)入源碼目錄,修改Makefile
文件EXTRAVERSION = xxx
為L(zhǎng)ocal信息.
ubuntu@one$ cd linux-4.9.87
ubuntu@one$ pwd
/usr/src/linux-4.9.87
ubuntu@one$ sudo vim Makefile
#內(nèi)核源碼包根目錄 Makefile 文件
VERSION = 4
PATCHLEVEL = 9
SUBLEVEL = 87
EXTRAVERSION =-linuxkit-aufs #這里修改為L(zhǎng)ocal信息
NAME = Roaring Lionus
.如需修改其他版本信息拣挪,進(jìn)入include/linux/vermagic.h
查看菠劝,此文件記錄的信息是通過(guò) sudo make menuconfig
開(kāi)關(guān)進(jìn)行設(shè)置(也可手動(dòng)修改-不推薦).
.開(kāi)始編譯前的準(zhǔn)備工作睁搭,進(jìn)入內(nèi)核源碼目錄园骆,加載默認(rèn)配置參數(shù)sudo make defconfig
, 處理.config文件中缺失的源碼中的參數(shù)配置sudo make oldconfig
锌唾,執(zhí)行編譯準(zhǔn)備工作sudo make prepare
, 生成需要的腳本文件sudo make scripts
.
ubuntu@one$ pwd
/usr/src/linux-4.9.87
ubuntu@one$ sudo make defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
*** Default configuration is based on 'x86_64_defconfig'
#
# configuration written to .config
#
ubuntu@one$
ubuntu@one$ sudo make oldconfig
scripts/kconfig/conf --oldconfig Kconfig
#
# configuration written to .config
#
ubuntu@one$
ubuntu@one$ sudo make prepare
scripts/kconfig/conf --silentoldconfig Kconfig
HOSTCC arch/x86/tools/relocs_32.o
HOSTCC arch/x86/tools/relocs_64.o
HOSTCC arch/x86/tools/relocs_common.o
HOSTLD arch/x86/tools/relocs
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
CC kernel/bounds.s
CHK include/generated/bounds.h
CHK include/generated/timeconst.h
CC arch/x86/kernel/asm-offsets.s
CHK include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
ubuntu@one$
ubuntu@one$ sudo make scripts
CC scripts/mod/empty.o
HOSTCC scripts/mod/mk_elfconfig
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/modpost.o
CC scripts/mod/devicetable-offsets.s
GEN scripts/mod/devicetable-offsets.h
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/sumversion.o
HOSTLD scripts/mod/modpost
HOSTCC scripts/selinux/genheaders/genheaders
HOSTCC scripts/selinux/mdp/mdp
HOSTCC scripts/kallsyms
HOSTCC scripts/pnmtologo
HOSTCC scripts/conmakehash
HOSTCC scripts/sortextable
.開(kāi)始編譯驅(qū)動(dòng)模塊,進(jìn)入需要編譯的驅(qū)動(dòng)模塊源碼目錄(以minix文件系統(tǒng)驅(qū)動(dòng)
為例)炬太,修改 Makefile
.
ubuntu@one$ cd fs/minix/
ubuntu@one$ pwd
/usr/src/linux-4.9.87/fs/minix
ubuntu@tinylab/linux-0.11-lab$ ls
bitmap.c inode.c itree_v2.c Makefile_ namei.c
dir.c itree_common.c Kconfig minix.h
file.c itree_v1.c Makefile Module.symvers
ubuntu@one$
ubuntu@one$ sudo vim Makefile
編輯目錄下的Makefile文件為:
#
# Makefile for the Linux minix filesystem routines.
# make minix fs as kernel module
obj-m += minix.o
minix-objs := bitmap.o itree_v1.o itree_v2.o namei.o inode.o file.o dir.o
KERNELDIR:=/usr/src/linux-4.9.87/
default:
make -C $(KERNELDIR) M=$(PWD) modules
#注意有的系統(tǒng) $(PWD) 為空 可以直接替換為當(dāng)前目錄亲族,
#如:M=/usr/src/linux-4.9.87/fs/minix/
clean:
rm -rf *.o *.mod.c *.ko *.symvers
. 執(zhí)行編譯命令sudo make
生成驅(qū)動(dòng)模塊
ubuntu@one$ sudo make
make -C /usr/src/linux-4.9.87/ M=/usr/src/linux-4.9.87/fs/minix/ modules
make[1]: Entering directory `/usr/src/linux-4.9.87'
CC [M] /usr/src/linux-4.9.87/fs/minix/bitmap.o
CC [M] /usr/src/linux-4.9.87/fs/minix/itree_v1.o
CC [M] /usr/src/linux-4.9.87/fs/minix/itree_v2.o
CC [M] /usr/src/linux-4.9.87/fs/minix/namei.o
CC [M] /usr/src/linux-4.9.87/fs/minix/inode.o
CC [M] /usr/src/linux-4.9.87/fs/minix/file.o
CC [M] /usr/src/linux-4.9.87/fs/minix/dir.o
LD [M] /usr/src/linux-4.9.87/fs/minix/minix.o
Building modules, stage 2.
MODPOST 1 modules
CC /usr/src/linux-4.9.87/fs/minix/minix.mod.o
LD [M] /usr/src/linux-4.9.87/fs/minix/minix.ko
make[1]: Leaving directory `/usr/src/linux-4.9.87'
ubuntu@one$
.查看生成模塊信息modinfo minix.ko
.
ubuntu@one$ modinfo minix.ko
filename: /usr/src/linux-4.9.87/fs/minix/minix.ko
license: GPL
alias: fs-minix
depends:
vermagic: 4.9.87-linuxkit-aufs SMP mod_unload
##注意 vermagic 字符串
加載模塊sudo insmod minix.ko
霎迫,查看是否加載成功lsmod
.
ubuntu@one$ sudo insmod minix.ko
ubuntu@one$ lsmod
Module Size Used by
minix 32768 0
.查看加載信息dmesg | tail
, 如果失敗知给,并出現(xiàn) Invalid module format
則需要修改相關(guān)版本信息.
###加載成功的消息:
ubuntu@one$ sudo dmesg | tail
[10770.402514] minix: loading out-of-tree module taints kernel.
ubuntu@one$
###加載失敗的消息:
ubuntu@one$ sudo insmod minix.ko
insmod: ERROR: could not insert module minix.ko: Invalid module format
ubuntu@one$ sudo dmesg | tail
[ 921.312628] minix: version magic '4.9.87-linuxkit-aufs SMP mod_unload '
should be '4.9.87-linuxkit-aufs SMP mod_unload '
ubuntu@one$
##-linuxkit-aufs 后面多出了一個(gè)空格(由于修改內(nèi)核源碼包根目錄Makefile時(shí)描姚,字符串后多出一個(gè)空格造成)
一些其他命令:
#查看內(nèi)核編譯版本信息
ubuntu@one$ sudo make kernelrelease
4.9.87-linuxkit-aufs