本篇內(nèi)容主要講解“怎么用QEMU搭建Linux kernel開發(fā)調(diào)試環(huán)境”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么用QEMU搭建Linux kernel開發(fā)調(diào)試環(huán)境”吧!
公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出修水免費(fèi)做網(wǎng)站回饋大家。
內(nèi)核需要事先編譯出來,這里展示的是通用的內(nèi)核編譯方法。
內(nèi)核目錄下選擇通用配置文件:
cp arch/x86/configs/x86_64_defconfig .config
調(diào)整內(nèi)核配置文件適配當(dāng)前內(nèi)核版本:
make menuconfig
編譯內(nèi)核文件:
make bzImage
這一步是最重要的,生成一個(gè)調(diào)試環(huán)境的文件系統(tǒng)。這里介紹四種方法。
busybox是一個(gè)輕量級(jí)的工具集合,包含了init和大部分常用的Linux工具。官網(wǎng):https://busybox.net 。
這個(gè)方法編譯出來的根文件系統(tǒng)是最小的,起動(dòng)速度也是最快的。就是自帶工具可能比較少,有些東西需要自己編譯。
創(chuàng)建raw格式的鏡像文件:
qemu-img create -f raw disk.raw 512M mkfs -t ext4 ./disk.raw
把raw文件掛載到臨時(shí)目錄:
sudo mount -o loop ./disk.raw ./img
進(jìn)入內(nèi)核目錄,把內(nèi)核里的模塊安裝進(jìn)文件系統(tǒng):
sudo make modules_install \ # 安裝內(nèi)核模塊 INSTALL_MOD_PATH=./img # 指定安裝路徑
下載busybox的源碼,編譯之前需要配置。busybox的配置方式和內(nèi)核類似:
cd busybox make defconfig make menuconfig
調(diào)整其中以下選項(xiàng),編譯包含靜態(tài)庫:
Busybox Settings ---> --- Build Options [*] Build BusyBox as a static binary (no shared libs)
然后編譯busybox,這里的path_to_disk_img_mount_point就是剛才raw文件掛載的臨時(shí)目錄:
make CONFIG_PREFIX=install
配置init環(huán)境:
根目錄下手工創(chuàng)建etc/init.d, dev, proc, sys 這三個(gè)目錄。
/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改為可執(zhí)行文件。
正常啟動(dòng)內(nèi)核:
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"
查看內(nèi)核串口輸出:
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
這個(gè)方法類似于虛擬機(jī)安裝系統(tǒng),利用系統(tǒng)自帶的安裝引導(dǎo)程序生成文件系統(tǒng)。這樣安裝出來的是一個(gè)完整的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裝在本機(jī)的一個(gè)目錄里。這個(gè)系統(tǒng)也是完整的debian。
生成raw鏡像文件:
qemu-img create -f raw debiam-10G.img 10G
掛載文件系統(tǒng):
sudo mount -o loop ./debiam-10G.img ./img
安裝debian,這里的path_to_disk_img_mount_point就是剛才鏡像文件的掛載點(diǎn):
sudo debootstrap --arch amd64 stretch
這里的網(wǎng)絡(luò)是主機(jī)和虛擬機(jī)之間的網(wǎng)絡(luò)。
讓系統(tǒng)啟動(dòng)時(shí)自動(dòng)運(yùn)行dhclient:
$ cat >/etc/systemd/network/eth.network <<__END__ [Match] Name=eth0 [Network] DHCP=yes __END__ $ systemctl enable systemd-networkd $ systemctl start systemd-networkd
腳本里的網(wǎng)絡(luò)設(shè)備名設(shè)置為eth0。不同的設(shè)備可能不一樣,比如有些電腦會(huì)叫enp0s3。具體網(wǎng)卡名稱可以通過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
系統(tǒng)啟動(dòng)后,在本機(jī)上可以用ssh -p 5555 localhost遠(yuǎn)程登錄虛擬機(jī)。
Fedora官方有相應(yīng)的的鏡像,叫cloud image,可以直接下載:https://alt.fedoraproject.org/
修改官方鏡像的密碼:
virt-customize -a Fedora-Cloud-Base-30-1.2.x86_64.raw --root-password password:123456
修改鏡像容量大?。?/p>
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擴(kuò)容失敗,grub會(huì)在啟動(dòng)時(shí)找不到分區(qū)。只能改用在系統(tǒng)內(nèi)擴(kuò)容:
qemu-img resize ubuntu-20.04-server-cloudimg-amd64.img +10G
進(jìn)入系統(tǒng)后動(dòng)態(tài)擴(kuò)大根分區(qū):
growpart /dev/sda 1 resize2fs /dev/sda1
進(jìn)入系統(tǒng)之后執(zhí)行:
$ xfs_growfs /dev/sda1
如果程序報(bào)錯(cuò):
xfs_growfs: /dev/sda is not a mounted XFS filesystem
改為指定目錄擴(kuò)容:
xfs_growfs /
啟動(dòng)官方鏡像:
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服務(wù):
systemctl restart sshd
同時(shí)禁止cloud服務(wù):
# systemctl disable cloud-config # systemctl disable cloud-final # systemctl disable cloud-init-local # systemctl disable cloud-init
qemu的網(wǎng)絡(luò)配置是一個(gè)比較糾結(jié)的問題,這里用橋接的方式,只能用有線網(wǎng)卡,不支持無線網(wǎng)卡。
沒什么技巧可言,直接用腳本啟動(dòng)橋接,系統(tǒng)中途會(huì)斷網(wǎng)片刻:
#!/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
與此同時(shí),kernel的啟動(dòng)腳本也要有所改變,這里以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
到此,相信大家對(duì)“怎么用QEMU搭建Linux kernel開發(fā)調(diào)試環(huán)境”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!