Прошлое обновление сервера печати, который построен на базе Raspberry Pi 1B и Raspbian, с Bullseye на Bookworm заняло несколько часов. В нём установлена micro SD карта на 4 гигабайта, которая работает довольно медленно, но для печати быстрее и не нужно. Debian Trixie вышел в начале августа, но обновить эту систему руки дошли только сейчас.
Тогда обновление системы напомнило былые времена с Gentoo. Тогда и появилась идея попробовать запустить образ SD карты в QEMU, обновить систему и записать его обратно на карту.
Поставил SD карту из сервера печати в ноутбук и сделал её образ в двух экземплярах - один будет использоваться для обновления, а второй будет в качестве резервной копии если после обновления он не начнёт работать.
$ sudo dd if=/dev/mmcblk0 of=sdcard-20251230.orig.bin bs=1M iflag=direct 3849+0 records in 3849+0 records out 4035969024 bytes (4,0 GB, 3,8 GiB) copied, 300,146 s, 13,4 MB/s $ cp sdcard-20251230.orig.bin sdcard.img
Теперь нужно выровнять размер образа для эмуляции иначе QEMU будет ругаться "qemu-system-arm: Invalid SD card size: 3.76 GiB SD card size has to be a power of 2, e.g. 4 GiB."
$ qemu-img resize -f raw sdcard.img 4096M Image resized.
Не вынимая SD карту из ноутбука копирую ядро (kernel7.img) и device tree (bcm2709-rpi-2-b.dtb) в директорию с образом накопителя.
Чтобы обновление прошло быстрее я использовал эмуляцию Raspberry PI 2B в QEMU. С подбором опций пришлось повозиться, т.к. загрузка висла когда включалась сетевая карта. В итоге нашёл что для эмуляции Raspberry PI 2B рекомендуют передать ядру параметр dwc_otg.fiq_fsm_enable=0 и после этого система загрузилась.
qemu-system-arm \ -M raspi2b \ -cpu cortex-a7 \ -m 1G \ -drive file=sdcard.img,if=sd,format=raw \ -device usb-net,netdev=net0 \ -netdev user,id=net0 \ -kernel kernel7.img -dtb bcm2709-rpi-2-b.dtb \ -append "root=/dev/mmcblk0p2 rw console=tty1 console=ttyAMA0 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait dwc_otg.fiq_fsm_enable=0" \ -display gtk
После запуска QEMU я переключался в его последовательный порт (Ctrl+Alt+3) и продолжил работу через него. В виде альтернативы можно пробросить порт для подключения через SSH.
Далее примитивный тест скорости линейного чтения с SD карты.
Raspberry PI 1B$ sudo dd if=/dev/mmcblk0p1 of=/dev/null bs=1M iflag=direct 161+1 records in 161+1 records out 169805824 bytes (170 MB, 162 MiB) copied, 11.7312 s, 14.5 MB/sQEMU
$ sudo dd if=/dev/mmcblk0p1 of=/dev/null bs=1M iflag=direct 161+1 records in 161+1 records out 169805824 bytes (170 MB, 162 MiB) copied, 84.4691 s, 2.0 MB/s
Чтение с SD карты в QEMU заметно медленнее реальной платы (разница около 7 раз). Уже этот факт ставит под сомнение идею обновления системы в эмуляторе, но на всякий случай сделал тест скорости скачивания пакетов перед обновлением (в APT это режим download only).
Raspberry PI 1B$ time sudo apt full-upgrade -yd Fetched 316 MB in 6min 1s (876 kB/s) Download complete and in download only mode real 6m26.506s user 0m0.550s sys 0m2.063sQEMU
$ time sudo apt full-upgrade -yd Fetched 316 MB in 27min 21s (193 kB/s) Download complete and in download only mode real 29m4.216s user 0m3.993s sys 0m20.757s
Собственно на этом эксперимент можно и закончить, т.к. разница составила около 5 раз в пользу Raspberry PI 1B и нет причин продолжать обновление в QEMU.
Полезные ссылки:
- https://www.qemu.org/docs/master/system/arm/raspi.html
- https://github.com/raspberrypi/documentation/blob/master/documentation/asciidoc/computers/configuration/boot_folder.adoc
- https://github.com/quickemu-project/quickemu/issues/230
- https://www.cl.cam.ac.uk/~atm26/ephemeral/rpi/dwc_otg/doc/html/module%20parameters.html

Комментариев нет:
Отправить комментарий