Започвам с уговорката, че ще разгледаме инсталация и настройка на KVM, под Debian базирани системи. В частност ще се докоснем до дистрибуциите Debian и Ubuntu. Правя разлика между двете, защото самата инсталация леко се различава, a работа с KVM не. Също така горещо бих препоръчал филмите на Алексей Нефедьев. За тези които разбират Руски ще е от голяма ползва. За разбиращи английски ето този сайт
QEMU-KVM представлява набор от програми позволяващ виртуализация върху работни станции, лаптопи, сървъри и т.н. под управлени е на операционна система Linux. Преди да започнем със самата инсталация трябва да имаме следните неща: - инсталирана дистрибуция на Linux примерно Debian или Ubuntu, - включена виртуализация на процесора в BIOS-а. Следващото действие е да проверим дали нашия процесор поддържа виртуализация.
# cat /proc/cpuinfo | grep -E 'vmx|svm' -m 1 flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec xsaves arat md_clear flush_l1d arch_capabilities
vmx е да видим дали се поддържа виртуализацията за процесори Intel, a svm е за AMD. 1 е за да се изведе един абзац за съвпадение. Ако няма нито един от двата стринга, значи сте забравили да включите виртуализацията в BIOS.
# apt install qemu-kvm libvirt-bin ovmf
ovmf е ако ще се ползва efi
# apt install virt-manager
virt-manager се ползва ако виртуализацията се прави на десктоп машина. С този тулс графично може да се управлява виртуалната машина. Ако инсталацията е на сървър то това не трябва да се инсталира.
Инсталациите протичат сравнително бързо. Следващото нещо е да се добави потребител в особена група който ще работи с KVM. За начало да проверим дали групата я има:
# cat /etc/group | grep libvirt libvirt:x:115:cccp libvirt-qemu:x:64055:libvirt-qemu libvirt-dnsmasq:x:116:
Групата libvirt в Ubuntu я има и потребителя cccp е член на тази група. Ако работите на десктоп машина, а не на сървър то потребителя с който работите трябва да се добави в тази група, за да може да се ползва графичния менажер. Това става с:
~# adduser cccp libvirt The user `cccp' is already a member of `libvirt'.
Грешката се получи тъй като потребителя вече го има и е член на тази група.
За Debian инсталацията е следната:
# apt install qemu-kvm libvirt-daemon-system ovmf
ovmf е ако ще се ползва efi
virt-manager също може да се инсталира както при Ubuntu.
Същото проверяваме в Debian за потребител в групата.
# cat /etc/group |grep libvirt libvirt:x:113: libvirt-qemu:x:64055:libvirt-qemu
Тука потребителя не е член на групата, затова:
# /usr/sbin/adduser cccp libvirt Adding user `cccp' to group `libvirt' ... Adding user cccp to group libvirt Done.
Да проверим:
# cat /etc/group |grep libvirt libvirt:x:113:cccp libvirt-qemu:x:64055:libvirt-qemu
Вичко е точно. С това приключваме с инсталацията. От тук нататък има два пътя. Единия е за тези които обичат да работят само от шел с команди, а другия е този който обича да ползва графика. Да започнем с шел-а. Ще работим на машината с Ubuntu, a тази с Debian ще я оставим за графична среда. От тук нататък разлика в работата дали с Ubuntu, дали с Debian няма. Работата с шел под която и да е операционна система е една и съща, затова ще говоря вече като цяло.
# virsh Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands 'quit' to quit
Влязохме във виртуалния шел.
virsh # help
Дава информация за всички възможни команди във виртуалния шел.
virsh # net- net-autostart net-dhcp-leases net-info net-undefine net-create net-dumpxml net-list net-update net-define net-edit net-name net-uuid net-destroy net-event net-start
След като напишем net- натискаме два пъти клавиша Tab и се получава горния резултат.
virsh # net-list Name State Autostart Persistent ----------------------------------------------------------------
Показва всички активни мрежови адаптери настроени в текущия хост. В дадения момент няма акктивни мрежови пулове. Да проверим абсолютно всички:
virsh # net-list --all Name State Autostart Persistent ---------------------------------------------------------------- default active no yes
Имаме една default, но не е активна. Информация по мрежовия адаптер може да получим от:
virsh # net-info default Name: default UUID: 57571040-5b2f-4d9b-9c34-51e93048efb4 Active: no Persistent: yes Autostart: no Bridge: virbr0
Накрая не забравяме да въвдедем името на адаптера (default). Да излезем от виртуалния шел и да проверим какви мрежови адаптери имаме.
virsh # quit
Да проверим наличните адаптери.
# ip a
1: lo:
Да се върнем в шела и да настроим мрежа по подразбиране.
# virsh
Да активираме адаптера:
virsh # net-start default error: Failed to start network default error: Requested operation is not valid: network is already active
Това е така защото двата адаптера се препокриват. Физическия ens33 и виртуалния default. Да настроим default.
virsh # net-edit default Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny 4. /bin/ed Choose 1-4 [1]: 1
Избираме текстовия редактор nano да е по подразбиране Редактираме файла.
<ip address='10.25.0.90' netmask='255.255.248.0'> <dhcp> <range start='10.25.0.2' end='10.25.0.254'/> </dhcp> </ip> # Променяме на: <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> </dhcp> </ip>
Така IP адресите няма как да си съвпаднат. Формата на файловете е xml. Стартираме адаптера наново:
virsh # net-start default Network default started
Мрежата успешно е пусната да я видим:
virsh # net-list Name State Autostart Persistent ---------------------------------------------------------- default active no yes
Сега ако рестартираме машината то адаптера няма да се вдигне автоматично. За да се случи всичко това:
virsh # net-autostart default Network default marked as autostarted
virsh # net-list Name State Autostart Persistent ---------------------------------------------------------- default active yes yes
Всичко е наред. Излизаме:
virsh # quit
# ip a
1: lo:
Появиха се два нови интерфейса virbr0 и virbr0-nic. Сега ще се помъчим да създадем нов интерфейс. Да го дефинираме в мрежа която пожелаем. Да го активираме. После да го изтрием. Така ще може за нови виртуални машини да дефинираме мрежови интерфейси. За създаване на нов интерфейс ще ползваме стария за юрнек.
# virsh virsh# net-dumpxml default <network> <name>defaultspan</name> <uuid>57571040-5b2f-4d9b-9c34-51e93048efb4</uuid> <forward mode='nat'> <nat> <port start='1024' end='65535'/> </nat> </forward> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:7c:d1:8b'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> </dhcp> </ip> </network> virsh# quit
Тази команда показа как е дефиниран интерфейса default в xml формат. Да експортнем съдържанието на файла в нов файл. Да го редактираме и да го използваме редактиран за наши цели.
# virsh net-dumpxml default > /root/default.xml
# nano /root/default.xml
# Редактираме файла
<network>
<name>vlan01</name>
<uuid>57571040-5b2f-4d9b-9c34-51e93048efb4</uuid> # Трием реда
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<mac address='52:54:00:7c:d1:8b'/> # Трием реда
<ip address='
Създадохме нов файл /root/default.xml. Нарекохме интерфейса във файла vlan1. Изтрихме идентификатора за уникален номер uuid. Създадохме бридж virb1. Изтрихме му mac адреса, за да си получи нов. Дадохме нов IP адрес. Дефинирахме пула на dhcp-то. Сега да създадем и самия интерфейс използвайки редактирания файл.
# virsh virsh # net-define /root/default.xml Network vlan01 defined from /root/default.xml
Интерфейса е създаден. За пълния синтаксис на командата може да видим чрез:
virsh # net-define --help
Да проверим какво сме създали
virsh # net-list Name State Autostart Persistent ---------------------------------------------------------- default active yes yes vlan01 inactive no yes
Интерфейса vlan01 е създаден но неактивен. Да го активираме:
virsh # net-start vlan01 Network vlan01 started
Да го проверим:
virsh # net-list --all Name State Autostart Persistent ---------------------------------------------------------- default active yes yes vlan01 active no yes virsh # quit
Интерфейса е активен.
# ip a
1: lo:
И тука се вижда. Сега да го унищожим.
# virsh virsh # net-destroy vlan01 Network vlan01 destroyed virsh # net-list --all Name State Autostart Persistent ---------------------------------------------------------- default active yes yes vlan01 inactive no yes
Интефейса е неактивен но не е изчезнал.
virsh # net-undefine vlan01 Network vlan01 has been undefined virsh # net-list --all Name State Autostart Persistent ---------------------------------------------------------- default active yes yes
Изчезна и интерфейса. По принцип интерфейс може да се създаде и с:
virsh # net-create vlan02
Лично аз този начин не го ползвам, защото така създадения интерфейс е временен. Никъде не се записва във файл и като се рестартира системата интерфейса изчезва. Това беше всичко важно за дефиниране и редактиране на интерфейси. В Интернет има много ръководства как да се създават интерфейси ползвайки горе упоменатите команди. Доста често се ползват интерфейси които не са в NAT, а примерно в bridge. До тука с мрежовата част. Сега да се занимаем с пуловете в които се пазят данните за виртуалните машини.
# virsh virsh # pool- pool-autostart pool-define-as pool-event pool-start pool-build pool-delete pool-info pool-undefine pool-create pool-destroy pool-list pool-uuid pool-create-as pool-dumpxml pool-name pool-define pool-edit pool-refresh
Както преди пишем pool- и натискаме два пъти TAB. Получава се горния екран. Можем да видим всички команди които може да ползваме за пулове. Командите са аналогични както при дефениране на мрежа.
virsh # pool-list Name State Autostart -------------------------------------------
Същото се получава ако въведем и:
virsh # pool-list -all Name State Autostart -------------------------------------------
За да се създаде пул трябва да има отделно място където да се помещава. Това може да е отделна директория или специално отделен диск. Принципно има два подхода за запазване на данните за виртуалните машини Те се различават в начина на запазване на данните. Първи: формат четене/запис (COW). Подхожда повече на хора работещи на десктоп машини. Реално се ползва за тестови варианти. Самия метод на запазване на виртуалната машина много напомня на използването на VirtualBox. В отделна папка се записва един файл с данните за виртуалната машина. Там е запазена и самата структура. Втори: (RAW) подхожда за сървъри. може да ползва цял диск и отделен дял от диска. Работи на различни файлови системи, даже на високо ниво като ZFS. Използва технологии като LVM.
Да добавим нов диск в системата. Ще го използваме за запазване на виртуалните машини.
# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 Apr 1 09:29 /dev/sda brw-rw---- 1 root disk 8, 1 Apr 1 09:29 /dev/sda1 brw-rw---- 1 root disk 8, 2 Apr 1 09:29 /dev/sda2 brw-rw---- 1 root disk 8, 16 Apr 1 09:29 /dev/sdb
Имаме диск sdb. Да го разделим.
# parted /dev/sdb (parted) p Error: /dev/sdb: unrecognised disk label Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 32.2GB Sector size (logical/physical): 512B/512B Partition Table: unknown Disk Flags: (parted) mklabel msdos (parted) unit mib (parted) mkpart Partition type? primary/extended? p File system type? [ext2]? Start? 1 End? 10G (parted) p Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 30720MiB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1.00MiB 9537MiB 9536MiB primary ext2 lba (parted) mkpart Partition type? primary/extended? p File system type? [ext2]? Start? 9537 End? 19537 (parted) p Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 30720MiB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1.00MiB 9537MiB 9536MiB primary ext2 lba 2 9537MiB 19537MiB 10000MiB primary ext2 lba (parted) quit
Създадохме два дяла по 10GB. Да тестваме RAW варианта с технологията LVM. Създаваме структурата на LVM.
# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 Apr 1 09:29 /dev/sda brw-rw---- 1 root disk 8, 1 Apr 1 09:29 /dev/sda1 brw-rw---- 1 root disk 8, 2 Apr 1 09:29 /dev/sda2 brw-rw---- 1 root disk 8, 16 Apr 1 09:55 /dev/sdb brw-rw---- 1 root disk 8, 17 Apr 1 09:55 /dev/sdb1 brw-rw---- 1 root disk 8, 18 Apr 1 09:55 /dev/sdb2 # pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created. # vgcreate vg0 /dev/sdb1 Volume group "vg0" successfully created
Създадохе логически том /dev/sdb1 и логическа група vg0. Други никакви логически томове няма да правим. По време на създаване на пуловете ще укажем коя LVM група ще ползваме и толкова. Да дефинираме и другия дял като обикновен дял.
# mkfs.ext4 /dev/sdb2 mke2fs 1.44.1 (24-Mar-2018) Creating filesystem with 2560000 4k blocks and 640848 inodes Filesystem UUID: bb03728e-0fa7-43bb-bd46-0e939c419b6e Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done
След създаване на файловата система може да се създаде отделена папка.
# mkdir /mnt/kvm-disks
Сега да монтираме диска в папката.
# mount /dev/sdb2 /mnt/kvm-disks/ # df -h Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 796M 1.5M 794M 1% /run /dev/sda2 97G 6.2G 86G 7% / tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/loop0 94M 94M 0 100% /snap/core/8935 /dev/loop1 90M 90M 0 100% /snap/core/8268 tmpfs 796M 0 796M 0% /run/user/1000 /dev/sdb2 9.6G 37M 9.1G 1% /mnt/kvm-disks
Всичко е точно. Диска е монтиран. Да се върнем във виртуалния шел и да създадем два пула, които ще съхраняват данните по различен начин.
# virsh virsh # pool-list --all Name State Autostart -------------------------------------------
Пулове нямаме. Създаваме пул с указване на директорията където да се съхраняват данните (/mnt/kvm-disks/) във формата COW.
virsh # pool-define-as --help virsh # pool-define-as --name local --type dir --target /mnt/kvm-disks/ Pool local defined
Пула се казва local. Указваме данните да се записват в директория (--type dir). Директорията където ще се записват данните е /mnt/kvm-disks/.
virsh # pool-list --all Name State Autostart ------------------------------------------- local inactive no
Пула е създаден но е неактивен.
virsh # pool-start local Pool local started
Активирахме пула. Да го направим да се зарежда автоматично със стартиране на машината.
virsh # pool-autostart local Pool local marked as autostarted
Да видим дали е така.
virsh # pool-list Name State Autostart ------------------------------------------- local active yes virsh # quit
Пула е активен и се зарежда автоматично със стартиране на машината. За да е всичко правилно трябва и директорията /mnt/kvm-disks/ да се монтира автоматично със стартиране на системата. Първо да намерим UUID на диска който ще монтираме автоматично.
# blkid /dev/sdb2 /dev/sdb2: UUID="bb03728e-0fa7-43bb-bd46-0e939c419b6e" TYPE="ext4" PARTUUID="0de6baf8-02" # blkid /dev/sdb2 | cut -d ' ' -f 2 UUID="bb03728e-0fa7-43bb-bd46-0e939c419b6e" # blkid /dev/sdb2 | cut -d ' ' -f 2 >> /etc/fstab
С първата команда видяхме информацията за /dev/sdb2. С втората команда отделихме само UUID като стринг. С третата команда записахме UUID-то във файла /etc/fstab. Да редактираме вече самия файл.
# nano /etc/fstab /dev/disk/by-uuid/7817c2ce-7e46-4c97-af04-948b04f8a6f1 / ext4 defaults 0 0 /swap.img none swap sw 0 0 UUID=bb03728e-0fa7-43bb-bd46-0e939c419b6e /mnt/kvm-disks ext4 defaults 0 1
Да проверим всичко дали работи.
# reboot # df -h Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 796M 1.5M 794M 1% /run /dev/sda2 97G 6.2G 86G 7% / tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/loop0 94M 94M 0 100% /snap/core/8935 /dev/loop1 90M 90M 0 100% /snap/core/8268 /dev/sdb2 9.6G 37M 9.1G 1% /mnt/kvm-disks tmpfs 796M 0 796M 0% /run/user/1000
Дяла правилно е монтиран.
# virsh virsh # pool-list --all Name State Autostart ------------------------------------------- local active yes
Пула го има и правилно е активиран. Пула се съхранява като директория. Наподобява работата на VirtualBox. Сега да включим другия формат използващ логическата група на LVM.
virsh # pool-define-as --name vg0 --type logical --source-name vg0 Pool vg0 defined
Създадохме пул vg0. Казва се по същия начин както името на логическта група в LVM. Типа на пула ще е logical. Накрая казваме коя LVM група щe ползваме с разширението --source-name. В случая е vg0.
virsh # pool-list --all Name State Autostart ------------------------------------------- local active yes vg0 inactive no
Новия пул го има и е неактивен. Да го активираме.
virsh # pool-start vg0 Pool vg0 started virsh # pool-autostart vg0 Pool vg0 marked as autostarted virsh # pool-list --all Name State Autostart ------------------------------------------- local active yes vg0 active yes
Вече имаме два пула активни с автоматичен старт. Първия вариант е с запазване на данните във вид на файл в директория. Втория записва данните в логическа структура и там може вече да създава дискове.
Сега може да създаваме твърди дискове в самите пулове
virsh # vol- vol-clone vol-delete vol-key vol-pool vol-create vol-download vol-list vol-resize vol-create-as vol-dumpxml vol-name vol-upload vol-create-from vol-info vol-path vol-wipe
Пишем vol- и натискаме два пъти TAB. Командите отново са аналогични на предните които ползвахме.
virsh # vol-create-as --help virsh # vol-create-as --pool vg0 --name test --capacity 1G Vol test created
Първо дефинирахме пула в който ще е (--pool vg0). След това казахме диска да се казва test. След това указахме капацитета на диска (--capacity 1G). Тъй като диска който създадохме с VLM-а е 10GB то ползвахме само 1GB за виртуалния диск. Да видим какво сме създали.
virsh # vol-list vg0 Name Path ------------------------------------------------------------------------------ test /dev/vg0/test
Освен командата vol-list задължително трябва да укажем в кой дял е. В случая дяла е vg0. И така създадохме виртуален диск. Да излезем от virsh и да видим логическата структура на LVM.
virsh # quit # lvdisplay --- Logical volume --- LV Path /dev/vg0/test LV Name test VG Name vg0 LV UUID Hg831S-WEVX-NHj5-oPqj-iv1P-z4eo-TLmCsx LV Write Access read/write LV Creation host, time ubuntu-kvm, 2020-04-01 23:38:25 +0000 LV Status available # open 0 LV Size 1.00 GiB Current LE 256 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
Наистина има създаден логически дял. Вече този диск може да се дава на виртуалната машина да го ползва като собствен диск. На него може да записва да го форматира и т.н.
# vgdisplay --- Volume group --- VG Name vg0 System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size <9.31 GiB PE Size 4.00 MiB Total PE 2383 Alloc PE / Size 256 / 1.00 GiB Free PE / Size 2127 / <8.31 GiB VG UUID xBQ6gd-m2yP-AN5T-1KHm-SPdt-faa5-0sRyID
Вижда се, че част от VG е използвана. Намаляла е с 1GB, колкото използвахме за създаване на виртуалния диск. Сега да изтрием логическия диск, който създадохме.
# virsh virsh # vol-delete test --pool vg0 Vol test deleted
Препоръка за работа с дискове: - Ако ще се ползва за тестове, то може би е по добре да се слагат дисковете в папка, както при VirtualBox, - Ако ще се слага на сървър, то по добре да се слагат на логически структури. В частност е LVM. Може да се ползва и ZFS. Преди да продължим все пак да създадем виртуален диск, който ще ползваме впоследствие.
# virsh virsh # vol-create-as --name test1-disk1 --pool vg0 --capacity 8G Vol test1-disk1 created virsh # vol-list vg0 Name Path ------------------------------------------------------------------------------ test1-disk1 /dev/vg0/test1-disk1
Сега нека да добавим нов диск към машината. Няма да показвам как създавам логическите групи, това ще се помъчите сами. Прегледайте нагоре как го правихме. Условието е следното: Новия диск да е 77GB. Да има създадена нова логическа група. Или хайде да покажа командите, без обяснение.
# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 Apr 2 00:35 /dev/sda brw-rw---- 1 root disk 8, 1 Apr 2 00:35 /dev/sda1 brw-rw---- 1 root disk 8, 2 Apr 2 00:35 /dev/sda2 brw-rw---- 1 root disk 8, 16 Apr 2 00:35 /dev/sdb brw-rw---- 1 root disk 8, 17 Apr 2 00:35 /dev/sdb1 brw-rw---- 1 root disk 8, 18 Apr 2 00:35 /dev/sdb2 brw-rw---- 1 root disk 8, 32 Apr 2 00:35 /dev/sdc # parted /dev/sdc (parted) mklabel msdos (parted) unit mib (parted) mkpart Partition type? primary/extended? p File system type? [ext2]? Start? 1 End? -1 (parted) quit # ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 Apr 2 00:35 /dev/sda brw-rw---- 1 root disk 8, 1 Apr 2 00:35 /dev/sda1 brw-rw---- 1 root disk 8, 2 Apr 2 00:35 /dev/sda2 brw-rw---- 1 root disk 8, 16 Apr 2 00:35 /dev/sdb brw-rw---- 1 root disk 8, 17 Apr 2 00:35 /dev/sdb1 brw-rw---- 1 root disk 8, 18 Apr 2 00:35 /dev/sdb2 brw-rw---- 1 root disk 8, 32 Apr 2 00:41 /dev/sdc brw-rw---- 1 root disk 8, 33 Apr 2 00:41 /dev/sdc1 # pvcreate /dev/sdc1 # vgcreate vg1 /dev/sdc1
Сега на него да създадем два виртуални диска. Първо създаваме пула после диска.
# virsh virsh # pool-define-as --name vg1 --type logical --source-name vg1 Pool vg1 defined virsh # pool-start vg1 virsh # pool-autostart vg1 virsh # pool-list --all Name State Autostart ------------------------------------------- local active yes vg0 active yes vg1 active yes virsh # vol-create-as --name test1-disk1 --pool vg1 --capacity 8G virsh # vol-create-as --name test2-disk1 --pool vg1 --capacity 24G virsh # quit
Вече може да се създава виртуалната машина.
Пълна информация как се прави виртуална машина може да получим от ман страницата на virt-install. Но за да видим страницата трябва да инсталираме virtinst.
# apt install virtinst -y # man virt-install
За начало ни трябва образ от където да инсталираме операционната система.
# cd /mnt/iso/ /mnt/iso# wget https://tlan.net/nextcloud/index.php/s/sgXdoFQ2frHc6iF/download
И самото създаване на виртуалната машина.
#virt-install --name test1 --vcpus sockets=2,cores=2,threads=2 --memory 4096 --network network=default,model=virtio --graphics spice --video qxl --disk vol=vg1/test1-disk1,cache=none,format=raw --boot hd,cdrom --cdrom=/mnt/iso/ubuntu-17.04-desktop-amd64.iso --virt-type kvm --hvm --sound ac97
--name test1: Име на виртуалната машина. --vcpus sockets=2,cores=2,threads=2: Тип процесор. За процесори Intel се добавя количеството на потока (threads=2). В случая са 2 потока. Значи имаме 2 процесора с 2 ядра с 2 потока, става 8 логически процесора. За виртуални машини Windows е добре да се показват количеството sockets и cores. При Linux може направо да се пише sockets=4 което се равнява на ockets=2,cores=2. threads много рядко се ползва, може би пак за Windows виртуални машини. --memory 4096: Вид памет. Количеството се описва в мегабайти. Указаното се равнява на 4 гигабайта. --network network=default,model=virtio: Вид мрежови интерфейс. model=virtio е за Windows виртуални машини. За Linux модела не е необходимо да се указва. Освен model=virtio може да се ползва model=е1000. Освен това може да се укаже и MAC адреса с ,mac=aa bb cc dd .... Ако MAC-a не се укаже то се просвоява случаен. --graphics spice: SPICE се препоръчва когато се работи с десктоп операционни системи като Windows например. --video qxl: Тип графическа карта. За десктопна версия е хубаво да се постави бърза карта, като qxl. Ако не се постави qxl то се взема карта по подразбиране и Windows ще работи на стандартните видео карти, които ще забавят много. --disk vol=vg1/test1-disk1,cache=none,format=raw: Диска ще е във пул vg1 и ще се ползва диска който създадохме test1-disk1. cache=none казва че няма кеширане. Този параметър не е задължителен той се взема по подразбиране. format=raw също не е задължителен. --boot hd,cdrom: Първо указваме да зареди от HDD, ако не може то тогава да зареди от компактдиска. --cdrom=/mnt/iso/ubuntu-17.04-desktop-amd64.iso: Указваме компактдиска от къде да зареди исо файла. Може да се укаже и физическото устройство --virt-type kvm: Типа на виртуалната машина е kvm. --hvm: Означава, че виртуалната машина е напълно виртуализирана. --sound ac97: Тип звукова карта, не е задължителна. Това е когато използваме RAW формат. Може би ще има проблем когато се администрират сървърите с Windows десктоп машини. В този случай се ползва --graphics vnc. Варианта ще го покажем по къвно. До сега разглеждахме вариант за създаване на виртуална машина на сървър. А сега нека да видим създаване на виртуална машина за тест. Тогава формата ще е COW.
#virt-install --name test1 --vcpus sockets=2,cores=2,threads=2 --memory 4096 --network network=default,model=virtio --graphics spice --video qxl --disk path=/mnt/kvm-disk/test1.img,cache=none,format=qcow2,size=10 --boot hd,cdrom --cdrom=/mnt/iso/ubuntu-17.04-desktop-amd64.iso --virt-type kvm --hvm --sound ac97
Тук формата на диска е format=qcow2 и се зарежда имидж файл от пътя /mnt/kvm-disk/test1.img. Също се указва и размера на диска, примерно size=10. Измервателната единица е гигабайти До тук се използваше BIOS. Да тестваме сега с EFI.
#virt-install --name test2 --vcpus sockets=2,cores=2,threads=2 --memory 4096 --network network=default,model=virtio --graphics spice --video qxl --disk vol=vg1/test2-disk1,cache=none,format=raw,bus=sata --boot hd,cdrom --cdrom=/mnt/iso/ru-en_win8.1-amd64.iso --virt-type kvm --hvm --sound ac97 --boot uefi
format=raw,bus=sata: При Windows задължително се указва типа шина. В случа сме казали да е SATA. За Linux това не е задължително. --boot uefi: няма да е BIOS а ще е EFI Всичко е прекрасно, но много писане. Представете си, че си правите тестове на някаква операционна система. Пускате, не става, трябва ви друга виртуалка от която да тествате друго. Всичко това забава работата. За целта може се направи автоматично създаване на виртуалки чрез скриптове. Да разгледаме този вариант.
# cd /mnt/ # nano start-vm-win.sh sudo qemu-img create -f qcow2 -o preallocation=metadata /var/lib/libvirt/images/vm-rdp.qcow2 30G sudo virt-install \ --connect=qemu:///system \ --virt-type=kvm \ --accelerate \ --hvm \ --vcpus=4 \ --ram=4096 \ --video=cirrus \ --graphics vnc,listen=0.0.0.0,password=cisco \ --noautoconsole \ --network bridge=br20, model=e1000 \ --os-type=windows \ --os-variant=win2k8 \ --boot hd,cdrom,menu=on \ --disk device=disk,bus=ide,chache=none,format=qcow2,path=/var/lib/libvirt/images/vm-03-rdp.qcow2 \ --disk device=disk,bus=virtio,chache=none,format=qcow2,path=/mnt/tmp.qcow2 \ --name=vm-rdp # chmod +x /mnt/starg-vm-win.sh
sudo qemu-img create -f qcow2 -o preallocation=metadata /var/lib/libvirt/images/vm-rdp.qcow2 30G: създава твърд диск 30г в указаната папка Забележете --graphics vnc,listen=0.0.0.0,password=cisco, връзката с виртуалната машина става чрез VNC. Сега вече администраторите с Windows може да работят с виртуалката. Това става като се стартира VNC клиент и за сървър се укаже сървъра където са виртуалните машини, за парола се слага cisco. Ако има отворена вече сесия с VNC, то за следващата сесия трябва да се укаже порт 5901. За още една сесия порта става 5902. Така за всяка нова сесия трябва да се връзва към сървъра с нарастващ порт. Сега да покажем и скрипт за Linux виртуална машина.
# nano /mnt/start-vm-linux.sh sudo qemu-img create -f qcow2 -o preallocation=metadata /var/lib/libvirt/images/hosting.qcow2 20G sudo virt-install \ --connect=qemu:///system \ --virt-type=kvm \ --accelerate \ --hvm \ --vcpus=2 \ --ram=4096 \ --video=cirrus \ --graphics vnc,listen=0.0.0.0,password=cisco \ --noautoconsole \ --network bridge=br10, model=vertio \ --os-type=linux \ --os-variant=auto \ --boot hd,cdrom,menu=on \ --disk device=cdrom,perms=ro,format=raw,path=/mnt/ubuntu-16.04-server-amd64.iso \ --disk device=disk,bus=virtio,chache=none,format=qcow2,path=/var/lib/libvirt/images/hosting.qcow2 \ --name=hosting # chmod +x /mnt/start-vm-linux.sh
Справка за синтаксиса в man virt-install За проверка на какви операционни системи могат да се инсталират
# virt-install --os-variant list
За да се видят кои виртуални машини работят се прави следното.
# virsh virsh # list --all virsh # list
А сега малко полезни команди през виртуалния шел # virsh list: дава информация за стартирани виртуални машини # virsh shutdown freebsd: спира виртуална машина freebsd # virsh shutdown 3: спира третата стартирала виртуална машина # virsh reboot 1: рестартира първата стартирала виртуална машина # virsh dominfo 2: дава информация за втората виртуална машина # virsh nodeinfo: дава информация за нода
До се га разглеждахме създаване на виртуални машини. Ако става въпрос за тестове не е проблем. Обаче ако става въпрос за реална работа тука вече има няколко особености. За начало си представете, че имате 5 стартирали виртуални машини работещи едновременно. Всички те имат мрежови интерфейс свързан като бридж с реалния мрежови интерфейс на машината. Какво става ако на някой от интерфейсите пуснете някакви мултикасти или бродкасти, те ще се предадат и на другите интерфейси. Ще стане пълна каша. Затова добрата практика е всяка виртуална машина да е на отделен VLAN. Всичко зависи от задачите които трябва да изпълнява виртуалната машина, но правилото за отделен VLAN трябва да се има в предвид. Така и така заговорихме за VLAN, да видим как се създава на машината на която ни е KVM-a.
# nano /etc/networks/interfaces auto ens33 # iface ens33 inet static # address 10.25.0.90 # netmask 255.255.248.0 # gateway 10.25.0.1 # dns-nameservers: 8.8.8.8 # dns-search tlan.net # Създаваме VLAN auto ens33.10 iface ens33.10 inet manual vlan-raw-device ens33 auto ens33.20 iface ens33.20 inet manual vlan-raw-device ens33 # Съадаваме бридж auto ens33 iface ens33 inet manual auto br1 iface br1 inet static address 10.25.0.201 netmask 255.255.248.0 gateway 10.25.0.1 dns-nameservers: 8.8.8.8 dns-search tlan.net bridge_ports ens33 bridge-stp off bridge-fd 0 bridge-maxwait 0 auto br10 iface br10 inet manual bridge_ports ens33.10 bridge-stp off bridge-fd 0 bridge-maxwait 0 auto br20 iface br1 inet manual bridge_ports ens33.20 bridge-stp off bridge-fd 0 bridge-maxwait 0
Създадохме три VLAN-а. Първия не го дефинирахме, защото си е самия хипервизор.