Установка и запуск Debian 8.0 (Jessie) ARM64 в QEMU

Уже сейчас можно купить(архив) сервер enterprise класса с ARM64(AArch64) CPU. Вероятно в будущем, arm64 составит реальную конкуренцию x86_64 в серверном сегменте, а пока далеко не у всех есть железо, на котором можно потестировать работоспособность приложений под arm64. В этой заметке будет представлена пошаговая инструкция как установить и запустить Debian 8.0 (Jessie) ARM64 в QEMU, при этом на хост-машине используется x86_64 Ubuntu 14.04.1.

Установка QEMU 2.2

Первым шагом будет установка QEMU из исходных кодов. Если в вашем дистрибутиве на хост машине имеется возможность установить qemu-system-aarch64 из репозитория, то этот шаг можно пропустить и вместо него установить qemu-system-aarch64 штатными средствами.

sudo apt-get install build-essential
sudo apt-get build-dep qemu
wget http://wiki.qemu-project.org/download/qemu-2.2.0.tar.bz2
tar -xf qemu-2.2.0.tar.bz2
./configure --prefix=/opt/qemu220 --target-list=aarch64-softmmu
make
sudo make install

Установка Debian 8.0 (Jessie) ARM64 на QEMU

Используется метод netinstall, предполагается, что на хост машине есть интернет. Процедура установки весьма длительная и не совсем тривиальная, поэтому этот шаг можно пропустить и сразу скачать готовый образ (для запуска нужны файлы vmlinuz-run, initrd-run.img и debian8-arm64.img)

Подготавливаем виртуальный HDD:

mkdir debian8
cd debian8/
/opt/qemu220/bin/qemu-img create -f qcow debian8-arm64.img 10G

Скачиваем ядро и initrd (в котором спрятан netinstall):

wget http://ftp.ru.debian.org/debian/dists/jessie/main/installer-arm64/20150107/images/netboot/debian-installer/arm64/linux
wget http://ftp.ru.debian.org/debian/dists/jessie/main/installer-arm64/20150107/images/netboot/debian-installer/arm64/initrd.gz

Альтернативный вариант:

wget http://ftp.ru.debian.org/debian/dists/jessie/main/installer-arm64/current/images/netboot/debian-installer/arm64/linux
wget http://ftp.ru.debian.org/debian/dists/jessie/main/installer-arm64/current/images/netboot/debian-installer/arm64/initrd.gz

(если по обоим вариантам файлы будут недоступны, то см. ссылку выше (эти файлы можно найти там же, где и готовый образ для запуска))
Начинаем установку:

/opt/qemu220/bin/qemu-system-aarch64 -machine virt -cpu cortex-a57 -nographic -smp 1 -m 512 -nographic \
 -kernel linux -initrd initrd.gz -append "root=/dev/ram console=ttyAMA0" \
 -global virtio-blk-device.scsi=off \
 -device virtio-scsi-device,id=scsi -drive file=debian8-arm64.img,id=rootimg,cache=unsafe,if=none -device scsi-hd,drive=rootimg \
 -netdev user,id=unet -device virtio-net-device,netdev=unet -net user

Через некоторое время начнётся процесс инсталляции:
debian8-arm64-install-start
Далее будут стандартные вопросы, на которые нужно ответить.

Пример разбивки диска (влияет на то как потом запускать эту виртуалку):
debian8-arm64-install-partitioning

Затем начнётся основная фаза инсталляции ОС. После её завершения должно появиться следующее предупреждение:
debian8-arm64-no-loader-warning
Нажимаем Continue, дожидаемся окончания инсталляции, в итоге соглашаемся на перезагрузку. После перезагрузки снова запустится инсталлятор, он уже не нужен, виртуальную машину нужно выключить комбинацией клавишей “ctrl+a x” или командой из другого терминала:

killall /opt/qemu220/bin/qemu-system-aarch64

Подготовка к запуску

Существует 2 способа запуска установленной ОС – с помощью QEMU UEFI + grub или же путём извлечения ядра и initrd из установленного образа и загрузки непосредственно с них (QEMU это умеет). По сложности они примерно одинаковые. Здесь будет описан второй вариант.

# Подключение образа HDD в качестве блочного устройства
sudo modprobe nbd max_part=16
sudo /opt/qemu220/bin/qemu-nbd -c /dev/nbd0 debian8-arm64.img
sudo partprobe /dev/nbd0

# Монтирование основного раздела, который содержит папку /boot
mkdir sda2
sudo mount /dev/nbd0p2 sda2

# Копирование нужных файлов
cp sda2/boot/vmlinuz vmlinuz-run
cp sda2/boot/initrd.img initrd-run.img

# Размонтирование раздела и прекращение использование файла образа HDD в качестве блочного устройства
sudo umount sda2
rmdir sda2
sudo /opt/qemu220/bin/qemu-nbd -d /dev/nbd0

В принципе, эту процедуру нужно проделывать каждый раз, когда обновляется ядро и initrd на гостевой машине (штатным средством типа “apt-get update && apt-get upgrade”).

Запуск установленного образа

/opt/qemu220/bin/qemu-system-aarch64 -machine virt -cpu cortex-a57 -nographic -smp 1 -m 512 \
 -kernel vmlinuz-run -initrd initrd-run.img -append "root=/dev/sda2 console=ttyAMA0" \
 -global virtio-blk-device.scsi=off \
 -device virtio-scsi-device,id=scsi -drive file=debian8-arm64.img,id=rootimg,cache=unsafe,if=none -device scsi-hd,drive=rootimg \
 -netdev user,id=unet -device virtio-net-device,netdev=unet -net user

Результат загрузки:
debian8-arm64-qemu-run

Выключение виртуальной машины

user@debian8-arm64:~$ su -
Password: 
root@debian8-arm64:~# halt

Затем выключить QEMU с помощью “ctrl+a x” или командой “killall /opt/qemu220/bin/qemu-system-aarch64” из другого терминала хост-машины.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s