Эмуляция малины Pi Raspbian с Qemu
Я пытаюсь подражать малине Pi с помощью Raspian OS с помощью QEMU. Я пробовал несколько подходов, описанных в Интернете, но без каких-либо успехов.
Я понял, что мне нужно исправить ядро Linux, устанавливая нужную ОС. В моем случае я выбрал Rasbian Lite с ядром 4.4:
wget https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2016-05-31/2016-05-27-raspbian-jessie-lite.zip
unzip 2016-05-27-raspbian-jessie-lite.zip
rm 2016-05-27-raspbian-jessie-lite.zip
Затем я загружаю ядро из https://www.kernel.org/:
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.16.tar.gz
tar -xzf linux-4.4.16.tar.gz
rm linux-4.4.16.tar.gz
Теперь перекрестная компиляция ядра:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
cd linux-4.4.16
make vexpress_defconfig
make all
cd ..
Теперь я могу скопировать загрузочный образ, который представляет собой сжатое изображение ядра, которое автоматически извлекается в ОЗУ, в мое рабочее пространство:
cp linux-4.4.16/arch/arm/boot/zImage zImage
и запустите QEMU
qemu-system-arm -kernel zImage -M vexpress-a9 -m 1024 -cpu cortex-a9 -no-reboot -serial stdio -hda 016-05-27-raspbian-jessie-lite.img -append "root=/dev/sda2 rootfstype=ext4"
Но я вижу только черное заполненное окно QEMU.: (
Я думаю, что проблема заключается в том, чтобы получить правильное Ядро. Копирование некоторых ячеек из Интернета никогда не приводило к успеху, потому что они не подходят для ОС.
Как я могу построить/исправить ядро, устанавливающее ОС (без загрузки существующего) и как правильно запустить QEMU?
Спасибо заранее
Alex
Второй подход
Загружаю kernel-qemu
здесь https://www.dropbox.com/s/g8u93xblz1v1ly0/kernel-qemu?dl=0 и запускаем с ним QEMU:
qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2" -hda 2016-05-27-raspbian-jessie-lite.img
Это приносит мне следующий результат:
И это имеет смысл для меня, потому что ядро 3.10.25 и старше, чем Raspbian Jessie с ядром 4.4.16.
С qemu-ядром из https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/kernel-qemu-4.4.12-jessie
qemu-system-arm -kernel kernel-qemu-4.4.12-jessie -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2016-05-27-raspbian-jessie-lite.img
У меня получился такой же результат:
![введите описание изображения здесь]()
Новая попытка с новым ядром-qemu 4.4.16:
-
Скопируйте build-kernel-qemu из https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/master/tools и добавьте следующую строку для проверки версии для Kernel 4.4.16
git checkout b05965f284db3e086022f4e318e46cb5bffb1376
-
Запустите build-kernel-qemu
для сборки ядра
sh build-kernel-qemu
-
Запустите QEMU
qemu-system-arm -kernel kernel-qemu -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2016-05-27-raspbian-jessie-lite.img
Результат: ![введите описание изображения здесь]()
Ответы
Ответ 1
Перед запуском
вы должны развернуть файл изображения Raspbian.
Подключите файл изображения Raspbian с помощью kpartx (возможно, придется установить kpartx)
$ sudo kpartx -av your-image.img
add map loop0p1 (252:5): 0 117187 linear /dev/loop0 1
add map loop0p2 (252:6): 0 3493888 linear /dev/loop0 118784
$ sudo mount /dev/mapper/loop0p2 /mnt/img1
$ cd /mnt/img1
Измените /etc/fstab и закомментируйте монтировки MMCBLK
$ sudo nano etc/fstab
proc /proc proc defaults 0 0
#/dev/mmcblk0p1 /boot vfat defaults 0 2
#/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
Измените /etc/ld.so.preload и закомментируйте строки...
$ sudo nano etc/ld.so.preload
#/usr/lib/arm-linux-gnueabihf/libarmmem.so
Отключить и уничтожить циклы из kpartx
$ sudo umount /mnt/img1
$ sudo kpartx -d your-image.img
Получите ядро Qemu, соответствующее изображению Raspbian здесь...
https://github.com/dhruvvyas90/qemu-rpi-kernel
Я использовал эту команду для успешного эмуляции Raspbian Jessie
qemu-system-arm -kernel kernel-qemu-4.4.12-jessie -cpu arm1176 -m 256 -M versatilepb \
-no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
-redir tcp:5022::22 \
-hda 2016-05-27-raspbian-jessie-lite.img
Ответ 2
Для запуска в QEMU требуется модифицированное ядро, поскольку в QEMU не доступно оборудование платы PI для малины. Вот почему ваш первый подход не удался.
В вашем втором подходе используется ядро, правильно исправленное для запуска на универсальной плате (поддерживается QEMU), так что это хорошо, но ядро 3.x слишком устарело для современного Raspbian. В принципе, ваш последний подход должен сработать.
Я рекомендую это обновленное руководство (feb 2017), я проверил его с ядром 4.4, и он работает сразу.
qemu-system-arm -kernel $KERNEL -cpu arm1176 -m 256 -M versatilepb -net nic,macaddr=$MAC -net tap -no-reboot -append "root=/dev/sda2 panic=1" -drive format=raw,file=$IMG
Мне пришлось использовать опцию format=raw,file=$IMG
, чтобы избежать предупреждения QEMU.
Вам не нужно комментировать /etc/fstab
, вы можете добавить в /etc/udev/rules.d/90-qemu.rules
KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
KERNEL=="sda2", SYMLINK+="root"
Кроме того, объект ld.so.preload является старым и больше не применяется
script, приведенный в упомянутом руководстве, делает все это для вас, а также обеспечивает сетевой доступ к вашему raspbian путем совместного использования сетевого интерфейса с raspbian.
Ответ 3
Ubuntu 16.04 хост, QEMU 2.9.0 -M raspi2, Raspbian 2016-05-27, ядро ванили
![введите описание изображения здесь]()
Преимущества:
- с
-M raspi2
, мы можем использовать ядро ванили, поэтому система более представительна
Ограничения:
-
-M raspi2
был добавлен в QEMU 2.6.0, а Ubuntu 16.04 имеет только QEMU 2.5.0, поэтому нам нужно скомпилировать QEMU из исходного кода. Но это не сложно.
- GUI показывает, но не реагирует на мышь/клавиатуру, проверенную как на SDL, так и на VNC. Но CLI работает отлично. Таким образом, вы можете также использовать изображение Lite, которое теперь имеет графический интерфейс.
- нет сетей
Шаги:
-
Скомпилируйте QEMU 2.9.0 из источника:
sudo apt-get build-dep qemu-system-arm
git clone --recursive git://git.qemu-project.org/qemu.git
cd qemu
git checkout v2.9.0
./configure
make `nproc`
-
Загрузите изображение и извлеките из него ядро и dts:
-
Загрузите изображение и разархивируйте его:
wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2016-05-31/2016-05-27-raspbian-jessie.zip
unzip 2016-05-27-raspbian-jessie.zip
-
Установите второе изображение раздела. Самый простой способ:
sudo losetup -f --show -P 2016-05-27-raspbian-jessie.img
Это работает только с последним losetup
на Ubuntu 16.04, другие методы: https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576
Это печатает устройство цикла, например:
/dev/loop0
так что:
sudo mkdir /mnt/rpi
sudo mount /dev/loop0p1 /mnt/rpi
cp /mnt/rpi/kernel7.img bcm2709-rpi-2-b.dtb .
sudo umount /mnt/rpi
sudo losetup -d /dev/loop0
-
Run:
./arm-softmmu/qemu-system-arm \
-M raspi2 \
-append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2" \
-cpu arm1176 \
-dtb bcm2709-rpi-2-b.dtb \
-sd 2016-05-27-raspbian-jessie.img \
-kernel kernel7.img \
-m 1G \
-smp 4 \
-serial stdio \
;
Затем вы можете войти в систему на терминале, который отображается на вашем хост-терминале.
[не удалось] Ubuntu 17.04, QEMU 2.8.0 -M raspi2, Raspbian 2016-05-27, ядро ванили
В этом новом Ubuntu QEMU 2.8.0 по умолчанию, поэтому нам не нужно компилировать QEMU из источника для -M raspi2
. Тем не менее, 2.8.0 зависает при загрузке после сообщения:
Console: switching to colour frame buffer device 100x30
Это покажет, насколько неустойчив -M raspi2
.
[не удалось] Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2017-08-16, ядро ванили
На этом более новом изображении, используя тот же метод для 2016-05-27, паника ядра при загрузке с помощью:
Please append a correct "root=" boot option; here are the available partitions:
...
[ 4.138114] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
Ответ 4
У меня была аналогичная проблема с пользовательским изображением ubuntu.
Я также применил модификации, как описано в ответе @Michael Connors, после чего я вижу загрузку системы.
Вы можете добавить следующее в -append=""
, чтобы узнать, что происходит в вашем случае:
qemu-system-arm ... -serial stdio -append="... console=ttyAMA0,115200 loglevel=8"