在CentOS中安裝海思Hi3861-鴻蒙LiteOS編譯環境

1. 背景html

前段時間收到了來自華爲和51CTO提供的HiSpark Wi-Fi IoT智能家居套件,在此表示感謝。收到以後就火燒眉毛開始研究了。該套件基於海思Hi3861芯片,在官方文檔中,整個LiteOS的編譯環境是基於Ubuntu發行版的。若是你像我同樣從事互聯網行業,那麼可能工做中接觸更多的是CentOS。在CentOS中安裝LiteOS的編譯環境究竟是否可行呢?那和Ubuntu環境的配置又有什麼區別呢?讓咱們來一塊兒探索一下。python

 

首先本文中的CentOS是以CentOS 7.8.2003爲基礎。我事先在VMware中安裝了全新的CentOS-7-x86_64-Minimal-2003(下載地址:http://mirrors.huaweicloud.com/centos/7.8.2003/isos/x86_64/),儘量在一個較爲乾淨的系統中,一步步探索編譯的最小環境。linux

 

2. 需求分析ios

海思Hi3861芯片的架構爲RISC-V(32位版本),所以交叉編譯工具鏈必不可少:gcc_riscv32;程序員

 

鴻蒙LiteOS的部分源代碼是基於gn、ninja構建工具組織的。咱們熟悉的Chrome開源版Chromium,使用一樣的構建工具管理。gn用來實現一種跨平臺的、程序員方便理解的編譯管理,執行gn後,會生成給ninja使用的編譯預處理配置。通過ninja預處理後,將會明顯加快編譯速度。這種特性對於操做系統等超大型項目來說很是有用;sql

 

在鴻蒙LiteOS源代碼中,關於Hi3861芯片的一些適配代碼,它的編譯使用了SCons工具,此工具基於Python;windows

 

另外還有一部分源代碼(例如第三方庫:curl)使用了傳統的makefile方式編譯,爲了實現一條命令便可完成編譯,也一樣須要Python腳原本進行集成。centos

 

3. 安裝編譯環境安全

3.1 準備好工具服務器

在編譯過程當中,輸入命令有時候須要複製粘貼,你須要一個好用的SSH客戶端,這裏我用的是ZOC,相似的像SecureCRT之類的客戶端也能夠;

另外,若是你的網絡情況不是很好的話,使用wget方式下載編譯器會比較慢,咱們可使用迅雷等工具先把編譯器下載好,而後經過rz命令傳入CentOS。

yum install -y lrzsz

3.2 下載交叉編譯工具

常規的操做是在CentOS中執行:

wget https://repo.huaweicloud.com/harmonyos/compiler/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz

若是你事先經過迅雷在本地下載好了交叉編譯器,能夠在CentOS中輸入:

rz

命令來激活SSH客戶端的上傳窗口,選擇本地文件後,點擊「打開」便可上傳至SSH中的當前目錄。
使用tar命令對工具鏈解壓

tar -xvf gcc_riscv32-linux-7.3.0.tar.gz

這裏有個稍微須要注意的地方,雖然壓縮包文件名爲tar.gz,通常這種文件在tar基礎上還使用了gz方式壓縮,所以一般解壓時須要加-z選項,可真的加上這個選項會提示:

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

3.3 安裝交叉編譯工具

解壓好交叉編譯工具後,通常按照習慣,我會把這類應用放到/usr/local目錄下。

mv gcc_riscv32 /usr/local/

固然,你也能夠在上一步解壓的過程當中直接使用

tar -xvf gcc_riscv32-linux-7.3.0.tar.gz -C /usr/local

爲了能在Shell中直接使用交叉編譯命令,須要將工具所在路徑加入到PATH環境變量中。

打開全局環境變量配置文件:

vi /etc/profile

快捷命令Shift+g將光標定位到文件尾部

修改PATH環境變量定義:

export PATH=/usr/local/gcc_riscv32/bin:$PATH

快捷命令:wq!將修改保存。

執行命令:

source /etc/profile

使環境變量配置當即生效。爲了驗證安裝正確性,可使用:

cd
riscv32-unknown-elf-gcc --version

應當輸出

riscv32-unknown-elf-gcc (GCC) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

3.4 編譯安裝Python 3

官方文檔中指出,Python須要3.7以上版本,看了一下CentOS官方源的Python版本,是2.7。並且一些運維的工具也是基於2.7的,不能強行刪除。所以咱們變通一下,本身編譯個Python 3。看了一下官網,目前的最新穩定版本爲:3.9.0。

 

和交叉編譯工具同樣,你也能夠提早下載好源碼包,或者使用命令下載

wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz

而後將源碼包解壓

tar -xzvf Python-3.9.0.tgz

在編譯開始前,須要安裝一些編譯過程當中依賴的其餘組件,如下是我逐個嘗試過的,爲最精簡的依賴包:

注意:若是你追求一個更爲精簡的環境,能夠在另一個環境中編譯好Python 3,而後將二進制包拷貝過來。這樣就不用安裝下面的組件了

yum groupinstall -y "Development tools"
yum install -y openssl-devel
yum install -y libffi libffi-devel
yum install -y bzip2-devel
yum install -y sqlite-devel
yum install -y readline-devel
yum install -y libuuid-devel
yum install -y uuid-devel
yum install -y xz-devel
yum install -y gdbm-devel
yum install -y tk-devel

按照習慣,但願將Python 3安裝到/usr/local/python3目錄下。須要配置編譯,指定prefix

cd Python-3.9.0
./configure --prefix=/usr/local/python3

接下來進行編譯Python 3

make -j8 && make install

這裏的參數 -j 是並行job數。請結合自身CentOS運行實際硬件環境(CPU核數)配置,過大、太小都不太好,適當優化可改善編譯速度。


爲了能在Shell中直接使用Python3命令,又不與系統中的Python 2.7產生衝突,咱們須要建立兩個軟連接

ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

/usr/bin目錄是默認在PATH環境變量中的,上述兩個軟連接建立好後便可直接在Shell中使用了:

[root@localhost ~]# python3 --version
Python 3.9.0
[root@localhost ~]# pip3 --version
pip 20.2.3 from /usr/local/python3/lib/python3.9/site-packages/pip (python 3.9)

3.5 安裝一些基於Python 3的必要組件

安裝完Python 3以後,根據官方指導,還須要安裝一些基於Python 3的編譯時用到的組件,整理以下:

pip3 install setuptools
pip3 install kconfiglib
pip3 install pycryptodome
pip3 install six --upgrade --ignore-installed six
pip3 install ecdsa

若是你在安裝時遇到了這樣的提示:

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate is not yet valid (_ssl.c:1122)'))': /simple/kconfiglib/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate is not yet valid (_ssl.c:1122)'))': /simple/kconfiglib/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate is not yet valid (_ssl.c:1122)'))': /simple/kconfiglib/

請檢查一下是否本地時間與真實時間相差比較大(寫這篇文章時的時間爲2020年10月14日)

[root@localhost ~]# date
2020年 09月 23日 星期三 15:46:28 CST

可使用

ntpdate -u time.windows.com

來校準本地時間

 

3.6 安裝SCons

上文中提到,鴻蒙LiteOS的源碼編譯過程還須要Scons工具,接下來要安裝一下。

首先下載其源代碼

wget http://prdownloads.sourceforge.net/scons/scons-4.0.1.tar.gz

解壓

tar -xzvf scons-4.0.1.tar.gz

安裝

cd SCons-4.0.1/
python3 setup.py install

生成SCons命令的軟連接,使其在Shell中可以直接使用

ln -s /usr/local/python3/bin/scons /usr/bin/scons


3.7 安裝gn工具(用來產生ninja編譯腳本)
gn工具是由google公司開發的一套預編譯工具,源代碼地址:https://gn.googlesource.com/gn/

因爲一些衆所周知的緣由,國內下載源碼不太方便,幸虧華爲爲咱們提供了編譯好的二進制文件。(若是你感興趣,想本身編譯的話,須要事先準備Python、ninja和LLVM環境)

下載:

wget https://repo.huaweicloud.com/harmonyos/compiler/gn/1523/linux/gn.1523.tar

解壓:

tar -xvf gn.1523.tar

安裝:

mv gn /usr/local/
ln -s /usr/local/gn/gn /usr/bin/gn

驗證:

[root@localhost ~]# gn --version
1523 (5bd8e26b)


3.8 安裝ninja工具

一樣,華爲爲咱們也提供了相應的二進制版本。

下載:

wget https://repo.huaweicloud.com/harmonyos/compiler/ninja/1.9.0/linux/ninja.1.9.0.tar

解壓:

tar -xvf ninja.1.9.0.tar

安裝:

mv ninja /usr/local/ 
ln -s /usr/local/ninja/ninja /usr/bin/ninja

驗證:

[root@localhost ~]# ninja --version
1.9.0

 

3.9 測試編譯

通過上述步驟,編譯環境已基本安裝完成,咱們來嘗試編譯一下。

下載全量源代碼:

wget https://repo.huaweicloud.com/harmonyos/os/1.0/code-1.0.tar.gz

解壓:

mkdir code
tar -xzvf code-1.0.tar.gz -C code

注意,源代碼壓縮文件內部未包含單獨的目錄,會解壓出來一大堆文件,應當先創建一個目錄,再向該目錄解壓!

解壓好以後,按照官方提供的命令進行編譯。因爲咱們安裝的Python 3爲了不與Python 2.7命令衝突,可執行命令變爲python3,故編譯稍有差異:

python3 build.py wifiiot

咱們看到,最終編譯成功,且輸出了能夠燒寫的固件:out/wifiiot/Hi3861_wifiiot_app_allinone.bin 

 

3.10 小結

上述過程,雖然稍顯繁瑣,但大體的思路就是若是有二進制版本,直接下載、解壓、安裝、驗證,這樣的步驟。沒有提供二進制版本的,能夠嘗試經過CentOS官方源來解決。若是官方源仍然沒法知足要求(例如Python 3),也能夠嘗試自行經過源碼編譯的方式來解決。

 

4. 啓用局域網共享

之因此要打開局域網共享,仍是由於目前的開發環境還不完善。RISC-V架構的編譯器只提供了Linux版,這就決定了編譯必須在Linux環境中。而Hi3861的芯片燒錄程序,只提供了Windows版(有時間咱們能夠聊聊鴻蒙LiteOS開發環境Deveco的燒錄原理)。並且大多數從事單片機開發的工程師(或者說單片機廠商提供的開發環境,例如燒錄驅動、燒錄工具)還都是以Windows平臺爲主。咱們但願編譯完後直接能拿到二進制文件進行燒錄,因此想到了這樣一種變通方式。

4.1 安裝samba

samba協議即Windows中的網上鄰居所使用的協議。在CentOS的最小安裝環境下須要單獨安裝。

yum install -y samba

容許開機啓動,這樣在編譯服務器掉電恢復後能自動啓動局域網共享:

systemctl enable smb

4.2 配置samba服務前的一些準備工做

咱們先建立一個用於文件共享的帳號,由於後續不少的操做都是基於這個帳號的。假設這個帳號名爲:harmony

useradd -r -s /bin/false harmony

使用useradd建立一個「三無帳戶」,即:沒有home目錄,沒有密碼,沒有系統Shell。畢竟咱們只是但願有個專用身份而已。隨後,要在samba系統中添加剛剛建立的帳戶,而且設置samba專用密碼。此處示例設置密碼爲:harmony。即用戶名密碼均爲:harmony。固然也能夠根據本身喜愛設置。

smbpasswd -a harmony

帳號初始化以後,就能夠建立一個專門用於存放共享代碼的目錄了:

mkdir /data

BTW:其實更加穩妥的操做是在安裝系統時單獨分一個/data掛載點分區,這樣一旦系統發生故障,哪怕重裝系統,咱們的代碼也不會丟失。

 

由於建立該目錄的用戶是root,因此samba用戶還不能對這個目錄進行寫入操做,要修改目錄全部者:

chown -R harmony:harmony /data

4.3 配置samba服務

接下來就是最關鍵的配置samba服務環節了。原本但願配置一個不須要用戶名密碼便可上傳、下載的共享目錄。但後來查閱資料,發現Windows 10默認狀況下已經不容許這種方式了。更改Windows安全策略來實現倒也不是不能夠,只是以犧牲咱們操做系統的安全性爲代價不划算,因此咱們選擇了在CentOS中建立一個Samba專用帳戶,用它來登陸。

 

首先將默認配置備份一下,之後若是配置錯誤,還能夠回滾到初始狀態

cd /etc/samba
cp smb.conf smb.conf.bak

而後使用vi命令編輯smb.conf文件

vi smb.conf

下面的這段是我以前整理好的一套配置:

[global]
        netbios name = Compiler
        server string = RISC-V Compiler
        workgroup = WORKGROUP
        security = user
        map to guest = Bad User
        passdb backend = tdbsam
        log file = /var/log/samba/log.%m

[code]
        comment = Public Stuff
        path = /data
        valid users = harmony
        browseable = yes
        writable = yes
        available = yes
        read only = no
        create mode = 0644
        directory mode = 0755

這裏簡單解釋一下,[code]表示掛載點,若是你使用Windows,在地址欄輸入\\[IP]以後,出現的第一級目錄,即掛載點。valid users表示容許咱們的harmony用戶訪問。由於要擁有寫入權限,所以writable設置爲yes,read only設置爲no。新建文件的默認權限爲644,即:rw-r--r--;新建目錄的默認權限爲755,即:drwxr-xr-x,必須擁有執行權限,不然新建完的目錄刪不掉。
 

4.4 開啓SELinux的安全選項

在CentOS中,默認開啓了SELinux,此功能是創建在系統內核的一套安全機制,對於samba服務,默認是不容許用戶向服務器寫入內容的。既然咱們有這個需求,那就將此功能啓用:

setsebool -P samba_export_all_rw 1

另附:查看SELinux中關於samba服務配置的選項狀態:

sestatus -b | grep samba

 

4.5 別忘了防火牆

在CentOS中,防火牆默認開啓,samba服務相關的端口不在防火牆策略中,此時即使開啓服務,外部也沒法訪問,所以須要將端口加入到防火牆容許策略中:

firewall-cmd --zone=public --add-port=139/tcp --permanent
firewall-cmd --zone=public --add-port=389/tcp --permanent
firewall-cmd --zone=public --add-port=445/tcp --permanent
firewall-cmd --zone=public --add-port=901/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all

固然,最簡單的仍是禁用防火牆,可是會帶來安全隱患,請酌情使用

systemctl stop firewalld
systemctl disable firewalld

4.6 啓動共享服務

一切配置好後,就能夠啓動共享服務了

systemctl start smb

也能夠查看服務的運行狀態

systemctl status smb

在Windows中,地址欄輸入\\[IP]地址,便可看到以前共享的目錄內容。

4.7 額外補充

若是後續使用中,samba用戶密碼修改,或者用戶名更改。那麼在Windows下,之前可以正常訪問也有可能變得不能訪問了。這時咱們在控制面板中搜索「憑據」,在「憑據管理器」->「Windows憑據」中刪除以前老的登陸帳號便可。

 

參考資料:

[1]Huawei. 搭建環境 [EB/OL]. https://device.harmonyos.com/cn/docs/start/introduce/oem_quickstart_3861_build-0000001054781998, 2020-10-14/2020-10-14

[2]mikey-no. pip always fails ssl verification [EB/OL].https://stackoverflow.com/questions/49324802/pip-always-fails-ssl-verification, 2019-01-28/2020-10-14

[3]一畝三分地. CentOS 7設置Samba共享目錄 [EB/OL]. https://www.cnblogs.com/ldm1989/p/9229921.html, 2018-06-26/2020-10-14



文章來源:https://harmonyos.51cto.com/posts/1268

做者:chaijunkun

相關文章
相關標籤/搜索