Linux内核开发环境-使用QEMU测试内核代码

建议点击这里查看个人主页上的最新原文

点击这里在哔哩哔哩bilibili在线观看配套的教学视频

点击这里在哔哩哔哩bilibili在线观看配套的加餐视频(就是一些补充)

点击跳转到内核课程所有目录

下面介绍Linux内核编译环境和测试环境的搭建过程,当然我也为各位朋友准备好了已经安装好的虚拟机镜像,只需下载运行即可。

点击这里从百度网盘下载对应平台的虚拟机镜像x86_64(也就是你平时用来安装windows系统的电脑,或者2020年前的苹果电脑)选择ubuntu-x64_64.ziparm64(2020年末之后的苹果电脑)选择ubuntu-aarch64.zip。虚拟机运行后,登录界面的密码是1

前面介绍完了编译环境,编译出的代码我们不能直接在编译环境上运行,还要再启动qemu虚拟机运行我们编译好的内核。

模拟器与虚拟机

Bochs: x86硬件平台的开源模拟器,帮助文档少,只能模拟x86处理器。

QEMU: quick emulation,高速度、跨平台的开源模拟器,能模拟x86、arm等处理器,与Linux的KVM配合使用,能达到与真实机接近的速度。

第1类虚拟机监控程序: 直接在主机硬件上运行,直接向硬件调度资源,速度快。如Linux的KVM(免费)、Windows的Hyper-V(收费)。

第2类虚拟机监控程序: 在常规操作系统上以软件层或应用的形式运行,速度慢。如Vmware Workstation、Oracal VirtualBox。

本教程中,我们使用qemu来测试运行内核代码。

制作测试用的qcow2镜像的脚本

测试编译好的内核我们不直接用发行版的iso镜像安装的系统,而是使用脚本生成比较小的镜像(不含有图形界面)。进入目录courses,选择相应的cpu架构,如x86_64目录。执行create-raw.sh生成raw格式的镜像,这个脚本会调用到create-debian.sh,是从syzkaller的脚本经过修改而来。

注意riscv64架构的镜像,可以直接下载ubuntu2204(选择[QEMU emulator]),使用文档

生成raw格式镜像后,再执行以下命令转换成占用空间更小的qcow2格式:

# -p 显示进度, -f 源镜像格式, -O 转换后的格式, 后面再紧接的是: 源文件名称,转换后的文件名称
qemu-img convert -p -f raw -O qcow2 image.raw image.qcow2

再执行脚本link-scripts.sh把脚本链接到相应的目录,执行update-base.sh启动虚拟机更新镜像(如再安装一些额外的软件),镜像更新完后关闭虚拟机,再执行create-qcow2.sh生成指向基础镜像的qcow2镜像。

通过iso安装发行版

也可以在Virtual Machine Manager中通过iso文件安装发行版,安装完成后的qcow2镜像要用命令行启动,安装时不使用LVM,而是把磁盘的某个分区挂载到根路径/

在 Virtual Machine Manager 中创建 qcow2 格式,会马上分配所有空间,所以需要在命令行中创建 qcow2:

qemu-img create -f qcow2 image.qcow2 512G
file image.qcow2 # 查看文件的格式

可以再生成一个qcow2文件image2.qcow2,指向安装好的镜像image.qcow2image.qcow2作为备份文件, 注意<有些版本的qemu-img>要求源文件和目标文件都要指定绝对路径

qemu-img create -F qcow2 -b /path/image.qcow2 -f qcow2 /path/image2.qcow2 #  -F 源文件格式

iso安装发行版本后,默认是/dev/vda1-device virtio-scsi-pci)挂载到根路径/,如果要重新制作成/dev/vda挂载到根分区/,可以把qcow2文件里的内容复制出来,qcow2格式镜像的挂载:

sudo apt-get install qemu-utils -y # 要先安装工具软件
sudo modprobe nbd max_part=8 # 加载nbd模块
sudo qemu-nbd --connect=/dev/nbd0 image.qcow2 # 连接镜像
sudo fdisk /dev/nbd0 -l # 查看分区
sudo mount /dev/nbd0p1 mnt/ # 挂载分区
sudo umount mnt # 操作完后,卸载分区
sudo qemu-nbd --disconnect /dev/nbd0 # 断开连接
sudo modprobe -r nbd # 移除模块

当然也可以把qcow2转换成raw格式,然后把raw格式文件里的内容复制出来:

qemu-img convert -p -f qcow2 -O raw image.qcow2 image.raw

ubuntu24.04报错dmesgvirtio_net virtio0 enp0s1: renamed from eth0,解决办法:

sudo vim /etc/netplan/50-cloud-init.yaml # 把网络接口名改成enp0s1
sudo netplan apply

源码安装qemu

关于各个Linux发行版怎么安装qemu,可以参考qemu官网的介绍,下面主要介绍一下源码的安装方式,源码安装方式可以使用qemu的最新特性。

先安装Ubuntu编译qemu所需的软件:

# ubuntu 22.04
sudo apt-get install libattr1-dev libcap-ng-dev -y
sudo apt install ninja-build -y
sudo apt-get install libglib2.0-dev -y
sudo apt-get install libpixman-1-dev -y
sudo apt install python3-pip
pip install tomli

CentOS发行版安装编译qemu所需的软件:

sudo dnf install glib2-devel -y
sudo dnf install iasl -y
sudo dnf install pixman-devel -y
sudo dnf install libcap-ng-devel -y
sudo dnf install libattr-devel -y

# centos 9才需要, http://re2c.org/
git clone https://github.com/skvadrik/re2c.git
./autogen.sh
./configure  --prefix=${HOME}/chenxiaosong/sw/re2c
make && make install

# centos 要安装 ninja, https://ninja-build.org/
git clone https://github.com/ninja-build/ninja.git && cd ninja
./configure.py --bootstrap

# centos9, https://sparse.docs.kernel.org/en/latest/
git clone git://git.kernel.org/pub/scm/devel/sparse/sparse.git
make

再下载编译qemu:

git clone https://gitlab.com/qemu-project/qemu.git
cd qemu
git submodule init
git submodule update --recursive
mkdir build
cd build/
../configure --enable-kvm --enable-virtfs --prefix=${HOME}/chenxiaosong/sw/qemu/
make -j`nproc`

qemu配置

非root用户没有权限的解决办法:

# 源码安装的
sudo chown root libexec/qemu-bridge-helper
sudo chmod u+s libexec/qemu-bridge-helper
# apt安装的
sudo chown root /usr/lib/qemu/qemu-bridge-helper
sudo chmod u+s /usr/lib/qemu/qemu-bridge-helper

groups | grep kvm
sudo usermod -aG kvm $USER
su - $USER # 或退出shell重新登录, 但在tmux中不起作用

允许使用virbr0网络接口:

# 源码安装的
mkdir -p etc/qemu
vim etc/qemu/bridge.conf # 添加 allow virbr0
# apt安装的
sudo mkdir -p /etc/qemu/
sudo vim /etc/qemu/bridge.conf # 添加 allow virbr0

修改virbr0网段:

virsh net-list # 查看网络情况
virsh net-edit default # 编辑
virsh net-destroy default
virsh net-start default

qemu运行qcow2镜像

制作好的Ubuntu虚拟机镜像(从百度网盘中下载的)中的${HOME}/qemu-kernel/start.sh脚本中每个选项的可选值可以使用以下命令查看:

qemu-system-aarch64 -cpu ?
qemu-system-x86_64 -machine ?

如果自己编译内核,启动时指定内核,需要指定-kernel-append选项。

如果你的镜像是一个完整的镜像(比如通过iso安装),不想指定内核,就想用镜像本身自带的内核,可以把-kernel-append选项删除。

qemu启动后,按快捷键ctrl+a c(先按ctrl+a松开后再按c)再输入quit强制退出qemu,但不建议强制退出。

在系统启动界面登录进去后(而不是以ssh登录),默认的窗口大小不会自动调整,需要手动调整:

stty size # 可以先在其他窗口查看大小
echo "stty rows 54 cols 229" > stty.sh
. stty.sh

当启用了9p文件系统,就可以把宿主机的modules目录(当然也可以是其他任何目录)共享给虚拟机,具体参考Documentation/9psetup。虚拟机中执行脚本mod-cfg.sh(直接运行bash mod-cfg.sh可以查看使用帮助)挂载和链接模块目录。

root免密登录,/etc/ssh/sshd_config(注意不是ssh_config) 修改以下内容:

PermitRootLogin yes
PasswordAuthentication yes
PermitEmptyPasswords yes

曾经使用过fedora发行版,这里记录一下fedora的一些笔记。进入fedora虚拟机后:

# fedora 启动的时候等待: A start job is running for /dev/zram0,解决办法: 删除 zram 的配置文件
mv /usr/lib/systemd/zram-generator.conf /usr/lib/systemd/zram-generator.conf.bak
# fedora26 安装 vim 前,先升级
sudo dnf update vim-common vim-minimal -y

注意fedora中账号密码输完后要用ctrl+j,不要用回车。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值