使用qemu搭建内核调试环境
- 编译内核
- 安装qemu-kvm
- 制作根文件系统
- 启动虚拟机
编译内核
内核源码很多地方都有,可以去阿里云、网易、中科大、清华等等的开源镜像站点找。
下载之后需要在电脑上安装编译内核的各种依赖项:
sudo apt-get build-dep linux linux-image-$(uname -r)
sudo apt-get install libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf
有了依赖项后,在内核源码根目录使用下面命令调整内核配置:
make menuconfig
然后使用下面命令即可开始编译:
线程数根据你电脑的情况可以自己改。
这里有一个我遇到的问题是:
需要在配置里把这个文件删除:
编译好的内核在内核源码根目录的以下位置:
arch/x86_64/boot/bzImage
安装qemu-kvm
apt-get install qemu
制作根文件系统
制作简单的根文件系统可以使用buildroot
下载,解压之后得到这样的根目录:
跟kernel类似,先安装依赖:
然后进行配置:
make menuconfig
注意,有一个必要的配置是,修改kernel的下载点:
buildroot原版的下载点是kernel的官网。我家的网络没法正常访问这个地址。我配的这个地址是中科大的镜像,其它的镜像,像清华、阿里的,因为目录结构跟kernel官网不一样,都不行。
这个我觉得应该是buildroot的问题。
记得修改root用户的密码:
然后编译:
注意:buildroot不支持make的-j参数。它自己本身就是多线程的。而且第一次编译的话,主要是下载源码的时间比较长,多不多线程影响不大。
编译结束之后会得到一个压缩包,在源码根目录的output/images下:
这个不能当文件系统用,还需要制作一个文件系统镜像。
qemu-img create -f raw init.img 100m
buildroot的默认设置生成的rootfs非常小,不需要很大的rootfs。这里设置镜像大小是100M。
然后把buildroot生成的文件系统拷贝到镜像里:
mkdir rootfs-folder
sudo mount init.img rootfs-folder
tar -xvf rootfs.tar -C rootfs-folder
sudo umount rootfs-folder
这样,根文件系统就做好了。
启动虚拟机
有了内核和rootfs,就可以用虚拟机调试这套系统了。
使用如下命令启动虚拟机:
qemu-system-x86_64 -kernel bzImage -nographic -append "console=ttyS0 root=/dev/sda" -m 512 --enable-kvm -cpu host -drive file=init.img
效果如下图: