千家信息网

怎么用QEMU搭建Linux kernel开发调试环境

发表于:2024-10-18 作者:千家信息网编辑
千家信息网最后更新 2024年10月18日,本篇内容主要讲解"怎么用QEMU搭建Linux kernel开发调试环境",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么用QEMU搭建Linux ker
千家信息网最后更新 2024年10月18日怎么用QEMU搭建Linux kernel开发调试环境

本篇内容主要讲解"怎么用QEMU搭建Linux kernel开发调试环境",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么用QEMU搭建Linux kernel开发调试环境"吧!

1. 编译内核

内核需要事先编译出来,这里展示的是通用的内核编译方法。

内核目录下选择通用配置文件:

 cp arch/x86/configs/x86_64_defconfig .config

调整内核配置文件适配当前内核版本:

make menuconfig

编译内核文件:

make bzImage

2. 生成根文件系统

这一步是最重要的,生成一个调试环境的文件系统。这里介绍四种方法。

2.1 制作busybox根文件系统 (方法一)

busybox是一个轻量级的工具集合,包含了init和大部分常用的Linux工具。官网:https://busybox.net 。

这个方法编译出来的根文件系统是最小的,起动速度也是最快的。就是自带工具可能比较少,有些东西需要自己编译。

2.1.1 创建镜像文件

创建raw格式的镜像文件:

qemu-img create -f raw disk.raw 512Mmkfs -t ext4 ./disk.raw

把raw文件挂载到临时目录:

sudo mount -o loop ./disk.raw ./img
2.1.2 安装模块

进入内核目录,把内核里的模块安装进文件系统:

sudo make modules_install \ # 安装内核模块INSTALL_MOD_PATH=./img # 指定安装路径
2.1.3 busybox

下载busybox的源码,编译之前需要配置。busybox的配置方式和内核类似:

cd busyboxmake defconfigmake 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= install
2.1.4 创建系统文件

配置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/shmount -t proc proc /procmount -t sysfs sysfs /sys

并把/etc/init.d/rcS改为可执行文件。

2.1.5 内核启动脚本

正常启动内核:

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

2.2 用ISO文件制作debian文件系统 (方法二)

这个方法类似于虚拟机安装系统,利用系统自带的安装引导程序生成文件系统。这样安装出来的是一个完整的debian,可以用apt安装工具。

2.2.1 生成镜像文件

生成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
2.2.2 内核启动脚本
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

2.3 用debootstrap制作Debian根文件系统 (方法三)

这方法是利用debian官方的debootstrap,把debian装在本机的一个目录里。这个系统也是完整的debian。

2.3.1 生成镜像文件

生成raw镜像文件:

qemu-img create -f raw debiam-10G.img 10G

挂载文件系统:

sudo mount -o loop ./debiam-10G.img ./img
2.3.2 安装debian

安装debian,这里的path_to_disk_img_mount_point就是刚才镜像文件的挂载点:

sudo debootstrap --arch amd64 stretch 
2.3.3 配置网络

这里的网络是主机和虚拟机之间的网络。

让系统启动时自动运行dhclient:

$ cat > /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查看。

2.3.4 内核启动脚本
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远程登录虚拟机。

2.4 使用Fedora cloud image (方法四)

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 +10Gqemu-img create -f qcow2 Fedora-Cloud-Base-30-1.2.x86_64.qcow2 20Gvirt-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 1resize2fs /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 yesPasswordAuthentication yes

重启sshd服务:

systemctl restart sshd

同时禁止cloud服务:

# systemctl disable cloud-config# systemctl disable cloud-final# systemctl disable cloud-init-local# systemctl disable cloud-init

3 虚拟机访问公网

qemu的网络配置是一个比较纠结的问题,这里用桥接的方式,只能用有线网卡,不支持无线网卡。

没什么技巧可言,直接用脚本启动桥接,系统中途会断网片刻:

#!/bin/bashETH_DEV=enp3s0USERNAME=mynamebrctl addbr br0ip addr flush dev ${ETH_DEV}brctl addif br0 ${ETH_DEV}tunctl -t tap0 -u ${USERNAME}brctl addif br0 tap0ip link set ${ETH_DEV} upip link set tap0 upip link set br0 upbrctl showdhclient -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开发调试环境"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

文件 系统 内核 镜像 方法 编译 目录 生成 配置 脚本 环境 网络 官方 工具 开发 就是 模块 网卡 制作 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 天津通用软件开发价格多少 华三网络技术大赛需要什么 广州壹晟互联网科技有限公司 手机上代理服务器 深圳燕家网络技术有限公司 增值税安全接入服务器 科技互联网创新创业采访 上海计算机网络技术学校电话多少 六壬网络安全公司王琦学历 福州软件开发定制平台 5月5日网络安全巡检 松下服务器err272报警 oracle数据库考试 公司电脑邮箱连接不上服务器 简述数据库技术的发展历史 发送邮件显示成功到达对方服务器 深圳net软件开发费用是多少 网络安全攻防比赛能速成吗 中国电信dns服务器地址是什么 深圳市掌柜网络技术有限公司 异地组网的点对网络技术 土地银行软件开发公司 佛山软件开发在哪 tcl西安软件开发 网络安全信息衡量标准 广东通用软件开发价格走势 移动网络技术有什么用 我国网络安全面临什么挑战 系统自带iis服务器是什么意思 国脉科技互联网医疗
0