Введение
На днях, работая над дипломом, столкнулся с необходимостью создания образа Ubuntu для одноплатника с уже установленным ROS (Robot Operating System – операционная система роботов). Если кратко, то диплом посвящен управлению группой роботов. Роботы оснащены двумя колесами и тремя дальномерами. Управляется все это дело из ROS, который крутится на плате ODROID-C2.
Робот Ladybug. Сорри, за плохое качество фото
Устанавливать ROS на каждого робота в отдельности не было ни времени, ни желания, в связи с чем возникла потребность в образе системы с уже установленным ROS. Прогулявшись по просторам интернета, нашел несколько подходов к тому, как это можно было бы сделать.
В целом все найденные решения можно разбить на следующие группы.
- Программы, создающие образ с готовой и настроенной системы (Distroshare Ubuntu Imager, linux live kit, linux respin, systemback и др.)
- Проекты, позволяющие собрать свой образ (yocto, linux from scratch)
- Сборка образа ручками самому (liveCD customization и русский аналог, плюс статья на хабре)
Использование решений из первой группы казалось самым простым и привлекательным вариантом, однако создать образ live-системы для ODROID у меня так и не получилось. Решения второй группы также мне не подошли из-за достаточного высокого порога вхождения. Сборка ручками по имевшимся туториалам также не подходила, т.к. в моем образе не было сжатой файловой системы.
В итоге наткнувшись на видео про chroot (chroot — change root, ссылка на видео в конце поста) и его возможности, решено было использовать его. Далее опишу свой частный случай кастомизации Ubuntu для разработчиков робототехники.
Исходные данные:
- Весь процесс модификации образа (за исключением записи на SD-карту с использованием balenaEtcher) выполнялся в операционной системе Ubuntu 18.04.
- Операционная система, сборку которой модифицировал – Ubuntu 18.04.3 mate desktop версия.
- Машина, на которой должна работать собранная система – ODROID-C2.
Подготовка образа
-
Скачиваем образ Ubuntu для ODROID с официального сайта
-
Распаковываем архив
unxz –kv <файл архива с образом>
-
Создаем директорию, в которую будем монтировать образ
mkdir mnt
-
Определяем раздел, на котором располагается файловая система
file <файл образа>
Ищем раздел с файловой системой в формате ext2, ext3 или ext4. Нам нужен адрес начала раздела (выделен красным на скрине):
Примечание. Расположение файловой системы можно также посмотреть с помощью утилиты parted.
-
Монтируем образ
sudo mount -o loop,offset=$((264192*512)) <файл с образом> mnt/
Нужный нам раздел начинается с блока 264192 (у вас цифры могут отличаться), размер одного блока — 512 байт, перемножаем их, чтобы получить отступ в байтах.
-
Переходим в папку со смонтированной системой и чрутимся в ней
cd mnt/ sudo chroot ~/livecd/mnt/ bin/sh
~/livecd/mnt — полный путь до директории со смонтированной системой
bin/sh — оболочка (можно также заменить на bin/bash)
Теперь можно уже заниматься установкой необходимых пакетов и приложений.
Установка ROS
Я ставил ROS последней версии (ROS Melodic) по официальному туториалу.
-
Обновляем список пакетов
sudo apt-get update
Здесь у меня возникала ошибка:
Err:6 http://deb.odroid.in/c2 bionic InRelease The following signatures were invalid: EXPKEYSIG 5360FB9DAB19BAC9 Mauro Ribeiro (mdrjr) <mauro.ribeiro@hardkernel.com>
Она связана с тем, что срок действия ключа для подписи пакетов истек. Для обновления ключей набираем:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys AB19BAC9
-
Готовим систему для установки ROS
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update
-
Устанавливаем ROS
К сожалению, мне не удалось поставить desktop версию ROS, поэтому устанавливал только базовые пакеты:sudo apt install ros-melodic-ros-base apt search ros-melodic
Примечание 1. В процессе установки иногда возникала ошибка:
dpkg: error: failed to write status database record about 'iputils-ping' to '/var/lib/dpkg/status': No space left on device
Исправлялась с помощью очистки кэша утилиты apt:
sudo apt-get clean; sudo apt-get autoclean
Примечание 2. После установки просорситься (source) командой:
source /opt/ros/melodic/setup.bash
не получится, т.к. мы не запускали bash, поэтому ее НЕ надо набирать в терминале.
-
Устанавливаем необходимые зависимости
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
sudo apt install python-rosdep
sudo rosdep init rosdep update
-
Настраиваем права доступа
Поскольку мы зачрутились и, фактически, выполняем все действия от имени root собираемой системы, то и ROS будет запускаться только с правами суперпользователя.
При попытке запустить roscore без sudo возникает ошибка:Traceback (most recent call last): File "/opt/ros/melodic/lib/python2.7/dist-packages/roslaunch/__init__.py", line 230, in main write_pid_file(options.pid_fn, options.core, options.port) File "/opt/ros/melodic/lib/python2.7/dist-packages/roslaunch/__init__.py", line 106, in write_pid_file with open(pid_fn, "w") as f: IOError: [Errno 13] Permission denied: '/home/user/.ros/roscore-11311.pid'
Чтобы ошибка не возникала, рекурсивно изменим права доступа к домашнему каталогу пользователя ROS. Для этого набираем:
sudo rosdep fix-permissions
-
Доустанавливаем пакеты rviz и rqt
sudo apt-get install ros-melodic-rqt ros-melodic-rviz
Финальные штрихи
- Выходим из chroot:
exit
- Размонтируем образ
cd .. sudo umount mnt/
- Запакуем образ системы в архив
xz –ckv1 <файл образа>
Все! Теперь с помощью balenaEtcher можно записать образ системы на SD-карту, вставить в ODROID-C2, и у вас будет Ubuntu с установленным ROS!
Ссылки:
- С тем как чрутиться в linux и для чего это надо очень помогло это видео:
Специально для сайта ITWORLD.UZ. Новость взята с сайта Хабр