Ip kvm своими руками 3.0

Private Virtual Bridge

Use case:

You want to set up a private network between 2 or more virtual machines. This network won’t be seen from the other virtual machines nor from the real network.

Prerequisites:

  • You need kvm up and running
  • If you don’t want to run as root, then the user needs to have rw access to /dev/kvm
  • The following commands must be installed on the host system and executed as root:
ip
brctl (deprecated). Use ip link instead
tunctl (deprecated). Use ip tuntap and ip link instead

Solution:

You need to create a bridge, e-g:

# ip link add br0 type bridge ; ifconfig br0 up
# brctl addbr br0 (deprecated)

You need a qemu-ifup script containing the following (run as root):

#!/bin/sh
set -x

switch=br0

if ;then
        # tunctl -u `whoami` -t $1 (use ip tuntap instead!)
        ip tuntap add $1 mode tap user `whoami`
        ip link set $1 up
        sleep 0.5s
        # brctl addif $switch $1 (use ip link instead!)
        ip link set $1 master $switch
        exit 0
else
        echo "Error: no interface specified"
        exit 1
fi

Generate a MAC address, either manually or using:

#!/bin/bash
# generate a random mac address for the qemu nic
printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256))

Run each guest with the following, replacing $macaddress with the value from the previous step

qemu-system-x86_64 -hda /path/to/hda.img -device e1000,netdev=net0,mac=$macaddress -netdev tap,id=net0

Notes:

  • If you don’t want to run qemu-ifup as root, then consider using sudo
  • You can either create a system-wide qemu-ifup in /etc/qemu-ifup or use another one. In the latter case, run
qemu-system-x86_64 -hda /path/to/hda.img -device e1000,netdev=net0,mac=$macaddress -netdev tap,id=net0,script=/path/to/qemu-ifup

Each guest on the private virtual network must have a different MAC address

Создание гостевой системы

Процедура создания гостевой системы с помощью графического интерфейса достаточно проста.

А вот текстовый режим можно и описать.

qcow2

При создании системы с помощью графического интерфейса в качестве жёсткого диска предлагается либо выбрать уже существующий файл-образ или блочное устройсво, либо создать новый файл с сырыми (RAW) данными. Однако, это далеко не единственный доступный формат файлов. Из всех перечисленных в man qemu-img типов дисков наиболее гибким и современным является qcow2 . Он поддерживает снапшоты, шифрование и сжатие. Его необходимо создавать до того, как создать новую гостевую систему.

Qemu-img create -o preallocation=metadata -f qcow2 qcow2.img 20G

Согласно тому же man qemu-img , предварительное размещение метаданных (-o preallocation=metadata) делает диск изначально немного больше, но обеспечивает лучшую производительность в те моменты, когда образу нужно расти. На самом деле,
в данном случае эта опция позволяет избежать неприятного бага. Создаваемый образ изначально занимает меньше мегабайта места и по мере необходимости растёт до указанного размера. Гостевая система сразу должна видеть этот окончательный указанный размер, тем не менее, на этапе установки она может увидеть реальный размер файла. Естественно, устанавливаться на жёсткий диск размером 200 кбайт она откажется. Баг не специфичен для Ubuntu, проявляется ещё в RHEL, как минимум.

Кроме типа образа впоследствии можно будет выбрать способ его подключения — IDE, SCSI или Virtio Disk. От этого выбора будет зависеть производительность дисковой подсистемы. Однозначно правильного ответа нет, выбирать нужно исходя из задачи, которая будет возложена на гостевую систему. Если гостевая система создаётся «на посмотреть», то сойдёт любой способ. Вообще, обычно именно I/O является узким местом виртуальной машины, поэтому при создании высоконагруженной системы к этому вопросу нужно отнестись максимально ответственно.

Эту заметку я пишу для того, чтобы продемонстрировать пошаговую установку и настройку виртуальной машины в Linux на базе KVM. Ранее я уже писал про виртуализацию, где использовал замечательный .

Сейчас передо мной встал вопрос аренды хорошего сервера с большим объёмом оперативной памяти и объёмным жестким диском. Но запускать проекты прямо на хост-машине не хочется, поэтому буду разграничивать их по отдельным небольшим виртуальным серверам с ОС Linux или docker-контейнерам (о них расскажу в другой статье).

Все современные облачные хостинги работают по такому же принципу, т.е. хостер на хорошем железе поднимает кучу виртуальных серверов, которые мы привыкли называть VPS/VDS, и раздаёт их пользователям, либо автоматизирует этот процесс (привет, DigitalOcean).

KVM (kernel-based virtual machine) это программное обеспечения для Linux, использующее аппаратные средства x86-совместимых процессоров для работы с технологией виртуализации Intel VT/AMD SVM.

User Networking

Use case:

  • You want a simple way for your virtual machine to access to the host, to the internet or to resources available on your local network.
  • You don’t need to access your guest from the network or from another guest.
  • You are ready to take a huge performance hit.
  • Warning: User networking does not support a number of networking features like ICMP. Certain applications (like ping) may not function properly.

Prerequisites:

  • You need kvm up and running
  • If you don’t want to run as root, then the user needs to have rw access to /dev/kvm
  • In order for the guest to be able to access the internet or a local network, the host system must be able to access these resources as well

Solution:

Simply run your guest without specifying network parameters, which by default will create user-level (a.k.a slirp) networking:

qemu-system-x86_64 -hda /path/to/hda.img

Notes:

  • The IP address can be automatically assigned to the guest thanks to the DHCP service integrated in QEMU
  • If you run multiple guests on the host, you don’t need to specify a different MAC address for each guest
  • The default is equivalent to this explicit setup:
qemu-system-x86_64 -hda /path/to/hda.img -netdev user,id=user.0 -device e1000,netdev=user.0
  • The user.0 identifier above is just to connect the two halves into one. You may use any identifier you wish, such as «n» or «net0».
  • Use rtl8139 instead of e1000 to get an rtl8139-based network interface.
  • You can still access one specific port on the guest using the «hostfwd» option. This means e.g. if you want to transport a file with scp from host to guest, start the guest with «-device e1000,netdev=user.0 -netdev user,id=user.0,hostfwd=tcp::5555-:22». Now you are forwarding the host port 5555 to the guest port 22. After starting up the guest, you can transport a file with e.g. «scp -P 5555 file.txt root@localhost:/tmp» from host to guest. Or you can also use the other address of the host to connect to.

Troubleshooting

How can I check that I’m not falling back to QEMU with no hardware acceleration?

If you think that you might not be using the hardware acceleration provided by the KVM module, here are a few steps to help you check this.

First of all, check that you don’t have messages such as:

qemu-system-x86_64 -hda myvm.qcow2
open /dev/kvm: No such file or directory
Could not initialize KVM, will disable KVM support

In that case, you can check that:

  • the modules are correctly loaded
  • you don’t have a «KVM: disabled by BIOS» line in the output of dmesg
  • /dev/kvm exists and you have the correct rights to use it

Other ways to do the diagnostic:

  • if you have access to the QEMU monitor (Ctrl-Alt-2, use Ctrl-Alt-1 to get back to the VM display), enter the «info kvm» command and it should respond with «KVM support: enabled»
  • the right-end columns of the output from <code>lsmod|grep kvm on the host system, once the VM is started should show only non zero values. The value on the line corresponding to the architecture specific module (e-g kvm_intel, kvm_amd) show the number of VM using the module. For instance, if I have 2 VM running using the KVM module on a machine with vt, it will report:
lsmod|grep kvm
kvm_intel              44896  2
kvm                   159656  1 kvm_intel

My guest network is stuck what should I do?

One would probably be interested in the Root Networking Mode page and the Network Bridge page.

Guest-side network lockups (fortunately restartable) may be happening due to tun/tap bridging erroneous MAC address reconfiguration on host side, see RHEL bug #571991 and others.

I’m experiencing timer drift issues in my VM guests, what to do?

Especially in case of networked systems (e.g. via NFS or Samba) it is very important to ensure stable operation of timing (both system timer and RTC).
Tell-tale signs of related trouble in VMs (apparently qemu/KVM/VMWare etc. are all affected) are e.g.
«make: Warning: File `XXXXX/cmakelists_rebuilder.stamp’ has modification time 0.37 s in the future»
«Clock skew detected. Your build may be incomplete.»

After having applied this very tight NTP coupling, this seems to finally have gotten rid of make’s time drift warnings.

Perhaps qemu’s -tdf (timing drift fix) option magically manages to help in your case, too.

I have VMware/Parallels/VirtualBox installed and when I modprobe KVM, my system deadlocks.

Neither Intel VT nor AMD-V provide a mechanism to determine whether software is currently using the hardware virtualization extensions. This means that if you have two kernel modules loaded attempting to use hardware virtualization extensions, very bad things will happen. If you are using another type of virtualization software and experience any sort of weirdness with KVM, make sure you can reproduce the problem without the kernel modules for that software loaded before you report a bug in KVM.

Конвертация образа диска qemu-img convert

Для конвертации одного формата образа в другой используется опция convert:

qemu-img convert -c -f fmt -O out_fmt -o options fname out_fname

где:

-c — компрессия (сжатие) целевого диска. Компрессию поддерживают только и форматы.

-f fmt — формат исходного диска, в большинстве случаев хорошо определяется автоматически.

-O out_fmt — формат целевого диска

-o options — куча опций. Чтобы узнать, какие опции допустимы для данной конвертации можно ввести:

$ qemu-img convert -O qcow2 ca.img ca1.img -o ?
Supported options:
size Virtual disk size
compat Compatibility level (0.10 or 1.1)
backing_file File name of a base image
backing_fmt Image format of the base image
encryption Encrypt the image
cluster_size qcow2 cluster size
preallocation Preallocation mode (allowed values: off, metadata)
lazy_refcounts Postpone refcount updates

Настройка сети

Устройство моста называемое virbr0 создается по умолчанию в процессе установки libvirt. Это устройство использует NAT для подключения компьютеров гостей к внешнему миру.

Запустите инструмент brctl, чтобы получить список текущих мостов и интерфейсов, к которым они подключены:

brctl show

bridge name bridge id STP enabled interfacesvirbr0 8000.52540003f59e yes virbr0-nic

Мост virbr0 не имеет добавленных физических интерфейсов. «Virbr0-nic» — это виртуальное устройство, через которое не проходит трафик. Единственная цель этого устройства — избежать изменения MAC-адреса моста «virbr0».

Эта настройка сети подходит для большинства пользователей настольных компьютеров Ubuntu, но имеет ограничения. Если вы хотите получить доступ к гостям вне локальной сети, вам необходимо создать новый мост и настроить его так, чтобы гостевые машины могли подключаться к внешнему миру через физический интерфейс хоста.

Manage KVM Virtual Machine using the command Line

Create Virtual Machine on CLI

Before moving further install virt-viewer on your machine if you have not, however for headless servers we need some other machine that supports the GUI to access KVM running guests either using Virt-Manager/Virt-Viewer or VNC viewer.

sudo apt install virt-viewer

To create and manage VM using the command line, we also need the ISO file of the distribution which you want to use as guest OS.

Once you have that use it with the below command.

Explanation of the commands used above:

–name – Use to give a name to your virtual machine.

–disk path: The location where you want to create a virtual storage drive for the guest OS to install. In the above command: Images under libvirt is the folder where I want to create a virtual storage disk in the .qcow2 format. So, the dsk.qcow2 is the name given to storage image formatted in qcow2, you can choose a different location with some other volume name. You can also use other disk image formats such as img.

–graphics: Type of graphics to export the Display of Guest OS, usually Spice or VNC.

–vcpu: Define how many virtual CPU you want to assign to the virtual machine.

–ram: Amount of memory.

–cdrom: location of the ISO file to boot the VM initially for installation.

–network bridge: Network interface for virtual machines.

Connect Virt-Viewer

The moment you run the above command to create a Virtual machine on KVM, the process will allocate the mentioned resources such hard disk space, RAM, CPU and others along with that it will immediately look for the Virt-Vierwer installed on our system and pop-up a  graphical interface window for the installation of the guest VM.

Install KVM machines using command terminal and virt-viewer

To remotely connect KVM through Virt-Viewer here is the command:

virt-viewer --connect qemu+ssh://username@server-ip/system VMname

username: The username of the system that is running the KVM

Server-IP: IP address or domain name of the KVM server.

VMname: Name of the Virtual machine want to connect

The Virtual Manager also can be used for the same purpose to connect VM remotely.

Public Bridge

WARNING: The method shown here will not work with all wireless drivers as they might not support bridging.

Use case:

  • You want to assign IP addresses to your virtual machines and make them accessible from your local network
  • You also want performance out of your virtual machine

Prerequisites:

  • You need kvm up and running
  • If you don’t want to run kvm as root, then the user must have rw access to /dev/kvm
  • The following commands must be installed on the host system and executed as root:
ip
brctl (deprecated, use ip link instead)
tunctl (deprecated, use ip tuntap instead)

Your host system must be able to access the internet or the local network

Solution 1: Using Distribution-Specific Scripts

RedHat Debian SuSE
  • Edit /etc/sysconfig/network-scripts/ifcfg-eth0
    • comment out BOOTPROTO
    • Add BRIDGE=br0
  • Create /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Bridge

/etc/network/interfaces

# Replace old eth0 config with br0
auto eth0 br0
# Use old eth0 config for br0, plus bridge stuff
iface br0 inet dhcp
    bridge_ports    eth0
    bridge_stp      off
    bridge_maxwait  0
    bridge_fd       0
  • Start YaST
  • Go to Network Configuration
  • Add new device -> Bridge
  • Tick your existing network device
  • done
  • /etc/init.d/networking restart
  • The bridge br0 should get the IP address (either static/dhcp) while the physical eth0 is left without an IP address.

VLANs

Please note that the rtl8139 virtual network interface driver does not support VLANs. If you want to use VLANs with your virtual machine, you must use another virtual network interface like virtio.

When using VLANs on a setup like this and no traffic is getting through to your guest(s), you might want to do:

# cd /proc/sys/net/bridge
# ls
bridge-nf-call-arptables  bridge-nf-call-iptables
bridge-nf-call-ip6tables  bridge-nf-filter-vlan-tagged
# for f in bridge-nf-*; do echo 0 > $f; done

Solution 2: Manual Configuration

You need to create a bridge, e-g:

# ip link add br0 type bridge
# brctl addbr br0 (deprecated, use ip link instead!)

Add one of your physical interface to the bridge, e-g for eth0:

# ip link set eth0 master br0
# brctl addif br0 eth0 (deprecated, use ip link instead!)

You need a qemu-ifup script containing the following (run as root):

#!/bin/sh
set -x

switch=br0

if ;then
        #tunctl -u `whoami` -t $1
        ip tuntap add $1 mode tap user `whoami`
        ip link set $1 up
        sleep 0.5s
        #brctl addif $switch $1
        ip link set $1 master $switch
        exit 0
else
        echo "Error: no interface specified"
        exit 1
fi

Generate a MAC address, either manually or using:

#!/bin/sh
# generate a random mac address for the qemu nic
printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256))

Run each guest with the following, replacing $macaddress with the value from the previous step

qemu-system-x86_64 -hda /path/to/hda.img -device e1000,netdev=net0,mac=$macaddress -netdev tap,id=net0

Notes:

  • If you don’t want to run qemu-ifup as root, then consider using sudo
  • Each guest on the network must have a different MAC address
  • You can either create a system-wide qemu-ifup in /etc/qemu-ifup or use another one. In the latter case, run
qemu-system-x86_64 -hda /path/to/hda.img -device e1000,netdev=net0,mac=$macaddress -netdev tap,id=net0,script=/path/to/qemu-ifup

Использование KVM

Использовать KVM в действительности очень просто, если ваша аппаратура ее поддерживает. Вам нужен процессор, который поддерживает виртуализацию: вы можете узнать, поддерживает ли ваша система виртуализацию, посмотрев в /proc/cpuinfo. Этот файл указывает, поддерживаются ли расширения vmx (Intel) или svm (AMD).

Далее вам необходимо ядро Linux с включенной поддержкой KVM. Вы можете это сделать в конфигурации ядра с помощью Device Drivers > Virtualization. Вы также должны включить поддержку процессора для вашего оборудования. У вас должны быть приложения kvm и qemu. За дополнительной информацией обратитесь к .

После того как у вас есть загруженное ядро с включенной поддержкой виртуализации, следующим шагом будет создание образа диска для гостевой операционной системы. Сделайте это, используя , как показано ниже

Обратите внимание на то, что размер образа 4 ГБ, но при использовании copy-on-write формата QEMU (qcow), файл будет увеличиваться настолько, насколько необходимо, вместо того чтобы занимать все 4 ГБ

$ qemu-img create -f qcow vm-disk.img 4G

После создания виртуального диска загрузите на него гостевую операционную систему. В следующем примере предполагается, что гостевая операционная система находится на CD-ROM. Кроме создания виртуального диска c ISO-образом CD-ROM, вы должны загрузить этот образ, после того как он сделан.

$ kvm -no-acpi -m 384 -cdrom guestos.iso -hda vm-disk.img -boot d

Ари Кивити написал ряд тестовых программ для тестирования KVM, для которых не требуется полная модель устройства. Следующий фрагмент кода (from kvm-12/user/main.c) дает высокоуровневый обзор запуска VM (смотрите ). Контроль обеспечивается через ioctl ядра (в частности, в файле./linux-2.6.20/drivers/kvm/kvm_main.c).

Вызов открывает устройство /dev/kvm, проверяет номера версий (экспортированные модулем ядра KVM), затем размещает контекстные объекты KVM и замещает некоторые функции внешнего вызова. Функция устанавливает и отображает две области памяти и затем создает виртуальный CPU (VCPU) с ioctl
().

Затем функция загружает образ в адресное пространство для данной VM, которая потом запускается вызовом
(используя ioctl ).
Этот простой процесс иллюстрирует, как вы можете запустить новую гостевую операционную систему с помощью KVM.

Листинг 1. Фрагмент приложения для тестирования
KVM гипервизора
int main()
{
	void *vm_mem;

	kvm = kvm_init(&test_callbacks, 0);
	if (!kvm) {
	    fprintf(stderr, "kvm_init failed\n");
	    return 1;
	}
	if (kvm_create(kvm, 128 * 1024 * 1024, &vm_mem) < 0) {
	    kvm_finalize(kvm);
	    fprintf(stderr, "kvm_create failed\n");
	    return 1;
	}
	if (ac > 1)
	    if (strcmp(av, "-32") != 0)
		load_file(vm_mem + 0xf0000, av);
	    else
		enter_32(kvm);
	if (ac > 2)
	    load_file(vm_mem + 0x100000, av);
	kvm_show_regs(kvm, 0);

	kvm_run(kvm, 0);

	return 0;
}

Управление KVM через virt-manager из Windows

Для удалённого подключения к virt-manager с Windows компьютера, вам понадобится следующее ПО:

  • Putty – ssh клиент
  • Xming – порт сервера для ОС Windows.

Откройте Putty, перейдите в Connection—>SSH—X11. Включите опцию “Enable X11 Forwarding“.

Теперь на вкладке Session, укажите адрес KVM сервера, имя сессии, укажите порт и сохраните подключение.

Чтобы из Windows удаленно подключаться к KVM серверу через virt-manager, используется следующий порядок:

  1. Сначала запускаете Xming;
  2. Запускаете сохраненную сессию Putty с опцией X11 Forwarding;
  3. Подключаетесь к virt-manager.

После включения Xming у вас в трее должен светиться значок X:

Далее запустите Putty, и после авторизации на сервере, выполните:

Через несколько секунд у вас должно открыться окно управления virt-manager и окно дополнительной авторизации, где нужно ввести данные для подключения к серверу:

После авторизации вы должны увидеть список виртуальных машин.

Настройка гостевой ОС Windows 10

Мы не будем подробно описывать все параметры конфигурации гостевой ОС, а лишь остановимся лишь на самых важных, от правильной установки которых зависит успех всей нашей задачи.

Переключимся на страницу SATA диск 1, выберем пункт Дополнительные параметры и изменим шину диска с SATA на VirtIO.

Тонкие настройки виртуального накопителя

Здесь же допускается явно задать серийный номер накопителя, который будет передан гостевой ОС (если не указано, то генерируется автоматически), а также включить поддержку процедуры TRIM в случае если хранилище было создано на SSD накопителе.

Нажмём кнопку Добавить оборудование, выберем тип Хранилище.

Подключение дискеты с драйверами

Изменим Тип устройства на Устройство чтения дискет, затем установим точку в Выбрать или создать дополнительное пространство данных и нажмём кнопку Настроить.

Выбор файла образа дискеты с драйверами

В появившемся окне переключимся на пул iso, выберем образ дискеты, нажмём Выбор тома, а затем Готово.

Переключимся на страницу Видео и в поле Модель убедимся, что установлено значение QXL. Если это не так, внесём правки.

Все остальные параметры оставим по умолчанию и нажмём кнопку Начать установку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector