[Из песочницы] Редактирование образа Raspberry Pi с помощью qemu-user-static (Ubuntu 14.04)

image

Иногда необходимо редактирование стандартных загрузочных образов, а также конфигурирование систем с последующим тиражированием на большое количество плат Raspberry Pi. Для решения подобных задач удобно использовать пакеты qemu-user-static и binfmt-support.
Запускаем терминал и устанавливаем пакеты qemu-user-static и binfmt-support:

sudo apt-get install qemu qemu-user-static binfmt-support 


QEMU в режиме qemu-user-static позволяет запускать бинарные файлы, скомпилированные для одного процессора, используя процессор другой архитектуры. Пакет binfmt-support позволяет запускать бинарные файлы напрямую.

После установки смотрим список поддерживаемых бинарных файлов:

update-binfmts --display 

qemu-aarch64 (enabled):
......
qemu-microblaze (enabled):
......
qemu-arm (enabled):
......
qemu-m68k (enabled):
......
qemu-ppc64abi32 (enabled):
......
qemu-sparc64 (enabled):
......
qemu-sparc (enabled):
......
qemu-sh4 (enabled):
......
qemu-sh4eb (enabled):
......
qemu-sparc32plus (enabled):
......
qemu-ppc64 (enabled):
......
qemu-ppc (enabled):
......
qemu-mipsel (enabled):
......
qemu-alpha (enabled):
......
qemu-mips (enabled):
......
qemu-cris (enabled):
......
qemu-s390x (enabled):
......
qemu-armeb (enabled):
...... 

Как видим, поддержка ARM файлов включена — qemu-arm (enabled).

Переходим на страницу www.raspberrypi.org/downloads и выбираем нужную систему. В качестве примера возьмем Raspbian Wheezy, на данный момент актуальная версия 2015–05–05-raspbian-wheezy.img.

Скачиваем и распаковываем архив:

sudo mkdir ~/rpi_image
cd ~/rpi_image
sudo wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2015-05-07/2015-05-05-raspbian-wheezy.zip
sudo unzip 2015-05-05-raspbian-wheezy.zip
sudo rm 2015-05-05-raspbian-wheezy.zip 


Сначала получим информацию об образе:

sudo fdisk -lu 2015-05-05-raspbian-wheezy.img

Диск 2015-05-05-raspbian-wheezy.img: 3276 МБ, 3276800000 байт
255 головок, 63 секторов/треков, 398 цилиндров, всего 6400000 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0xa6202af7
 
                    Устр-во Загр        Начало      Конец       Блоки     Id    Система
2015-05-05-raspbian-wheezy.img1          8192       122879      57344     c     W95 FAT32 (LBA)
2015-05-05-raspbian-wheezy.img2          122880     6399999     3138560   83    Linux

Добавляем 1Gb к образу:

sudo chmod 775 2015-05-05-raspbian-wheezy.img
sudo dd if=/dev/zero bs=1M count=1024 >> 2015-05-05-raspbian-wheezy.img


Подцепляем весь образ к устройству loop0, а второй раздел (начинается с сектора 122880, каждый сектор по 512 байт) к loop1.

sudo losetup -f --show 2015-05-05-raspbian-wheezy.img
sudo losetup -f --show -o $((122880*512)) 2015-05-05-raspbian-wheezy.img


Это привяжет устройство /dev/loop0 ко всему образу и /dev/loop1 к разделу, который мы хотим расширить.

Запускаем parted, удаляем второй раздел в устройстве /dev/loop0 и создаем его с новым размером.

sudo parted /dev/loop0 

GNU Parted 2.3
Используется /dev/loop0
Добро пожаловать в GNU Parted! Наберите 'help' для просмотра списка команд
(parted) print 

Модель: Loopback device (loop)
Диск /dev/loop0: 4351MB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: msdos
 
Номер  Начало  Конец   Размер  Тип      Файловая система  Флаги
 1     4194kB  62,9MB  58,7MB  primary  fat16             lba
 2     62,9MB  3277MB  3214MB  primary  ext4 
(parted) rm 2                                                              
(parted) mkpart primary 62.9 4351                                          
(parted) print      

Модель: Loopback device (loop)
Диск /dev/loop0: 4351MB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: msdos
 
Номер  Начало  Конец   Размер  Тип      Файловая система  Флаги
 1     4194kB  62,9MB  58,7MB  primary  fat16             lba
 2     62,9MB  4351MB  4288MB  primary  ext4
(parted) quit


Затем проверяем и изменяем размер нового раздела:

sudo e2fsck -f /dev/loop1 

e2fsck 1.42.9 (4-Feb-2014)
Проход 1: Проверка inodes, блокs, а также размеров
Pass 2: Checking каталог structure
Pass 3: Checking каталог connectivity
Pass 4: Checking reference counts
Pass 5: Checking группа summary information
/dev/loop1: 86233/196224 files (0.1% non-contiguous), 630146/784640 blocks 
sudo resize2fs /dev/loop1 

resize2fs 1.42.9 (4-Feb-2014)
Resizing the filesystem on /dev/loop1 to 1046784 (4k) blocks.
The filesystem on /dev/loop1 is now 1046784 blocks long.

Теперь убедимся, что размер нового раздела увеличился на 1 Gb:

sudo parted /dev/loop0 

GNU Parted 2.3
Используется /dev/loop0
Добро пожаловать в GNU Parted! Наберите 'help' для просмотра списка команд. 
(parted) print

Модель: Loopback device (loop)
Диск /dev/loop0: 4351MB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: msdos
 
Номер  Начало  Конец   Размер  Тип      Файловая система  Флаги
 1     4194kB  62,9MB  58,7MB  primary  fat16             lba
 2     62,9MB  4351MB  4288MB  primary  ext4 
(parted) quit 


Очистим loop-устройства:

losetup -d /dev/loop0 /dev/loop1 


Монтируем образ:

sudo mkdir ~/rpi_mnt
sudo mount ~/rpi_image/2015-05-05-raspbian-wheezy.img -o loop,offset=$((122880*512)),rw ~/rpi_mnt


(необязательно) Монтируем /boot:

sudo mount ~/rpi_image/2015-05-05-raspbian-wheezy.img -o loop,offset=$((8192*512)),rw ~/rpi_mnt/boot


(необязательно):

cd ~/rpi_mnt
sudo mount --bind /dev dev/
sudo mount --bind /sys sys/
sudo mount --bind /proc proc/
sudo mount --bind /dev/pts dev/pts


Чтобы все работало правильно (например, сеть) перед изменением корневого каталога нужно закомментировать все строки в файле ~/rpi_mnt/etc/ld.so.preload:

sudo vi ~/rpi_mnt/etc/ld.so.preload


для редактирования нажмите клавишу i, впишите # перед каждой строкой, затем нажмите: wq Изменение корневого каталога (CHROOT).

Прежде всего, нужно убедиться что binfmt-support запустит наш код, как только мы изменим корневую файловую систему. Для этого скопируем файл в корневой каталог образа:

sudo cp /usr/bin/qemu-arm-static ~/rpi_mnt/usr/bin 


Меняем корень:

cd ~/rpi_mnt
sudo chroot . bin/bash 


Проверим изменение корневого каталога:

uname -a

Linux simm-UX32VD 3.19.0-33-generic #38~14.04.1-Ubuntu SMP Fri Nov 6 18:17:28 UTC 2015 armv7l GNU/Linux

Теперь можно добавлять и удалять программы, конфигурировать систему, после чего скопировать полученный образ на множество устройств Raspberry Pi, без необходимости подключения монитора и клавиатуры к каждой отдельной плате.

Вход в меню конфигурации Raspberry Pi:

sudo raspi-config


Удаление окружения рабочего стола:

apt-get remove --dry-run --auto-remove --purge libx11-.*


Убедитесь, что в списке нет лишних пакетов и запустите еще раз без »--dry-run».

Обновление системы. Для обновления до новой версии (например, jessie, stretch и др.), должен быть смонтирован /boot (также проверьте все файлы в /etc/apt/sources.list.d для обновления). Перед обновлением сохраните нужные конфигурационные файлы.

sed -i 's/wheezy/jessie/g' /etc/apt/sources.list
apt-get update
apt-get dist-upgrade -o Dpkg::Options::="--force-confold"


Для записи образа на SD карту необходимо:

1. Выйти из CHROOT (наберите exit)
2. Раскомментировать строки в файле /etc/ld.so.preload:

sudo vi ~/rpi_mnt/etc/ld.so.preload 


удалите добавленные ранее символы # нажатием x, затем нажмите: wq 3. Размонтировать все разделы:

sudo umount ~/rpi_mnt/sys
sudo umount ~/rpi_mnt/proc
sudo umount ~/rpi_mnt/dev/pts
sudo umount ~/rpi_mnt/boot
sudo umount ~/rpi_mnt/dev
cd ..
sudo umount ~/rpi_mnt 


Вставляем SD карту, смотрим путь и записываем образ:

sudo fdisk -l
sudo dd if=~/rpi_image/2015-05-05-raspbian-wheezy.img of=/dev/mmcblk0

© Habrahabr.ru