Рубрики
KVM

QEMU / Пример работы с kvm/ nokvm из qemu без libvirt

M – тип машины, virt – абстрактно-виртуальный ARM
-machine указывает тип компьютера, который вы собрались эмулировать, можно выбрать ubuntu, pc, pc-q35 и другие варианты, смотрите подробнее командой -machine help
-cpu - тип процессора, можно передать непосредственно тип процессора, а также дополнительные флаги
-smp - включает симуляцию мультипроцессорной архитектуры, количество ядер
-boot - позволяет настроить порядок загрузки устройств, a,b - дискета, с - первый жесткий диск, d - CDROM, n-p - загрузка через сеть, по умолчанию виртуальная машина загружается из жесткого диска
-m - указывает количество оперативной памяти, доступной машине, объем памяти
-k - раскладка клавиатуры по умолчанию
-soundhw - подключить звуковую карту к системе
-device - подключить указанное устройство к машине, нужно указать драйвер и его опции
-name - имя гостевой системы, будет отображаться в верху окна
-uuid - установить UUID для системы
-fda, fdb - подключить дискету из файла
-hda, hdb - подключить жесткий диск из файла
-cdrom - подключить оптический диск
-usb - включить поддержку USB
-usbdevice - подключить USB устройство
-display - выбрать тип отображения, доступно sdl, curses, gtk, none, vga и другие
-full-screen - запустить в полный экран
-no-acpi - отключить поддержку ACPI
-net - создать сетевой интерфейс
-net nic
-net tap
-net user
-net nic user,model=virtio
-realtime включить режим реального времени, опции mclock нужно передать значение on
-gdb - ожидать подключения отладчика gdb
-enable-kvm - включить поддержку kvm
-loadvm - загрузить сохраненное состояние
-daemonize - сделать процесс фоновым
-snapshot - записывать изменения не в файл жесткого диска, а в отдельные файлы
-nographic - отключить графический вывод
-kernel - использовать указанный образ ядра linux
-append - командная строка для ядра
-initrd - файл initrd для загрузки Linux
-vnc :5 - VNC на :5905 
-drive if=none,file=debian.img,format=qcow2 – образ жесткого диска
-soundhw ac97 - добавить звуковую карту
 no-reboot – перезапуск системы приведет к остановке эмулятора

Немного о сетевых устройствах в qemu

Вариант первый:
qemu-system-x86_64 
-m 1G 
-device virtio-net-pci,netdev=lan 
-netdev user,id=lan 
-drive file=you.iso,media=cdrom

Виртуальная машина автоматически получит ip-адрес из подсети 10.0.2.0/24, шлюз - 10.0.2.2, dns-сервер - 10.0.2.3.
К физическому хосту можно обратиться по адресу 10.0.2.2.
ICMP пакеты через такой тип сети не проходят.


Вариант два:
Для такой сетевой карты требуется root
sudo qemu-system-x86_64 
-m 1G 
-device virtio-net-pci,netdev=lan 
-netdev tap,id=lan,ifname=tap0 
-drive file=/tmp/livecd.iso,media=cdrom
P.S. мне этот вариант не нравится так как у меня уже есть бридж на ovs

Вариант три:
Для такой сетевой карты требуется root
sudo qemu-system-x86_64 
-m 1G 
-device virtio-net-pci,netdev=lan 
-netdev tap,id=lan,script=no,ifname=tap0 
-drive file=/tmp/livecd.iso,media=cdrom
Почти тоже самое что но c очень важным параметром "script=no", 
да и теперь нам надо выполнить одну команду для ovs для добавления tap0 в бридж ovs
ovs-vsctl add-port ovsbr0 tap0
ip link set up dev tap0

x86

Готовим диск:

cd new_dir
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.5.0-amd64-netinst.iso

qemu-img create -f qcow2 image_x86.qcow2 10G

Установка системы:
qemu-system-x86_64 
    -enable-kvm 
    -cpu host 
    -hda image_x86.qcow2 
    -drive file=debian-12.5.0-amd64-netinst.iso,media=cdrom 
    -boot d 
    -smp 4 
    -m 4G 
    -display gtk 
    -vga std 
    -device virtio-net-pci,netdev=lan 
    -netdev tap,id=lan,ifname=tap0,script=no 
    -vnc :5 
    -device AC97 
    -nographic

Дальнейший запуск и использование ВМ:
!!! Убираем строки отвечающие за загрузку с cd-cdrom
!!! -drive file=manjaro-xfce-21.0-210318-linux510.iso,media=cdrom 
!!! -boot d 
!!! Не забываем про сеть
!!! ovs-vsctl add-port ovsbr0 tap0
!!! ip link set up dev tap0

qemu-system-x86_64 
    -enable-kvm 
    -cpu host 
    -hda image_x86.qcow2 
    -smp 4 
    -m 4G 
    -display gtk 
    -vga std 
    -device virtio-net-pci,netdev=lan 
    -netdev tap,id=lan,ifname=tap0,script=no 
    -vnc :5 
    -device AC97 
    -nographic

arm



0. Готовим диск болванку:
qemu-img create -f qcow2 ebian12-arm.qcow2 8G


1. Нам нужны будут файлы:
Файло брать тут:
http://ftp.debian.org/debian/dists/bookworm/main/installer-armhf/current/images/netboot/

Нам потребуется:
wget http://ftp.debian.org/debian/dists/bookworm/main/installer-armhf/current/images/netboot/initrd.gz
wget http://ftp.debian.org/debian/dists/bookworm/main/installer-armhf/current/images/netboot/vmlinuz

2. Создаем диск:
qemu-img create -f qcow2 debian12-arm.qcow2 10G

!!! Заменил драйвер для сетевой карты так как при установки системы ее было не видно
!!! Вместо  -device virtio-net-pci,netdev=lan 
!!! На -device virtio-net-device,netdev=lan

3. Создаем виртуальный интерфейс tap0 и добавляем его в ovsbr0
ip tuntap add dev tap0 mode tap
ip link set up dev tap0
ovs-vsctl add-port ovsbr0 tap0


4. Пример первый запуск ВМ для установки ос:
qemu-system-arm -smp 4 -m 1024 -M virt 
   -kernel vmlinuz 
   -initrd initrd.gz 
   -append "root=/dev/ram" 
   -drive if=none,file=debian12-arm.qcow2,format=qcow2,id=hd 
   -device virtio-blk-device,drive=hd 
   -device virtio-net-device,netdev=lan 
   -netdev tap,id=lan,ifname=tap0,script=no 
   -vnc :5 
   -device AC97 
   -nographic 
   -no-reboot

5. Теперь нам нужно добыть загрузочные файлы из толькочто установленного образа
sudo modprobe nbd max_part=16
sudo qemu-nbd -c /dev/nbd0 debian12-arm.qcow2 
mkdir mount-qemu
mount /dev/nbd0p1 mount-qemu
sudo mount /dev/nbd0p1 mount-qemu
mkdir after-copy
cp mount-qemu/ after-copy/
umount mount-qemu 
sudo umount mount-qemu 
sudo qemu-nbd -d /dev/nbd0
sudo killall qemu-nbd


6. Используем образ дальше:
!!! Перед использованием рекомендую файлы initrd,vmlinuz и debian12-arm.qcow2 в один каталог.
qemu-system-arm -smp 4 -m 1024 -M virt 
   -kernel vmlinuz-6.1.0-18-armmp-lpae 
   -initrd initrd.img 
   -drive if=none,file=debian12-arm.qcow2,format=qcow2,id=hd 
   -device virtio-blk-device,drive=hd 
   -device virtio-net-device,netdev=lan 
   -netdev tap,id=lan,ifname=tap0,script=no 
   -vnc :5 
   -device AC97 
   -nographic 
   -no-reboot

7. запуск образа system_img

qemu-system-x86_64 
  -enable-kvm -cpu host 
  -machine type=q35 
  -m 2048 
  -smp sockets=1,cores=4 
  -drive file=./system_img,if=none,id=hd0,format=raw 
  -device virtio-scsi-pci 
  -device scsi-hd,drive=hd0 
  -boot order=d 
  -netdev user,id=net0 
  -device virtio-net-pci,netdev=net0
  

8. запуск образа и использовать бридж что потребует судо:


создаем бридж:
sudo ip link add name br0 type bridge
sudo ip link set br0 up
sudo ip link set eth0 master br0  # Замените eth0 на ваш интерфейс

запускаем вм:
sudo qemu-system-x86_64 
  -enable-kvm -cpu host 
  -machine type=q35 
  -m 2048 
  -smp sockets=1,cores=4 
  -drive file=./ system_img,if=none,id=hd0,format=raw 
  -device virtio-scsi-pci 
  -device scsi-hd,drive=hd0 
  -boot order=d 
  -netdev bridge,id=net0,br=br0 
  -device virtio-net-pci,netdev=net0

9. запуск образа и использовать проброс портов:

qemu-system-x86_64 
  -enable-kvm -cpu host 
  -machine type=q35 
  -m 2048 
  -smp sockets=1,cores=4 
  -drive file=./napios-qemux86-64-dev-0.2.0.1.rootfs.system_img,if=none,id=hd0,format=raw 
  -device virtio-scsi-pci 
  -device scsi-hd,drive=hd0 
  -boot order=d 
  -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8443-:443 
  -device virtio-net-pci,netdev=net0


После используем:
curl https://localhost:8443/
ssh root@localhost:2222