没有国产主机,怎么开发:交叉编译和QEMU虚拟机
1. 背景
近期国产化的趋势越来越浓,包括国产操作系统、国产CPU等。时隔十多年,QQ for Linux也更新了。做为软件开发人员,“有幸”也需要适配国产化。至于国产化的意义等就不在此讨论。
本文提到的国产主机主要是指使用国产CPU和操作系统的计算机,比如:操作系统是银河麒麟,CPU是飞腾FT2000。如果需要做适配开发,起码需要一台对应的主机吧。据说在国产化早期,有钱都难买到机器,需要特殊渠道申请购买。不过,现在购买还是比较方便的。
通过客户提供的正规正统的厂家询价,着实吓一跳,一台居然要一万多!!而同等性能配置的windows-x86普通台式主机,才两三千块左右,相差有点大呀。本着能省就省的原则,上万能的某宝看能不能淘一个。真得感谢马爸爸和深圳华强北,5千多块,突然感觉肉没那么痛了。
其实完全可以理解,国产的批量肯定很小很小,价格必然是高的。对于不专门开发“国产软件”的公司来说,买一台使用率比较低的机器不太值得。后面将介绍在没有国产主机情况下,进行软件开发的两种替代方法:交叉编译和QEMU虚拟机。
2. 银河麒麟是什么
银河麒麟操作系统有服务器版本和桌面版本,本文使用的是桌面版本。具体细节看官方的介绍即可,就不做搬运工了。官方说的自主研发、安全可控都不是我们所关心的,我们只需要关心它的内核是什么,会不会如网上所说根本就是个Ubutun,改个皮肤而已?!。
先用VMware安装个虚拟机试试吧,网上找了一个只有X86架构的镜像包Kylin-4.0.2-desktop-sp2_Community-20171127-x86_64.iso,安装过程略过,使用命令“uname -a”查一下。
Linux wrgz-Lenovo 4.11.0-14-generic #20~16.04.1kord0k1-Ubuntu SMP Wed Oct 18 00:56:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
看到Ubuntu就放心了,就当它是个Ubuntu Linux就行了。
3. 飞腾FT2000又是什么
通俗点讲它就是个CPU,再看看飞腾的官网上的描述。FT-2000系列芯片是基于飞腾片上并行系统(PSoC)体系结构设计的通用微处理器,兼容ARMv8指令集,兼容支持ARM64和ARM32两种执行模式。哦嚯,划个重点,简单点看它就是一个ARMv8的64位CPU。
划个不考试的重点:对于应用软件开发者,简单理解为是在ARMv8架构上的Ubuntu Linux上进行开发软件;对于普通办公者,则理解为是仿Windows的Linux系统。
4. 交叉编译
本文提到的软件开发,是使用C/C++开发无界面的应用软件,实际上开发和测试都有是可以在Ubuntu上进行。但发布软件则需要真机编译或者交叉编译才能运行。
很幸运,在上飞腾官网时,发现了飞腾FT2000的技术文档FT-2000+64Sv1.1.pdf,里面有介绍到交叉编译环境。
- 安装Ubuntu16.04(可安装在虚拟机上或 X86电脑裸机上)
- 安装成功后,虚拟机 apt 源修改 修改/etc/apt/source.list 内容为如下:
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe > multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse
- 运行 apt-get update,再运行apt-get install gcc-aarch64-linux-gnu安装
- 使用命令aarch64-linux-gnu-gcc –v可以看到gcc版本号为gcc version 5.4.0 20160609
有了交叉编译器,编译是很轻松的事。经后续测试,交叉编译出来的程序,可以在国产真机上运行。
5. QEMU虚拟机是什么
我们经常使用的虚拟机软件是VMware,摆着这么好的不用,为什么选择QEMU呢。这得从他们的区别说起。
VMware重点于在一个硬件平台下运行多个操作系统,虚拟硬件平台与宿主硬件架构一致,也就是说虚拟机程序中的指令一般就是宿主CPU指令集,可以直接执行,因此一般速度上也就比较快。
QEMU的特点是可以虚拟不同的硬件平台架构,比如在X86机器上虚拟出ARM架构的机器。许多基于ARM指令集的Android手机模拟器是基于Qemu的,很适合无真机情况下进行Android开发。当然执行ARM指令,需要转换成X86指令才能在宿主机器上运行,这样速度一般会慢点。
由于本文提到的国产主机就是ARM架构的,VMware并不适用,而QEMU则符合要求。还有一个原因是QEMU支持Windows,只需要一个安装包,安装过程简单,太香了。
6. QEMU安装银河麒麟操作系统
无独有偶,鲲鹏处理器也是ARMv8指令集,在华为官网看到详细的安装过程,安装细节可参考https://www.huaweicloud.com/kunpeng/software/qemu.html。
下面只针对一些重点关注点做些说明。
- 需要下载一个Arm64架构的麒麟桌面操作系统镜像包,名字类似Kylin-4.0.2-desktop-sp3-xxxxxxx-arm64.iso。之所以重点提这点,是因为这种镜像包在网上很难找。有想到用Arm64架构的Ubuntu镜像包代替,才发现原来官方并没有提供ARM桌面版的镜像包(有ARM服务器版)。
- 原来华为提供的安装参数有些问题,包括网络、鼠标、键盘参数。这些参数配置不对,会直接影响使用。
QEMU有一个不太人性化的特点,就是没有提供类似VMware的界面操作,只能通过命令操作,参数还特别多,网上的资料不多,官方文档都有是英文的。下面给出三个重要的QEMU命令:创建、安装、启动。
创建
这个步骤就是创建一个预分配一个大文件,做为虚拟机的磁盘,我比较任性地分配了40G。
c:\qemu\qemu-img.exe create D:\qemu\vm\kylin\hdd01.img 40G
安装
c:\qemu\qemu-system-aarch64.exe -m 4096 -cpu cortex-a72 -smp 2,cores=2,threads=1,sockets=1 -M virt -bios D:\qemu\bios\QEMU_EFI.fd -net nic,model=pcnet -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA -drive if=none,file=D:\software\kylin\Kylin-4.0.2-desktop-sp3-19122616.Z1-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom -drive if=none,file=D:\qemu\vm\kylin\hdd01.img,id=hd0 -device virtio-blk-device,drive=hd0
启动
c:\qemu\qemu-system-aarch64.exe -m 4096 -cpu cortex-a72 -smp 2,cores=2,threads=1,sockets=1 -M virt -bios D:\qemu\bios\QEMU_EFI.fd -net nic -net tap,ifname=tap0 -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA -device virtio-scsi-device -drive if=none,file=D:\qemu\vm\kylin\hdd01.img,id=hd0 -device virtio-blk-device,drive=hd0
安装和启动的命令参数差不多,统一说明它们的含义:
参数 | 说明 |
---|---|
qemu-system-aarch64.exe | 二进制文件,提供模拟aarch64架构的虚拟机进程 |
-m 2048 | 分配2048MB内存 |
-M virt | 模拟成什么服务器,我们一般选择virt就可以了,他会自动选择最高版本的virt |
-cpu cortex-a72 | 模拟成什么CPU,其中cortex-a53\a57\a72都是ARMv8指令集的 |
-smp 2,cores=2,threads=1,sockets=1 | 2个vCPU,这2个vCPU由qemu模拟出的一个插槽(socket)中的2个核心,每个核心支持一个超线程构成 |
-bios xxx | 指定bios bin所在的路径 |
-device xxx | 添加一个设备,参数可重复 |
-drive | 添加一个驱动器,参数可重复 |
-net | 添加网络设备 |
QEMU虚拟机怎么连网
在Windows上使用qemu虚拟机,使虚拟机能连网,配置方法如下:
- 在Windows主机上安装TAP网卡驱动:可下载openvpn客户端软件,只安装其中的TAP驱动;在网络连接中,会看到一个新的虚拟网卡,属性类似于TAP-Windows Adapter V9,将其名称修改为tap0。
- 将虚拟网卡和Windows上真实网卡桥接:选中这两块网卡,右键,桥接。此时,Windows主机将不能连接互联网,需要在网桥上配置IP地址和域名等信息,才能使Windows主机连接互联网。
- QEMU参数配置:在虚拟机启动命令行添加以下参数--net nic -net tap,ifname=tap0;tap0为的虚拟网卡名。
7. 总结
国产操作系统的使用体验已经好了很多,轻度办公室还是可行的,但想替换Windows,太难了。
QEMU可以虚拟不同的硬件平台架构,是个不错的虚拟机软件,而且开源,但在使用体验方面还是差了一些。
欢迎关注我的公众号【林哥哥的编程札记】,谢谢!