benshushu:~# apt update
Get:1 http://mirrors.ustc.edu.cn/debian unstable InRelease [165 kB]
Err:1 http://mirrors.ustc.edu.cn/debian unstable InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 648ACFD622F3D138 NO_PUBKEY 0E98404D386FA1D9
Reading package lists... Done
W: GPG error: http://mirrors.ustc.edu.cn/debian unstable InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 648ACFD622F3D138 NO_PUBKEY 0E98404D386FA1D9
E: The repository 'http://mirrors.ustc.edu.cn/debian unstable InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
benshushu:~#
《奔跑吧Linux内核》 第二版配套实验平台
奔跑吧第二版配套实验平台
《奔跑吧Linux内核》第二版系列三本书:卷1、卷2以及入门篇,已经出版,读者可以到异步社区、京东、当当等书店购买。
我们还提供丰富的学习资源,下载方法:登陆“奔跑吧linux社区”微信公众号,输入“奔跑吧2”获取下载地址。
索取课件powerpoint和插图visio版本
奔跑吧入门篇第二版除了准备丰富的教学和学习资料, 我们还准备好了电子课件的powerpoint原稿和 插图的visio原稿,仅特供给:
请发送邮件给笨叔以及悦叔: 笨叔:runninglinuxkernel@126.com 悦叔:chenyuecn@163.com
入门篇课件的pdf和插图jpg版本已经上传到百度网盘,对读者来说已经足够,不必申请PowerPoint和visio版本.
《奔跑吧Linux内核》的来由
笨叔当fae的时候,去请教研发兄弟一些问题,时常会遭到白眼:我也不太懂,某某代码里有,你自己看啦,某某芯片手册有,你自己看啦。 现在人生活压力忒大,生怕教会了别人,感觉明天就会失业了一样。笨叔觉得,好东西需要记录下来和大家分享,于是有了《奔跑吧linux内核》。
奔跑吧面试必考题
你想试试《奔跑吧linux内核》这本书适不适合你,你可以来试试做一下这份卷子,只要考分在90%以下,《奔跑吧Linux内核》就是为您量身打造的。
奔跑吧面试必考题
实验平台说明
我们强烈推荐读者使用我们制作好的vmware image,开箱即用,下载方式:关注“奔跑吧linux社区”微信公众号,输入“奔跑吧2”下载。
本git repo是《奔跑吧Linux内核》第二版卷1卷2以及入门篇三本书的配套实验平台,包含Linux 5.0代码以及书上实验参考代码。 使用busybox工具制作的最小文件系统,该最小系统仅仅包含了Linux系统最常用的命令,如ls,top等命令。如果要在此最小系统中进行systemtap以及kdump等试验的话, 我们需要手动编译和安装这些工具,这个过程是相当复杂和繁琐的。为此,我们尝试使用Debian的根文件系统来构造一个小巧而且好用的实验平台。 在这个实验平台中,读者可以在线安装丰富的软件包,比如kdump,crash,systemtap等工具。这个实验平台具有如下特点:
本书推荐的实验环境如下。
在Ubuntu Linux 20.04可以通过如下命令来安装本书需要的软件包。
本书配套的实验是在 kmodules 目录下面:
本书配套的其他资源
请关注奔跑吧linux社区微信公众号:runninglinuxkernel
本书配套的视频课程
若读者觉得阅读本书的文字版本不过瘾,想看笨叔录制的视频课程,请关注:
目前上线的配套课程有3个:
全球原创的ARM64实验,全球首个手把手解读ARMv8芯片手册,笨叔带您一起做实验,一起玩树莓派,一起进步!
使用O0编译的内核的好处
这个runninglinuxkernel内核默认使用GCC的“O0”优化等级来编译的。 读者可能发现gdb在单步调试内核时会出现光标乱跳并且无法打印有些变量的值(例如出现)等问题,其实这不是gdb或QEMU的问题。
是因为内核编译的默认优化选项是O2,因此如果不希望光标乱跳,可以尝试把linux-5.0根目录Makefile中的O2改成O0,但是这样编译时有问题,作者为此做了一些修改。
最后需要特别说明一下,使用GCC的“O0”优化等级编译内核会导致内核运行性能下降,因此我们仅仅是为了方便单步调试内核。
使用O1或者O2编译的内核,使用gdb进行单步调试时查看变量会出现大量的。
实验说明
本书配套的实验代码是在kmodules/rlk_basic目录下面。
1. 编译运行
在runninglinuxkernel_5.0目录下面有一个rootfs_arm64.tar.xz文件,这个是采用Ubuntu/Debian系统的根文件系统制作而成。 但是,这个根文件系统还只是一个半成品,我们还需要根据编译好的内核来安装内核镜像和内核模块,整个过程比较复杂。
如果在编译内核之前想进入menuconfig界面来配置内核:
编译内核。
执行上述脚本需要几十分钟,依赖于主机的计算能力。接着,编译根文件系统。
读者需要注意,编译根文件系统需要管理员权限,而编译内核则不需要。执行完成后会生成一个名为rootfs_arm64.ext4的根文件系统。
运行刚才编译好的ARM64版本的Linux系统。 运行run_debian_arm64.sh脚本,输入run参数即可。
系统登录名: benshushu 密码:123
切换到root用户:su root
如果读者修改了runninglinuxkernel_5.0内核的配置文件,比如arch/arm64/config/debian_defconfig文件,那么需要重新编译内核以及更新根文件系统。
2. 在线安装软件包
QEMU虚拟机可以通过VirtIO-Net技术来生成一个虚拟的网卡,通过NAT网络桥接技术和主机进行网络共享。使用ifconfig命令来检查网络配置。
可以看到生成了一个名为enp0s1的网卡设备,分配的IP地址为:10.0.2.15。 通过apt update命令来更新Debian系统的软件仓库。
如果更新失败,有可能是系统时间比较旧了,可以使用date命令来设置日期。
使用apt install命令来安装软件包。比如,可以在线安装gcc。
3. 共享文件夹
在主机和QEMU虚拟机之间共享文件。 主机和QEMU虚拟机可以通过NET_9P技术进行文件共享,这个需要QEMU虚拟机和主机的Linux内核都使能NET_9P的内核模块。本实验平台已经支持主机和QEMU虚拟机的共享文件,可以通过如下简单方法来测试。 复制一个文件到runninglinuxkernel_5.0/kmodules目录下面。
启动QEMU虚拟机之后,首先检查一下/mnt目录是否有test.c文件。
我们在后续的实验中会经常利用这个特性,比如把编译好的内核模块或者内核模块源代码放入QEMU虚拟机。
4. 编译内核模块
在QEMU虚拟机中安装必要的软件包。
在QEMU虚拟机里编译内核模块时需要指定QEMU虚拟机本地的内核路径,例如BASEINCLUDE变量指向了本地内核路径。“/lib/modules/$(shell uname -r)/build”是一个链接文件,用来指向具体内核源代码路径,通常是指向已经编译过的内核路径。
编译内核模块,下面以最简单的hello_world内核模块程序为例。
加载内核模块。
5. Livepatch support
在rlk_5.0内核下添加了对arm64 livepatch的支持。aarch64-linux-gnu-gcc版本必须是8或者以上。
在内核源码根目录下samples/livepatch/目录中有相关用例,在ubuntu主机里编译相关模块
加载热补丁模块后再次执行该命令:
可以看到内核函数cmdline_proc_show被替换成功。
卸载热补丁模块
可以看到热补丁模块卸载后,cmdline_proc_show函数恢复到补丁前状态。
6. kdump的使用
请参考《奔跑吧Linux内核》第二版卷2第5章相关内容。
7. 调试ARM64 Linux内核
请参考《奔跑吧Linux内核》第二版卷2第3.1章相关内容,里面详细介绍如何使用QEMU+GDB+Eclipse来调试arm64内核。
8. apt update证书问题
如果在QEMU+ARM64平台里apt更新失败,如下面日志显示。
这个是由于PGP证书的问题,上述日志显示有两个证书有问题,我们可以通过如下方式来修复。
上述两个证书修复之后就可以执行apt update操作了。
加入奔跑吧微信技术交流群
我们建立奔跑吧读者交流群,可以先加我们的客服微信号,请出示奔跑吧系列图书购买截图,以方面我们邀请您进读者群(我们目的是邀请读者进群,过滤机器人,销售,HR,猎头等):