沒有國產主機,怎麼開發:交叉編譯和QEMU虛擬機器
阿新 • • 發佈:2020-06-12
## 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”查一下。
```bash
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 內容為如下:
```bash
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。
```base
c:\qemu\qemu-img.exe create D:\qemu\vm\kylin\hdd01.img 40G
```
**安裝**
```base
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
```
**啟動**
```bash
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**為的虛擬網絡卡名。
![](https://images.cnblogs.com/cnblogs_com/qinwanlin/1694046/o_2006120551362.png)
## 7. 總結 ##
國產作業系統的使用體驗已經好了很多,輕度辦公室還是可行的,但想替換Windows,太難了。
QEMU可以虛擬不同的硬體平臺架構,是個不錯的虛擬機器軟體,而且開源,但在使用體驗方面還是差了一些。
> 歡迎關注我的公眾號【林哥哥的程式設計札記】,謝謝!
> ![](https://raw.githubusercontent.com/qinwanlin/image/master/qrcode_for_gzh.