Введение
С гипервизором kvm лично мне приходилось мало работать. Еще в первое мое знакомство с гипервизорами, когда я выбирал, какой использовать в своей работе, kvm мне не понравился вообще по следующим причинам:
- Нет удобного инструмента для управления гипервизором под Windows. Для меня это критично, так как моя основная рабочая система ОС Windows.
- Не увидел готового образа, который бы позволил быстро и без лишних движений развернуть гипервизор на новом железе.
В итоге я остановился на Xen там, где нужно поставить систему на программный рейд mdadm, и Hyper-V в тех случаях, где рейд либо не нужен совсем, либо он аппаратный. В своей работе так или иначе приходится сталкиваться с различными системами, поэтому разбираться приходится во всем, в том числе и в kvm.
Есть 2 различных способа сделать бэкап виртуальной машины kvm:
- С остановкой или заморозкой системы на короткий промежуток времени.
- Без остановки системы вообще.
Для первого случая все относительно просто, каких-то нюансов нет. Во втором случае возникают нюансы и вопросы. Просто взять и сделать горячий бэкап виртуальной машины в kvm не получится. Вопрос рассмотрения архивных копий виртуальных машин нужно начинать с выбора типа жесткого диска, который будет использоваться. В зависимости от этого будет разная стратегия бэкапа. С этого мы и начнем.
Сразу хочу пояснить, что не имею большого опыта в работе с kvm и возможно что-то делаю неправильно. Данная статья мой опыт самостоятельного поиска решения и закрепление его для себя и всех, кому это будет интересным.
Начало работы
Настроить дисковые накопители
/dev/sda/dev/sdb/dev/sdbext4
- Размечаем диск, создавая новый раздел:
- Нажимаем клавишу o или g (разметить диск в MBR или GPT).
- Далее нажимаем клавишу n (создать новый раздел).
- И наконец w (для сохранения изменений).
- Создаем файловую систему ext4:
- Создаем директорию, куда будем монтировать раздел:
- Открываем конфигурационный файл на редактирование:
- Добавляем туда новую строку:
- После внесения изменений сохраняем их сочетанием клавиш Ctrl + X, отвечая Y на вопрос редактора.
- Для проверки, что все работает, отправляем сервер в перезагрузку:
- После перезагрузки проверяем смонтированные разделы:
/dev/sdb1/mnt/storage
Добавить новое хранилище в Proxmox
ДатацентрХранилищеДобавитьДиректория
- ID — название будущего хранилища;
- Директория — /mnt/storage;
- Содержимое — выделяем все варианты (поочередно щелкая на каждом варианте).
Добавить
Создать виртуальную машину
- Определяемся с версией операционной системы.
- Заранее закачиваем ISO-образ.
- Выбираем в меню Хранилище только что созданное хранилище.
- Нажимаем Содержимое ➝ Загрузить.
- Выбираем из списка ISO-образ и подтверждаем выбор нажатием кнопки Загрузить.
- Нажимаем Создать VM.
- Заполняем поочередно параметры: Имя ➝ ISO-Image ➝ Размер и тип жесткого диска ➝ Количество процессоров ➝ Объем оперативной памяти ➝ Сетевой адаптер.
- Выбрав все желаемые параметры нажимаем Завершить. Созданная машина будет отображена в меню панели управления.
- Выбираем ее и нажимаем Запуск.
- Переходим в пункт Консоль и выполняем установку операционной системы точно таким же образом, как и на обычный физический сервер.
Настроить автозапуск
- Щелкаем по названию нужной машины.
- Выбираем вкладку Опции ➝ Запуск при загрузке.
- Ставим галочку напротив одноименной надписи.
Start/Shutdown order
Step 3: Rename/Move the disk
This step is only necessary if the disk contains the VM ID, which includes most
storage types (iSCSI-Direct is an example where you can skip this step).
All of the examples below assume there’s no disk on the target storage for that
VM already. If there is, increase the trailing number so that the name is
unique. Eg. if you already have a vm-2300-disk-1 and
vm-2300-disk-2, then
use vm-2300-disk-3 instead.
For directory based storages (Directory, NFS, Gluster):
Find the path and rename the file.
For example, assuming the disk line was: local:400/vm-400-disk-1.qcow2:
# pvesm path 'local:400/vm-400-disk-1.qcow2' /var/lib/vz/images/400/vm-400-disk-1.qcow2 # mkdir -p /var/lib/vz/images/2300 # mv /var/lib/vz/images/400/vm-400-disk-1.qcow2 /var/lib/vz/images/2300/vm-2300-disk-1.qcow2
For LVM (thin) storages:
Use
# lvs (...) vm-400-disk-1 pve Vwi-aotz-- 42.00g
to find the disk’s name on the host (mala in this example). It must appear in the source VM’s config as well. Thus, the following command should give a similar result.
# cat /etc/pve/nodes/mala/qemu-server/400.conf | grep lvm scsi1: local-lvm:vm-400-disk-1,size=42G
There are two crucial steps to move the disk. The first is renaming the logical volume according to the target VM.
# lvrename pve/vm-400-disk-1 pve/vm-2300-disk-1 Renamed "vm-400-disk-1" to "vm-2300-disk-1" in volume group "pve"
The second is to adapt the VM config files. Delete the line for this disk from the source VM config
# sed -i.backup '/vm-400-disk-1/d' /etc/pve/nodes/mala/qemu-server/400.conf
and add it to the one of of the target VM 2300, with changes according to lvrename. This means
# echo "scsi1: local-lvm:vm-2300-disk-1,size=42G" >> /etc/pve/nodes/mala/qemu-server/2300.conf
For ZFS:
Assuming the storage is named tank, and the pool property is
tank/host/vms, and the disk line was: tank:vm-400-disk-1:
# zfs rename tank/host/vms/vm-400-disk-1 tank/host/vms/vm-2300-disk-1
For ceph:
Assuming the pool is named rbd and the disk line was:
myceph:vm-400-disk-1, and there’s a monitor at the address 1.2.3.4, we
use following command:
# rbd -m 1.2.3.4 -n client.admin --keyring /etc/pve/priv/ceph/myceph.keyring --auth_supported cephx mv rbd/vm-400-disk-1 rbd/vm-2300-disk-1
If you only have one ceph storage, local to your PVE cluster, or have a local
ceph configuration for easier maintenance you might be able to shorten this
command to just:
# rbd mv rbd/vm-400-disk-1 rbd/vm-2300-disk-1
Introduction
storage pool type: lvm
LVM is a thin software layer on top of hard disks and partitions. It can be used to split available disk space
into smaller logical volumes. LVM is widely used on Linux and makes managing hard drives easier.
Another use case is to put LVM on top of a big iSCSI LUN. That way you can easily manage space on
that iSCSI LUN, which would not be possible otherwise, because the iSCSI specification does not define a
management interface for space allocation
Configuration
The LVM backend supports the common storage properties content, nodes, disable, and the following LVM specific properties:
- vgname
- base
- saferemove
- saferemove_throughput
General LVM advantages
LVM is a typical block storage, but this backend does not support snapshot and clones. Unfortunately,
normal LVM snapshots are quite inefficient, because they interfere all writes on the whole volume group
during snapshot time.
One big advantage is that you can use it on top of a shared storage, for example an iSCSI LUN. The backend
itself implement proper cluster wide locking.
Note: The newer LVM-thin backend allows snapshot and clones, but does not support shared storage. |
Создание нового образа диска — qemu-img create
qemu-img create создает новый образ диска в базовой операционной системе для гостевой виртуальной машины. Формат команды:
qemu-img create -f fmt -o options size fname
где:
fmt — формат образа диска. В kvm в Ubuntu можно создать образы дисков следующих форматов: vvfat vpc vmdk vhdx vdi sheepdog sheepdog sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd nbd nbd dmg tftp ftps ftp https http cow cloop bochs blkverify blkdebug.
Из всего этого разнообразия реально используется только 4 формата:
-
raw Файл содержащий как бы точную копию физического диска. Переводится как «сырой». Данные пишутся как есть без всякой обработки и без дополнительной служебной информации. Основным преимуществом данного формата являются максимальная производительность дисковой подсистемы среди других образов за счет отсутствия служебной информации и дополнительных действий в моменты чтения/записи. Универсальность формата позволяет использовать RAW-диски под управлением других гипервизоров(Xen, VMware).
К минусам можно отнести невозможность создавать снапшоты а так же необходимость выделения для файла-образа всего объема дискового пространства указанного в параметре size, что в прочем в некоторых случаях избавляет от фрагментации файла-образа за счет единовременного выделения всего объема. -
qcow2 «Родной» формат эмулятора QEMU с поддержкой сжатия, снапшотов и шифрования. Кроме того qcow2 образ занимает столько места, сколько реально занимают данные, вне зависимости от размера создаваемого при соз8589934592дании. Наиболее часто используемый и рекомендуемый формат.
Производительность дисков в формате QCOW2 несколько уступает дискам в формате RAW. Диски в формате QCOW2 в большей степени подвержены фрагментации за счет постепенного а не едино разового выделения всего объема на физическом диске. - vdi Образ виртуальных машин, поддерживаемый VirtualBox.
- vmdk Образ виртульных машин VMware.
size — размер создаваемого диска. Число и единица измерения — (kilobyte), (megabyte), (gigabyte), или (terabyte).
fname — имя файла образа диска.
$qemu-img create -f qcow2 -o size=8G /images/ca.img Formatting '/images/ca.img', fmt=qcow2 size=4294967296
$ qemu-img info /images/ca.img image: ca.img file format: qcow2 virtual size: 8.0G (8589934592 bytes) disk size: 2.7G cluster_size: 65536 Format specific information: compat: 0.10
Сетевой Bridge для kvm
Настройка сети для виртуальных машин kvm может быть настроена различными способами. Я как минимум 3 наиболее популярных знаю:
- Виртуальные машины выходят во внешний мир через сам хост kvm, на котором настроен NAT. Этот вариант вам будет доступен сразу после установки kvm. Ничего дополнительно настраивать не надо, так как сетевой бридж для этого virbr0 уже будет добавлен в систему. А в правилах iptables будет добавлен MASQUERADE для NAT.
- Одна из виртуальных машин превращается в шлюз и через нее осуществляется доступ во внешний мир для всех виртуальных машин. Наиболее гибкий способ управления сетью для vm, но в то же время требует больше времени на настройку и набор знаний по работе с сетями.
- Для виртуальных машин kvm создается отдельный сетевой бридж во внешнюю сеть. Они напрямую получают в нее сетевой доступ.
Последний вариант наиболее простой и удобный, поэтому настроим сеть для виртуальных машин таким образом. Для этого нам нужно установить дополнительный пакет на host.
sudo apt install bridge-utils
Теперь на хосте приводим сетевые настройки в /etc/netplan к следующему виду.
network: ethernets: ens18: dhcp4: false dhcp6: false version: 2 bridges: br0: macaddress: 16:76:1a:3b:be:03 interfaces: - ens18 dhcp4: true dhcp6: false parameters: stp: true forward-delay: 4
Здесь будьте очень внимательны. Не выполняйте изменения сетевых настроек, не имея прямого доступа к консоли сервера. Очень высок шанс того, что что-то пойдет не так и вы потеряете удаленный доступ к серверу.
В предложенном наборе правил netplan у меня один сетевой интерфейс на хосте гипервизора — ens18. Он изначально получал настройки по dhcp. Мы добавили новый сетевой бридж br0, в него добавили интерфейс ens18. Так же мы указали, что br0 будет получать сетевые настройки по dhcp. Я указал mac адрес для того, чтобы он не менялся после перезагрузки. Такое может происходить. Адрес можно указать любой, не принципиально. Я сделал похожий на адрес физического сетевого интерфейса.
Теперь надо применить новые настройки.
sudo netplan apply
Сразу после этого вы потеряете доступ к серверу по старому адресу. Интерфейс ens18 перейдет в состав bridge br0 и потеряет свои настройки. А в это время бридж br0 получит новые сетевые настройки по dhcp. IP адрес будет отличаться от того, что был перед этим на интерфейсе ens18. Чтобы снова подключиться удаленно к гипервизору kvm, вам надо будет пойти на dhcp сервер и посмотреть, какой новый ip адрес ему назначен.
Если у вас нет dhcp сервера или вы просто желаете вручную указать сетевые настройки, то сделать это можно следующим образом.
network: ethernets: ens18: dhcp4: false dhcp6: false version: 2 bridges: br0: macaddress: 16:76:1a:3b:be:03 interfaces: - ens18 addresses: - 192.168.25.2/24 gateway4: 192.168.25.1 nameservers: addresses: - 192.168.25.1 - 77.88.8.1 dhcp4: false dhcp6: false parameters: stp: true forward-delay: 4
В этом случае после применения новых настроек, гипервизор kvm будет доступен по адресу 192.168.25.2.
Обращайте внимание на все отступы в конфигурационном файле netplan. Они важны
В случае ошибок, настройки сети применены не будут. Иногда эта тема очень напрягает, так как не получается сразу понять, где именно в отступах ошибка. В этом плане yaml файл для настроек сети гипервизора как-то не очень удобен.
Далее еще один важный момент. Чтобы наш kvm хост мог осуществлять транзит пакетов через себя, надо это явно разрешить в sysctl. Добавляем в /etc/sysctl.d/99-sysctl.conf новый параметр. Он там уже есть, надо только снять пометку комментария.
net.ipv4.ip_forward=1
Применяем новую настройку ядра.
sudo sysctl -p /etc/sysctl.d/99-sysctl.conf net.ipv4.ip_forward = 1
С настройкой сети гипервизора мы закончили. На данном этапе я рекомендую перезагрузить сервер и убедиться, что все настройки корректно восстанавливаются после перезагрузки.
Скрипт для автоматического бэкапа виртуальных машин KVM
По мотивам всего написанного выше я набросал простенький скрипт для автоматического живого бэкапа всех дисков всех работающих в момент выполнения скрипта виртуальных машин
Обращаю внимание, что бэкапятся все диски. Скрипт привожу просто для примера, не используйте его, если вам не нужны полные бэкапы всех дисков
Лично я бэкаплю только небольшие системные диски. Все, что много весит, предпочитаю архивировать другими способами уже изнутри виртуальной машины. Если это базы данных, то делаю , если это файловый сервер, то использую rsync для создания инкрементных бэкапов. Ну и так далее. Каждый выбирает средства на свой вкус.
#!/bin/bash # Дата год-месяц-день data=`date +%Y-%m-%d` # Папка для бэкапов backup_dir=/backup-vm # Список работающих VM vm_list=`virsh list | grep running | awk '{print $2}'` # Список VM, заданных вручную, через пробел #vm_list=(vm-1 vm-2) # Лог файл logfile="/var/log/kvmbackup.log" # Использовать это условие, если список VM задается вручную #for activevm in "${vm_list}"; # Использовать это условие, если список работающих VM берется автоматически for activevm in $vm_list do mkdir -p $backup_dir/$activevm # Записываем информацию в лог с секундами echo "`date +"%Y-%m-%d_%H-%M-%S"` Start backup $activevm" >> $logfile # Бэкапим конфигурацию virsh dumpxml $activevm > $backup_dir/$activevm/$activevm-$data.xml echo "`date +"%Y-%m-%d_%H-%M-%S"` Create snapshots $activevm" >> $logfile # Список дисков VM disk_list=`virsh domblklist $activevm | grep vd | awk '{print $1}'` # Адрес дисков VM disk_path=`virsh domblklist $activevm | grep vd | awk '{print $2}'` # Делаем снепшот диcков virsh snapshot-create-as --domain $activevm snapshot --disk-only --atomic --quiesce --no-metadata sleep 2 for path in $disk_path do echo "`date +"%Y-%m-%d_%H-%M-%S"` Create backup $activevm $path" >> $logfile # Вычленяем имя файла из пути filename=`basename $path` # Бэкапим диск pigz -c $path > $backup_dir/$activevm/$filename.gz sleep 2 done for disk in $disk_list do # Определяем путь до снепшота snap_path=`virsh domblklist $activevm | grep $disk | awk '{print $2}'` echo "`date +"%Y-%m-%d_%H-%M-%S"` Commit snapshot $activevm $snap_path" >> $logfile # Объединяем снепшот virsh blockcommit $activevm $disk --active --verbose --pivot sleep 2 echo "`date +"%Y-%m-%d_%H-%M-%S"` Delete snapshot $activevm $snap_path" >> $logfile # Удаляем снепшот rm $snap_path done echo "`date +"%Y-%m-%d_%H-%M-%S"` End backup $activevm" >> $logfile done
Обращаю внимание на несколько моментов:
vm_list может либо автоматически заполняться списком работающих виртуальных машин, либо можно вручную указать список только тех машин, которые нужно бэкапить. Для этого нужно раскомментировать соответствующую строку в начале скрипта при объявлении переменной. Затем выбрать подходящую строку для цикла for. Он будет немного разным, в зависимости от списка.
Снепшоты будут создаваться в той же папке, где хранится основной файл данных. На время отладки советую для начала закомментировать строку с удалением снепшота, на всякий случай. Рекомендую этот крипт прогнать сначала на тестовом сервере. Я его написал на примере одного гипервизора, больше нигде не проверял. Но работает он однозначно, я проверил несколько раз с разными списками VM. В итоге оставил его у себя на сервере в работе.
Для регулярной очистки бэкапов, если они у вас будут храниться где-то в доступном с этого сервера месте, можно добавить в самый конец условие очистки. Для полного бэкапа VM мне видится нормальной схема хранения бэкапов в несколько месяцев, с созданием архивов раз в неделю. Чаще бэкапить системные диски не вижу смысла, там редко бывают ежедневные изменения.
/usr/bin/find /backup-vm/*/ -type f -mtime +90 -exec rm -rf {} \;
Данная команда удалит все файлы старше 90 дней в папках с названиями виртуальных машин, расположенных в /backup-vm.
Конвертация дисков qcow2 -> lvm в KVM (Proxmox)
Занимался на днях переносом виртуальных машин с обычного kvm гипервизора на proxmox. На исходном гипервизоре диски виртуальных машин были в формате qcow2. Я решил заодно сконвертировать диски из qcow2 в lvm и написать заметку об этом, чтобы не забыть.
Для тех, кто не знает, в чем разница между разными форматами дисков в гипервизоре KVM, предлагаю почитать об этом в моей статье на тему бэкапа виртуальных машин kvm. В общем случае, сконвертировать диски qcow2 в lvm можно следующим образом. Сначала преобразуем их в raw формат с помощью qemu-img.
# qemu-img convert /mnt/data/images/102/vm-102-disk-0.qcow2 -O raw /mnt/data/images/102/vm-102-disk-0.raw
1 | # qemu-img convert /mnt/data/images/102/vm-102-disk-0.qcow2 -O raw /mnt/data/images/102/vm-102-disk-0.raw |
Далее raw образ переносим на новый сервер. На нем же к виртуальной машине подключаем новый диск из lvm хранилища такого же размера, как raw образ. Далее в консоли proxmox выполняем конвертацию в lvm с помощью обычного dd.
# dd if=/mnt/data/images/102/vm-102-disk-0.raw of=/dev/pve/vm-102-disk-0
1 | # dd if=/mnt/data/images/102/vm-102-disk-0.raw of=/dev/pve/vm-102-disk-0 |
Все то же самое можно сделать одной командой на новом сервере, перенеся туда диск в формате qcow2.
# qemu-img convert -p -n -f qcow2 -O raw /mnt/data/images/102/vm-102-disk-0.qcow2 /dev/pve/vm-102-disk-0
1 | # qemu-img convert -p -n -f qcow2 -O raw /mnt/data/images/102/vm-102-disk-0.qcow2 /dev/pve/vm-102-disk-0 |
Последняя команда qemu-img будет работать медленнее, чем dd из предыдущего примера. Каким способом конвертировать — решать вам. Не забудьте изменить путь к lvm разделу. В моем случае он /dev/pve/vm-102-disk-0, у вас имя группы томов может быть другим, не pve.
Я описал общий случай для любого гипервизора KVM. Но конкретно в proxmox это можно сделать проще. Если вам нужно конвертировать qcow2 в lvm на этом же хосте, то достаточно просто через web интерфейс выбрать Move disk и указать в качестве storage хранилище с LVM. Proxmox сам конвертирует диск с помощью того же qemu-img.
Конвертация дисков qcow2 -> lvm в KVM (Proxmox)
Если вы выполняете, как и я, перенос виртуальной машины с одного сервера на другой, то действуйте так:
- Переносим qcow2 диск со старого гипервизора на новый.
- На новом создаем виртуальную машину, подключаем к ней диск любого размера на обычном хранилище в виде директории.
- Запоминаем имя этого диска и удаляем его. Вместо него переносим диск со старого гипервизора и указываем ему такое же имя.
- Запускаем виртуалку на новом сервере, убеждаемся, что она работает, выключаем.
- Через web интерфейс proxmox переносим диск на storage с lvm. Proxmox сам выполнит конвертацию.
Я по такой схеме переносил как linux машины, так и windows. Проблем не было. Единственное, надо не забыть зайти через консоль в windows машину и проверить сетевые настройки. Нужно будет заново настроить сеть, иначе по rdp не подключиться. После переноса сетевой адаптер поменяется.
Ускорение дисковой подсистемы Qemu KVM в Linux +35
- 25.03.20 02:48
•
inetstar
•
#493696
•
Хабрахабр
•
Tutorial
•
•
8900
Блог компании RUVDS.com, Высокая производительность, Виртуализация, Настройка Linux, Накопители
Иногда я берусь за различные задачи по настройке серверов. Некоторое время назад ко мне обратился владелец небольшой хостинговой компании, с интересной проблемой. Он хотел бы на своих серверах, где уже стоял Ubuntu 18.04, запускать виртуальные машины с Windows под KVM.
Однако проведённое им тестирование показало, что дисковая система KVM прилично отставала от показателей, которые у него были под Hyper-V. Он хотел раскочегарить qemu на своих Ubuntu серверах, чтобы избежать закупок дорогих серверных лицензий Windows (бесплатная версия Microsoft Hyper-V Server не устраивала из-за своих ограничений).
0. Диспозиция
Windows 10 LTSC | Hyper-V 2 CPU |
KVM 2 CPU |
---|---|---|
О размере тестового файла для CrystalDiskMarkВнимательный читатель может заметить, что использовались разные по размеру области для тестирования от 100МБ до 4ГБ. Дело в том, что размер области очень влияет на время выполнения теста: чем больше область, тем длиннее шёл тест.
Однако, так как каждый раз виртуальная машина запускалась заново, кеш Windows сбрасывался и не оказывал влияние на результаты. Результаты для области 100МБ и 4ГБ отличались в пределах погрешности, но время было в 40 раз больше.
Тестирований за время настройки было проведено огромное количество, чтобы задача не затянулась на месяцы, основная часть испытаний была проведена с областями размером 100МБ-1ГБ. И только решающие испытания были проведены с областями 4ГБ.
4. Добавляем в каждую виртуальную машину выделенный поток для обслуживания IO
<iothreads>1</iothreads>
<disk type=’block’ device=’disk’>
<driver name=’qemu’ type=’raw’ cache=’none’ io=’threads’ iothread=’1′/>
<source dev=’/dev/win/terminal’/>
<target dev=’vda’ bus=’virtio’/>
<boot order=’2’/>
<address type=’pci’ domain=’0x0000′ bus=’0x04′ slot=’0x00′ function=’0x0’/>
</disk>
7. Результаты после применения всех твиков
Hyper-V 2 CPU |
KVM 2 CPU |
KVM 4 CPU |
---|---|---|
KVM из коробки 2 CPU |
KVM после твиков 2 CPU |
---|---|
Основные элементы успехаЗамеченные ошибки направляйте в личку. Повышаю за это карму.
Благодарности
За изображение спасибо TripletConcept. Его лучше смотреть в полном размере в отдельном окне.
За разрешение поделиться рабочими материалами — st_neonRUVDSЗамеченные ошибки направляйте в личку. Повышаю за это карму.
Конвертация виртуальной машины Windows.
Создадим на хосте Proxmox виртуальную машину с необходимыми настройками и ресурсами. Создайте два жестких диска, один IDE для системного диска, второй SCSI или Virtio, в зависимости от того, какой тип планируете использовать. Диск IDE должен присутствовать обязательно, иначе виртуальная машина не загрузится. Вот такая конфигурация получилась у меня:
Теперь переходим непосредственно к конвертации. В консоли хоста Proxmox выполним команду:
Shell
qemu-img convert -f vmdk </path/to/disk.vmdk> -O raw /mnt/pve/hdd1/images/101/disk0.raw -p
1 | qemu-img convert-fvmdk<pathtodisk.vmdk>-Orawmntpvehdd1images101disk0.raw-p |
В команде, естественно, укажите свои параметры.
Запустится процесс конвертации диска.
После завершения конвертации нужно изменить конфиг виртуальной машины. Для этого открываем в редакторе файл конфигурации ВМ(в нашем случае ВМ имеет ID 101):
Shell
nano /etc/pve/qemu-server/101.conf
1 | nanoetcpveqemu-server101.conf |
Если узел Proxmox находится в кластере, путь до файла конфигурации будет выглядеть так:
Shell
nano /etc/pve/nodes/<node-name>/qemu-server/101.conf
1 | nanoetcpvenodes<node-name>qemu-server101.conf |
В строке ide0 укажем наш сконвертированный диск:
Сохраните изменения. Теперь можно запустить виртуальную машину.
Настройка ВМ после конвертации.
После конвертации необходимо проделать следующие действия: удалить VMtools(если они установлены) и установить необходимые драйвера.
Удаление VMtools производится через стандартную оснастку «Программы и компоненты».
Перезагрузку после удаления можно отложить.
Для установки драйверов потребуется скачать и подключить к ВМ образ с драйверами. Скачать его можно из официального источника..
После подключения образа с драйверами, перейдите в него и запустите мастер установки драйверов, выбрав нужную разрядность:
Это самый простой способ установить необходимые драйвера. Также, не лишним будет установить гостевой агент из папки guest-agent.
Теперь нам нужно переключить системный диск с устаревшего контроллера IDE на Virtio. Для этого выключаем виртуальную машину и вносим изменения в конфиг файл, который мы уже редактировали. Приведем его к следующему виду:
Обратите внимание, что нужно указать первым загрузочным устройством наш системный диск. (Думаю, что загрузочный диск, всё же, лучше разместить на шине 0, поэтому нужно заменить в файле конфигурации virtio1 на virtio0)
Диски, созданные при создании ВМ, теперь можно удалить.
После этого можно включать виртуальную машину и использовать по назначению.
Troubleshooting and known issues
Thin Overprovisioning
In a LVM_thin pool there is no space limit when defining LVM volumes in it — regardless if these volumes are virtual disks for containers or virtual machines or just volumes for any other purpose defined by «lvcreate». If the total amount of all defined logical volume size within a thin pool exceeds the physical size of the pool it is called «overprovisioning».
Attention! You can never use more space for data than physically is available! Unfortunately in case of reaching the space limit no direct warning or error message occurs. At the user interface — e.g. inside a virtual machine — it looks like all logical space can be used; but when exceeding the physical limit the data are corrupt!
Therefore it is recommended
— to avoid overprovisioning; or at least, if not possible
— to check regularly via
lvs
the actual physical usage.
See also «Automatically extend thin pool LV» in
Clonezilla Live CDs
This method is fast, reliable and OS independent as it uses live CDs.
- Now, boot the physical host with Clonezilla, go for beginner mode and select device — device and then remote, just follow the wizard
- On the Proxmox VE host, prepare a KVM guest, make sure you got a big enough IDE disk assigned (add 1 GB extra to be on the safe side) and also boot this KVM guest with the live CD and execute a shell.
- Become root and run fdisk (fdisk /dev/sda/) to make sure that sda is here, exit fdisk with ‘w’. this was essential.
- Now enter all commands from the wizard on the source server tells you (configure network and request the copy process)
- After success (the wizard just copies the data, means I got a 80 GB disk but only 5 GB data on it so it was just a few minutes for the whole process on a gigabit network) just change the boot device to the hard disk and start the VM. Windows will install all needed drivers automatically, just the Intel NIC drivers for e1000 must be loaded from ISO (I got one big driver ISO from Intel containing all NIC drivers).
Конвертация образа диска 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
FreeNAS
Those are the necessary steps to migrate a Ubuntu Bionic VM from FreeNAS 11.2 to Proxmox VE 6.2-1.
The VM in FreeNAS was created with the following parameters
- Boot Loader Type: UEFI
- Guest OS: Ubuntu Bionic
- Disk
- Disk Mode: AHCI
- Zvol: test/ubuntu-1xmtpt
Check the name of your zvol by going to Virtual Machines → Options of the VM ⋮→ Devices → Options of your disk ⋮ → Edit → Zvol
Preparation in FreeNAS
- Create a shared directory in Sharing → Unix (NFS) Shares with path .
- Enable SSH in Services & edit the SSH service (Actions) to allow password login for root
- Copy the zvol to the shared directory
- Log in to FreeNAS via SSH
ssh root@ip.of.your.freenas
- Copy the zvol to the shared directory
dd if=/dev/zvol/test/ubuntu-1xmtpt of=/mnt/test/ubuntu.raw bs=1m
- Log in to FreeNAS via SSH
Importing to Proxmox VE
- Create a virtual machine (here vmid is 103) in Proxmox VE. Make sure to set BIOS to OVMF (this is UEFI).
- Delete the disk that was created in step 1.
- Create a directory
- Mount the shared directory from FreeNAS
sudo mount -t nfs 192.168.31.241:/mnt/test /home/user/freenas
- Import the image of the FreeNAS VM to the Proxmox VE VM as unused disk (vmid 103, storage local)
qm importdisk 103 /home/user/freenas/ubuntu.raw local --format qcow2
- In the GUI of Proxmox VE:
- Go to the hardware view of your new virtual machine
- Set the display to spice
- Double click on the unused disk to attach it and choose Virtio as bus
- Go to the options view of your new virtual machine
- Choose your new virtio disk as bootdisk
Заключение
В начале статьи я сказал, что не встретил готового решения по живому бэкапу kvm. (upd. Уже после публикации статьи мне подсказали готовое решение kvmBackup.) На самом деле это не совсем верно. Есть хорошая готовая сборка на основе kvm — proxmox. Я подробно рассматривал ее в отдельном материале — Установка и настройка proxmox. Но все же это решение конкретного коллектива разработчиков со своими возможностями и ошибками. В проксмокс реализован живой бэкап виртуальных машин из коробки. К сожалению, я не смог быстро найти техническую реализацию их решения. Возможно, все было бы еще проще. Но так тоже ничего получилось.
Важное дополнение в самом конце. Не забывайте проверять возможность восстановления систем из ваших резервных копий
Ведь конечная цель не сделать бэкап, а восстановиться из него!!!