没有国产主机,怎么开发:交叉编译和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可以虚拟不同的硬件平台架构,是个不错的虚拟机软件,而且开源,但在使用体验方面还是差了一些。
欢迎关注我的公众号【林哥哥的编程札记】,也欢迎赞赏,谢谢!
没有国产主机,怎么开发:交叉编译和QEMU虚拟机的更多相关文章
- python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)
类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...
- python作业类Fabric主机管理程序开发(第九周)
作业需求: 1. 运行程序列出主机组或者主机列表 2. 选择指定主机或主机组 3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载) 4. 充分使用多线程或多进程 5. 不同主机的用户名密码 ...
- python 学习分享-实战篇类 Fabric 主机管理程序开发
# 类 Fabric 主机管理程序开发: # 1. 运行程序列出主机组或者主机列表 # 2. 选择指定主机或主机组 # 3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载) # 4. 充分 ...
- 类 Fabric 主机管理程序开发
类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载4. 充分使用多线程或多进程5. 不同主 ...
- samrt210开发板ping-系列问题(开发板ping通主机,主机ping通虚拟机,唯独~开发板ping不通虚拟机)
硬件:PC机.虚拟机(Linux).开发板(smart210) 常用模型: 注:1).有线网卡与无线网不可同连一个路由器,不可在同网段: 2).vmware选择桥接模式,虚拟网络适配器选定具体的网卡名 ...
- 开发板ping通虚拟机与主机
刚因为虚拟机与主机没法互相ping通的事情,奋战到将近凌晨一点.现在把这个过程总结一下,以方便后加入该行业的广大IT精英. VMWare提供了三种工作模式:bridged(桥接模式).NAT(网络地址 ...
- 芯灵思SinA33开发板怎样安装虚拟机
芯灵思SinA33开发板怎样安装虚拟机 今天入手一块芯灵思的开发板,型号为SIN-A33,用的是全志的A33芯片,与其它开发板不同的是, 芯灵思开发板手册上用来搭建开发环境的linux系统是cento ...
- 利用QMP和QEMU虚拟机交互的几种方式
QMP是一种基于JSON格式的传输协议,我们能利用它与一个QEMU虚拟机实例进行交互,例如查询,更改虚拟机的状态,获取设备信息等等.下面是几种创建QMP的方法以及对其它的一些基本命令的使用: 1.基于 ...
- 虚拟机centOS中安装Redis,主机Redis Destop Manager不能访问虚拟机Redis server的解决方案
今天在学些redis的时候碰到个问题,发现主机Redis Destop Manager不能访问虚拟机Redis server的解决方案,找了一些网上的资料,原因可能有两个,整理记录下来: 1. Red ...
随机推荐
- Bootstrap响应式布局介绍
一.响应式布局 1.什么是响应式网页 2.响应式网页必须做到的几件事 1.布局,使用流式布局(默认文档流+浮动)+弹性布局+栅格布局 2.文字和图片大小随着容器大小改变 3.媒体查询技术(css3) ...
- webpack 3 升级 webpack4 个人笔记
参考文章: 1. webpack4升级完全指南 https://segmentfault.com/a/1190000014247030 2. Mobx useStrict is not a funct ...
- CentOS7初始化服务器开发环境——根据个人习惯而定
目录 修改hostname 创建个人账户和组 修改hostname 编辑主机名称,注意:执行以下指令,无需重启服务器,因为此指令实时写入linux 内核 hostnamectl --static se ...
- 关于 Git 拉取GitLab工程报错:Repository not found的问题
[root@localhost xscan]# git pull fatal: repository 'http://gitlab.***.com/***.git/' not found 原因1: 可 ...
- CSS3和HTML5头部定位自用
body{ max-width: 540px; min-width: 320px; margin: 0 auto; font: normal 14px/1.5 tahoma; color: #000; ...
- Golang源码学习:调度逻辑(四)系统调用
Linux系统调用 概念:系统调用为用户态进程提供了硬件的抽象接口.并且是用户空间访问内核的唯一手段,除异常和陷入外,它们是内核唯一的合法入口.保证系统的安全和稳定. 调用号:在Linux中,每个系统 ...
- [256个管理学理论]006.刺猬效应(Hedgehog Effect)
刺猬效应(Hedgehog Effect) 来自于大洋彼岸的让你看不懂的解释: 刺猬效应(刺猬法则)就是人际交往中的“心理距离效应”.人与人之间都应该保持这条底线,过犹不及. 刺猬效应强调的就是人际交 ...
- Python每日一练(1)
这两天在做Python的每日一练,感觉收获颇丰,所以来记录分享一下,一共做了三个,涉及socket,PIL,pymysql三个库,另外终于开始了Flask框架的学习,后续也会做出一些分析 第一个是一个 ...
- java方式实现堆排序
一.堆排序和堆相关概念描述 堆排序是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子结点的值总是小于(或者大于)它的父节点,若子结点的值总是小于它的父节 ...
- Rocket - jtag - JtagTap
https://mp.weixin.qq.com/s/0u9jM2u-FkTlrk3QNuZaBw 简单介绍JtagTap的实现. 1. 简单介绍 定义TAP(Test Access Port)所需要 ...
