沒有國產主機,怎麼開發:交叉編譯和QEMU虛擬機

来源:https://www.cnblogs.com/qinwanlin/archive/2020/06/12/qemu.html
-Advertisement-
Play Games

本文介紹在沒有國產主機情況下,進行軟體開發的兩種替代方法:交叉編譯和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可以虛擬不同的硬體平臺架構,是個不錯的虛擬機軟體,而且開源,但在使用體驗方面還是差了一些。

歡迎關註我的公眾號【林哥哥的編程札記】,謝謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • kubeadm介紹 kubeadm概述 參考附003.Kubeadm部署Kubernetes。 kubeadm功能 參考附003.Kubeadm部署Kubernetes。 本方案描述 本方案採用kubeadm部署Kubernetes 1.18.3版本; etcd採用混部方式; Keepalived: ...
  • ArchLinux——使用WINE-TIM頭像異常解決辦法 當使用WINE-TIM頭像圖片載入異常時,執行以下命令 sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1 sudo sysctl -w net.ipv6.conf.default.disable ...
  • 思考: 現目前的架構是什麼?業務邏輯? ​ 研發一臺,測試&生產共用一套k8s集群。 ​ 目前前端已經遷移到k8s,生產後端暫時沒有上k8s。 造成目前架構的原因是什麼? ​ 歷史遺留原因 造成架構不合理 那些地方不合理,為什麼? (1).使用經典公網模式,會自動分配區域網ip地址 , nginx- ...
  • 單選題 1、在OSI模型中,HTTP協議工作在第()層,交換機工作在第()層。 A、7/3 B、7/2【正確答案】 C、6/3 D、6/2 2、Linux有三個查看文件的命令,若希望在查看文件內容過程中可以用游標上下移動來查看文件內容,應使用命令。 A、cat B、more C、less【正確答案】 ...
  • 1、下麵屬於測試用例黑盒技術的是 A、等價類劃分【正確答案】 B、邊界值分析【正確答案】 C、錯誤推測【正確答案】 D、因果圖【正確答案】 2、批量刪除當前目錄下尾碼名為.c的文件。如a.c、b.c。 A、rm *.c【正確答案】 B、find .-name "*.c" -maxdepth 1 | ...
  • 眾所周知,sysconf 用來返回某種常量的定義或者資源的上限,前者用於應用動態的判斷系統是否支持某種標準或能力、後者用於決定資源分配的尺寸。 但是你可能不知道的是,sysconf 可以返回四種狀態: 常量定義本身或資源上限 (>=0, 整型值) 無限制 (no limit) 不支持 出錯 那一個小 ...
  • 創建新用戶後無法切換 su: failed to execute /bin/bash: Permission denied 當使用 su username 從root切換用戶時顯示 su: failed to execute /bin/bash: Permission denied (也有人顯示的是 ...
  • linux新用戶(組)的那些事 創建新用戶 groupadd bigdata //添加新用戶組bigdata useradd -g bigdata es //-g:為用戶組添加新用戶 passwd es //修改es的密碼 如果直接useradd es 的話,es的用戶組也為es,如同root的用戶 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...