您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么用QEMU搭建Linux kernel開發調試環境”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用QEMU搭建Linux kernel開發調試環境”吧!
內核需要事先編譯出來,這里展示的是通用的內核編譯方法。
內核目錄下選擇通用配置文件:
cp arch/x86/configs/x86_64_defconfig .config
調整內核配置文件適配當前內核版本:
make menuconfig
編譯內核文件:
make bzImage
這一步是最重要的,生成一個調試環境的文件系統。這里介紹四種方法。
busybox是一個輕量級的工具集合,包含了init和大部分常用的Linux工具。官網:https://busybox.net 。
這個方法編譯出來的根文件系統是最小的,起動速度也是最快的。就是自帶工具可能比較少,有些東西需要自己編譯。
創建raw格式的鏡像文件:
qemu-img create -f raw disk.raw 512M mkfs -t ext4 ./disk.raw
把raw文件掛載到臨時目錄:
sudo mount -o loop ./disk.raw ./img
進入內核目錄,把內核里的模塊安裝進文件系統:
sudo make modules_install \ # 安裝內核模塊 INSTALL_MOD_PATH=./img # 指定安裝路徑
下載busybox的源碼,編譯之前需要配置。busybox的配置方式和內核類似:
cd busybox make defconfig make menuconfig
調整其中以下選項,編譯包含靜態庫:
Busybox Settings ---> --- Build Options [*] Build BusyBox as a static binary (no shared libs)
然后編譯busybox,這里的path_to_disk_img_mount_point就是剛才raw文件掛載的臨時目錄:
make CONFIG_PREFIX=<path_to_disk_img_mount_point> install
配置init環境:
根目錄下手工創建etc/init.d, dev, proc, sys 這三個目錄。
/etc/inittab:
::sysinit:/etc/init.d/rcS ::askfirst:/bin/ash ::ctrlaltdel:/sbin/reboot ::shutdown:/sbin/swapoff -a ::shutdown:/bin/umount -a -r ::restart:/sbin/init
/etc/init.d/rcS:
#!/bin/sh mount -t proc proc /proc mount -t sysfs sysfs /sys
并把/etc/init.d/rcS改為可執行文件。
正常啟動內核:
qemu-system-x86_64 \ -m 512 \ -kernel ../kernel/arch/x86_64/boot/bzImage \ -drive format=raw,file=./disk.raw \ -append "init=/linuxrc root=/dev/sda rw"
查看內核串口輸出:
qemu-system-x86_64 \ -m 512 \ -kernel ../kernel/arch/x86_64/boot/bzImage \ -drive format=raw,file=./disk.raw \ -append "init=/linuxrc root=/dev/sda rw console=ttyS0" \ -serial file:./serial.out
這個方法類似于虛擬機安裝系統,利用系統自帶的安裝引導程序生成文件系統。這樣安裝出來的是一個完整的debian,可以用apt安裝工具。
生成raw鏡像文件:
qemu-img create -f raw debiam-10G.img 10G
安裝debian:
qemu-system-x86_64 -m 512 -boot d -hda ./debiam-10G.img -cdrom iso/debian-9.4.0-amd64-netinst.iso
qemu-system-x86_64 -m 512 -boot c -kernel ../kernel/arch/x86_64/boot/bzImage -append root=/dev/sda1 -hda ./debiam-10G.img -hdb ./fat.img -net nic -net user,hostfwd=tcp::10022-:22
這方法是利用debian官方的debootstrap,把debian裝在本機的一個目錄里。這個系統也是完整的debian。
生成raw鏡像文件:
qemu-img create -f raw debiam-10G.img 10G
掛載文件系統:
sudo mount -o loop ./debiam-10G.img ./img
安裝debian,這里的path_to_disk_img_mount_point就是剛才鏡像文件的掛載點:
sudo debootstrap --arch amd64 stretch <path_to_disk_img_mount_point>
這里的網絡是主機和虛擬機之間的網絡。
讓系統啟動時自動運行dhclient:
$ cat > <path_to_disk_img_mount_point>/etc/systemd/network/eth.network <<__END__ [Match] Name=eth0 [Network] DHCP=yes __END__ $ systemctl enable systemd-networkd $ systemctl start systemd-networkd
腳本里的網絡設備名設置為eth0。不同的設備可能不一樣,比如有些電腦會叫enp0s3。具體網卡名稱可以通過ip link查看。
qemu-system-x86_64 \ -m 512 \ -kernel ../../kernel/arch/x86_64/boot/bzImage \ -drive format=raw,file=./debian-stretch-x86_64.img,index=0 \ -drive format=raw,file=./../fat/fat.winxp.img,index=1 \ --append "console=ttyS0 root=/dev/sda rw" \ -enable-kvm \ -nographic \ -device e1000,netdev=net0 \ -netdev user,id=net0,hostfwd=tcp::5555-:22
系統啟動后,在本機上可以用ssh -p 5555 localhost遠程登錄虛擬機。
Fedora官方有相應的的鏡像,叫cloud image,可以直接下載:https://alt.fedoraproject.org/
修改官方鏡像的密碼:
virt-customize -a Fedora-Cloud-Base-30-1.2.x86_64.raw --root-password password:123456
修改鏡像容量大小:
qemu-img resize Fedora-Cloud-Base-30-1.2.x86_64.raw +10G qemu-img create -f qcow2 Fedora-Cloud-Base-30-1.2.x86_64.qcow2 20G virt-resize --expand /dev/sda1 Fedora-Cloud-Base-30-1.2.x86_64.qcow2 Fedora-Cloud-Base-30-1.2.x86_64-20G.qcow2
ubuntu 20.04使用virt-resize擴容失敗,grub會在啟動時找不到分區。只能改用在系統內擴容:
qemu-img resize ubuntu-20.04-server-cloudimg-amd64.img +10G
進入系統后動態擴大根分區:
growpart /dev/sda 1 resize2fs /dev/sda1
進入系統之后執行:
$ xfs_growfs /dev/sda1
如果程序報錯:
xfs_growfs: /dev/sda is not a mounted XFS filesystem
改為指定目錄擴容:
xfs_growfs /
啟動官方鏡像:
sudo qemu-system-x86_64 -m 512 -drive format=raw,file=./Fedora-Cloud-Base-30-1.2.x86_64.raw -nographic -enable-kvm -device e1000,netdev=net0 -netdev user,id=net0,hostfwd=tcp::5555-:22
如果要ssh登陸,需要修改/etc/ssh/sshd_config:
PermitRootLogin yes PasswordAuthentication yes
重啟sshd服務:
systemctl restart sshd
同時禁止cloud服務:
# systemctl disable cloud-config # systemctl disable cloud-final # systemctl disable cloud-init-local # systemctl disable cloud-init
qemu的網絡配置是一個比較糾結的問題,這里用橋接的方式,只能用有線網卡,不支持無線網卡。
沒什么技巧可言,直接用腳本啟動橋接,系統中途會斷網片刻:
#!/bin/bash ETH_DEV=enp3s0 USERNAME=myname brctl addbr br0 ip addr flush dev ${ETH_DEV} brctl addif br0 ${ETH_DEV} tunctl -t tap0 -u ${USERNAME} brctl addif br0 tap0 ip link set ${ETH_DEV} up ip link set tap0 up ip link set br0 up brctl show dhclient -v br0
與此同時,kernel的啟動腳本也要有所改變,這里以debian鏡像為例:
qemu-system-x86_64 \ -m 512 \ -enable-kvm \ -kernel ../../kernel/arch/x86_64/boot/bzImage \ -drive format=raw,file=./debian-stretch-x86_64.img,index=0 \ --append "root=/dev/sda rw" \ -device e1000,netdev=network0 \ -netdev tap,id=network0,ifname=tap0,script=no,downscript=no
到此,相信大家對“怎么用QEMU搭建Linux kernel開發調試環境”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。