一、背景介紹
1.1、環(huán)境配置
- 編譯環(huán)境:Ubuntu 20.04
- OpenHarmony版本:4.0 release
- 平臺(tái)設(shè)備:RK3568
OpenHarmony 3.2更新至OpenHarmony 4.0后,公司服務(wù)器無法編譯通過,總是在最后幾十個(gè)文件時(shí)報(bào)錯(cuò),錯(cuò)誤碼4000:
[OHOS ERROR] ld.lld: error: undefined symbol: __aarch64_cas4_acq_rel
[OHOS ERROR] >>> referenced by hdf_vnode_adapter.c:294 (/home/xxx/OHOS/OpenHarmony_master/out/kernel/OBJ/linux-5.10/../../../../drivers/hdf_core/framework/core/adapter/vnode/src/hdf_vnode_adapter.c:294)
[OHOS ERROR] >>> vmlinux.o:(HdfVNodeAdapterIoctl)
[OHOS ERROR] >>> referenced by hdf_vnode_adapter.c:303 (/home/xxx/OHOS/OpenHarmony_master/out/kernel/OBJ/linux-5.10/../../../../drivers/hdf_core/framework/core/adapter/vnode/src/hdf_vnode_adapter.c:303)
[OHOS ERROR] >>> vmlinux.o:(HdfVNodeAdapterIoctl)
[OHOS ERROR] >>> referenced by hdf_vnode_adapter.c:428 (/home/xxx/OHOS/OpenHarmony_master/out/kernel/OBJ/linux-5.10/../../../../drivers/hdf_core/framework/core/adapter/vnode/src/hdf_vnode_adapter.c:428)
[OHOS ERROR] >>> vmlinux.o:(HdfDeviceSendEventToClient)
[OHOS ERROR] >>> referenced 1 more times
[OHOS ERROR] BTF .btf.vmlinux.bin.o
[OHOS ERROR] pahole: .tmp_vmlinux.btf: No such file or directory
[OHOS ERROR] LD .tmp_vmlinux.kallsyms1
[OHOS ERROR] ld.lld: error: .btf.vmlinux.bin.o: unknown file type
[OHOS ERROR] make[2]: *** [/home/xxx/OHOS/OpenHarmony_master/out/kernel/src_tmp/linux-5.10/Makefile:1236: vmlinux] Error 1
[OHOS ERROR] make[1]: *** [arch/arm64/Makefile:208: rk3568-toybrick-x0-linux.img] Error 2
[OHOS ERROR] make[1]: Leaving directory '/home/xxx/OHOS/OpenHarmony_master/out/kernel/OBJ/linux-5.10'
[OHOS ERROR] make: *** [Makefile:192: __sub-make] Error 2
[OHOS ERROR] Traceback (most recent call last):
...
[OHOS ERROR] raise OHOSException('ninja phase failed', '4000')
[OHOS ERROR] exceptions.ohos_exception.OHOSException: ninja phase failed
[OHOS ERROR]
[OHOS ERROR] Code: 4000
[OHOS ERROR]
[OHOS ERROR] Reason: ninja phase failed
[OHOS ERROR]
[OHOS ERROR] Solution: Please check the compile log at out/{compiling product}/build.log, If you could analyze build logs.
[OHOS ERROR] Or you can try the following steps to solve this problem:
[OHOS ERROR] 1. cd to OHOS root path
[OHOS ERROR] 2. run 'hb clean --all' or 'rm -rf out build/resources/args/.json'.
[OHOS ERROR] 3. repo sync
[OHOS ERROR] 4. repo forall -c 'git lfs pull'
[OHOS ERROR] 5. bash build/prebuilts_download.sh
[OHOS ERROR] 6. rebuild your product or component
[OHOS ERROR] 7. check if any environment variables required by the building process are not set in build/compile_env_allowlist.json
[OHOS ERROR]
[OHOS ERROR] If you still cannot solve this problem, you could post this problem on:
[OHOS ERROR] https://gitee.com/openharmony/build/issues
[OHOS ERROR]
=====build error=====
經(jīng)分析嘗試:
1、相同的步驟和命令,wsl2 編譯OpenHarmony 4.0 r正常。
2、服務(wù)器使用sudo編譯正常,但由于sudo使用root權(quán)限,會(huì)影響項(xiàng)目編譯鏈等配置,故不能作為解決方案。
于是嘗試在服務(wù)器中使用docker,通過隔離環(huán)境編譯OpenHarmony 4.0。
二、docker安裝與配置
在Ubuntu服務(wù)器中安裝和配置docker
2.1、docker安裝
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt install docker.io
#安裝后通過查看docker版本驗(yàn)證是否安裝成功
$ docker --version 或 docker -v
Docker version 24.0.5, build 24.0.5-0ubuntu1~20.04.1
2.2、獲取docker 鏡像
獲取docker鏡像,以u(píng)buntu:20.04為例注意:
此過程較漫長(zhǎng),請(qǐng)耐心等待~
$ docker pull ubuntu:20.04
#創(chuàng)建好后可通過image命令查看
$ docker images 或docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 20.04 f78909c2b360 8 days ago 72.8MB
swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_standard 3.2 ae33c06f45c5 6 months ago 5.3GB
2.3、創(chuàng)建docker容器
#進(jìn)入需要與docker映射的目錄,后續(xù)基于此目錄的修改,容器和服務(wù)會(huì)同步。
$ cd ~/docker/
$ docker run -it -v $(pwd):/home/zhangsan --name ohos ubuntu:20.04
說明:命令表示創(chuàng)建一個(gè)名為ohos,系統(tǒng)鏡像為ubuntu 20.04的容器;這個(gè)容器運(yùn)行在交互模式下,并且將當(dāng)前目錄映射
到容器的/home/zhangsan
目錄。注意:zhangsan
需與后續(xù)要在ohos創(chuàng)建的非root用戶名保持一致,否則后續(xù)下拉和編譯代碼會(huì)出現(xiàn)權(quán)限問題。
創(chuàng)建好ohos容器,默認(rèn)以root用戶進(jìn)入。
#退出root用戶
$ exit
# 啟動(dòng)ohos容器
$ docker container start ohos
#查看docker容器
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab7d67807966 ubuntu:20.04 "/bin/bash" 29 hours ago Up 29 hours ohos
2.4、ohos容器中創(chuàng)建非root用戶
由于docker 容易與宿主系統(tǒng)共享一個(gè)內(nèi)核,容器中的用戶ID和組ID是映射到宿主系統(tǒng)的;默認(rèn)情況下,容器內(nèi)的所有進(jìn)程都以root用戶身份運(yùn)行。這意味著容器內(nèi)的進(jìn)程具有與宿主系統(tǒng)中的root用戶相同的權(quán)限。為了提高安全性,建議在容器中使用非root用戶運(yùn)行進(jìn)程。
#運(yùn)行ohos容器(默認(rèn)root用戶)
$ docker exec -it ohos bash
$ apt-get update
$ apt-get upgrade
$ apt install -y sudo
$ apt install -y vim
#添加非root用戶zhangsan
$ useradd -m zhangsan
#設(shè)置用戶密碼,123456
$ passwd zhangsan
#設(shè)置zhangsan用戶組
$ usermod -aG zhangsan zhangsan
#sudoers添加zhangsan
$ vim /etc/sudoers #文末添加一行zhangsan ALL=(ALL) ALL
#設(shè)置/home/zhangsan目錄用戶和組,需與用戶名保持一致
$ chown -R zhangsan:zhangsan /home/zhangsan
$ exit
注意:zhangsan的uid和gid需與宿主系統(tǒng)自己的uid和gid保持一致,否則后續(xù)下載源碼后,在宿主系統(tǒng)中自己無權(quán)限修改。
如下zhangsan 與wangwu的id匹配一致,為1003
#ohos容器zhangsan 用戶名,uid,gid和組信息
$ whoami && id
uid=1003(zhangsan) gid=1003(zhangsan) groups=1003(zhangsan)
#宿主系統(tǒng)自己賬戶(wangwu)用戶名,uid,gid和組信息
$ whoami && id
wangwu
uid=1003(wangwu) gid=1003(wangwu) groups=1003(wangwu)
若ohos容器中zhangsan的uid與wangwu的不一致(通常zhangsan.uid < wangwu.uid),可在容器中添加任意用戶,uid號(hào)以1000開始累加,最終使得zhangsan.uid = wangwu.uid即可
#由于uid不匹配,先刪除zhangsan用戶
userdel zhangsan
# 添加隨意用戶 tom,jerry
$ useradd -M tom
$ useradd -M jerry
#查看所有用戶
cat /etc/passwd
...
tom:x:1001:1001::/home/tom:/bin/sh
jerry:x:1002:1002::/home/jerry:/bin/sh
#此時(shí)再次添加zhangsan用戶,其uid則為1003
三、OpenHarmony 4.0 源碼下載及編譯
3.1、配置ohos容器編譯環(huán)境
#以zhangsan用戶運(yùn)行ohos容器
$ docker exec --user zhangsan -it ohos bash
#替換軟件源
$ sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
$ sudo vim /etc/apt/sources.list #sources.list替換以下內(nèi)容
deb http://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
## Not recommended
# deb http://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src http://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
更新
$ sudo apt-get update
$ sudo apt-get upgrade
#將Shell環(huán)境修改為bash
$ sudo dpkg-reconfigure dash #select no
#部署編譯環(huán)境,安裝工具包
$ sudo apt-get install -y gcc-arm-linux-gnueabi gcc-9-arm-linux-gnueabi
$ sudo apt-get install -y python python3 python3-pip binutils binutils-dev git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby genext2fs device-tree-compiler make libffi-dev e2fsprogs pkg-config perl openssl libssl-dev libelf-dev libdwarf-dev u-boot-tools mtd-utils cpio doxygen liblz4-tool openjdk-8-jre gcc g++ texinfo dosfstools mtools default-jre default-jdk libncurses5 apt-utils wget scons python3.8-distutils tar rsync git-core libxml2-dev lib32z-dev grsync xxd libglib2.0-dev libpixman-1-dev kmod jfsutils reiserfsprogs xfsprogs squashfs-tools pcmciautils quota ppp libtinfo-dev libtinfo5 libncurses5-dev libncursesw5 libstdc++6 gcc-arm-none-eabi vim ssh locales libxinerama-dev libxcursor-dev libxrandr-dev libxi-dev
#上一步命令執(zhí)行過程需手動(dòng)選擇時(shí)區(qū)配置:6.Asia/70.Shanghai
#配置pip軟件包更新源
$ mkdir ~/.pip
$ pip3 config set global.index-url https://mirrors.huaweicloud.com/repository/pypi/simple
$ pip3 config set global.trusted-host mirrors.huaweicloud.com
$ pip3 config set global.timeout 120
#配置git
git config --global user.email "jerry@163.com"
git config --global user.name "jerry"
git config --global credential.helper store
git config --global --add safe.directory "*"
#安裝repo
wget https://gitee.com/oschina/repo/raw/fork_flow/repo-py3
sudo mv repo-py3 /usr/local/bin/repo
sudo chmod a+x /usr/local/bin/repo
pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests
3.2、下拉OpenHarmony 4.0r源碼及編譯
$ mkdir OpenHarmony_4.0r && cd OpenHarmony_4.0r
$ repo init -u https://gitee.com/openharmony/manifest -b OpenHarmony-4.0-Release --no-repo-verify
$ repo sync -c && repo forall -c 'git lfs pull'
$ bash build/prebuilts_download.sh
$ ./build.sh -p rk3568 #編譯成功,結(jié)果如下
...
Please modify according to README.md
[OHOS INFO] rk3568 build success
[OHOS INFO] Cost time: 0:14:17
=====build successful=====
2023-12-21 21:29:18
++++++++++++++++++++++++++++++++++++++++
宿主系統(tǒng)可見openharmony 4.0r代碼已拉下,并有權(quán)限修改文章來源:http://www.zghlxwxcb.cn/news/detail-771110.html
$ tree -L 2 ~/docker/
docker/
├── OpenHarmony_4.0r
│ ├── applications
│ ├── arkcompiler
│ ├── base
│ ├── build
│ ├── build.py -> build/build_scripts/build.py
│ ├── build.sh -> build/build_scripts/build.sh
│ ├── commonlibrary
│ ├── developtools
│ ├── device
│ ├── docs
│ ├── domains
│ ├── drivers
│ ├── foundation
...
#創(chuàng)建文件正常
$ touch ~/docker/OpenHarmony_4.0r/test
后續(xù)
當(dāng)然,ohos環(huán)境可以自己打包成鏡像推至自己的倉庫,上述繁瑣的過程可以在Dockerfile中進(jìn)行配置,僅通過docker build 命令完成全部操作,剛接觸docker,待后續(xù)優(yōu)化完善~文章來源地址http://www.zghlxwxcb.cn/news/detail-771110.html
到了這里,關(guān)于Docker 編譯OpenHarmony 4.0 release的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!