编译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

Ubuntu 14.04与16.04(Linux Mint或者Debain)内核与模块编译的更多相关文章

  1. Project Perfect让Swift在服务器端跑起来-在Linux上创建你的Perfect项目(三)

    前两篇,分别讲述了入门和在Linux下部署,现在得说说如何在Linux下开发了。在Linux下开发,相对比在Mac下开发更灵活。我们先来看看构建基于Perfect的网站服务的编译方式如图通过引用基础库PerfectLib和数据链接,中间件模块创建你的网页文件,并用makefile打包生成你的网站动态库。所以如果你只是在Linux下构建项目,你只需要先创建好你的Handlers.swift即可。根据上面的方式我们开始在Linux下创建我们的Perfect项目。这里我在Perfect文件夹创建了一个Demo文

  2. 使用 Swift 语言编写 Android 应用入门

    Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。做梦,虽然Swift编译器可以胜任在安卓设备上编译Swift代码并运行。这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建你的应用用户界面,以上这些Swift标准库不能提供。简单来说,构建在安卓设备上使用的Swiftstdlib需要libiconv和libicu。通过命令行执行以下命令:gitclonegit@github.com:SwiftAndroid/libiconv-libi

  3. Project Perfect让Swift在服务器端跑起来-Hi Linux(二)

    开篇写了一个简单的入门,今天想说说怎么让Perfect项目在Linux上运行。Swift开源后,苹果让Swift不仅在OSX/iOS上跑,更让Swift在Linux/Windows上跑。作为服务端的Perfect框架+RemObjectSilver,让Swift成为了一个全栈语言。Perfect由于是服务端的,让Perfect在Linux上跑是必然的事情。从第一篇文章中我们可以了解到Perfect由PerfectLib和PerfectServer组成。

  4. Project Perfect让Swift在服务器端跑起来-在Linux上创建你的Perfect项

    前两篇,分别讲述了入门和在Linux下部署,现在得说说如何在Linux下开发了。在Linux下开发,相对比在Mac下开发更灵活。我们先来看看构建基于Perfect的网站服务的编译方式如图通过引用基础库PerfectLib和数据链接,中间件模块创建你的网页文件,并用makefile打包生成你的网站动态库。所以如果你只是在Linux下构建项目,你只需要先创建好你的Handlers.Swift即可。根据上面的方式我们开始在Linux下创建我们的Perfect项目。

  5. Swift for OS X编译Linux?

    我对其他平台上Swift的构建过程感到困惑.Swift是否允许我在OSX上构建Linux项目,或者我是否需要在Linux上专门使用Swift来构建我计划在那里使用的任何东西?我查看了documentation,但这个主题并不是很清楚……

  6. Swift 2和Linux / OS X的区别

    我正在尝试将一些基本的应用程序从OSX移植到Linux,但似乎Linux平台上缺少基本的东西.有些文件缺少什么?

  7. 将Trickle移植到android

    >如何告诉编译器链接我之前为android交叉编译的共享库,以便为android生成最终的可执行命令行应用程序.而且这甚至可以在Android上移植涓流?

  8. phonegap运行android – create命令失败,退出代码8 – linux

    我做了一些googleing但没有发现任何相关内容.任何帮助赞赏.请务必使用裸体vm进行尝试没有nodejs安装或依赖问题.基督教解决方法我刚刚面临同样的问题,问题是没有正确设置sdk工具的路径:请尝试以下方法:

  9. 在Android和Raspberry Pi 3 Linux之间建立Wifi-Direct连接

    我在这里遗漏了什么?谢谢.解决方法你在哪里:使用:

  10. 如何在.pro文件中为Android平台构建指定库?

    我正在尝试使用QtCreatorQT来构建在桌面和移动平台上运行的应用程序.为实现这一目标,我需要根据目标平台使用不同的预构建库.如何在.pro文件中指定它?该向导仅提供linux/mac/windows作为平台选择我试过了但是两个构建目标只有unix:!mac被执行/评估.所以我的问题是:如何在.pro文件中检测构建目标并相应地更改库定义?

随机推荐

  1. crontab发送一个月份的电子邮件

    ubuntu14.04邮件服务器:Postfixroot收到来自crontab的十几封电子邮件.这些邮件包含PHP警告.>我已经解决了这些警告的原因.>我已修复每个cronjobs不发送电子邮件(输出发送到>/dev/null2>&1)>我删除了之前的所有电子邮件/var/mail/root/var/spool/mail/root但我仍然每小时收到十几封电子邮件.这些电子邮件来自cronjobs,

  2. 模拟两个ubuntu服务器计算机之间的慢速连接

    我想模拟以下场景:假设我有4台ubuntu服务器机器A,B,C和D.我想在机器A和机器C之间减少20%的网络带宽,在A和B之间减少10%.使用网络模拟/限制工具来做到这一点?

  3. ubuntu-12.04 – 如何在ubuntu 12.04中卸载从源安装的redis?

    我从源代码在Ubuntu12.04上安装了redis-server.但在某些时候它无法完全安装,最后一次makeinstallcmd失败.然后我刚刚通过apt包安装.现在我很困惑哪个安装正在运行哪个conf文件?实际上我想卸载/删除通过源安装的所有内容,只是想安装一个包.转到源代码树并尝试以下命令:如果这不起作用,您可以列出软件自行安装所需的步骤:

  4. ubuntu – “apt-get source”无法找到包但“apt-get install”和“apt-get cache”可以找到它

    我正在尝试下载软件包的源代码,但是当我运行时它无法找到.但是当我运行apt-cache搜索squid3时,它会找到它.它也适用于apt-getinstallsquid3.我使用的是Ubuntu11.04服务器,这是我的/etc/apt/sources.list我已经多次更新了.我尝试了很多不同的debs,并没有发现任何其他地方的错误.这里的问题是你的二进制包(deb)与你的源包(deb-src)不

  5. ubuntu – 有没有办法检测nginx何时完成正常关闭?

    &&touchrestarted),因为即使Nginx没有完成其关闭,touch命令也会立即执行.有没有好办法呢?这样的事情怎么样?因此,pgrep将查找任何Nginx进程,而while循环将让它坐在那里直到它们全部消失.你可以改变一些有用的东西,比如睡1;/etc/init.d/Nginx停止,以便它会休眠一秒钟,然后尝试使用init.d脚本停止Nginx.你也可以在某处放置一个计数器,这样你就可以在需要太长时间时发出轰击信号.

  6. ubuntu – 如何将所有外发电子邮件从postfix重定向到单个地址进行测试

    我正在为基于Web的应用程序设置测试服务器,该应用程序发送一些电子邮件通知.有时候测试是使用真实的客户数据进行的,因此我需要保证服务器在我们测试时无法向真实客户发送电子邮件.我想要的是配置postfix,以便它接收任何外发电子邮件并将其重定向到一个电子邮件地址,而不是传递到真正的目的地.我正在运行ubuntu服务器9.10.先感谢您设置本地用户以接收所有被困邮件:你需要在main.cf中添加:然后

  7. ubuntu – vagrant无法连接到虚拟框

    当我使用基本的Vagrantfile,只配置了两条线:我看到我的虚拟框打开,但是我的流氓日志多次显示此行直到超时:然后,超时后的一段时间,虚拟框框终于要求我登录,但是太久了!所以我用流氓/流氓记录.然后在我的物理机器上,如果我“流氓ssh”.没有事情发生,直到:怎么了?

  8. ubuntu – Nginx – 转发HTTP AUTH – 用户?

    我和Nginx和Jenkins有些麻烦.我尝试使用Nginx作为Jenkins实例的反向代理,使用HTTP基本身份验证.它到目前为止工作,但我不知道如何传递带有AUTH用户名的标头?}尝试将此指令添加到您的位置块

  9. Debian / Ubuntu – 删除后如何恢复/ var / cache / apt结构?

    我在ubuntu服务器上的空间不足,所以我做了这个命令以节省空间但是现在在尝试使用apt时,我会收到以下错误:等等显然我删除了一些目录结构.有没有办法做apt-getrebuild-var-tree或类似的?

  10. 检查ubuntu上安装的rubygems版本?

    如何查看我的ubuntu盒子上安装的rubygems版本?只是一个想法,列出已安装的软件包和grep为ruby或宝石或其他:)dpkg–get-selections

返回
顶部