Въведение
Наскоро, работейки над диплома, се сблъсках с необходимостта да създам образ на Ubuntu за едноплатното устройство с вече инсталиран ROS (Robot Operating System – операционна система за роботи). В кратце, дипломът е посветен на управлението на група роботи. Роботите са оборудвани с два колела и три далекомера. Всичко това се управлява от ROS, който работи на платката ODROID-C2.

Робот Ladybug. Извинявайте за лошото качество на снимката
Нямаше ни време, ни желание да инсталирам ROS на всеки робот поотделно, поради което възникна необходимостта от образ на система с вече инсталиран ROS. Разглеждайки интернет, намерих няколко подхода за това как това може да бъде направено.
Общо взето, всички намерени решения могат да бъдат разделени на следните групи.
- Програми, които създават образ от готова и настроена система (, , , systemback и др.)
- Проекти, позволяващи събиране на собствен образ (, )
- Създаване на образ на ръка самостоятелно ( и , плюс )
Използването на решения от първата група изглеждаше като най-простия и привлекателен вариант, обаче не успях да създам образ на 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 Следните подписи бяха невалидни: EXPKEYSIG 5360FB9DAB19BAC9 Mauro Ribeiro (mdrjr)Тя е свързана с това, че срокът на валидност на ключа за подписване на пакетите е изтекъл. За актуализиране на ключовете въвеждаме:
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 C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654sudo apt updateИнсталираме ROS
За съжаление, не успях да инсталирам десктоп версията на ROS, затова инсталирах само основните пакети:sudo apt install ros-melodic-ros-base apt search ros-melodicЗабележка 1. По време на инсталацията понякога възникваше грешка:
dpkg: грешка: не успя да запише запис за статуса на 'iputils-ping' в '/var/lib/dpkg/status': Няма място на устройствотоТя се оправя с помощта на почистване на кеша на утилитата 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-essentialsudo apt install python-rosdepsudo 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
Всичко! Сега с помощта на можете да запишете образа на системата на SD-карта, да я поставите в ODROID-C2 и ще имате Ubuntu с инсталиран ROS!
Връзки:
- С темата за chroot в linux и защо е необходимо много ми помогна това видео:

Източник: habr.com

