1 简介
容器可以让你将VxWorks的应用程序打包并和系统的其他部分进行分离开。VxWorks的容器可以被部署在被称为Dockerhub的元存储库上,并可从那儿分发到VxWorks的目标板上。
VxWorks是由风河公司提供的实时操作系统。
VxWorks有针对Raspberry Pi 4 model B目标板的板级支持包(BSP)。
Raspberry Pi 4开发板是一个小型的,价格可承受的计算机开发板。
DockerHub是一个Docker用户可以存储和分发容器镜像的仓库。
本文将介绍如何配置VxWorks以支持Raspberry Pi 4上的容器,还有DockerHub云如何注册。
2 前提条件
这些步骤假设你正在使用:
1) 一个具有4GB内存的Raspberry Pi 4 model B的开发板
2) 一个USB转串行TTL的串口线
3) 一个microSD卡
4) 一个安装了下面Wind River VxWorks 7, SR31.07的Windows工作站
5) Wind River VxWorks 7, SR21.07
这些步骤假设你已经有了一个Docker Hub的登录帐号。参考https://hub.docker.com 查看更多细节。
我们也假设你已经将你的工作站用buildah工具进行了配置,这是用来编译OCI兼容容器的,更多细节,请参考VxWorks容器编程指南,为容器来配置编译用的工作站。
3 相关的文档
更多关于这些主题的内容,请参考:
Wind River文档
VxWorks容器编程者指南
4 为Raspberry Pi 4的目标开发板的一些准备工作
4.1 为TTL的串口线安装驱动(仅仅在Windows的工作站上)
按照下述链接的描述来为USB转串口线安装一个Windows 10的驱动
Fake PL2303 – how to install on Windows 8.1
4.3 将TTL的串口线连接到Raspberry Pi 4的开发板上
在开发板上找到pin的连接器,Pin 1是在从板边算起的第二排的pin里面,离顶边最近的那一列的pin。(离网络RJ45和USB连接器最远的那边)
如下面描述将TTL串口线连好:
pin 06 – 黑线
pin 08 – 白线
pin 10 – 绿线
注意:红线不要接
4.3 按照BSP里面的target.txt文件里描述的指令来定位firmware:
installDir\vxworks\21.07\os\unsupported\rpi_4\rpi_4\target.txt
首先,将Raspberry Pi的firmware git库克隆到本地,比如:
git clone https://github.com/raspberrypi/firmware.git
然后,将正确版本的代码下载下来
注意:当你使用git checkout命令时候,添加-f参数来强制下载正确的firmware版本,比如:
git checkout -f d9c382e0f3a546e9da153673dce5dd4ba1200994
4.4 将启动目录的文件拷贝到SD卡的根目录
下载到一个目录中git仓储被称为firmware,将firmware/boot里面的文件拷贝到SD卡的根目录。
4.5 将串口线接到Raspberry Pi 4的开发板上
将TTL的串口线的USB接头连到工作站上
将电源线和网线连到Raspberry Pi 4的开发板上
4.6 检查Raspberry Pi 4开发板上的U-Boot串口终端
工作站终端的串口配置默认如下:
Baud Rate: 115200
Date: 8 bit
Stop: 1 bit
Parity: None
Flow Ctrl: None
5 准备支持容器的VxWorks的工程项目
5.1 创建并编译一个容器VxWorks源码编译项目(VSB)
打开Windows的命令行,配置编译环境,然后将容器库添加进新创建的VxWorks源码编译工程(VSB)里:
cd <WIND_HOME> // your installation directory
wrenv -p vxworks\21.07
cd <YOUR_WORKSPACE> // your workspace
vxprj vsb create -S -bsp rpi_4 -smp rpiVSB
cd rpiVSB // your VSB directory
// add the Containers runtime
vxprj vsb layer add CONTAINER_RUNTIME
// add the Containers manager
vxprj vsb layer add CONTAINER_MANAGER
// add the Containers Examples
vxprj vsb layer add PYTHON
vxprj vsb layer add CONTAINER_EXAMPLES
vxprj vsb config -s -add _WRS_CONFIG_CONTAINER_PYTHON_WEB_SERVER=y
// Build the VSB
vxprj vsb build -j 16
cd ..
5.2 创建并编译一个容器VxWorks镜像工程(VIP)
像下面一样来创建一个VxWorks镜像工程:
vxprj vip create -vsb rpiVSB llvm -profile PROFILE_DEVELOPMENT rpiVIP
cd rpiVIP
// enable VIP container components
vxprj vip component add INCLUDE_CONTAINER_RUNTIME INCLUDE_CONTAINER_SHELL_CMD
vxprj vip component add INCLUDE_DISK_UTIL INCLUDE_RAM_DISK INCLUDE_OVERLAY_FS
vxprj vip parameter set RAM_DISK_SIZE 0x4000000
vxprj vip component add INCLUDE_STANDALONE_SYM_TBL
vxprj vip component add INCLUDE_STANDALONE_DTB
// enable PYTHON and ROMFS
vxprj vip component add INCLUDE_PYTHON_SUPPORT INCLUDE_ROMFS
5.3 配置VxWorks可以让公网访问
vxprj vip component add INCLUDE_CONTAINER_MANAGER INCLUDE_IPDNSC
vxprj vip component add INCLUDE_PING INCLUDE_IFCONFIG
vxprj vip parameter setstring DNSC_PRIMARY_NAME_SERVER "8.8.8.8"
vxprj vip parameter set SEC_VAULT_KEY_ENCRYPTING_PW \"vault_passwd\"
vxprj vip component add INCLUDE_IPCOM_USE_TIME_CMD
注意:
在Linux主机端,按照如下指示来设置 SEC_VAULT_KEY_ENCRYPTING_PW
vxprj parameter set SEC_VAULT_KEY_ENCRYPTING_PW \"\vault_passwd\"
注意:
将SEC_VAULT_KEY_ENCRYPTING_PW设置成一个合适的含有大小写字母以及数字的密码。
5.4 添加针对Raspberry Pi 4具体的组件
vxprj vip component add DRV_END_FDT_BCM_GENETv5 INCLUDE_XBD_PART_LIB
vxprj vip component add DRV_FDT_BRCM_2711_PCIE DRV_FDT_BRCM_2711_EMMC2
vxprj vip component add DRV_SDSTORAGE_CARD
5.5 拷贝VxWorks容器证书到VIP ROMFS目录
mkdir romfs\vxc\ca-certs
copy ..\..\vxworks\21.07\os\container\manager\ca-certs\ca-certificates.crt romfs\vxc\ca-certs\
5.6 更新DTS文件中的VxWorks启动行
在一个编辑器中打开DTS文件rpi_4_0_1_2_0\rpi-4b.dts
定位到DTS文件中选择的节点
为目标机选择一个IP地址并将给IP地址正确地配置到VxWorks的启动行里,比如:
bootargs = "genet(0,0)host:vxworks h=192.168.1.105 e=192.168.1.107:ffffff00 g=192.168.1.1 u=target pw=vx tn=RPi4";
5.7 编译VIP工程项目
vxprj build
6 将这个网页服务器的示例容器推送到DockerHub上
cd ..\myVSB\usr\containers\web_server\
wsl buildah pull oci:web_server.oci
wsl buildah push --creds dockerAccountName:dockerAccountPassword web_server.oci docker://dockerAccountName/web_server.oci
注意:
dockerAccountName 是你的Docker Hub帐号的docker ID
dockerAccountPassword 是你的Docker Hub帐号的密码
7 启动Raspberry PI 4目标板上的VxWorks
7.1 将VxWorks启动文件拷贝到SD卡上
将Raspberry Pi 4目标板断电,移除SD卡,将SD卡插入到工作站上,将VIP项目工程生成的uVxWorks文件拷贝到SD卡的根目录。
将rpiVIP\rpi_4_0_1_2_0_sd_card_files目录下的内容拷贝到SD卡的根目录,从工作站移除SD卡,并安装到Raspberry Pi 4的目标板上。
7.2 从U-Boot的控制台启动VxWorks
给目标板上电,U-Boot将会自动运行启动脚本,然后VxWorks的内核shell将会出现在串口控制台上。
另一种方法,你也可以手动来启动VxWorks内核:
首先,按回车键来中断U-Boot的启动过程,然后,手动在命令行上加载uVxWorks文件。
fatload mmc 0:1 0x10000000 uVxWorks
然后,运行uVxWorks文件。
bootm 0x10000000
7.3 确定目标板的网络IP地址
从VxWorks的内核shell上运行ifconfig命令:
-> ifconfig
.
.
.
gei0 Link type:Ethernet HWaddr 7a:7a:9a:00:00:02
inet 192.168.1.107 mask 255.255.255.0 broadcast 192.168.1.255
.
.
.
value = 0 = 0x0
->
注意:有时候,VxWorks的网络协议栈在VxWorks启动后需要花几分钟来创建一个网络链接,RJ45网络接口上的LED会在驱动尝试连接的过程中一直闪烁。
你可能需要拔掉然后再插上网线来让LED开始闪烁,当绿灯和黄灯稳定之后,你应该就可以成功访问网络了。
7.4 设置正确的VxWorks日期
-> cmd
[vxWorks *]# date 2021-06-15
ok
[vxWorks *]#
注意:
这个指令是假设当前日期是2021年6月15日。请设置成你访问本文并实际操作的日期。
8 下载并运行网页服务器的容器
8.1 检查你的网络连接
[vxWorks *]# C
-> ping "www.google.com"
Pinging lhr25s34-in-f4.1e100.net (142.250.187.228) with 64 bytes of data:
Reply from 142.250.187.228 bytes=64 ttl=114 seq=0 time=16ms
--- lhr25s34-in-f4.1e100.net ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 17 ms
rtt min/avg/max = 16/16/16 ms
value = 0 = 0x0
-> cmd
[vxWorks *]#
注意:
你可能需要等一会,让END的网络驱动完成配置网络PHY,当RJ45链接头上的LED停止闪烁后,配置就搞定了。
8.2 将网页服务器的VxWorks容器拉到目标机上
[vxWorks *]# vxc pull dockerAccountName/web_server.oci
[vxWorks *]# vxc unpack --image web_server.oci --rootfs flattened /ram0/bundle
注意:
dockerAccountName 是你的Docker Hub账户的docker ID
8.3 运行网页服务器容器
[vxWorks *]# vxc run --bundle /ram0/bundle web_server
Starting server using port 8888
8.4 打开你的工作张上的网页浏览器来验证示例容器已经运行
假设你的目标机IP地址是192.168.1.107,将你的浏览器导航到 http://192.168.1.107:8888 ,你可以看到示例的Wind River网页页面会展示在你的浏览器上了。
当网页服务器为你的浏览器提供内容的时候,你也会在内核shell上收到调试信息,比如:
[vxWorks *]# vxc run --bundle /ram0/bundle web_server
Starting server using port 8888
192.168.1.105 - - [06/Jul/2021 01:43:54] "GET / HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:43:54] "GET / HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:43:55] "GET /wndrvr.png HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:43:55] "GET /GettyImages.jpg HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:43:55] code 404, message File not found
192.168.1.105 - - [06/Jul/2021 01:43:55] "GET /favicon.ico HTTP/1.1" 404 -
192.168.1.105 - - [06/Jul/2021 01:44:13] "GET / HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:44:13] "GET /wndrvr.png HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:44:13] "GET /GettyImages.jpg HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:44:13] code 404, message File not found
192.168.1.105 - - [06/Jul/2021 01:44:13] "GET /favicon.ico HTTP/1.1" 404 -
192.168.1.105 - - [06/Jul/2021 01:44:51] "GET / HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:44:51] "GET /wndrvr.png HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:44:51] "GET /GettyImages.jpg HTTP/1.1" 200 -