1. 起因
太多文章是基于arm架构在讲,而基于x86架构的大部分都是最小根文件的内核调试,而对内核修改的范围往往比这个大。此文记录这些困扰的解决方案。
2. 最小根文件的编译环境
- 编译选项里有的还需要加上调试信息
- 需要一个根文件系统来运行刚刚编译好的内核,运行busybox会在_install目录下得到一个最小的文件系统的一部分,还需要进行下面的操作:
sudo rsync -ar busybox-1.33.0/_install/* rootfs cd rootfs sudo chown root:root * -R sudo mkdir -p proc sys dev etc/init.d sudo mknod -m 622 dev/console c 5 1 sudo mknod -m 666 dev/null c 1 3 sudo mknod -m 666 dev/zero c 1 5 sudo mknod -m 666 dev/ptmx c 5 2 sudo mknod -m 666 dev/tty c 5 0 sudo mknod -m 444 dev/random c 1 8 sudo mknod -m 444 dev/urandom c 1 9 sudo chown root:tty dev/{console,ptmx,tty} sudo sh -c 'echo "#!/bin/sh\nmount -t proc none /proc\nmount -t sysfs none /sys\nln -s /dev/null /dev/tty2\nln -s /dev/null /dev/tty3\nln -s /dev/null /dev/tty4\nexit 0" > etc/init.d/rcS' sudo chmod a+x etc/init.d/rcS
这里参考的链接如下,谢谢慷慨的前辈们:
利用qemu+gdb在ubuntu下搭建调试kernel的环境
Linux内核调试环境的搭建QEMU+GDB
使用GDB+Qemu调试Linux内核
- 启动命令
qemu-system-x86_64 \ -kernel /home/yi/Downloads/kernel/longterm/linux-5.4.259/arch/x86_64/boot/bzImage \ -nographic \ -append "nokaslr console=ttyS0 root=/dev/sda rw" \ -drive file=/home/yi/Documents/kernel.img,format=raw,id=hd0 \ -m 8G \ -s \ -S
3. 更丰富的调试环境
Ubuntu系统提供debootstrap工具快速创建指定架构的根文件系统。
3.1 根文件系统的制作
只使用最小的根文件系统是很有局限性的,很多调试的工具都没法用,现在试图做一个更丰富的根文件。
这些文件来自笨叔的奔跑吧
cat rootfs_debian_x86_64.part0* > rootfs_debian_x86_64.tar.xz
sudo tar Jxf rootfs_debian_x86_64.tar.xz
mkdir -p /home/yi/Documents/rootfsAdvance
sudo cp -a rootfs_debian_x86_64/* rootfsAdvance/
sudo rm -rf /home/yi/Documents/rootfs_debian_x86_64
3.2 编译内核
进入编译内核的那个文件里
make -j20
sudo make modules_install -j 20
make headers_install
make -s kernelrelease
得到结果5.4.259qemulearn
3.3 完善准备要制作的文件系统
mkdir -p /home/yi/Documents/rootfsAdvance/usr/src/linux/
rm /home/yi/Documents/rootfsAdvance/lib/modules/5.4.259qemulearn/build
mkdir -p /home/yi/Documents/rootfsAdvance/lib/modules/5.4.259qemulearn/build
cp -a include /home/yi/Documents/rootfsAdvance/usr/src/linux/
cp Makefile .config Module.symvers System.map /home/yi/Documents/rootfsAdvance/usr/src/linux/
mkdir -p /home/yi/Documents/rootfsAdvance/usr/src/linux/arch/x86/
mkdir -p /home/yi/Documents/rootfsAdvance/usr/src/linux/arch/x86/kernel/
mkdir -p /home/yi/Documents/rootfsAdvance/usr/src/linux/scripts
cp -a arch/x86/include /home/yi/Documents/rootfsAdvance/usr/src/linux/arch/x86/
cp -a arch/x86/Makefile /home/yi/Documents/rootfsAdvance/usr/src/linux/arch/x86/
cp -a scripts /home/yi/Documents/rootfsAdvance/usr/src/linux/
ln -s /usr/src/linux /home/yi/Documents//lib/modules/5.4.259qemulearn/build
3.4 制作流程
dd if=/dev/zero of=/home/yi/Documents/rootfsAdvance.ext4 bs=1M count=8192
mkfs.ext4 /home/yi/Documents/rootfsAdvance.ext4
mkdir -p tmpfs
sudo mount -t ext4 /home/yi/Documents/rootfsAdvance.ext4 tmpfs/ -o loop
sudo cp -af /home/yi/Documents/rootfsAdvance/* tmpfs/
umount tmpfs
chmod 777 /home/yi/Documents/rootfsAdvance.ext4
3.5 启动
sudo qemu-system-x86_64 -m 10G\
-nographic -smp 10 \
-kernel /home/yi/Downloads/kernel/longterm/linux-5.4.259/arch/x86_64/boot/bzImage \
-append "console=ttyS0 root=/dev/sda rw" \
-hda /home/yi/Documents/rootfsAdvance.ext4
4. gdb断点调试
在有vmlinux的目录下进入gdb
file vmlinux
target remote:1234
hb start_kernel #如果断点不停止,第一个断点需要下硬断点而不是软断点;同时还需要在启动命令加上nokaslr关闭地址随机化
5. vscode连接上虚拟机
需要安装一个gdb debug的扩展
用到的网络工具
cd clash-linux-amd64-v1.18.0/
chmod +x clash-linux-amd64
cat my_paid_config.yaml > ~/.config/clash/config.yaml
sudo mv clash-linux-amd64 /usr/local/bin/clash
clash -d ~/.config/clash