Debian 11 в виртуальной машине Qemu на архитектуре ARM
Первый этап формирования корневой файловой системы
Установим утилиту для формирования образа корневой файловой системы Debian:
# apt-get install debootstrap
Запустим debootstrap для формирования заготовки будущей корневой файловой системы в каталоге debian-bullseye-armhf:
# debootstrap --foreign --arch=armhf bullseye debian-bullseye-armhf http://mirror.yandex.ru/debian/
Где:
--foreign
- выполнить только первый этап подготовки файловой системы,--arch=armhf
- требуемая архитектура,bullseye
- требуемый выпуск Debian,debian-bullseye-armhf
- каталог, в который будут скачаны и распакованы необходимые deb-пакеты,http://mirror.yandex.ru/debian/
- зеркало репозиториев с deb-пакетами.
debootstrap скачает из указанного репозитория deb-пакеты, составляющие основу операционной системы, указанной архитектуры и распакует их в каталог debian-bullseye-armhf.
Второй этап формирования корневой файловой системы
Установим эмулятор qemu и пакет поддержки интерпретаторов двоичных форматов:
# apt-get install qemu-user-static binfmt-support
qemu-user-static - эмулятор, позволяющий запускать Linux-программы, собранные для одной архитектуры процессора, на процессорах другой архитектуры.
binfmt-support - утилита, определяющая подходящий интерпретатор для запуска программы по сигнатуре файла, а также утилита для управления списком соответствий.
# chroot debian-bullseye-armhf
# debootstrap/debootstrap --second-stage
После этого можно выполнить дополнительные действия по настройке будущей системы: добавить пользователей, задать имя узла, прописать настройки сети и т.п. Я ограничусь лишь сменой пароля пользователя root, т.к. всё остальное можно будет поменять, войдя в систему под ним:
# passwd
Для уменьшения итогового образа файловой системы можно очистить каталог /var/cache/apt/archives от deb-пакетов, использованных для развёртывания системы и от списка пакетов, доступных из репозиториев:
# cd /var/cache/apt/archives
# rm *.deb
# cd /var/lib/apt/lists
# find . -type f -delete
Когда настройка будет завершена, можно покинуть среду chroot командой exit или нажатием Ctrl-D.
Формирование загрузочного образа
Оценим размер будущей файловой системы:
$ du -sh debian-bullseye-armhf
Делаем архив получившейся файловой системы и удаляем исходный каталог:
# tar cjvf debian-bullseye-armhf.tbz -C debian-bullseye-armhf .
# rm -R debian-bullseye-armhf
Сейчас нам пригодится оценка размера файловой системы. Нужно создать для образа будущей файловой системы пустой файл такого размера, чтобы в него уместились файлы. Например, для файлов объёмом 172 мегабайта я создаю пустой файл размером 256 мегабайт:
# dd if=/dev/zero bs=1M count=256 of=debian-bullseye-armhf.ext4
Отформатируем этот файл для размещения файловой системы в формте ext4:
# mkfs.ext4 -F debian-bullseye-armhf.ext4
Смонтируем пустую файловую систему, распакуем в неё файлы и размонтируем файловую систему:
# mount debian-bullseye-armhf.ext4 /mnt/
# tar xjvf debian-bullseye-armhf.tbz -C /mnt/
# umount /mnt/
Подготовка ядра Linux
Установим инструменты, необходимые для компиляции ядра:
# apt-get install bison flex bc libncurses-dev
Для кросс-компиляции понадобится также кросс-компилятор под соответствующую платформу:
# apt-get install crossbuild-essential-armhf
Скачаем архив с исходными текстами стабильной версии ядра Linux с официального сайта и распакуем их:
$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.14.15.tar.xz
$ tar xJvf linux-5.14.15.tar.xz
Перейдём в каталог с распакаованными исходными текстами
$ cd linux-5.14.15
В каталоге arch/arm/configs/ можно найти готовые конфигурации для различных устройств. Для запуска в qemu без проблем подошёл файл конфигруации vexpress_defconfig. Выберем его:
$ ARCH=arm make vexpress_defconfig
Этот файл конфигурации сохранится под именем .config. Поменять опции в файле конфигурации .config через удобный ncurses-интерфейс можно следующим образом:
$ ARCH=arm make menuconfig
Для сборки ядра нужной нам конфигурации воспользуемся кросс-компиляцией:
$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make
Тестирование ядра Linux
Проверим возможность запуска ядра Linux в виртуальной машине, для чего нам понадобятся файлы zImage с образом самого ядра и vexpress-v2p-ca9.dtb с информацией о системе для ядра:
$ qemu-system-arm -nodefaults -nographic -machine vexpress-a9 -m 256 -kernel linux-5.14.15/arch/arm/boot/zImage -dtb linux-5.14.15/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -append "console=ttyAMA0" -serial stdio
Т.к. ядру не была указана корневая файловая система для загрузки, то запуск должен завершиться ошибкой. В одной из последних строчек сообщений об ошибке можно будет найти сообщение такого вида:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
Загрузка системы
Теперь запустим ядро с указанием образа корневой файловой системы:
$ qemu-system-arm -nodefaults -nographic -machine vexpress-a9 -m 256 -kernel linux-5.14.15/arch/arm/boot/zImage -dtb linux-5.14.15/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -append "console=ttyAMA0 root=/dev/mmcblk0 rootfstype=ext4 ro" -serial stdio -drive if=sd,format=raw,file=debian-bullseye-armhf.ext4
Виртуальная машина через virt-manager
Для удобства можно настроить виртуальную машину через virt-manager, а образ SD-диска поместить на логический том LVM.
Общие настройки:
Настройки центрального процессора:
Настройки загрузки системы:
Настройки SD-карты:
Настройки сети:
Консоль загруженной системы: