您好,登录后才能下订单哦!
本篇内容主要讲解“怎么用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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。