Ubuntu kernel 编译安装
最近参与一个 ubuntu 项目,基于 intel Cherrytrail 平台的系统开发,包括 kernel 层面的一些问题。由于开始对那套ubuntu的开发编译环境不是很熟悉,问了下这几个月一直在这个项目中的同事,他提供的一套方法,说是ubuntu官网上的编译方法,每次编译要40分钟左右,天哪,每次编译kernel要40分钟,那效率也太低了。他另外提供了一套优化过的方式,编译也要10-20分钟。 时间还是挺宝贵的,所以我尝试过一次之后,看看是否有更快的方式。
关于编译环境的搭建,略!
原始提供的方式:
Cd kernel
fakeroot debian/rules clean
fakeroot debian/rules binary-headers binary-cs1p
最终在项目根目录(包含kernel/ ubuntu/ .repo/)生成多个linux*.deb文件,将这些deb文件在调试机上通过dpkg 安装之后,即可更新最新的kernel。
优化之后的方式:
将使用第一种方式生成的kernel/debian/build/build-cs1p/.config copy到kernel/.config
Cd kernel/
$ cp ../minimal.mk ./debian/ruleset/
$ fakeroot make-kpkg --initrd kernel_image kernel_headers
10多分钟之后,在根目录生成4个deb包,将这些deb包安装到调试机上即可。(其实只要使用linux-image-4.4.19+_4.4.19+-10.00.Custom_amd64.deb这个就能update kernel)
观察、思考并改进
工作绩效其实不是说你加多少班,投入很多时间,就能产生很高绩效,其实真正的绩效应该是说给公司,给团队带来多少价值。工作努力是一方面,实际的输出是另外一个层次。所以我们需要不断提高生产力,提高效率,这样才能在有限的时间,有限的条件下做更多的事 。
查看了下生产的几个deb 包,而对于kernel的更新来说,正真有用的是linux-image-4.4.19 +_4.4.19 +-10.00.Custom_amd64.deb包,可以将其解压缩打开,观看其庐山真面目。
$ ar -x linux-image-4.4.19+_4.4.19+-10.00.Custom_amd64.deb
生产两个压缩包:control.tar.gz data.tar.xz
Control.tar.gz可以通过tar -zxvf control.tar.gz -C ./control解压缩
Data.tar.xz 则通过xz -d data.tar.xz 解压缩生成data.tar包
然后tar -xvf data.tar -C xxx/ 提出文件
-----------------------------------------------------以下题外话,可以略过此处----------------------------------------------------------
上面涉及到两个指令:(附带描述一下)
Ar指令是针对linux中archive 包的操作的
-d :从archive包中delete文件
-m:移动archive中的文件
-t:列举archive包中的文件;
Xz指令是针对**.xz 压缩包的操作
据说XZ是压缩届最新压缩率之王,甚至比7z的压缩率还高。压缩率提高的一个副作用就是压缩解压缩的时间变长了。Ubuntu 14.04 LTS就带此工具。
xz -z 要压缩的文件
如果要保留被压缩的文件加上参数 -k ,如果要设置压缩率加入参数 -0 到 -9调节压缩率。如果不设置,默认压缩等级是6.
xz -d 要解压的文件
使用 -k 参数来保留被解压缩的文件。
解、压缩tar.xz文件
以为tar.xz也可以用单一命令搞定解压或压缩,就像tar czvf 或 tar xzvf处理tgz一样。其实不行 tar里面没有征对xz格式的参数,比如 z是针对 gzip,j是针对 bzip2。
创建tar.xz文件:
tar cvf xxx.tar xxx/ 得到xxx.tar文件
xz -z xxx.tar将 xxx.tar压缩成为xxx.tar.xz
解压tar.xz文件:
xz -d xxx.tar.xz 解压成 xxx.tar
-----------------------------------------------------以上题外话,可以略过此处----------------------------------------------------------
继续
在提取出来的xxx文件中找到boot/文件夹,里面看到三个与kernel相关的文件:
config-4.4.19+System.map-4.4.19+vmlinuz-4.4.19+
config-4.4.19+ 是编译kernel的.config文件
System.map-4.4.19+ 是编译生成的符号文件,kernel启动的时候用到,尤其是相关log需要匹配到;
vmlinuz-4.4.19+ 才是真正的kernel文件
$ file vmlinuz-4.4.19+
vmlinuz-4.4.19+: Linux kernel x86 boot executable bzImage,version 4.4.19+ (root@R241) #8 SMP Tue Dec 27 17:42:56 CST 2016,RO-rootFS,swap_dev 0x7,Normal VGA
其实,我们只需要将上面三个文件替换即可。在编译环境中找到生成的三个文件
kernel/.config
Kernel/.System.map
Kernel/arch/x86/boot/bzImage
那么剩下的问题是如何在短时间内编译kernel 生成新的kernel文件呢?(主要是上面三个kernel相关文件)
其实还是回到最原始的kernel编译方式上。
1,配置config文件,这个项目我们使用上面生成的.config文件,将其放到kernel路径下;或者从调试机的/boot路径下获取config文件
若需要修改,通过make menuconfig 。
2,make
包含几种:
$ sudo make
$ sudo make install 在调试机上编译安装,最终只要reboot即可更新到最新的kernel版本
$ sudo make modules_install 在调试机上编译安装modules 更新/lib/modules中的模块;
一般情况下,在kernel根目录会生成vmlinux 或者bzImage,System.map,当然或者如./arch/x86/boot/路径下找bzImage文件。
将三个文件copy出来即可。
纯粹编译kernel时间会短很多,不过第一次也会较长,后面会快很多了。
使用多线程编译: