ubuntu14.04与16.04(linuxmint或者debain)内核与模块编译(代码片段)

TonyHo TonyHo     2022-12-07     181

关键词:

编译Ubuntu的内核, 如果按照官方的说明, 那么一般是编译出deb包, 然后安装,但是如果我们改了驱动, 或者内核那么我们很可能只想编译bzImage而不是重新生成deb包.


一般的编译步骤

参考Ubuntu 的wiki:

Kernel Compile

BuildYourOwnKernel


基本步骤如下

安装需要的软件包, 或者kernel source:

apt-get source linux-image-$(uname -r)
sudo apt-get build-dep linux-image-$(uname -r)

如果还需要menuconfig之类的话, 安装ncurse即可.

然后需要chmod脚本

chmod a+x debian/rules
chmod a+x debian/scripts/*
chmod a+x debian/scripts/misc/*
fakeroot debian/rules clean

然后就是修改menuconfig了:

fakeroot debian/rules editconfigs

这个过程会提示修改哪个的menuconfig, 第一个弹出的就是适合我们架构(running)的menuconfig, 例如如果是X86, 那么就是AMD64, 修改后会提示是否更改其他arch的menuconfig, 例如arm64, ppc64等等. 

更改完成后, 第一次需要全编译, 直接:

fakeroot debian/rules clean
# quicker build:
fakeroot debian/rules binary-headers binary-generic binary-perarch
# if you need linux-tools or lowlatency kernel, run instead:
fakeroot debian/rules binary

注意后面的binary这个目标将编译所有的arch, 但是其实我们只需要编译适合我们现在在跑的这个机器即可. 因此可以这样子:

fakeroot debian/rules binary-generic

这个generic是flavour, 还可以是其他的架构. 

编译完成后, 安装deb包

重新编译

如果后来又修改了内核中的代码, 这个时候就可以快速编译一个bzImage即可, 步骤如下:

进入到需要source 目录, 即apt-get source获取下来patched后的source, 然后运行类似下面的commands即可. 如果还需要修改menuconfig, 那么就使用前面的editconfig.

make ARCH=x86_64 CROSS_COMPILE= KERNELVERSION=4.4.0-75-generic CONFIG_DEBUG_SECTION_MISMATCH=y KBUILD_BUILD_VERSION="96" LOCALVERSION= localver-extra= CFLAGS_MODULE="-DPKG_ABI=75" O=/home/hexiongjun/LinuxRC/linux-4.4.0/debian/build/build-generic -j4 bzImage modules 

注意里面的O=, 这个是build output目录,这样子可以避免污染source. 编译完成后就可以将需要的kernel替换现有的了.

也可以使用grub来加载指定的kernel.


模块编译

如果是自己编译的内核,那么编译out of tree模块依赖kernel编译的目录和source. 对此, 可以使用下面这个模块:

CONFIG_MODULE_SIG=n

ifneq ($(KERNELRELEASE),)
        obj-m := c.o
        remote-y = a.o b.o
else
        PWD := $(shell pwd)
        KVER := $(shell uname -r)
        #KDIR := /lib/modules/$(KVER)/build
        KDIR := /home/hexiongjun/LinuxRC/linux-4.4.0/debian/build/build-generic/

all:
        $(MAKE) -C $(KDIR) M=$(PWD) modules
        #$(MAKE) -C $(KDIR) M=$(PWD) modules -s

clean:
        rm -rf *.o *.mod.c *.mod.o *.ko *.symvers *.order *.a

endif

编译完成后,生成ko, 然后insmod即可. 


Grub2 bootloader加载说明

对于编译好的内核可以使用grub2在直接指定, 而不替换原有的image, 可以参考/boot/grub2/grub.cfg, 例如对于Linux Mint 18的entry:

menuentry 'Linux Mint 18.1 KDE 64-bit' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-0415fbcf-6c1f-4e68-8921-f415b6f6fd0c' 
	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
	insmod part_msdos
	insmod ext2
	set root='hd1,msdos5'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  0415fbcf-6c1f-4e68-8921-f415b6f6fd0c
	else
	  search --no-floppy --fs-uuid --set=root XXXXXXXX-6c1f-4e68-8921-YYYYYYY
	fi
	linux	/boot/vmlinuz-4.4.0-75-generic root=UUID=XXXXX-6c1f-4e68-8921-YYYYYY ro  quiet splash $vt_handoff
	initrd	/boot/initrd.img-4.4.0-75-generic
前面的insmod为bootloader/grub2加载驱动, 然后设置root, 接着指定kernel与initrd, 最后自动调用boot完成启动, 因此我们可以在grub2中手动指定bzImage.

关于vmlinux, vmlinuz, zImage等信息如果不是很熟悉可以参考SOF:

https://unix.stackexchange.com/questions/5518/what-is-the-difference-between-the-following-kernel-makefile-terms-vmlinux-vml/5602#5602



如何在ubuntu16.04和14.04lts中安装postgresql9.5

参考技术A你好,ubuntu软件中心,还有可以从网站下载的deb文件也可以用gdebi或命令或新立德安装 查看详情

sh易于安装openresty(在ubuntu14.04,15.10和16.04上使用和测试)(代码片段)

查看详情

markdown最安全的方法来清理启动分区-ubuntu14.04lts-x64,ubuntu16.04lts-x64(代码片段)

查看详情

sh易于安装openresty和nvm(在ubuntu14.04,15.10和16.04上使用和测试)(代码片段)

查看详情

ubuntu16.04安装有道词典

以前用Ubuntu14.04的时候,直接下载有道词典官方deb安装包,就安装好了,现在换成Ubuntu16.04因为有些依赖问题就无法安装成功。于是Google之,成功解决,也顺便熟悉了一下dpkg的用法。因为官方的deb包(Ubuntu版本的)依赖gstreamer0.10... 查看详情

ubuntu16.04安装有道词典

1.下载有道词典从http://cidian.youdao.com/index-linux.html下载ubuntu64位:youdao-dict_1.1.0-0-ubuntu_amd64.deb2.安装之前用Ubuntu14.04的时候,直接下载有道词典官方deb安装包,然后安装依赖就好了,但是使用Ubuntu16.04,gstreamer0.10-plugins-ugly依赖问题... 查看详情

Ubuntu 16.04 安装 ElasticSearch 5.x,启动失败

】Ubuntu16.04安装ElasticSearch5.x,启动失败【英文标题】:Ubuntu16.04installElasticSearch5.x,failedtostart【发布时间】:2017-04-2812:05:25【问题描述】:在全新安装Ubuntu16.04时,我使用后续步骤安装ElasticSearch5.0.1或5.0.2,但ES无法启动。有谁知道... 查看详情

Ubuntu 16.04 上的 dbus java 库更新

】Ubuntu16.04上的dbusjava库更新【英文标题】:dbusjavalibraryupdateonUbuntu16.04【发布时间】:2017-07-2622:47:32【问题描述】:我最近将我的Ubuntu14.04升级到了Ubuntu16.04LTS。我的一个项目使用dbusjava库(http://www.java2s.com/Code/JarDownload/dbus/dbus.jar... 查看详情

如何使用 apt-get 在 Ubuntu 18.04/17.04/16.10/16.04 LTS/15.10/15.04/14.10/14.04 LTS/13.10/13.04 上安装 Maven

】如何使用apt-get在Ubuntu18.04/17.04/16.10/16.04LTS/15.10/15.04/14.10/14.04LTS/13.10/13.04上安装Maven3?[关闭]【英文标题】:HowtoinstallMaven3onUbuntu18.04/17.04/16.10/16.04LTS/15.10/15.04/14.10/14.04LTS/13.10/13.04byusingapt-get?[closed]【 查看详情

Swift 5 Ubuntu 16.04 与 dateComponents 崩溃

】Swift5Ubuntu16.04与dateComponents崩溃【英文标题】:Swift5Ubuntu16.04CrashwithdateComponents【发布时间】:2019-06-1205:08:23【问题描述】:这是我的代码:importFoundationifletutc=TimeZone(abbreviation:"UTC")letcalendar=Calendar.currentprint("\\(calendar 查看详情

如何在ubuntu16.04上搭建phpstorm+xdebug调试

参考技术A一:操作环境:Ubuntu14.04php5.5+apachewindowsphpstorm二:准备工作,在保证php与apache能够正常工作的情况下1:sudoapt-cachesearchxdebug先查找xdebug相关的软件名,然后安装php的sudoapt-getinstall-yphp5-xdebug还有一些内容我就不一一讲述了... 查看详情

ubuntu14.04安装pcl

方式一:官网prebuild版本sudoadd-apt-repositoryppa:v-launchpad-jochen-sprickerhof-de/pclsudoapt-getupdatesudoapt-getinstalllibpcl-allubuntu16.04使用ppa预安装时,最后一句apt-getinstalllibpcl-all应该更改为apt-geti 查看详情

ubuntu14.04按照python3.6总是失败报错

参考技术A我用的是Ubuntu14.04按照网上很多方法安装python3.6总会出现失败的问题python3.6Ubuntu14.04(Trusty)and16.04(Xenial)下边是安装方法:如果上边还是不行的话,请尝试更新一下源库,阿里的镜像库地址如下: 查看详情

让 Cloud9 (Ubuntu 14.04) 与 PHP 7.0 和 phpMyAdmin 一起运行

】让Cloud9(Ubuntu14.04)与PHP7.0和phpMyAdmin一起运行【英文标题】:GettingCloud9(Ubuntu14.04)runningwithPHP7.0andphpMyAdmin【发布时间】:2016-04-2609:59:51【问题描述】:我正在使用Cloud9(运行Ubuntu14.04)。我已经能够删除PHP5并更新到PHP7.0.2(phpinfo... 查看详情

来自 Ubuntu 14.04 的 NGINX 1.4.7 与最新版本 NGINX 1.8.0

】来自Ubuntu14.04的NGINX1.4.7与最新版本NGINX1.8.0【英文标题】:NGINX1.4.7fromUbuntu14.04vslatestversionNGINX1.8.0【发布时间】:2015-07-1202:15:51【问题描述】:我注意到ubuntu14.04中的标准NGINX版本与NGINXwebsite上的(!stable)版本(目前是1.8.0)相比确... 查看详情

caffe配置最简明教程(ubuntu14.04)

1.前言本教程使用的系统是Ubuntu14.04LTS64-bit,使用的CUDA版本为7.5,使用的NVIDIA驱动版本为352。如果您使用的Pascal架构显卡,如GTX1080或者新ttx,则必须使用更高版本的驱动和CUDA8。本教程不适于这种情况,请不要尝试。Ubuntu每两年... 查看详情

ubuntu14.04.1lts是啥意思

参考技术Aubuntu14.04.1lts中的14.04是指版本号,代表2014年出的4月发布的版本,ubuntu一般每半年会推出出一个版本,所以看到的版本一般是11.0412.0412.10 14.04等。LTS即LongTermSupport ,代表这个版本是ubuntu长期支持的版本,而且会... 查看详情

linuxmint安装jdk8

...based系统的安装指南是:sudoapt-getinstallopenjdk-8-jdk然而我的LinuxMint17却无法安装。搜索之后发现如下问题:OpenJDK8只在Ubuntu14.10及以后的版本源中包含而LinuxMint17是基于Ubuntu14.04LTS的,下一个版本的LinuxMi 查看详情