本文最后更新于:2023年10月13日 晚上
amd64下基于qemu用户网络、debootstrap调试amd64内核、根文件系统
1. 编译调试版linux内核
下载源码
1 git clone https://github.com/torvalds/linux.git
安装编译依赖
1 sudo apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev
内核编译选项配置
进入源码目录,配置编译选项:
1 2 3 cd linux git checkout -b v5.10-rc7 v5.10-rc7 make menuconfig
比较重要的配置项有:
1 2 3 4 5 Kernel hacking ---> [*] Kernel debugging Compile-time checks and compiler options ---> [*] Compile the kernel with debug info [*] Provide GDB scripts for kernel debugging
一定要打开。 还有下面的选项会导致打断点失败,一定要关闭:
1 2 Processor type and features ----> [] Randomize the address of the kernel image (KASLR)
保存并退出 menuconfig,开始编译之旅:
1 make -j`expr $(nproc ) / 2`
2. debootstrap制作根文件系统
安装依赖
1 sudo apt-get install qemu qemu-user-static binfmt-support debootstrap debian-archive-keyring
制作文件系统
使用也十分简单,命令格式为:
1 sudo debootstrap --arch [平台] [发行版本代号] [构建目录] [镜像地址]
以在Deepin 20.7 amd64上构建ubuntu18(bionic) amd64为例,预装ifupdown是因为下方配置网络的时候需要用到:
1 sudo debootstrap --arch =amd64 --include=ifupdown bionic linux-rootfs http://mirrors.aliyun.com/ubuntu/
arm64下交叉编译构建amd64需要执行下方命令:
1 sudo cp -a /usr/bin/qemu-x86_64-static linux-rootfs/usr/bin/qemu-x86_64-static
进入文件系统
1 2 3 4 5 6 7 8 9 10 11 wget https://raw.githubusercontent.com/ywhs/linux-software/master/ch-mount.shchmod 777 ch-mount.sh ./ch-mount.sh -m linux-rootfs/ debootstrap/debootstrap --second-stage exit ./ch-mount.sh -u linux-rootfs/ ./ch-mount.sh -m linux-rootfs/
定制文件系统
配置网络
要确保进入文件系统后有网络,可以将 /etc/resolv.conf 文件拷贝到 linux-rootfs/etc/resolv.conf。
1 sudo cp /etc/resolv.conf linux-rootfs/etc/resolv.conf
更换国内镜像源
1 2 3 4 5 6 apt install apt-transport-httpscp /etc/apt/sources.list /etc/apt/sources.list.bak vim /etc/apt/source.listecho "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list
配置 root 用户密码
建立一个普通用户
1 2 3 4 5 USER=wujing HOST=wujing useradd -G sudo -m -s /bin/bash $USER passwd $USER
设置主机名和以太网
1 2 3 4 5 echo $HOST > /etc/hostnameecho "127.0.0.1 localhost.localdomain localhost" > /etc/hostsecho "127.0.0.1 $HOST " >> /etc/hostsecho "auto enp0s3" >> /etc/network/interfacesecho "iface enp0s3 inet dhcp" >> /etc/network/interfaces
退出文件系统
1 2 exit ./ch-mount.sh -u linux-rootfs
制作文件系统镜像(initrd)
1 2 3 4 5 6 7 dd if =/dev/zero of=bionic.img bs=1M seek=2047 count=1 sudo mkfs.ext4 -F bionic.img sudo mkdir -p /mnt/bionic sudo mount -o loop bionic.img /mnt/bionic sudo cp -a linux-rootfs/. /mnt/bionic/. sudo umount /mnt/bionic sudo chmod 666 bionic.img
3. 启动内核并调试
依赖安装
1 sudo apt install qemu qemu-system qemu-kvm
qemu启动内核并挂载文件系统调试
下方两个命令都行,第一个报warning,第二个file=后面要使用绝对路径。
1 qemu-system-x86_64 -s -S -m 2048 -kernel ~/code/linux/arch/x86/boot/bzImage -hda ~/code/tmp/bionic.img -append "root=/dev/sda rootfstype=ext4 rw console=ttyS0 nokaslr" -nographic
1 qemu-system-x86_64 -s -S -m 2048 -kernel ~/code/linux/arch/x86/boot/bzImage -drive format=raw,file=/home/wujing/code/tmp/bionic.img -append "root=/dev/sda rootfstype=ext4 rw console=ttyS0 nokaslr" -nographic
加载内核调试工具
然后切换到内核源码目录,启动 gdb,不过在启动之前,请向 ~/code/linux/.gdbinit 添加如下内容:
1 2 cd linuxecho "add-auto-load-safe-path ./scripts/gdb/vmlinux-gdb.py" >> .gdbinit
加载内核调试工具,然后执行:
1 2 3 gdb vmlinux target remote :1234 c
来连接到虚拟机上的 gdb 服务。
到这里,你就可以像调试普通程序一样调试 Linux 内核了。Linux 的内核入口函数是位于 init/main.c 中的 start_kernel ,在这里完成各种内核数据结构的初始化。
4. 网络修复
输入root密码登录后,查看IP地址:
假设网卡名为enp0s3。
假设上方设置主机名和以太网中网卡名为eth0。
执行如下命令:
1 2 sed -i "s/eth0/enp0s3/g" /etc/network/interfaces ifup enp0s3
现在可以使用apt安装依赖:
qemu默认使用的用户模式网络非常适合允许访问网络资源,包括 Internet。 特别是,它允许从guest到主机的 ssh流量。 但是,默认情况下,它充当防火墙,不允许任何传入流量。 它也不支持 TCP 和 UDP 以外的协议 - 例如,ping 和其他 ICMP 程序将不起作用。