构建调试Linux内核网络代码的环境MenuOS系统
实验环境:基于Ubuntu18.0.4和Linux5.0.1
一、下载Linux内核源代码
下载地址:https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz
下载后放入~/LinuxKernel文件夹
执行
mv linux-5.0.1.tar.xz ~/LinuxKernel
xz -d linux-5.0.1.tar.xz
tar -xvf linux-5.0.1.tar
cd linux-5.0.1
二、安装内核编译工具
1、更换镜像源(可选)
若官方镜像源安装太慢,可以更换阿里云镜像源(可选)
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份原文件
sudo vim /etc/apt/sources.list
命令模式下输入ggdG全部删除即可,然后复制对应版本配置(此处为Ubuntu18.04),不同版本可查找 https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.53322f70pnGTJP
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
保存后,输入sudo apt-get update生效
2、安装编译工具
非常重要!必须保证都安装上,不然编译报各种错。
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev
三、配置编译内核
make i386_defconfig #生成32位的配置文件
make menuconfig #开启文本菜单选项,对窗口有限制,尽量调大窗口
通过↑↓键
- 选择Kernel hacking
- 选择Compile-time checks and compiler options
- []Compile the kernel with debug info 选项处按Y
- Save后Exit回车即可
开始编译内核
make -j* # *为cpu核心数
我输入的是make -j4 编译速度有明显提升,这个步骤一般需要几十分钟
没有选择升级当前内核,由于升级之后无法正常开机,若要尝试,建议先执行快照进行备份,以下是升级内核的命令(不推荐)
sudo make modules_install # ⚠️安装前通过系统快照备份系统,以防出现故障前功尽弃
sudo make install
sudo update-grub
reboot
uname -a # 查看当前内核版本号
四、通过QEMU虚拟机加载内核
cd ~/LinuxKernel/
sudo apt install qemu # 安装qemu命令
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage #qemu虚拟机加载 linux-5.0.1内核,这条命令可以不用执行,因为后面构造menuOS的makefile中是包含了这条命令的
如果qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage报错,是VFS:Unable to mount root fs on Unknown-block(xxx,xxx)并卡死,关闭窗口继续往下执行。
五、构造MenuOS
1、制作根目录
#下载menu系统,并在LinuxKernel目录下建一个子目录rootfs,当作menuOS的根目录
git clone https://github.com/mengning/menu.git
mkdir rootfs
sudo apt-get install libc6-dev-i386 # 安装libc6-dev-i386
修改Makefile
cd menu
vim Makefile
修改前:qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img
修改后:qemu -kernel ../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img
命令模式wq保存,执行
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
2、初始化根目录
#在menu目录下执行一下命令
make rootfs
结果如下:
六、构建Linux内核的gdb调试环境
在执行gdb 调试之前,保证make menuconfig那个步骤已经执行,不然编译的内核系统不含调试信息。
1、启动gdb server
关闭已启动的MenuOS窗口,执行
qemu -kernel ../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img -append nokaslr -s -S
2、gdb客户端连接gdb server
打开另一个终端输入gdb
# 在提示下依次输入
file ~/LinuxKernel/linux-5.0.1/vmlinux
break start_kernel
target remote:1234
c
list
MenuOS窗口如下:
七、构建MenuOS的网络功能
1、将 TCP 网络通信程序的服务端集成到 MenuOS 系统中
cd ~/LinuxKernel
git clone https://github.com/mengning/linuxnet.git
cd linuxnet/lab2
make
cd ../../menu/
make rootfs
2、将 TCP 网络通信程序的客户端集成到 MenuOS 系统中
cd ~/LinuxKernel
git clone https://github.com/mengning/linuxnet.git
cd linuxnet/lab3
vim Makefile
# 修改rootfs为linux-5.0.1保存
make rootfs
结果如图:menuOS下面已经多了replyhi,和 hello命令