Как прошить "ястреб" из контейнера докера?

Я делаю первый шаг в разработке на PX4 с использованием Docker.

Поэтому я расширяю px4io/px4-dev-nuttx изображение в px4dev с некоторыми дополнительными установками.

Dockerfile

FROM px4io/px4-dev-nuttx

RUN apt-get update && \
    apt-get install -y \
    python-serial \
    openocd \
    flex \
    bison \
    libncurses5-dev \
    autoconf \
    texinfo \
    libftdi-dev \
    libtool \
    zlib1g-dev

RUN useradd -ms /bin/bash user
ADD ./Firmware /src/firmware/
RUN chown -R user:user /src/firmware/

Чем я запускаю изображение / контейнер:

docker run -it --privileged \
    --env=LOCAL_USER_ID="$(id -u)" \
    -v /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00:/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00:rw \
    px4dev \
    bash

Я также попробовал:

--device=/dev/ttyACM0 \
--device=/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00 \

Чем я перешел на /src/firmware/Построй код. Но загрузка всегда приводит к этой ошибке:

make px4fmu-v2_default upload
ninja: Entering directory `/src/firmware/build/nuttx_px4fmu-v2_default'
[0/1] uploading px4
Loaded firmware for board id: 9,0 size: 1028997 bytes (99.69%), waiting for the bootloader...

Я использую Pixhawk 2.4.8, мой хост - Ubuntu 18.04 64bit. Делать то же самое на хосте будет работать.

  1. Что здесь не так? Может быть, перезагрузка PX4 во время перепрошивки вызывает проблему?

  2. Если это, как правило, невозможно, каков выходной файл сборки и возможно ли загрузить его с помощью QGroundControl?

С наилучшими пожеланиями, Алекс


запустить скрипт:

#!/bin/bash

docker run -it --rm --privileged \
    --env=LOCAL_USER_ID="$(id -u)" \
    --device=/dev/ttyACM0 \
    --device=/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00 \
    --name=dev01 \
    px4dev \
    bash

по любой причине иногда загрузка заканчивается по-другому:

user@7d6bd90821f9:/src/firmware$ make px4fmu-v2_default upload
...
[153/153] Linking CXX executable nuttx_px4io-v2_default.elf
[601/602] uploading /src/firmware/build/px4fmu-v2_default/px4fmu-v2_default.px4
Loaded firmware for 9,0, size: 1026517 bytes, waiting for the bootloader...
If the board does not respond within 1-2 seconds, unplug and re-plug the USB connector.

но даже если я так и сделаю. Это застряло здесь.


Что касается устройства по умолчанию, я grep через папку сборки:

user@7d6bd90821f9:/src/firmware$ grep -r "/dev/serial" ./build/
./build/px4fmu-v2_default/build.ninja:  COMMAND = cd /src/firmware/build/px4fmu-v2_default && /usr/bin/python /src/firmware/Tools/px_uploader.py --port "/dev/serial/by-id/*_PX4_*,/dev/serial/by-id/usb-3D_Robotics*,/dev/serial/by-id/usb-The_Autopilot*,/dev/serial/by-id/usb-Bitcraze*,/dev/serial/by-id/pci-3D_Robotics*,/dev/serial/by-id/pci-Bitcraze*,/dev/serial/by-id/usb-Gumstix*" /src/firmware/build/px4fmu-v2_default/px4fmu-v2_default.px4

есть px_uploader.py --port "...,/dev/serial/by-id/usb-3D_Robotics*,...", Так что я бы сказал, что это выглядит для /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00!

Смотря с ls /dev/ внутри контейнера для доступных устройств нет ни /dev/ttyACM0, ни /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00. Здесь может быть проблема. Что-то не так с --device=...

Но ls показывает, что / dev / usb / доступен. Поэтому я проверил это с lsusb и PX4 указан рядом с другими:

user@3077c8b483f8:/$ lsusb
Bus 003 Device 018: ID 26ac:0011 

Может быть, внутри контейнера нет подходящего драйвера для этого USB-устройства?

На моем хосте я получил майор: минор № 166:0:

user:~$ ll /dev/
crw-rw----  1 root dialout   166,     0 Jan  2 00:40 ttyACM0

Насколько я вижу, папка /sys/dev/char/166:0 идентична на хосте и в контейнере. А в контейнере, кажется, есть ссылка на что-то с */tty/ttyACM0, как на хосте:

user@3077c8b483f8:/$ ls -l /sys/dev/char/166\:0
lrwxrwxrwx 1 root root 0 Jan  1 23:44 /sys/dev/char/166:0 -> ../../devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.3/3-1.3.1/3-1.3.1.3/3-1.3.1.3:1.0/tty/ttyACM0

На хосте я получил эту информацию об устройствах - но этого не хватает внутри контейнера:

user:~$ ls -l /dev/ttyACM0 
crw-rw---- 1 root dialout 166, 0 Jan  2 00:40 ttyACM0
user:~$ ls -l /dev/serial/by-id/
total 0
lrwxrwxrwx 1 root root 13 Jan  2 00:40 usb-3D_Robotics_PX4_FMU_v2.x_0-if00 -> ../../ttyACM0

После этого поста я изменил свой скрипт запуска на (без privileged флаг)

#!/bin/bash
DEV1='/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00'
docker run \
    -it \
    --rm \
    --env=LOCAL_USER_ID=0 \
    --device=/dev/ttyACM0 \
    --device=$DEV1 \
    -v ${PWD}/Firmware:/opt/Firmware \
    px4dev_nuttx \
    bash

Чем я вижу устройства. Но они не доступны.

root@586fa4570d1c:/# setserial /dev/ttyACM0 
/dev/ttyACM0, UART: unknown, Port: 0x0000, IRQ: 0
root@586fa4570d1c:/# setserial /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00 
/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00, UART: unknown, Port: 0x0000, IRQ: 0

0 ответов

Другие вопросы по тегам