host上编译安装qemu
host: centos 8.0 x86_64
下载qemu-4.0.0.tar.gz
https://download.qemu.org/编译qemu
1 | ./configure --target-list=aarch64-softmmu |
在编译qemu需要安装glibc和glib2的等开发包,请安装相应的开发包。
下载 UEFI firmware
我们需要支持aarch64的UEFI固件,上面的rpm在x86_64上无法直接安装,可以通过下面的命令获取UEFI固件。
- 解压uefi固件
1 | $ rpm2cpio edk2-aarch64-20190308git89910a39dcfd-6.el8.noarch.rpm | cpio -div |
使用上面解压出来的UEFI固件:QEMU_EFI.fd
运行虚拟机 安装centos发行版
1 | qemu-system-aarch64 -m 4096 -cpu cortex-a57 -smp 2 -M virt -bios QEMU_EFI.fd -nographic -drive if=none,file=CentOS-7-aarch64-Everything-1908.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom -drive if=none,file=centos-aarch64.img,id=hd0 -device virtio-blk-device,drive=hd0 |
- 上面的命令没有给VM配置网络接口,仅仅用来安装操作系统!!
- centos的安装完全是基于命令行界面的,按照提示安装就可以了
配置网络
网络参照这个文档,配置tap接口给aarch64虚拟机使用。
配置接口
如果由brctl命令则使用brctl命令。1
2
3
4
5brctl addbr br0
ifconfig br0 up
tunctl -t tap0 -u root # 创建一个 tap0 接口,只允许 root 用户访问
brctl addif br0 tap0 # 在虚拟网桥中增加一个 tap0 接口
ifconfig tap0 0.0.0.0 promisc up # 启用 tap0 接口如果没有brctl命令,可以使用ip命令代替。
1
2
3
4
5ip tuntap add tap0 mode tap
ip link set dev tap0 up
ip link add br0 type bridge
ip link set tap0 master br0
ip link set eth0 master br0VM使用网络接口
1
-net nic -net tap,ifname=tap0,script=no,downscript=no
使用上面的参数让qemu使用tap接口作为vm的网络接口。
完整的命令如下:1
qemu-system-aarch64 -m 4096 -cpu cortex-a57 -smp 4 -M virt -bios QEMU_EFI.fd -nographic -drive if=none,file=centos-aarch64.img,id=hd0 -device virtio-blk-device,drive=hd0 -drive if=none,file=CentOS-7-aarch64-Everything-1908.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom -net nic -net tap,ifname=tap0,script=no,downscript=no
-boot c参数指定硬盘启动无效,原因不明,规避方法是启动中按esc进入UEFI的bootmgr选择硬盘启动。
配置ssh访问
登录aarch64 centos后,设置网络接口。这里VM使用的tap接口时桥接到外部网络的,配置地址后就可以访问。
总结
安装aarch64的centos后,登录发现虚拟机效率很低。
1 | $ cat /proc/cpuinfo |
这里可见模拟cpu的BogoMIPS为125,即每秒125M指令,实际CPU的主频在250M左右。
host上cpu主频在2.2G,执行效率仅为10%,有着90%的性能损失。