ubuntu编译kernel
Posted 梦起白沙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ubuntu编译kernel相关的知识,希望对你有一定的参考价值。
前言
使用的是ubuntu 22.04 本来的kernel:5.19.0-38-generic 编译kernel 5.19
使用虚拟机要注意存储空间的变化,避免内存爆掉。
环境配置
需要先安装配置环境
sudo apt-get install ncurses-dev
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install libelf-dev
sudo apt-get install libssl-dev
sudo apt install dwarves
sudo apt-get install zstd
编译kernel
下载和kernel同版本的源码。
http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v5.x/linux-5.19.tar.gz
将自带的配置文件copy到解压的源码的顶层Makefile处。
cp -r /boot/config-5.19.0-38-generic .config
配置kernel
sudo make menuconfig
选择save,选择.config(之前copy过来的)
完成之后回到这个界面选择退出。
make
出现问题
make[1]: *** No rule to make target \'debian/canonical-certs.pem\', needed by \'certs/x509_certificate_list\'. Stop.
make: *** [Makefile:1843: certs] Error 2
删除.config文件中这两行中的双引号中的内容,双引号保留。
CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
CONFIG_SYSTEM_REVOCATION_KEYS="debian/canonical-revoked-certs.pem"
清除编译结果重新编译。
清除编译结果
make mrproper
安装驱动
sudo make modules_install
完成后会生成一个版本号的文件夹。生成位置是/lib/modules/5.19.0
这个文件夹要创建需要权限。
生成内核压缩镜像文件
make bzImage
./arch/x86/boot下会生成bzImage文件
安装准备
5.19.0这个名字是/lib/modules下创建的文件夹的名字。
sudo cp -r arch/x86/boot/bzImage /boot/vmlinuz-5.19.0
sudo cp -r .config /boot/config-5.19.0
root@ok-VirtualBox:/home/ok/Downloads/linux-5.15.58# cd /lib/modules/5.15.58/
root@ok-VirtualBox:/lib/modules/5.15.58# ls
build modules.builtin.bin modules.softdep
kernel modules.builtin.modinfo modules.symbols
modules.alias modules.dep modules.symbols.bin
modules.alias.bin modules.dep.bin source
modules.builtin modules.devname
modules.builtin.alias.bin modules.order
切换kernel版本
查看kernel版本
这是可以选择的kernel版本,每个版本都有正常的和recovery mode两个 (不要选择recovery mode)
root@ubuntu:/# cat /boot/grub/grub.cfg |grep -E \'menuentry.+class.+class.+menuentry_id_option\'
menuentry \'Ubuntu\' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option \'gnulinux-simple-97fa777f-a9b2-4ce8-babc-03476266e1dd\'
menuentry \'Ubuntu, with Linux 5.19.0-41-generic\' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option \'gnulinux-5.19.0-41-generic-advanced-97fa777f-a9b2-4ce8-babc-03476266e1dd\'
menuentry \'Ubuntu, with Linux 5.19.0-41-generic (recovery mode)\' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option \'gnulinux-5.19.0-41-generic-recovery-97fa777f-a9b2-4ce8-babc-03476266e1dd\'
menuentry \'Ubuntu, with Linux 5.19.0-38-generic\' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option \'gnulinux-5.19.0-38-generic-advanced-97fa777f-a9b2-4ce8-babc-03476266e1dd\'
menuentry \'Ubuntu, with Linux 5.19.0-38-generic (recovery mode)\' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option \'gnulinux-5.19.0-38-generic-recovery-97fa777f-a9b2-4ce8-babc-03476266e1dd\'
menuentry \'Ubuntu, with Linux 5.19.0\' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option \'gnulinux-5.19.0-advanced-97fa777f-a9b2-4ce8-babc-03476266e1dd\'
menuentry \'Ubuntu, with Linux 5.19.0 (recovery mode)\' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option \'gnulinux-5.19.0-recovery-97fa777f-a9b2-4ce8-babc-03476266e1dd\'
root@ubuntu:/# vi /etc/default/grub
选择版本
对照上面拿到的数据编上顺序号码
0 5.19.0-41-generic
1 5.19.0-41-generic (recovery mode)
2 Linux 5.19.0-38-generic
3 5.19.0-38-generic (recovery mode)
4 Linux 5.19.0
5 Linux 5.19.0 (recovery mode)
配置/etc/default/grub文件
GRUB_DEFAULT=0
这个0就是选择的结果,对应的就是前面的版本,0表示的是默认的版本。不要选择recovery mode
如果不小心真的进入了recovery mode 在开机时长按shift键,自己手动选择。
为什么是0,因为默认的时候会自己选择第一个选项(正常开机就是默认选择的第一个 *Ubuntu):
但是我们自己编译的kernel想要使用就在第二个选项中,对应的操作码是1
然后第二个选项的子菜单
第一个选项是0,以此类推。
如果是想要启动Linux 5.19.0内核,就
GRUB_DEFAULT=1> 4
1表示的是一级菜单选择的是1,4表示的是二级菜单选择5.19.0 > 符号后面有一个空格
这个选项表也和之前查看的kernel版本对的上。
完成之后更新
sudo update-grub
重启
uname -r 查看版本是否切换成功
如何编译Android的kernel
1.准备工作: (ubuntu1110 32位)ubuntu等linuxOS,下载好eclipse,安装好JDK, 安装好android的SDK, 在eclipse中成功打开android 手机模拟器即OK。
2.初始化编译环境 :
关注该网页上的“installing required packages”,其中有的软件包因为版本问题而安装不上,不用管它,之后遇到错误再单独解决。
3.下载内核源码:
android 2.3 内核 下载需要等待一段时间。
4.下载交叉编译器:
该步骤有可能耗费大量时间,依据网速不同,几个小时到几天不等,或许可以尝试git clone 后面的地址只下载prebuilt/linux-x86/toolchain
5.设置参数以及编译:
$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-eabi-
$ cd goldfish // 进入下载的源代码目录
$ git checkout <commit_from_first_step> //这个步骤我没有做,不知道干嘛用的
$ make goldfish_defconfig
$ make
6.报错信息:
若有报错说找不到 (arm-eabi-gcc command not found)等等,尝试使用采用另外一个交叉编译器。
7.测试:
最后,测试一下刚才编译的内核:emulator -avd myavd -kernel ~/goldfish/arch/arm/boot/zImageemulator若系统找不到,可以去android SDK中某文件夹找到,加入系统PATH即可。 -avd后面的参数 myavd即为模拟器的名字,这个我是在eclipse中的模拟器管理中新建的一个模拟器,用那个模拟器的名字即可。 -kernel后面的参数就找到刚才编译出的内核的路径。
若启动模拟器失败,可尝试关闭后再启动。第一次启动模拟器时可能需要等待比较长的时间。 参考技术A 方法如下:
在Linux的环境下:
建立目录:
mkdir ~/android-kernel cd android-kernel
下载源代码, 大概有280MB, 慢慢等哈~~~ (当然你要先安装git) git clone git://git.linuxtogo.org/home/groups/mobile-linux/kernel.git
类似的屏幕信息:
Initialized empty Git repository in /home/user/android-kernel/kernel/.git/ remote: Counting objects: 908251, done.
remote: Compressing objects: 100% (153970/153970), done.
remote: Total 908251 (delta 755115), reused 906063 (delta 753016) Receiving objects: 100% (908251/908251), 281.86 MiB | 292 KiB/s, done. Resolving deltas: 100% (755115/755115), done. Checking out files: 100% (22584/22584), done.
然后去到htc-msm branch: cd kernel
git checkout -b htc-msm origin/htc-msm
屏幕信息:
Branch htc-msm set up to track remote branch refs/remotes/origin/htc-msm. Switched to a new branch "htc-msm"
下载ARM的toolchain, 大概64MB左右, 下到~/android-kernel: 下
载
:
http://www.codesourcery.com/gnu_toolchains/arm/portal/package2549/public/arm-none-linux-gnueabi/arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
cd ~/android-kernel
tar xjf arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
编译kernel
准备缺省的Kaiser 配置文件.config
cd ~/android-kernel/kernel
make htckaiser_defconfig ARCH=arm
然后编译zImage:
export PATH=~/android-kernel/arm-2008q1/bin:$PATH
make zImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
编译好的在: ~/android-kernel/kernel/arch/arm/boot/zImage
如果你的机器是多核的, 可以编译的时候用-j <cores/cpus_number>来加速:
比如, 双核的可以:
make -j 2 zImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi本回答被提问者和网友采纳
以上是关于ubuntu编译kernel的主要内容,如果未能解决你的问题,请参考以下文章