Convert a VxWorks 7 RTP to Container and Deploy With Dockerhub
Table of Contents
- 1. Introduction
- 2. Prerequisites
- 3. Related Documentation
- 4. Prepare the Container-Enabled VxWorks Projects
- 4.1. Create and Build the Containers VxWorks Source Build (VSB) Project
- 4.2. Create and Build the Containers VxWorks Image Project (VIP)
- 4.3. Prepare the VxWorks Configuration for Public Internet Access
- 4.4. Add Raspberry Pi 4 Specific Components
- 4.5. Copy the VxWorks Container Certificate to the VIP ROMFS Directory
- 4.6. Update the VxWorks bootline in the DTS File
- 4.7. Build the VIP
- 5. Create the Philosophers Example RTP Project
- 6. Create a Container for Philosophers
- 7. Build the philContainer OCI Image File
- 8. Push the philContainer OCI Image File to DockerHub
- 9. Pull philContainer to the VxWorks Target Board
1 Introduction
Containers allow the packaging of VxWorks applications that are isolated from the rest of the system. VxWorks containers can be deployed into the cloud repository called Dockerhub, and distributed to VxWorks target boards from there.
In this blog, I will show how to convert a standard, example VxWorks RTP into a Container, push it to DockerHub, and then deploy to VxWorks.
VxWorks is a Real Time Operating System built by Wind River.
VxWorks has board support package (BSP) for the Raspberry Pi 4 model B target board.
The Raspberry Pi 4 board is a small and affordable computer board.
DockerHub is a repository where Docker users store and distribute container images.
Before attempting to follow this blog, make sure you have completed Using VxWorks 7 Containers With Dockerhub on a Raspberry Pi 4 Model B Board.
2 Prerequisites
These instructions assume that you are using:
1) A Raspberry Pi 4 model B board with 4GB RAM booting VxWorks
2) A USB-Serial TTL serial cable
3) A micro-SD card
4) A Windows workstation with the following installed on it:
5) Wind River VxWorks 7, SR21.07
The instructions assume you have a Docker Hub login. Refer to https://hub.docker.com/ for details.
They also assume you have configured your workstation with the buildah utility. This is used to build OCI compliant containers. For details, refer to the VxWorks Container Programmer’s Guide, Configure the Build Workstation for Containers.
3 Related Documentation
For more information on these topics, refer to:
Wind River documentation:
VxWorks Container Programmer’s Guide
4 Prepare the Container-Enabled VxWorks Projects
4.1 Create and Build the Containers VxWorks Source Build (VSB) Project
Open a Windows command shell, configure the build environment, and then add the containers libraries to a newly created VxWorks source build (VSB) project:
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 ..
4.2 Create and Build the Containers VxWorks Image Project (VIP)
Create the VxWorks image project (VIP) as follows:
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 mkdir romfs
4.3 Prepare the VxWorks Configuration for Public Internet Access
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
NOTE:
On linux hosts, set the SEC_VAULT_KEY_ENCRYPTING_PW as follows:
vxprj parameter set SEC_VAULT_KEY_ENCRYPTING_PW \"\vault_passwd\"
NOTE:
Set SEC_VAULT_KEY_ENCRYPTING_PW to an appropriate password which includes letters of varying case, and numbers.
4.4 Add Raspberry Pi 4 Specific Components
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
4.5 Copy the VxWorks Container Certificate to the VIP ROMFS Directory
mkdir romfs\vxc\ca-certs copy ..\..\vxworks\21.07\os\container\manager\ca-certs\ca-certificates.crt romfs\vxc\ca-certs\
4.6 Update the VxWorks bootline in the DTS File
Open the DTS file rpi_4_0_1_2_0\rpi-4b.dts in an editor.
Locate the chosen node in the DTS file.
Select an IP address for the target and configure the IP addresses in the VxWorks bootline correctly. For example:
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";
4.7 Build the VIP
vxprj build
5 Create the Philosophers Example RTP Project
This example RTP project is provided by Wind River Workbench. It is an example VxWorks user-mode implementation of Edsger Dijkstra’s Dining Philosophers problem used to illustrate solutions to software synchronization issues.
1) Open Wind River Workbench.
2) Select File, New, Example.
3) Select the Philosophers Demonstration Program.
4) Select rpiVSB as the VxWorks source build for the RTP.
5) Build the RTP project.
6 Create a Container for Philosophers
6.1 Create a Directory for the Container
Return to your Windows command shell.
cd <YOUR_WORKSPACE> // your workspace
mkdir philContainer // a new directory for your new container
6.2 Copy the Philosophers RTP executable to the Container Directory
copy philosophers\rpiVSB_ARMARCH8Allvm_LP64_ld\philosophers\Debug\philosophers.vxe philContainer\.
6.3 Create the Container Dockerfile in an Editor
This file must be a text file and it must be named Dockerfile without a .txt extension to the directory name.
FROM scratch WORKDIR /vxbin COPY philosophers.vxe /vxbin ENTRYPOINT ["philosophers.vxe"] LABEL com.windriver.vxworks.rtp.rtpStackSize 0x400000 LABEL com.windriver.vxworks.rtp.rtpPriority 50 LABEL com.windriver.vxworks.rtp.rtpOptions 0x80 LABEL com.windriver.vxworks.rtp.rtpTaskOptions 0x00
Save the file in the philContainer directory.
Note:
If the editor appends .txt to the directory name on save, you must remove it. For example:
rename Dockerfile.txt Dockerfile
7 Build the philContainer OCI Image File
In the philContainer directory:
wsl buildah bud --arch arm64 --os vxworks -f Dockerfile -t philosophers
cd ..
8 Push the philContainer OCI Image File to DockerHub
wsl buildah push philosophers oci:philosophers.oci wsl buildah push --creds dockerAccountName:dockerAccountPassword philosophers docker://dockerAccountName/philosophers.oci
Note:
dockerAccountName = the docker ID for your Docker Hub account
dockerAccountPassword = your Docker Hub account password
9 Pull philContainer to the VxWorks Target Board
9.1 Set the VxWorks date correctly
-> cmd [vxWorks *]# date 2021-09-27 ok [vxWorks *]#
Note:
This instruction assumes the date of 27th September 2021. Set the date to the current date at time of using this blog.
9.2 Check your Internet connectivity
[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 *]#
Note:
You may need to wait a while until the END driver finishes configuring the ethernet PHY. Once the RJ45 connector LEDs have stopped flashing, configuration is done.
9.3 Pull philContainer to the Target and Unpack the Bundle
[vxWorks *]# vxc pull dockerAccountName/philosophers.oci -k [vxWorks *]# vxc unpack --image web_server.oci --rootfs layered /ram0/bundle
Note:
dockerAccountName = the docker ID for your Docker Hub account
9.4 Create the Container from the Bundle
[vxWorks *]# vxc create --bundle /ram0/philosophers phil [vxWorks *]# cd /overlay/phil [vxWorks *]# ls . .. philosophers.vxe [vxWorks *]# ls
9.5 Start the Container Running
[vxWorks *]# vxc start phil Resume the RTP's initial task to end the demo. Running claim-based solution. Philosopher 1 is thinking... Philosopher 3 is thinking... Philosopher 4 is thinking... Philosopher 2 is thinking... Philosopher 5 is thinking...
9.6 Stop the Container Running
[vxWorks *]# vxc kill phil