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