在CentOS中安裝鴻蒙LiteOS編譯環境-海思Hi3861
背景
前段時間收到了來自華為和51CTO提供的HiSpark Wi-Fi IoT智能家居套件,在此表示感謝。收到之后就迫不及待開始研究了。該套件基于海思Hi3861芯片,在官方文檔中,整個LiteOS的編譯環境是基于Ubuntu發行版的。如果你像我一樣從事互聯網行業,那么可能工作中接觸更多的是CentOS。在CentOS中安裝LiteOS的編譯環境到底是否可行呢?那和Ubuntu環境的配置又有什么區別呢?讓我們來一起探索一下。
首先本文中的CentOS是以CentOS 7.8.2003為基礎。我事先在VMware中安裝了全新的CentOS-7-x86_64-Minimal-2003(下載地址:http://mirrors.huaweicloud.com/centos/7.8.2003/isos/x86_64/),盡可能在一個較為干凈的系統中,一步步探索編譯的最小環境。
2. 需求分析
海思Hi3861芯片的架構為RISC-V(32位版本),因此交叉編譯工具鏈必不可少:gcc_riscv32;
鴻蒙LiteOS的部分源代碼是基于gn、ninja構建工具組織的。我們熟悉的Chrome開源版Chromium,使用同樣的構建工具管理。gn用來實現一種跨平臺的、程序員方便理解的編譯管理,執行gn后,會生成給ninja使用的編譯預處理配置。經過ninja預處理后,將會明顯加快編譯速度。這種特性對于操作系統等超大型項目來講非常有用;
在鴻蒙LiteOS源代碼中,關于Hi3861芯片的一些適配代碼,它的編譯使用了SCons工具,此工具基于Python;
另外還有一部分源代碼(例如第三方庫:curl)使用了傳統的makefile方式編譯,為了實現一條命令即可完成編譯,也同樣需要Python腳本來進行集成。
3. 安裝編譯環境
3.1 準備好工具
在編譯過程中,輸入命令有時候需要復制粘貼,你需要一個好用的SSH客戶端,這里我用的是ZOC,類似的像SecureCRT之類的客戶端也可以;
另外,如果你的網絡狀況不是很好的話,使用wget方式下載編譯器會比較慢,我們可以使用迅雷等工具先把編譯器下載好,然后通過rz命令傳入CentOS。
- yum install -y lrzsz
在官方文檔中指出一些必要的工具需要通過下載二進制的形式安裝,需要用到wget這樣的命令。在最小化安裝的CentOS中,wget等命令是默認未安裝的,此時我們要將此工具準備好:
- yum install -y wget
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 liteos
- tar -xzvf code-1.0.tar.gz -C liteos
注意,源代碼壓縮文件內部未包含單獨的目錄,會解壓出來一大堆文件,應當先建立一個目錄,再向該目錄解壓!
解壓好之后,按照官方提供的命令進行編譯。由于我們安裝的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憑據”中刪除之前老的登錄賬號即可。如果登錄時沒有勾選過記住憑據,可以在Windows的命令行中使用:
- net use * /del
來清除連接緩存。
參考資料:
[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