前言

在我們上一篇文章中,我們提到了怎麼安裝LIMO的ROS2容器。其中有一些命令,我們照著打安裝過去,但卻不知道代表什麼意思。本篇我們將針對這些小部分進行補充,並介紹"為什麼"與"之後可以怎麼使用"。

 

本篇內容如不閱讀並不影響後續課程進行,有興趣者再配飯觀賞即可!

 

建立容器時的指令

docker run --network=host  --cap-add=SYS_PTRACE --cap-add=SYS_RAWIO --security-opt=seccomp:unconfined --security-opt=apparmor:unconfined --volume=/tmp/.X11-unix:/tmp/.X11-unix --runtime=nvidia --device /dev/ttyTHS1:/dev/ttyTHS1 --device /dev/ttyUSB0:/dev/ydlidar --device /dev/bus/usb/:/dev/bus/usb -v $(pwd)/:workspace --env="DISPLAY=$DISPLAY" --name limo-foxy-dev  -w /workspace -id ros:foxy

我們仍未知道這行命令在說什麼。

……所以今天我們就來一步一步來拆解,說明其中這些參數的意義。

 

--network=host

這行指出容器的網路使用host(也就是母體系統)的網路。通過加上這行,容器才有上網能力,也才能做到我們前面在容器內使用apt等方式安裝軟體包的行為--同時也保證了ROS2可以對區網通訊。

 

--cap-add=SYS_PTRACE --cap-add=SYS_RAWIO

增加容器可以存取的權限,我們知道sudo有非常大的權力可以控制各種命令和存取。capadd則是將這些權力拆散,讓容器碰到指定的某些部份時可以不用sudo操作。

其中SYS_PTRACE讓容器可以追蹤進程,RAWIO則使容器可以存取諸如/devport、/dev/mem、/dev/kmem等等裝置。

順帶一提,sudo(正確來說應該是root)的權利在這定義下被拆分為29項,這裡使用的只是冰山一角而已。

 

--security-opt=seccomp:unconfined --security-opt=apparmor:unconfined

對容器做安全性的設置,常看見的就是AppArmor(Application Armor)和seccomp(Secure computing mode),這兩者在此處都預設不設限制。

 

--volume=/tmp/.X11-unix:/tmp/.X11-unix

可以簡單的想像成和原生系統共用資料夾,可以重新指定在容器中對應的路徑。

 

--runtime=nvidia

由於我們是在NV上進行,並且「有可能」使用到NV的GPU,因此需要加上這個參數讓容器載入NV的設置。

 

--device /dev/ttyTHS1:/dev/ttyTHS1 --device /dev/ttyUSB0:/dev/ydlidar --device /dev/bus/usb/:/dev/bus/usb

將原生系統的硬體橋接到容器中,同樣可以在容器內為他改名。

 

--env="DISPLAY=$DISPLAY"

這很關鍵(同時也是松靈原廠沒加的參數),他讓容器可以直接使用原生系統的螢幕輸出,這樣後續我們才能利用這個容器執行rviz……

執行時,原生系統也要打上相關的指令開啟權限給Docker:

xhost +local:docker 

我們也可以將這行新增到bashrc裡面自動開啟權限。

 

--name limo-foxy-dev  -w /workspace

為容器命名,以及指定進入容器時的工作目錄