在CentOS中安装鸿蒙LiteOS编译环境-海思Hi3861

系统
前段时间收到了来自华为和51CTO提供的HiSpark Wi-Fi IoT智能家居套件,在此表示感谢。收到之后就迫不及待开始研究了。该套件基于海思Hi3861芯片,在官方文档中,整个LiteOS的编译环境是基于Ubuntu发行版的。如果你像我一样从事互联网行业,那么可能工作中接触更多的是CentOS。在CentOS中安装LiteOS的编译环境到底是否可行呢?那和Ubuntu环境的配置又有什么区别呢?让我们来一起探索一下。

[[349887]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 背景

前段时间收到了来自华为和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。

  1. yum install -y lrzsz 

在官方文档中指出一些必要的工具需要通过下载二进制的形式安装,需要用到wget这样的命令。在最小化安装的CentOS中,wget等命令是默认未安装的,此时我们要将此工具准备好:

  1. yum install -y wget 

3.2 下载交叉编译工具

常规的操作是在CentOS中执行:

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

如果你事先通过迅雷在本地下载好了交叉编译器,可以在CentOS中输入:

  1. rz 

命令来激活SSH客户端的上传窗口,选择本地文件后,点击“打开”即可上传至SSH中的当前目录。

使用tar命令对工具链解压

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

这里有个稍微需要注意的地方,虽然压缩包文件名为tar.gz,一般这种文件在tar基础上还使用了gz方式压缩,因此通常解压时需要加-z选项,可真的加上这个选项会提示:

  1. gzip: stdin: not in gzip format 
  2.  
  3. tar: Child returned status 1 
  4.  
  5. tar: Error is not recoverable: exiting now 

3.3 安装交叉编译工具

解压好交叉编译工具后,一般按照习惯,我会把这类应用放到/usr/local目录下。

  1. mv gcc_riscv32 /usr/local

当然,你也可以在上一步解压的过程中直接使用

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

为了能在Shell中直接使用交叉编译命令,需要将工具所在路径加入到PATH环境变量中。

打开全局环境变量配置文件:

  1. vi /etc/profile 

快捷命令Shift+g将光标定位到文件尾部

修改PATH环境变量定义:

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

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

执行命令:

  1. source /etc/profile 

使环境变量配置立即生效。为了验证安装正确性,可以使用:

  1. cd 
  2.  
  3. riscv32-unknown-elf-gcc --version 

 应当输出 

  1. riscv32-unknown-elf-gcc (GCC) 7.3.0 
  2.  
  3. Copyright (C) 2017 Free Software Foundation, Inc. 
  4.  
  5. This is free software; see the source for copying conditions. There is NO 
  6.  
  7. 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。

和交叉编译工具一样,你也可以提前下载好源码包,或者使用命令下载

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

然后将源码包解压

  1. tar -xzvf Python-3.9.0.tgz 

在编译开始前,需要安装一些编译过程中依赖的其他组件,以下是我逐个尝试过的,为最精简的依赖包:

注意:如果你追求一个更为精简的环境,可以在另外一个环境中编译好Python 3,然后将二进制包拷贝过来。这样就不用安装下面的组件了

  1. yum groupinstall -y "Development tools" 
  2.  
  3. yum install -y openssl-devel 
  4.  
  5. yum install -y libffi libffi-devel 
  6.  
  7. yum install -y bzip2-devel 
  8.  
  9. yum install -y sqlite-devel 
  10.  
  11. yum install -y readline-devel 
  12.  
  13. yum install -y libuuid-devel 
  14.  
  15. yum install -y uuid-devel 
  16.  
  17. yum install -y xz-devel 
  18.  
  19. yum install -y gdbm-devel 
  20.  
  21. yum install -y tk-devel 

 按照习惯,希望将Python 3安装到/usr/local/python3目录下。需要配置编译,指定prefix 

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

 接下来进行编译Python 3 

  1. make -j8 && make install 

这里的参数 -j 是并行job数。请结合自身CentOS运行实际硬件环境(CPU核数)配置,过大、过小都不太好,适当优化可改善编译速度。

为了能在Shell中直接使用Python3命令,又不与系统中的Python 2.7产生冲突,我们需要创建两个软链接

  1. ln -s /usr/local/python3/bin/python3 /usr/bin/python3 
  2.  
  3. ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 

 /usr/bin目录是默认在PATH环境变量中的,上述两个软链接创建好后即可直接在Shell中使用了: 

  1. [root@localhost ~]# python3 --version 
  2.  
  3. Python 3.9.0 
  4.  
  5. [root@localhost ~]# pip3 --version 
  6.  
  7. 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的编译时用到的组件,整理如下: 

  1. pip3 install setuptools 
  2.  
  3. pip3 install kconfiglib 
  4.  
  5. pip3 install pycryptodome 
  6.  
  7. pip3 install six --upgrade --ignore-installed six 
  8.  
  9. pip3 install ecdsa 

 如果你在安装时遇到了这样的提示: 

  1. 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/ 
  2.  
  3. 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/ 
  4.  
  5. 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日)

  1. [root@localhost ~]# date 

2020年 09月 23日 星期三 15:46:28 CST

可以使用

  1. ntpdate -u time.windows.com 

来校准本地时间

3.6 安装SCons

上文中提到,鸿蒙LiteOS的源码编译过程还需要Scons工具,接下来要安装一下。

首先下载其源代码

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

解压

  1. tar -xzvf scons-4.0.1.tar.gz 

安装

  1. cd SCons-4.0.1/ 
  2.  
  3. python3 setup.py install 

 生成SCons命令的软链接,使其在Shell中能够直接使用

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

3.7 安装gn工具(用来产生ninja编译脚本)

gn工具是由google公司开发的一套预编译工具,源代码地址:https://gn.googlesource.com/gn/

由于一些众所周知的原因,国内下载源码不太方便,幸好华为为我们提供了编译好的二进制文件。(如果你感兴趣,想自己编译的话,需要事先准备Python、ninja和LLVM环境)

下载:

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

解压:

  1. tar -xvf gn.1523.tar 

安装:

  1. mv gn /usr/local
  2.  
  3. ln -s /usr/local/gn/gn /usr/bin/gn 

 验证:

  1. [root@localhost ~]# gn --version 
  2.  
  3. 1523 (5bd8e26b) 

 3.8 安装ninja工具

同样,华为为我们也提供了相应的二进制版本。

下载: 

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

解压:

  1. tar -xvf ninja.1.9.0.tar 

安装:

  1. mv ninja /usr/local
  2.  
  3. ln -s /usr/local/ninja/ninja /usr/bin/ninja 

 验证: 

  1. [root@localhost ~]# ninja --version 
  2.  
  3. 1.9.0 

 3.9 测试编译

经过上述步骤,编译环境已基本安装完成,我们来尝试编译一下。

下载全量源代码:

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

解压:

  1. mkdir liteos 
  2.  
  3. tar -xzvf code-1.0.tar.gz -C liteos 

 注意,源代码压缩文件内部未包含单独的目录,会解压出来一大堆文件,应当先建立一个目录,再向该目录解压!

解压好之后,按照官方提供的命令进行编译。由于我们安装的Python 3为了避免与Python 2.7命令冲突,可执行命令变为python3,故编译稍有差别: 

  1. 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的最小安装环境下需要单独安装。

  1. yum install -y samba 

允许开机启动,这样在编译服务器掉电恢复后能自动启动局域网共享:

  1. systemctl enable smb 

4.2 配置samba服务前的一些准备工作

我们先创建一个用于文件共享的账号,因为后续很多的操作都是基于这个账号的。假设这个账号名为:harmony

  1. useradd -r -s /bin/false harmony 

使用useradd创建一个“三无账户”,即:没有home目录,没有密码,没有系统Shell。毕竟我们只是希望有个专用身份而已。随后,要在samba系统中添加刚刚创建的账户,并且设置samba专用密码。此处示例设置密码为:harmony。即用户名密码均为:harmony。当然也可以根据自己喜好设置。

  1. smbpasswd -a harmony 

账号初始化之后,就可以创建一个专门用于存放共享代码的目录了:

  1. mkdir /data 

BTW:其实更加稳妥的操作是在安装系统时单独分一个/data挂载点分区,这样一旦系统发生故障,哪怕重装系统,我们的代码也不会丢失。

因为创建该目录的用户是root,所以samba用户还不能对这个目录进行写入操作,要修改目录所有者:

  1. chown -R harmony:harmony /data 

4.3 配置samba服务

接下来就是最关键的配置samba服务环节了。本来希望配置一个不需要用户名密码即可上传、下载的共享目录。但后来查阅资料,发现Windows 10默认情况下已经不允许这种方式了。更改Windows安全策略来实现倒也不是不可以,只是以牺牲我们操作系统的安全性为代价不划算,所以我们选择了在CentOS中创建一个Samba专用账户,用它来登录。

首先将默认配置备份一下,以后如果配置错误,还可以回滚到初始状态

  1. cd /etc/samba 
  2.  
  3. cp smb.conf smb.conf.bak 

然后使用vi命令编辑smb.conf文件 

  1. vi smb.conf 

下面的这段是我之前整理好的一套配置:

  1. [global
  2.  
  3. netbios name = Compiler 
  4.  
  5. server string = RISC-V Compiler 
  6.  
  7. workgroup = WORKGROUP 
  8.  
  9. security = user 
  10.  
  11. map to guest = Bad User 
  12.  
  13. passdb backend = tdbsam 
  14.  
  15. log file = /var/log/samba/log.%m 
  16.  
  17. [code] 
  18.  
  19. comment = Public Stuff 
  20.  
  21. path = /data 
  22.  
  23. valid users = harmony 
  24.  
  25. browseable = yes 
  26.  
  27. writable = yes 
  28.  
  29. available = yes 
  30.  
  31. read only = no 
  32.  
  33. create mode = 0644 
  34.  
  35. 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服务,默认是不允许用户向服务器写入内容的。既然我们有这个需求,那就将此功能启用:

  1. setsebool -P samba_export_all_rw 1 

另附:查看SELinux中关于samba服务配置的选项状态:

  1. sestatus -b | grep samba 

4.5 别忘了防火墙

在CentOS中,防火墙默认开启,samba服务相关的端口不在防火墙策略中,此时即便开启服务,外部也无法访问,因此需要将端口加入到防火墙允许策略中: 

  1. firewall-cmd --zone=public --add-port=139/tcp --permanent 
  2.  
  3. firewall-cmd --zone=public --add-port=389/tcp --permanent 
  4.  
  5. firewall-cmd --zone=public --add-port=445/tcp --permanent 
  6.  
  7. firewall-cmd --zone=public --add-port=901/tcp --permanent 
  8.  
  9. firewall-cmd --reload 
  10.  
  11. firewall-cmd --list-all 

 当然,最简单的还是禁用防火墙,但是会带来安全隐患,请酌情使用。 

  1. systemctl stop firewalld 
  2.  
  3. systemctl disable firewalld 

 4.6 启动共享服务

一切配置好后,就可以启动共享服务了

  1. systemctl start smb 

也可以查看服务的运行状态

  1. systemctl status smb 

在Windows中,地址栏输入\\[IP]地址,即可看到之前共享的目录内容。

4.7 额外补充

如果后续使用中,samba用户密码修改,或者用户名更改。那么在Windows下,以前能够正常访问也有可能变得不能访问了。这时我们在控制面板中搜索“凭据”,在“凭据管理器”->“Windows凭据”中删除之前老的登录账号即可。如果登录时没有勾选过记住凭据,可以在Windows的命令行中使用:

  1. 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

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区 

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2020-10-28 10:00:09

海思Hi3861CentOS鸿蒙LiteOS

2020-10-28 10:03:43

Hi3861 GPIO点灯按键

2020-10-16 09:50:37

Hi3861WiFi热点

2020-12-31 12:02:15

鸿蒙Hi3861环境搭建

2023-05-26 16:07:14

Hi3861Wifi模块

2022-03-15 15:00:59

Hi3861Pin接口鸿蒙

2021-04-23 10:13:05

鸿蒙HarmonyOS应用

2022-04-12 11:07:11

Hi3861鸿蒙操作系统

2020-11-02 12:07:11

鸿蒙 GPIO

2023-07-04 09:48:30

应用开发Hi3861

2020-10-14 09:41:02

Hi3861GPIO点灯

2022-03-07 15:05:58

HTTPHi3861数据解析

2021-02-02 15:52:17

鸿蒙HarmonyOS应用开发

2010-01-13 14:18:36

CentOS Open

2020-10-14 09:37:03

HiBurn鸿蒙.bin文件

2022-05-30 15:21:27

Hi3861TCP通信

2020-10-30 17:12:05

Hi3861

2010-02-23 14:45:52

CentOS LEMP

2020-11-06 10:15:16

HiBurn

2021-12-20 21:01:52

鸿蒙HarmonyOS应用
点赞
收藏

51CTO技术栈公众号