Execute o JetPack TX2 Installer em um contêiner do Docker no X sobre o ssh

1

O instalador Nvidia JetPack para o TX2 precisa ser executado em uma máquina host Ubuntu com permissão sudo. Deixa resíduos no host. quando executar novamente um período de tempo depois, a versão do residual pode entrar em conflito com as versões atuais atualizadas de outros pacotes do repo.

Para resolver ou solucionar esse problema, pode ser desejável executar o instalador do JetPack em um contêiner do Docker criado rapidamente. Como você faria isso, passo a passo?

    
por minghua 16.05.2018 / 09:40

2 respostas

1

O Docker é voltado principalmente para aplicativos em execução. Mas o JetPack também modifica strongmente o sistema. Assim, depois de brincar com ele por um tempo, eu entendi que o docker não é um bom jogo. O LXD, um contêiner de ambiente linux completo, é muito mais adequado para a tarefa. Eu tenho a GUI trabalhando em lxd - basta seguir qualquer dos tutoriais para LXD ou LXC GUI e depois que funciona você também precisa instalar drivers nvidia para o JetPack GUI para trabalhar (pelo menos se você usar drivers Nvidia na máquina host):

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!

E você conseguirá que tudo corra rápido e sem problemas. Só que passei muito tempo tentando mapear a porta USB do Jetson para o LXD e finalmente não consegui descobrir. Mas eu acho que deveria ser possível se você souber como lidar bem com o kernel de baixo nível.

A solução

Enfim, finalmente entendi que estou usando ferramentas erradas para a tarefa. Eu não preciso de um contêiner. O host do Jetson não será algo que eu quero executar e destruir novamente (isto é bom para os contêineres). Tudo que eu quero é portabilidade - que eu não estaria preso ao envelhecimento do Ubuntu 16.04 no host físico, mas poderia usar um software mais novo. Uma boa e velha máquina virtual (VM) é muito mais fácil, economiza tempo e nervos - e é adequada para o propósito. Então (certifique-se de que o Jetson esteja conectado primeiro):

  1. Execute o comando lsusb no terminal do host (se o host for linux) para verificar se o Jetson aparece. Se não, algo está errado. Deve mostrar uma linha como esta: Bus 001 Device 003: ID 0955:xxxx NVidia Corp.

  2. Instale o VirtualBox, baixe o Ubuntu 16.04 .iso do ubuntu.com e instale-o em uma nova máquina VirtualBox.

  3. Instale o pacote de extensão VirtualBox do VirtualBox.org (necessário para conectar dispositivos USB). NB! Você precisa baixar a mesma versão que o seu VirtualBox é. Clique duas vezes no instalador e o VirtualBox irá instalá-lo
  4. Adicione seu usuário no grupo HOST (não VM) ao vboxusers (pelo menos no Linux):

    sudo usermod -aG vboxusers $USER

  5. Reinicie (ou possivelmente efetue logoff) para que o grupo adicione para entrar em vigor

  6. Ativar suporte a USB 2.0 a partir de Configurações- > USB (ou possivelmente suporte a USB 3.0 - Eu não tentei, o USB 2.0 funcionou para mim)
  7. Reinicie a VM
  8. Anexar o Jetson a partir de dispositivos - USB
  9. Execute o comando lsusb no terminal da VM para verificar se o dispositivo da NVidia (Jetson) aparece. Se não, algo está errado. Deve mostrar uma linha como esta: %código%
  10. Executar o JetPack a partir da VM

Pode não ser uma solução para todos, mas se o seu objetivo não estivesse ligado ao uso do Ubuntu 16.04 como seu principal sistema operacional, uma máquina virtual é um caminho a ser seguido. Muito mais fácil do que brincar com os contêineres.

    
por 25.05.2018 / 15:50
0

Aqui está apenas uma resposta parcial. A limitação é que ela não inclui a parte do flash do sistema operacional, drivers e sistema de arquivos.

Depois que o sistema operacional básico e o sistema de arquivos foram flasheados e instalados no módulo TX2 de destino, o TX2 pode ser acessado por meio de uma porta de rede sobre o ssh. Assim, o host do Ubuntu só precisa: Obter uma GUI com capacidade de sudo e acessar a rede. Por padrão, um contêiner docker tem a capacidade de se conectar à rede à qual o host pode se conectar. Para obter uma GUI, existem algumas abordagens. Abaixo está a abordagem X-over-ssh com ajuda de dois scripts. O script inclui operações para adicionar o usuário atual ao grupo sudo também.

Execute o primeiro script para criar uma imagem do docker do Ubuntu personalizada para executar o instalador do JetPack 3.1. Em seguida, execute o segundo script para criar um contêiner docker com nome de usuário e senha estáticos, e acesse a home page da conta do usuário do host para a home page do usuário guest do contêiner.

O primeiro script para criar uma imagem de encaixe:

# 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 .

O último CMD geralmente pode ser substituído por esses dois se não estiver executando um sshd service:

USER \$UNAME
CMD /bin/bash

O segundo script para criar o contêiner:

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

Para acessar o guest do container Ubuntu, rode no host usando a senha screencast :

ssh -l testuser -p 2022 -X localhost
    
por 16.05.2018 / 09:54

Tags