- 作者: 陈孝松
- 主页: chenxiaosong.com
- 哔哩哔哩: 陈孝松
- 课程: chenxiaosong.com/courses
- 博客: chenxiaosong.com/blog
- 贡献: chenxiaosong.com/contributions
- 邮箱: chenxiaosong@chenxiaosong.com
- QQ交流群: 544216206, 点击查看群介绍
点击这里在哔哩哔哩bilibili在线观看配套的加餐视频(就是一些补充)。
下面介绍Linux内核编译环境和测试环境的搭建过程,当然我也为各位朋友准备好了已经安装好的虚拟机镜像,只需下载运行即可。
点击这里从百度网盘下载对应平台的虚拟机镜像,x86_64
(也就是你平时用来安装windows系统的电脑,或者2020年前的苹果电脑)选择ubuntu-x64_64.zip
,arm64
(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.qcow2
,image.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报错dmesg
中virtio_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
,不要用回车。