Встановлення ROS в IMG-образ Ubuntu для одноплатника
Запровадження
Днями, працюючи над дипломом, зіткнувся із необхідністю створення образу Ubuntu для одноплатника з уже встановленим ROS (Robot Operating System – операційна система роботів). Якщо коротко, то диплом присвячений управлінню групою роботів. Роботи оснащені двома колесами та трьома далекомірами. Управляється вся справа з ROS, який крутиться на платі ODROID-C2.
Робот Ladybug. Соррі за погану якість фото
Встановлювати ROS кожного робота окремо був ні часу, ні бажання, у зв'язку з чим виникла потреба у образі системи з уже встановленим ROS. Прогулявшись просторами інтернету, знайшов кілька підходів до того, як це можна було б зробити.
У цілому нині знайдені рішення можна розбити такі групи.
Використання рішень з першої групи здавалося найпростішим і найпривабливішим варіантом, проте створити образ live-системи для ODROID у мене так і не вийшло. Рішення другої групи також мені не підійшли через достатньо високий поріг входження. Складання ручками по туториалам також не підходила, т.к. у моєму образі не було стиснутої файлової системи.
У результаті наткнувшись на відео про chroot (chroot - change root, посилання на відео в кінці посту) та його можливості, вирішено було використати його. Далі опишу свій окремий випадок кастомізації Ubuntu для розробників робототехніки.
Вихідні дані:
Весь процес модифікації образу (за винятком запису на карту SD з використанням balenaEtcher) виконувався в операційній системі Ubuntu 18.04.
Визначаємо розділ, на якому розташовується файлова система
file <файл образа>
Шукаємо розділ із файловою системою у форматі ext2, ext3 або ext4. Нам потрібна адреса початку розділу (виділена червоною на скрині):
Примітка. Розташування файлової системи можна також переглянути за допомогою утиліти розлучився.
Монтуємо образ
sudo mount -o loop,offset=$((264192*512)) <файл с образом> mnt/
Потрібний розділ починається з блоку 264192 (у вас цифри можуть відрізнятися), розмір одного блоку - 512 байт, перемножуємо їх, щоб отримати відступ в байтах.
Переходимо в папку зі змонтованою системою і шануємося в ній
cd mnt/
sudo chroot ~/livecd/mnt/ bin/sh
~/livecd/mnt - Повний шлях до директорії зі змонтованою системою bin/sh - Оболонка (можна також замінити на bin/bash)
Тепер можна вже займатися встановленням необхідних пакетів та додатків.
Налаштовуємо права доступу
Оскільки ми зачарувалися і, фактично, виконуємо всі дії від імені 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. Для цього набираємо: