通过 ssh 在 X 上的 Docker 容器中运行 JetPack TX2 安装程序

通过 ssh 在 X 上的 Docker 容器中运行 JetPack TX2 安装程序

TX2 的 Nvidia JetPack 安装程序需要在具有 sudo 权限的 Ubuntu 主机上运行。它会在主机上留下残留。一段时间后再次运行时,残留中的版本可能会与存储库中其他软件包的当前更新版本发生冲突。

为了解决或解决这个问题,可能需要在快速创建的 Docker 容器中运行 JetPack 安装程序。您将如何一步一步地做到这一点?

答案1

Docker 主要用于运行应用程序。但 JetPack 也对系统进行了重大修改。因此,在试用了一段时间后,我明白 docker 并不是一个好的选择。LXD 是一个完整的 Linux 环境容器,更适合这项任务。我让 LXD 中的 GUI 运行起来 - 只需按照任何LXD 或 LXC GUI 的教程,在其运行之后,您还需要安装 nvidia 驱动程序以使 JetPack GUI 运行(至少如果您在主机上使用 Nvidia 驱动程序):

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-XXX # replace XXX with the same version your computer is running!

一切都将快速流畅地运行。只是我花了太多时间弄清楚如何将 Jetson USB 端口映射到 LXD,最后还是没弄明白。但我想如果你知道如何很好地处理低级内核的东西,这应该是可能的。

解决方案

无论如何,我终于明白了,我使用的工具不对。我不需要容器。Jetson 主机不是我想要再次运行和销毁的东西(这正是容器的优点)。我想要的只是可移植性 - 我不会被物理主机上老旧的 Ubuntu 16.04 所束缚,而是可以使用较新的软件。一个好的旧虚拟机 (VM) 要容易得多,节省了我的时间和精力 - 并且适合这个目的。所以(首先确保 Jetson 已连接):

  1. 在主机终端(如果主机是 Linux)中运行lsusb命令以检查 Jetson 是否出现。如果没有,则说明有问题。它应该显示如下一行:Bus 001 Device 003: ID 0955:xxxx NVidia Corp.

  2. 安装 VirtualBox,从 ubuntu.com 下载 Ubuntu 16.04 .iso 并将其安装在新的 VirtualBox 机器上。

  3. 从 VirtualBox.org 安装 VirtualBox 扩展包(连接 USB 设备所需)。注意!您需要下载与您的 VirtualBox 相同的版本。双击安装程序,VirtualBox 将安装它
  4. 将 HOST(不是 VM)上的用户添加到 vboxusers 组(至少在 Linux 上):

    sudo usermod -aG vboxusers $USER

  5. 重新启动(或者注销)以使组添加生效

  6. 从“设置”->“USB”启用 USB 2.0 支持(或者可能是 USB 3.0 支持 - 我没有尝试,USB 2.0 对我来说可用)
  7. 重启虚拟机
  8. 从设备连接 Jetson - USB
  9. 在 VM 终端中运行lsusb命令以检查 NVidia 设备 (Jetson) 是否出现。如果没有,则表示有问题。它应该显示如下一行: Bus 001 Device 003: ID 0955:xxxx NVidia Corp.
  10. 从虚拟机运行 JetPack

这可能不是适合所有人的解决方案,但如果你的目标只是不局限于使用 Ubuntu 16.04 作为主操作系统,那么虚拟机是一种可行的方法。这比摆弄容器要容易得多。

答案2

这只是部分答案。限制在于它不包括刷新操作系统、驱动程序和文件系统的部分。

在将基本操作系统和文件系统刷入目标 TX2 模块并安装后,就可以通过 ssh 通过网络端口访问 TX2。因此,Ubuntu 主机只需要:获取具有 sudo 功能的 GUI,并访问网络。默认情况下,docker 容器能够连接到主机可以连接的网络。要获取 GUI,有几种方法。以下是借助两个脚本的 X-over-ssh 方法。该脚本还包括将当前用户添加到 sudo 组的操作。

运行第一个脚本创建一个为运行 JetPack 3.1 安装程序而定制的 Ubuntu docker 镜像。然后运行第二个脚本创建一个具有静态用户名和密码的 docker 容器,并将主机用户帐户 home 挂载到容器 guest 用户 home。

创建docker镜像的第一个脚本:

# current uid and gid
curr_uid=`id -u`
curr_gid=`id -g`

# create bb.dockerfile:
cat << EOF2 > bb.dockerfile
 FROM ubuntu:xenial-20180417
 ARG UNAME=testuser
 ARG UID=1000
 ARG GID=1000
 RUN groupadd -g \$GID \$UNAME
 RUN useradd -m -u \$UID -g \$GID -s /bin/bash \$UNAME

 RUN apt-get update
 RUN apt-get install -y openssh-server openssh-client iputils-ping sudo
 RUN apt-get install -y lsb-release libgtk2.0 xterm vim rsync sshpass
 RUN mkdir /var/run/sshd
 RUN echo 'testuser:screencast' | chpasswd
 RUN sed -i -e '/sudo/ s/$/testuser/' /etc/group

 ENV NOTVISIBLE "in users profile"
 RUN echo "export VISIBLE=now" >> /etc/profile

 EXPOSE 22
 CMD ["/usr/sbin/sshd", "-D"]
EOF2

docker build --build-arg UID=${curr_uid} --build-arg GID=${curr_gid} \
    -f bb.dockerfile -t testimg .

CMD如果没有运行服务,通常可以用这两个替换最后一个sshd

USER \$UNAME
CMD /bin/bash

创建容器的第二个脚本:

docker run -it -d \
    -v /tmp/.X11-unix:/tmp/.X11-unix  \
    -v $HOME:/home/testuser \
    -p 2022:22 \
    --name testcontainer -P testimg

要访问容器客户机 Ubuntu,请在主机上使用密码运行screencast

ssh -l testuser -p 2022 -X localhost

相关内容