среда, 31 декабря 2025 г.

Эксперимент с обновлением Raspbian через QEMU

Прошлое обновление сервера печати, который построен на базе 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/s
QEMU
$ 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.063s
QEMU
$ 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.

Полезные ссылки:

Комментариев нет:

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