从操作系统诞生之日起,虚拟化技术就不断的演进与发展,结合目前云原生的发展态势,容器无疑是其中的重要一环。
Docker是一个开源的软件项目,可以在Linux操作系统上提供一层额外的抽象,让用户程序部署在一个相对隔离的运行环境,并提供自动管理机制。
需要额外指出的是,Docker并不等于容器(containers),Docker只是容器的一种,其他种类的容器还有Kata container,Rocket container等。
编译环境搭建
准备一个可以运行Docker的虚拟机操作系统,推荐ubuntu或者openEuler的发行版。
搭建环境[1]:在ubuntu虚拟机上执行以下步骤,下载OpenAtom OpenHarmony(简称“OpenHarmony”)的源码并部署Docker编译环境。
1、安装gitee repo工具[2]
1 2 3 4 5 | mkdir ~/bin curl https: //gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repo chmod a+x ~/bin/repo pip3 install -i https: //repo.huaweicloud.com/repository/pypi/simple requests |
2、获取OpenHarmony源码
(1)在ubuntu虚拟机上创建源码目录:
1 2 3 | mkdir /home/openharmony cd /home/openharmory |
(2)使用repo命令获取OpenHarmony v3.2 release源码:
1 2 3 4 | repo init -u git@gitee.com:openharmony/manifest.git -b OpenHarmony-3.2-Release --no-repo-verify repo sync -c repo forall -c 'git lfs pull' |
以上步骤完成后,可以获取到OpenHarmony编译所需的完整的源码,代码目录结构如下图所示:
3、获取Docker编译环境
独立Docker编译环境,适用于编译轻量和小型系统/标准系统.[3]
(1)获取OpenHarmony Docker编译镜像
1 2 | docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 |
此Docker编译环境较大,请耐心等待下载完成。
(2)进入源码根目录,启动并进入Docker编译环境。执行以下命令:
1 2 3 | cd /home/openharmory docker run --name ohos_build -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 |
命令参数说明:
-v X:Y 将宿主机的X目录挂载到容器的Y目录下。
将当前源码所在目录,挂载到容器编译环境的/home/openharmony目录下。
(3)安装编译依赖
通过步骤(2)进入容器的shell后,切换到/home/openharmony路径,执行脚本下载OpenHarmony编译所依赖的组件:
1 2 3 | cd /home/openharmony ./build/prebuilts_download.sh |
此处需要下载的编译依赖较多,请耐心等待下载完成。
至此OpenHarmony Docker编译环境准备完毕,在执行编译动作之前,需要完成OpenHarmony kernel特性的修改,否则Docker无法在OpenHarmony系统上正常运行。
kernel配置修改
如何判断源码使用默认配置编译后生成的kernel是否满足Docker的运行依赖呢?开源社区存在检查工具,可以帮助我们完成这个任务,大家可以自行获取此工具[4] 。
在此我们直接进入kernel配置的修改环节。
1、修改OpenHarmony kernel配置文件,开启Docker运行所依赖的内核功能。
需要修改的配置文件位置如下:
1 2 | kernel/linux/config/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig |
针对kernel特性的修改,主要是开启OpenHarmony内核中namespace、cgroup、network、overlay filesystem等功能。在配置文件的末尾追加以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | # add for Docker CONFIG_POSIX_MQUEUE=y CONFIG_SCHED_WALT=y CONFIG_PSI=y CONFIG_PAGE_COUNTER=y CONFIG_CGROUP_BPF=y CONFIG_MEMCG_KMEM=y CONFIG_MEMCG_SWAP_ENABLED=y CONFIG_BLK_CGROUP=y CONFIG_BLK_DEV_THROTTLING=y CONFIG_RT_GROUP_SCHED=y CONFIG_CGROUP_PIDS=y CONFIG_CGROUP_HUGETLB=y CONFIG_CGROUP_PERF=y CONFIG_NET_CLS_CGROUP=y CONFIG_BPF_SYSCALL=y CONFIG_BINFMT_MISC=y CONFIG_TLS=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_INET_ESP=y CONFIG_IPV6_MIP6=y CONFIG_IPV6_MULTIPLE_TABLES=y CONFIG_IPV6_MROUTE=y CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y CONFIG_NF_CONNTRACK=y CONFIG_NETFILTER_XT_MARK=y CONFIG_NETFILTER_XT_SET=y CONFIG_NETFILTER_XT_TARGET_CHECKSUM=y CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_IPVS=y CONFIG_NETFILTER_XT_MATCH_CGROUP=y CONFIG_IP_SET=y CONFIG_IP_SET_HASH_IP=y CONFIG_IP_SET_HASH_NET=y CONFIG_IP_VS=y CONFIG_IP_VS_NFCT=y CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_RR=y CONFIG_IP_VS_WRR=y CONFIG_IP_VS_SH=y CONFIG_IP_NF_MATCH_STATE=y CONFIG_IP_NF_MATCH_LIMIT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_NF_NAT=y CONFIG_IP_NF_FTP=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_IP_NF_CONNTRACK=y CONFIG_IP_NF_IRC=y CONFIG_IP_NF_NAT=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_BRIDGE=y CONFIG_BRIDGE_NETFILTER=y CONFIG_CGROUP_NET_PRIO=y CONFIG_STREAM_PARSER=y CONFIG_DRIVERS_HDF_LIGHT=y CONFIG_HYPERHOLD=y CONFIG_HYPERHOLD_DEBUG=y CONFIG_HYPERHOLD_ZSWAPD=y CONFIG_HYPERHOLD_FILE_LRU=y CONFIG_HYPERHOLD_MEMCG=y CONFIG_ZRAM_GROUP=y CONFIG_ZRAM_GROUP_DEBUG=y CONFIG_ZLIST_DEBUG=y CONFIG_ZRAM_GROUP_WRITEBACK=y CONFIG_REGMAP_SPI=y CONFIG_MACVLAN=y CONFIG_VXLAN=y CONFIG_AUFS_FS=y CONFIG_VETH=y CONFIG_DRM_DW_HDMI_I2S_AUDIO=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=y CONFIG_SND_SEQ_DEVICE=y CONFIG_SND_RAWMIDI=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y CONFIG_SND_PCM_TIMER=y CONFIG_SND_HRTIMER=y CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y CONFIG_SND_SEQUENCER=y CONFIG_SND_SEQ_DUMMY=y CONFIG_SND_SEQ_HRTIMER_DEFAULT=y CONFIG_SND_SEQ_MIDI_EVENT=y CONFIG_SND_SEQ_MIDI=y CONFIG_SND_DRIVERS=y CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y CONFIG_SND_SOC_ROCKCHIP=y CONFIG_SND_SOC_ROCKCHIP_I2S=y CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y CONFIG_SND_SOC_ROCKCHIP_PDM=y CONFIG_SND_SOC_ROCKCHIP_SPDIF=y CONFIG_SND_SOC_ROCKCHIP_SPDIFRX=y CONFIG_SND_SOC_ROCKCHIP_MAX98090=y CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y CONFIG_SND_SOC_ROCKCHIP_RT5645=y CONFIG_SND_SOC_ROCKCHIP_HDMI=y CONFIG_SND_SOC_DUMMY_CODEC=y CONFIG_SND_SOC_HDMI_CODEC=y CONFIG_SND_SOC_ES7202=y CONFIG_SND_SOC_ES7243E=y CONFIG_SND_SOC_ES8311=y CONFIG_SND_SOC_ES8316=y CONFIG_SND_SOC_MAX98090=y CONFIG_SND_SOC_RK3308=y CONFIG_SND_SOC_RK3328=y CONFIG_SND_SOC_RK817=y CONFIG_SND_SOC_RK_CODEC_DIGITAL=y CONFIG_SND_SOC_RL6231=y CONFIG_SND_SOC_RT5616=y CONFIG_SND_SOC_RT5640=y CONFIG_SND_SOC_RT5645=y CONFIG_SND_SOC_RT5651=y CONFIG_SND_SOC_SPDIF=y CONFIG_SND_SOC_TS3A227E=y CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y CONFIG_ANDROID_PARANOID_NETWORK=y CONFIG_ACCESS_TOKENID=y CONFIG_F2FS_GRADING_SSR=y CONFIG_OVERLAY_FS=y CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y CONFIG_CRYPTO_SEQIV=y # end |
2、修改OpenHarmony配置文件 build/ohos/images/build_image.py
添加Docker运行依赖的目录:'run', 'var', 'opt', 'usr'。
1 2 3 4 5 6 | _dir_list = [ 'config' , 'dev' , 'proc' , 'sys' , 'updater' , 'system' , 'vendor' , 'data' , 'chipset' , 'storage' , 'mnt' , 'tmp' , 'sys_prod' , 'chip_prod' , 'run' , 'var' , 'opt' , 'usr' ] |
3、修改OpenHarmony配置文件
base/security/selinux/sepolicy/base/system/file_contexts
添加以下内容:
1 2 3 4 5 6 | /run u:object_r:rootfs:s0 / var u:object_r:rootfs:s0 /opt u:object_r:rootfs:s0 /usr u:object_r:rootfs:s0 /lib u:object_r:rootfs:s0 |
至此准备工作结束,进入OpenHarmony系统编译环节。
OpenHarmony编译
本文以适配触觉开发板为例,对代码编译流程进行说明。
在OpenHarmony源码路径下,执行以下命令触发编译:
1 2 | ./build.sh --product-name rk3568 --ccache --jobs $(nproc) |
编译正常结束后,产物存放在以下位置:
接下来就需要将目录下的产物拷贝到Windows环境,使用开发板厂商提供的烧写工具完成系统烧写。
说明:
清理编译路径下已生成的文件,可以执行命令:hb clean
命令会清理out路径下生成的文件。如果要重编内核,需要确认out/kernel路径被移除,然后重新触发编译即可。
烧写
烧录工作需要使用Windows环境,且依赖厂商提供的烧写工具及驱动助手[5]。
1、RK驱动助手
解压后需要执行DriverInstall.exe,完成安装,否则烧写工具无法识别到开发板。
2、AndroidTool烧写工具
解压后直接运行RKDevTool.exe,打开烧录操作界面,如下图所示:
烧录步骤做如下说明:
1)在瑞芯微开发工具界面,点击[设备分区表],读取设备分区;
2)按照设备分区的起始地址修改烧录项,导入前序步骤生成的img文件;
3)点击[执行]后进入系统烧录流程。
开发板完成烧录后,会自动进行重启。之后可以通过HDC调试工具登录OpenHarmony shell交互命令行,完成Docker的部署操作。
HDC调试工具
HDC(OpenHarmony Device Connector)[6] 是为开发人员提供的用于设备连接调试的命令行工具,该工具支持部署在Windows/Linux/Mac等系统上与OpenHarmony设备(或模拟器)进行连接调试通信。
工具可以通过OpenHarmony官方的每日构建dailybuilds[7] 或发布的SDK[8] 中获得,根据使用的系统平台到相应的toolchains目录下提取。
以SDK为例,解压后HDC工具路径如下:
1 2 | ohos-sdk\windows\toolchains-windows-x64-3.2.11.9-Release.zip\toolchains\ |
HDC工具的基本使用方法:(在Windows PowerShell中执行命令)
1 2 3 4 5 6 7 | # 进入调试shell > .\hdc.exe shell # 文件拷贝,从openharmony系统下载文件至Windows的当前目录下: > .\hdc.exe file recv /data/xxxx . # 文件拷贝,从windows环境上传文件到openharmony的/data目录下: > .\hdc.exe file send .\testfile /data/ |
Docker环境配置
历经坎坷,终于到了最后一步Docker部署的环节。通过HDC工具连接到触觉开发板之后,执行以下步骤。
1、执行脚本修改跟目录的读写权限。脚本内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/bin/sh #remount / to rw property mount -o remount -rw / #mount cgroup mount -t tmpfs -o rw,nosuid,nodev,noexec,mode=755 tmpfs /sys/fs/cgroup #create related folder cd /sys/fs/cgroup mkdir pids cpuset blkio cpu,cpuacct memory devices net_cls,net_prio perf_event #mount files related cgroup mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,pids cgroup /sys/fs/cgroup/pids mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,cpuset cgroup /sys/fs/cgroup/cpuset mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,blkio cgroup /sys/fs/cgroup/blkio mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,cpu,cpuacct cgroup /sys/fs/cgroup/cpu,cpuacct mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,memory cgroup /sys/fs/cgroup/memory mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,devices cgroup /sys/fs/cgroup/devices mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,net_cls,net_prio cgroup /sys/fs/cgroup/net_cls,net_prio mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,perf_event cgroup /sys/fs/cgroup/perf_event mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,freezer cgroup /sys/fs/cgroup/freezer |
2、部署Docker静态可执行文件
下载Docker静态可执行文件,当前选用的是20.10.21版本 [9]。
使用HDC工具将下载的压缩包上传至触觉开发环境并解压,将解压目录下的文件全部拷贝到/system/bin目录下即可。解压后目录结构如图所示:
3、创建Docker运行所需的目录及配置文件
1 2 3 | mkdir /system/etc/docker mkdir / var /run |
创建/system/etc/docker/daemon.json文件,并添加以下文件内容
1 2 3 4 5 | { "registry-mirrors" :[ "https://veotnqhz.mirror.aliyuncs.com" , "https://hub-mirror.c.163.com" , "https://mirror.baidubce.com" ], "data-root" : "/data/data/dockerdir" } |
4、添加库别名
由于Docker运行时使用的库与OpenHarmony环境存在的库名称不同,需要创建一个软链接别名。
1 2 | ln -s /lib/ld-musl-arm.so.1 /lib/ld-musl-armhf.so.1 |
5、手动拉起Docker的服务进程
1 2 3 | # 拉起dockerd守护进程 dockerd -D -H tcp: //0.0.0.0:2375 -H unix:///var/run/docker.sock & |
6、验证Docker基本功能
1 2 3 4 5 | # 判断docker命令可以正常执行 docker --verison # 判断docker命令可以正常拉取、运行远端镜像(前提是网络可用) docker run hello-world |
至此OpenHarmony上Docker的基本功能已经实现,大家可以尝试导入或部署自己的Docker应用。
参考链接
[1] https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/sourcecode-acquire.md
[2]
https://gitee.com/help/articles/4316#article-header0
[3]
https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/gettools-acquire.md
[4]
https://github.com/moby/moby/blob/master/contrib/check-config.sh
[5]
https://www.t-firefly.com/doc/download/107.html
[6]
https://gitee.com/openharmony/developtools_hdc
[7]
http://ci.openharmony.cn/dailys/dailybuilds
[8]
https://repo.huaweicloud.com/harmonyos/os/3.2-Release/ohos-sdk-windows_linux-public.tar.gz
[9]
https://download.docker.com/linux/static/stable/aarch64/docker-20.10.21.tgz
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
2022-05-18 直播预告丨OpenHarmony标准系统多媒体子系统之视频解读