1. 起因

太多文章是基于arm架构在讲,而基于x86架构的大部分都是最小根文件的内核调试,而对内核修改的范围往往比这个大。此文记录这些困扰的解决方案。

2. 最小根文件的编译环境

  1. 编译选项里有的还需要加上调试信息
  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
但是我的要求应该不止最小根文件系统,还需要更丰富的根文件系统。对于4.15用于采样的那个内核最小根文件系统cgroup文件夹就是没法挂载上的。一些可能有效的方法: - 2.1在创建文件镜像的时候加入那些目录。 - 2.2使用-append "init=/xx.sh"写一个脚本告诉内核启动阶段需要创建的目录和文件 但这两种方式不一定能行,因为这里面的文件应该是内核自己挂载上去的才对,最初img里面的文件只有一层。而有趣的是最小的根文件系统创建的时候,有4个文件创建空文件夹,由内核启动时挂载上去就好。当需要更多文件系统的功能时,需要自己从内核文件去拿编译了的,并且创建新的文件映射。详见下面这部分的文件有没有被改。

这里参考的链接如下,谢谢慷慨的前辈们:
利用qemu+gdb在ubuntu下搭建调试kernel的环境
Linux内核调试环境的搭建QEMU+GDB
使用GDB+Qemu调试Linux内核

  1. 启动命令
    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

配置网关


文章作者: 易百分
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 易百分 !
  目录