使用qemu构建一个loongarch64虚拟机

背景

国产化的平台目前主要用到的有飞腾和龙芯,飞腾的是arm64架构,这个使用的比较多,龙芯的架构之前是mips架构,最新的硬件的架构已经发生了改变,现在是loongarch64架构,这个算比较新的架构,所以硬件就比较难获得,如果又有适配的需求,这个时候通过虚拟机启动环境是一个比较好的方式

虚拟机有两种方式:

  • 一种是在相同架构下开虚拟机,这个比较简单,一般的操作系统内都带了kvm的相关的软件,直接使用qemu-kvm启动虚拟机就可以了,这个方式的前提是你得有一台这个架构的物理机器,才能在上面启动kvm虚拟机,还存在资源共用的问题了
  • 另外一种方式就是通过qemu完全软件来进行启动这个虚拟机,qemu是在软件内实现了硬件的模拟,一般硬件厂商会给这个做一些适配工作,然后就支持虚拟厂商的硬件了,这个对宿主机环境没有要求

上面的方式二在之前尝试过,可能当时厂商对qemu还没开发完整,所以整个软件链路我自己当时是没有跑起来的,最近因为软件适配的问题,再次尝试,能够启动成功了,本篇就是把这个过程记录下来

准备的资源

  • 准备一个x86的主机,性能尽量好点,这样虚拟机也能快一点
  • 准备一个操作系统,这个操作系统最好系统版本高一点,centos8或者8以上的stream都可以,因为新版本的qemu里面用到的库的版本比较高,所以操作系统尽量高一点,这个依赖就比较好找了
  • qemu的软件,这个用最新版本的即可
  • loongarch64的qemu的一些运行的二进制文件
  • 一个支持loongarch64的操作系统,这个国产操作系统基本都做了适配,这个我直接下载的操作系统,没有走iso安装的步骤,这个后面再研究,如果不好安装,也可以在kvm下把系统安装好了以后,把系统文件弄出来给qemu使用即可,这里直接下载官方提供的,本次使用的是opencloudos的龙芯操作系统

操作系统

这里为了方便,主机的操作系统我选择的是opencloudos的x86系统

https://mirrors.opencloudos.tech/opencloudos-stream/releases/23/images/x86_64/OpenCloudOS-Stream-23-20240304-minimal-x86_64.iso

下载的是minimal的,后面根据需要安装包即可

配置方法

编译qemu

安装后面会用到的依赖包

1
[root@lab101 ~]# dnf install wget gcc python3-sphinx python3-sphinx_rtd_theme ninja-build glib2-devel usbredir-devel libusbx-devel git bridge-utils net-tools

有个libusbredirparser-0.5包冲突处理下

1
2
[root@lab101 ~]# rpm -e libusbx --nodeps
[root@lab101 ~]# dnf install libusb1-devel

下载qemu源码包

1
[root@lab101 ~]# wget https://download.qemu.org/qemu-9.0.2.tar.xz

解压

1
[root@lab101 ~]# tar -xvf qemu-9.0.2.tar.xz

编译

1
2
3
[root@lab101 ~]# cd qemu-9.0.2
[root@lab101 qemu-9.0.2]# ./configure --disable-rdma --prefix=/usr --target-list="loongarch64-softmmu" --disable-libiscsi --disable-libnfs --disable-libpmem --disable-glusterfs --enable-libusb --enable-usb-redir --disable-opengl --disable-xen --disable-spice --enable-debug --disable-capstone --disable-kvm
[root@lab101 qemu-9.0.2]# make -j24

完成后检查输出

1
2
3
4
[root@lab101 qemu-9.0.2]# /root/qemu-9.0.2/build/qemu-system-loongarch64 -M ?
Supported machines are:
none empty machine
virt Loongson-3A5000 LS7A1000 machine (default)

可以看到支持模拟的是 Loongson-3A5000

配置网桥

宿主机配置一个网桥

1
2
3
4
5
6
7
8
[root@lab101 ~]# cat br0.sh
ifconfig p786p1 down
ifconfig p786p1 0.0.0.0
brctl addbr br0
brctl addif br0 p786p1
ifconfig br0 192.168.19.101/16 up
brctl stp br0 off
route add default gw 192.168.1.1 br0

下载固件和镜像

1
2
3
4
[root@lab101 ~]# mkdir /vm
[root@lab101 ~]# cd /vm/
[root@lab101 vm]# wget https://mirrors.opencloudos.tech/opencloudos-stream/releases/23/images/loongarch64/OpenCloudOS-Stream-23-20240808-loongarch64-preview.qcow2
[root@lab101 vm]# wget https://github.com/yangxiaojuan-loongson/qemu-binary/releases/download/2024-05-30/QEMU_EFI.fd
1
2
[root@lab101 vm]# mkdir -p /root/qemu-9.0.2/build/qemu-bundle/etc/qemu/
[root@lab101 vm]# vi /root/qemu-9.0.2/build/qemu-bundle/etc/qemu/bridge.conf

添加

1
allow br0

启动虚拟机

1
/root/qemu-9.0.2/build/qemu-system-loongarch64 -M virt -m 12G -cpu la464 -smp 12 -bios /vm/QEMU_EFI.fd -drive file=/vm/OpenCloudOS-Stream-23-20240808-loongarch64-preview.qcow2  -net nic  -net bridge,br=br0  --nographic

修改root密码

通过用 rw init=/sysroot/bin/sh 参数替换内核中的 ro 语句以单用户模式启动

1
2
3
4
linux ($root)/boot/vmlinuz-6.6.34-9.ocs23.loongarch64 root=UUID=69ed94f1-41\|
|53-48c0-8f9a-937959022d1d ro i8042.noaux quiet console=ttyS0,115200 console\|
|=tty0 crashkernel=512M-4G:192M,4G-64G:256M,64G-128G:512M,128G-:768M biosdev\|
|name=0 net.ifnames=0

改成

1
2
3
4
linux ($root)/boot/vmlinuz-6.6.34-9.ocs23.loongarch64 root=UUID=69ed94f1-41\|
|53-48c0-8f9a-937959022d1d rw init=/sysroot/bin/sh i8042.noaux quiet console=ttyS0,115200 console\|
|=tty0 crashkernel=512M-4G:192M,4G-64G:256M,64G-128G:512M,128G-:768M biosdev\|
|name=0 net.ifnames=0

改好了后按F10启动,这个如果知道root密码就不用改

1
2
3
4
5
6
7
8
9
10
11
Generating "/run/initramfs/rdsosreport.txt"


Entering emergency mode. Exit the shell to continue.
Type "journalctl" to view system logs.
You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick or /boot
after mounting them and attach it to a bug report.


Press Enter for maintenance
(or press Control-D to continue):
1
2
3
4
5
6
7
:/root# /sysroot/sbin/chroot /sysroot/
:/# passwd root
Changing password for user root.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

改好后,重启退出,再启动

输入用户名密码登录即可

1
2
3
[root@192 ~]# cat /proc/cpuinfo |grep "Model\|CPU Revision"|sort -u
CPU Revision : 0x10
Model Name : Loongson-3A5000

启动成功界面

可以看到,通过qemu,我们完成了虚拟机的模拟启动了

总结

本篇介绍了使用qemu来模拟一个龙芯的环境,并且安装了opencloudos的镜像,其它镜像也是类似的操作