使用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
效果如下圖: