Если инфорация оказалась интересна и/или полезна, не побрезгуйте, оставьте комментарий ;)

среда, 3 февраля 2021 г.

Запуск KVM из командной строки (консоли) в Ubuntu 20.04 на HPE Synergy SY480 Gen10

Продолжаю установку ПО (первая часть "Настройка FCoE в Ubuntu 20.04 на сервере HPE Synergy SY480 Gen10 с адаптером 3820C. Неофициальное руководство" тут), попутно изучая возможности Linux. Все настройки выполняются на Ubuntu Server 20.04.

Что их себя представляет сервер (хост)? 2 процессора по 12 ядер и гипертретингом, 256 ГБ памяти. У сервера нет монитора, доступ только по сети, либо через удаленную графическую консоль (неудобно) процессора управления iLO

ubuntu-kvm:~$ lscpu
Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   46 bits physical, 48 bits virtual
CPU(s):                          48
On-line CPU(s) list:             0-47
Thread(s) per core:              2
Core(s) per socket:              12
Socket(s):                       2
NUMA node(s):                    4
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           85
Model name:                      Intel(R) Xeon(R) Gold 6126 CPU @ 2.60GHz
Stepping:                        4
CPU MHz:                         1000.612
BogoMIPS:                        5200.00
Virtualization:                  VT-x
L1d cache:                       768 KiB
L1i cache:                       768 KiB
L2 cache:                        24 MiB
L3 cache:                        38.5 MiB
NUMA node0 CPU(s):               0-5,24-29
NUMA node1 CPU(s):               6-11,30-35
NUMA node2 CPU(s):               12-17,36-41
NUMA node3 CPU(s):               18-23,42-47
Vulnerability Itlb multihit:     KVM: Mitigation: Split huge pages
Vulnerability L1tf:              Mitigation; PTE Inversion; VMX conditional cache flushes, SMT vulnerable
Vulnerability Mds:               Mitigation; Clear CPU buffers; SMT vulnerable
Vulnerability Meltdown:          Mitigation; PTI
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp
Vulnerability Spectre v1:        Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:        Mitigation; Full generic retpoline, IBPB conditional, IBRS_FW, STIBP conditional, RSB filling
Vulnerability Srbds:             Not affected
Vulnerability Tsx async abort:   Mitigation; Clear CPU buffers; SMT vulnerable
Flags:                           fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acp
                                 i mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_per
                                 fmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64
                                  monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2
                                 apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetc
                                 h cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin ssbd mba ibrs ibpb stibp
                                 tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bm
                                 2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel
                                 _pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm
                                 _mbm_total cqm_mbm_local dtherm ida arat pln pts pku ospke md_clear flush_l1d

ubuntu-kvm:~$ lsmem
RANGE                                  SIZE  STATE REMOVABLE   BLOCK
0x0000000000000000-0x00000000afffffff  2.8G online       yes    0-21
0x0000000100000000-0x000000403fffffff  253G online       yes 32-2055

Memory block size:       128M
Total online memory:    255.8G
Total offline memory:      0B

Основная стратья, на которую опирался при настройке - "Install And Configure KVM In Ubuntu 20.04 Headless Server" План:

  1. Ставим необходимые пакеты
  2. Настраиваем сеть
  3. Создаем и настраиваем виртуальную машину. Настройка доступа
  4. Клонируем виртуальные машины до нужного количества (4) и установка уникальных настроек
  5. Прокидывание диска с хоста в виртуальные машины

Начнем с установки пакетов

ubuntu-kvm:~$ sudo apt install qemu qemu-kvm libvirt-daemon libvirt-clients libvirt-daemon-system virtinst bridge-utils libvirt-daemon-driver-qemu libvirt-daemon-system-systemd virtinst virt-viewer libosinfo-bin ebtables libguestfs-tools

Проверяем, что libvirtd запущен. На всякий случай делаем ему enable

ubuntu-kvm:~$ sudo systemctl status libvirtd
● libvirtd.service - Virtualization daemon
     Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2021-02-02 15:16:35 UTC; 19h ago
TriggeredBy: ● libvirtd-admin.socket
             ● libvirtd-ro.socket
             ● libvirtd.socket
       Docs: man:libvirtd(8)
             https://libvirt.org
   Main PID: 22676 (libvirtd)
      Tasks: 18 (limit: 32768)
     Memory: 2.6G
     CGroup: /system.slice/libvirtd.service
             └─22676 /usr/sbin/libvirtd
ubuntu-kvm:~$ sudo systemctl enable libvirtd

Теперь сеть. На нее я потратил много времени. Сделал вывод, что нельзя бездумно заниматься копипастом.

@ubuntu-kvm:~$ ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3f0:  mtu 1500 qdisc mq master br0 state UP group default qlen 1000
    link/ether XX:XX:XX:40:03:ef brd ff:ff:ff:ff:ff:ff
........
6: virbr0:  mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether XX:XX:XX:XX:98:9e brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
7 virbr0-nic:  mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:f1:98:9e brd ff:ff:ff:ff:ff:ff
Появился новый интерфейс virbr0:, созданный для KVM. Можно использовать его, но машины будут доступны только с хоста, на котором запущены. Самим виртуальным машинам будет видна внешняя сеть и Интернет через сервер-хост. Если нужен доступ к машинам из внешней сети (той, к которой подключен хост), надо делать мост. Данный порт удаляем. Перед этим отключаем Netfilter. Редактируем или создаем файл /etc/sysctl.d/bridge.conf
ubuntu-kvm:~$ sudo vim /etc/sysctl.d/bridge.conf
В него надо добавить параметры:
net.bridge.bridge-nf-call-ip6tables=0
net.bridge.bridge-nf-call-iptables=0
net.bridge.bridge-nf-call-arptables=0
Создаем файл /etc/udev/rules.d/99-bridge.rules
ubuntu-kvm:~$ sudo vim /etc/udev/rules.d/99-bridge.rules
Добавляем строку
ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", RUN+="/sbin/sysctl -p /etc/sysctl.d/bridge.conf"
Перезагрузите систему

Теперь удаляем интерфейсы

ubuntu-kvm:~$ virsh net-destroy default
Network default destroyed
ubuntu-kvm:~$ virsh net-undefine default
Network default has been undefined
Мне не пригодилось, но автор дает альтернативный метод, если не сработает основной:
ubuntu-kvm:~$ sudo ip link delete virbr0 type bridge
$ sudo ip link delete virbr0-nic
Теперь будет такой набор интерфейсов
ubuntu-kvm:~$ ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3f0:  mtu 1500 qdisc mq master br0 state UP group default qlen 1000
    link/ether XX:XX:XX:40:03:ef brd ff:ff:ff:ff:ff:ff
    inet 10.43.0.199/16 brd 10.43.255.255 scope global br0
       valid_lft forever preferred_lft forever
3: ens3f1:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether XX:XX:XX:XX:03:f2 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::9c4c:e4ff:fe40:3f2/64 scope link
       valid_lft forever preferred_lft forever
4: ens3f2:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether XX:XX:XX:40:03:f0 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::9c4c:e4ff:fe40:3f0/64 scope link
       valid_lft forever preferred_lft forever
5: ens3f3:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether XX:XX:XX:XX:03:f1 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::9c4c:e4ff:fe40:3f1/64 scope link
       valid_lft forever preferred_lft forever
6: ens3f2.3968@ens3f2:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether XX:XX:XX:XX:03:f0 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::9c4c:e4ff:fe40:3f0/64 scope link
       valid_lft forever preferred_lft forever

Теперь создаем новый мост. На этом этапе я потерял много времени. Для этого редактируем файл конфигурации /etc/netplan/00-installer-config.yaml менеджера сетей Netplan. Настоятельно рекомендую предварительно сделать резервную копию.

ubuntu-kvm:~$ sudo cp /etc/netplan/00-installer-config.yaml{,.backup}
Затем
ubuntu-kvm:~$ sudo vim /etc/netplan/00-installer-config.yaml
Автор утверждает, что его файл до правки выглядел так. Мой - по-другом, но копии не сохранилось
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      dhcp4: true
    enp0s8:
      dhcp4: true
    enp0s9:
      dhcp4: true
  version: 2
Прежде чем дать конечный вид файл, несколько замечаний.
  • CЛЕДИТЕ ЗА ПРОБЕЛАМИ. Отступы обязательно должны быть. Они должны быть одинаковыми для параметров одного уровня вложенности
  • Допустим, у меня адрес сервера был 10.43.0.199 и сидел он на интерфейсе ens3f0. Для простоты допустим, что это единсвенный интерфейс. Тогда нужно у ens3f0 IP-адрес забрать, создаваемому мосту br0: отдать. В принципе. все параметры понятны и дополнительных пояснений не требуют.
  • Автор добавляет параметр stp: true. Этот параметр отнял у меня пару вечеров. Я поставил его в свою конфигурацию. Но при каждой активации конфигурации мой порт отваливался, так как образовалась петля. Гугл ничем помочь не смог. Ларчик же просто открывался. При активации STP отправляются BPDU-пакеты. А на Synergy Virtual Connect стоит защита от колец, которая предполагает, что со стороны сервера не может прийти BPDU-пакеты, так как на сервере не может быть их источника. Если же он пришел, это значит, что между двумя портами сервера есть мост (не имеет отношения к мосту для KVM), и все пакеты, приходящие извне на один порт сервера пересылаются на выход через другой порт сервера. Так, конечно, быть не может. Поэтому порт выключается.
Итого мой файл конфигурации сейчас выглядит так:
network:
        version: 2
        renderer: networkd
        ethernets:
                ens3f0:
                    dhcp4: no
                    dhcp6: no
                ens3f1:
                    dhcp4: no
                    dhcp6: no
        bridges:
                br0:
                    interfaces: [ens3f0]
                    addresses: [10.43.0.199/16]
                    routes:
                        - to: default
                          via: 10.43.255.254
                    nameservers:
                        search: [domain.local]
                        addresses: [192.168.143.240,16.110.135.52]
                    mtu: 1500
                    dhcp4: no
                    dhcp6: no
Применяем конфигурацию. Если ошибок нет, перегружаем сервер.
ubuntu-kvm:~$ sudo netplan --debug  generate
DEBUG:command generate: running ['/lib/netplan/generate']
** (generate:88670): DEBUG: 12:04:31.655: Processing input file /etc/netplan/00-installer-config.yaml..
** (generate:88670): DEBUG: 12:04:31.655: starting new processing pass
** (generate:88670): DEBUG: 12:04:31.655: We have some netdefs, pass them through a final round of validation
** (generate:88670): DEBUG: 12:04:31.655: ens3f1: setting default backend to 1
** (generate:88670): DEBUG: 12:04:31.655: Configuration is valid
** (generate:88670): DEBUG: 12:04:31.655: br0: setting default backend to 1
** (generate:88670): DEBUG: 12:04:31.655: Configuration is valid
** (generate:88670): DEBUG: 12:04:31.655: ens3f0: setting default backend to 1
** (generate:88670): DEBUG: 12:04:31.655: Configuration is valid
** (generate:88670): DEBUG: 12:04:31.655: Generating output files..
** (generate:88670): DEBUG: 12:04:31.655: openvswitch: definition ens3f0 is not for us (backend 1)
** (generate:88670): DEBUG: 12:04:31.655: NetworkManager: definition ens3f0 is not for us (backend 1)
** (generate:88670): DEBUG: 12:04:31.655: openvswitch: definition ens3f1 is not for us (backend 1)
** (generate:88670): DEBUG: 12:04:31.655: NetworkManager: definition ens3f1 is not for us (backend 1)
** (generate:88670): DEBUG: 12:04:31.655: openvswitch: definition br0 is not for us (backend 1)
** (generate:88670): DEBUG: 12:04:31.655: NetworkManager: definition br0 is not for us (backend 1)
(generate:88670): GLib-DEBUG: 12:04:31.655: posix_spawn avoided (fd close requested)
(generate:88670): GLib-DEBUG: 12:04:31.655: posix_spawn avoided (fd close requested)
ubuntu-kvm:~$ sudo netplan --debug  apply
** (generate:88684): DEBUG: 12:05:01.871: Processing input file /etc/netplan/00-installer-config.yaml..
** (generate:88684): DEBUG: 12:05:01.871: starting new processing pass
** (generate:88684): DEBUG: 12:05:01.871: We have some netdefs, pass them through a final round of validation
** (generate:88684): DEBUG: 12:05:01.871: ens3f1: setting default backend to 1
** (generate:88684): DEBUG: 12:05:01.871: Configuration is valid
** (generate:88684): DEBUG: 12:05:01.871: br0: setting default backend to 1
** (generate:88684): DEBUG: 12:05:01.872: Configuration is valid
** (generate:88684): DEBUG: 12:05:01.872: ens3f0: setting default backend to 1
** (generate:88684): DEBUG: 12:05:01.872: Configuration is valid
** (generate:88684): DEBUG: 12:05:01.872: Generating output files..
** (generate:88684): DEBUG: 12:05:01.872: openvswitch: definition ens3f0 is not for us (backend 1)
** (generate:88684): DEBUG: 12:05:01.872: NetworkManager: definition ens3f0 is not for us (backend 1)
** (generate:88684): DEBUG: 12:05:01.872: openvswitch: definition ens3f1 is not for us (backend 1)
** (generate:88684): DEBUG: 12:05:01.872: NetworkManager: definition ens3f1 is not for us (backend 1)
** (generate:88684): DEBUG: 12:05:01.872: openvswitch: definition br0 is not for us (backend 1)
** (generate:88684): DEBUG: 12:05:01.872: NetworkManager: definition br0 is not for us (backend 1)
(generate:88684): GLib-DEBUG: 12:05:01.872: posix_spawn avoided (fd close requested)
(generate:88684): GLib-DEBUG: 12:05:01.872: posix_spawn avoided (fd close requested)
DEBUG:netplan generated networkd configuration changed, restarting networkd
DEBUG:ens3f0 not found in {}
DEBUG:ens3f1 not found in {'ens3f0': {'dhcp4': False, 'dhcp6': False}}
DEBUG:br0 not found in {}
DEBUG:Merged config:
network:
  bridges:
    br0:
      addresses:
      - 10.43.0.199/16
      dhcp4: false
      dhcp6: false
      gateway4: 10.43.255.254
      interfaces:
      - ens3f0
      mtu: 1500
      nameservers:
        addresses:
        - 192.168.143.240
        - 16.110.135.52
        search:
        - htcmsw-p.local
  ethernets:
    ens3f0:
      dhcp4: false
      dhcp6: false
    ens3f1:
      dhcp4: false
      dhcp6: false
  renderer: networkd
  version: 2

DEBUG:no netplan generated NM configuration exists
DEBUG:ens3f0 not found in {}
DEBUG:ens3f1 not found in {'ens3f0': {'dhcp4': False, 'dhcp6': False}}
DEBUG:br0 not found in {}
DEBUG:Merged config:
network:
  bridges:
    br0:
      addresses:
      - 10.43.0.199/16
      dhcp4: false
      dhcp6: false
      gateway4: 10.43.255.254
      interfaces:
      - ens3f0
      mtu: 1500
      nameservers:
        addresses:
        - 192.168.143.240
        - 16.110.135.52
        search:
        - htcmsw-p.local
  ethernets:
    ens3f0:
      dhcp4: false
      dhcp6: false
    ens3f1:
      dhcp4: false
      dhcp6: false
  renderer: networkd
  version: 2

DEBUG:Link changes: {}
DEBUG:netplan triggering .link rules for lo
DEBUG:netplan triggering .link rules for ens3f0
DEBUG:netplan triggering .link rules for ens3f1
DEBUG:netplan triggering .link rules for ens3f2
DEBUG:netplan triggering .link rules for ens3f3
DEBUG:netplan triggering .link rules for br0
DEBUG:netplan triggering .link rules for ens3f2.3968
DEBUG:netplan triggering .link rules for vnet1
DEBUG:netplan triggering .link rules for vnet0
DEBUG:ens3f0 not found in {}
DEBUG:ens3f1 not found in {'ens3f0': {'dhcp4': False, 'dhcp6': False}}
DEBUG:br0 not found in {}
DEBUG:Merged config:
network:
  bridges:
    br0:
      addresses:
      - 10.43.0.199/16
      dhcp4: false
      dhcp6: false
      gateway4: 10.43.255.254
      interfaces:
      - ens3f0
      mtu: 1500
      nameservers:
        addresses:
        - 192.168.143.240
        - 16.110.135.52
        search:
        - htcmsw-p.local
  ethernets:
    ens3f0:
      dhcp4: false
      dhcp6: false
    ens3f1:
      dhcp4: false
      dhcp6: false
  renderer: networkd
  version: 2
После перезагрузки проверяем, что наш мост появился
ubuntu-kvm:~$ ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3f0:  mtu 1500 qdisc mq master br0 state UP group default qlen 1000
    link/ether 9e:4c:e4:40:03:ef brd ff:ff:ff:ff:ff:ff
3: ens3f1:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 9e:4c:e4:40:03:f2 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::9c4c:e4ff:fe40:3f2/64 scope link
       valid_lft forever preferred_lft forever
4: ens3f2:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 9e:4c:e4:40:03:f0 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::9c4c:e4ff:fe40:3f0/64 scope link
       valid_lft forever preferred_lft forever
5: ens3f3:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 9e:4c:e4:40:03:f1 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::9c4c:e4ff:fe40:3f1/64 scope link
       valid_lft forever preferred_lft forever
6: br0:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 9e:4c:e4:40:03:ef brd ff:ff:ff:ff:ff:ff
    inet 10.43.0.199/16 brd 10.43.255.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::184e:85ff:fe6d:23ba/64 scope link
       valid_lft forever preferred_lft forever
7: ens3f2.3968@ens3f2:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 9e:4c:e4:40:03:f0 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::9c4c:e4ff:fe40:3f0/64 scope link
       valid_lft forever preferred_lft forever

ubuntu-kvm:~$ brctl show br0
bridge name     bridge id               STP enabled     interfaces
br0             8000.9e4ce44003ef       no              ens3f0

Настраиваем сеть в KVM. Создаем (можно в локальной директории) файл host-bridge.xml:

<network>
  <name>host-bridge</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
</network>
Активируем:
$ virsh net-define host-bridge.xml
ubuntu-kvm:~$ virsh net-start host-bridge
ubuntu-kvm:~$ virsh net-autostart host-bridge
Network host-bridge marked as autostarted

ubuntu-kvm:~$ virsh net-list --all
 Name          State    Autostart   Persistent
------------------------------------------------
 host-bridge   active   yes         yes

С сетью всё. Теперь наконец виртуальные машины.

Пока виртуальных машин у нас нет

ubuntu-kvm:~$ sudo virsh list --all
 Id   Name               State
----------------------------------

Варианты создания новой ВМ.
  • Установка по сети:
    ubuntu-kvm:~$ sudo virt-install --name Ubuntu-20.04-vm1 --ram=2048 --vcpus=2 --cpu host --hvm --disk /var/lib/libvirt/images/ubuntu-20.04-vm1,size=10 --location='http://us.archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/' --network bridge=br0 --nographics --accelerate --check path_in_use=off --os-variant ubuntu20.04 --extra-args 'console=ttyS0'
  • Установка с образа ОС:
    ubuntu-kvm:~$ sudo virt-install --name Ubuntu-20.04-vm1 --ram=2048 --vcpus=2 --cpu host --hvm --disk /var/lib/libvirt/images/ubuntu-20.04-vm1,size=10 --cdrom /home/user/ubuntu-20.04.1-live-server-amd64.iso --network bridge=br0 --graphics vnc,listen=0.0.0.0,password=vnc_password --accelerate --check path_in_use=off --os-variant ubuntu20.04
Кратко о параметрах
  • name: Название создаваемой ВМ ram: Выделяемый объем памяти vcpus: Выделяемое количество ядер cpu host: Оптимизация настройки процессора hvm: Требование аппаратной виртуализации. disk: Файл, где будет хранится образ ВМ cdrom: Путь к образу образа ОС location: путь к образу. может быть адрес в сети или образ ОС (у меня с образом не срослось) network bridge=: Используемая сеть os-variant: Указываем, какую ОС ставим check path_in_use: Отключаем проверку, есть ли уже такой образ ВМ. Удобно, если до этого при попытке создания ВМ были ошибки, и вы пытаетесь сделать это снова.
Значение для параметра os-variant можно выяснить так (если ставим, к примеру, Ubuntu):
ubuntu-kvm:~$ osinfo-query os |grep ubuntu
 ubuntu10.04          | Ubuntu 10.04 LTS                                   | 10.04    | http://ubuntu.com/ubuntu/10.04
 ubuntu10.10          | Ubuntu 10.10                                       | 10.10    | http://ubuntu.com/ubuntu/10.10
 ubuntu11.04          | Ubuntu 11.04                                       | 11.04    | http://ubuntu.com/ubuntu/11.04
 ubuntu11.10          | Ubuntu 11.10                                       | 11.10    | http://ubuntu.com/ubuntu/11.10
 ubuntu12.04          | Ubuntu 12.04 LTS                                   | 12.04    | http://ubuntu.com/ubuntu/12.04
 ubuntu12.10          | Ubuntu 12.10                                       | 12.10    | http://ubuntu.com/ubuntu/12.10
 ubuntu13.04          | Ubuntu 13.04                                       | 13.04    | http://ubuntu.com/ubuntu/13.04
 ubuntu13.10          | Ubuntu 13.10                                       | 13.10    | http://ubuntu.com/ubuntu/13.10
 ubuntu14.04          | Ubuntu 14.04 LTS                                   | 14.04    | http://ubuntu.com/ubuntu/14.04
 ubuntu14.10          | Ubuntu 14.10                                       | 14.10    | http://ubuntu.com/ubuntu/14.10
 ubuntu15.04          | Ubuntu 15.04                                       | 15.04    | http://ubuntu.com/ubuntu/15.04
 ubuntu15.10          | Ubuntu 15.10                                       | 15.10    | http://ubuntu.com/ubuntu/15.10
 ubuntu16.04          | Ubuntu 16.04                                       | 16.04    | http://ubuntu.com/ubuntu/16.04
 ubuntu16.10          | Ubuntu 16.10                                       | 16.10    | http://ubuntu.com/ubuntu/16.10
 ubuntu17.04          | Ubuntu 17.04                                       | 17.04    | http://ubuntu.com/ubuntu/17.04
 ubuntu17.10          | Ubuntu 17.10                                       | 17.10    | http://ubuntu.com/ubuntu/17.10
 ubuntu18.04          | Ubuntu 18.04 LTS                                   | 18.04    | http://ubuntu.com/ubuntu/18.04
 ubuntu18.10          | Ubuntu 18.10                                       | 18.10    | http://ubuntu.com/ubuntu/18.10
 ubuntu19.04          | Ubuntu 19.04                                       | 19.04    | http://ubuntu.com/ubuntu/19.04
 ubuntu19.10          | Ubuntu 19.10                                       | 19.10    | http://ubuntu.com/ubuntu/19.10
 ubuntu20.04          | Ubuntu 20.04                                       | 20.04    | http://ubuntu.com/ubuntu/20.04
 ubuntu4.10           | Ubuntu 4.10                                        | 4.10     | http://ubuntu.com/ubuntu/4.10
 ubuntu5.04           | Ubuntu 5.04                                        | 5.04     | http://ubuntu.com/ubuntu/5.04
 ubuntu5.10           | Ubuntu 5.10                                        | 5.10     | http://ubuntu.com/ubuntu/5.10
 ubuntu6.06           | Ubuntu 6.06 LTS                                    | 6.06     | http://ubuntu.com/ubuntu/6.06
 ubuntu6.10           | Ubuntu 6.10                                        | 6.10     | http://ubuntu.com/ubuntu/6.10
 ubuntu7.04           | Ubuntu 7.04                                        | 7.04     | http://ubuntu.com/ubuntu/7.04
 ubuntu7.10           | Ubuntu 7.10                                        | 7.10     | http://ubuntu.com/ubuntu/7.10
 ubuntu8.04           | Ubuntu 8.04 LTS                                    | 8.04     | http://ubuntu.com/ubuntu/8.04
 ubuntu8.10           | Ubuntu 8.10                                        | 8.10     | http://ubuntu.com/ubuntu/8.10
 ubuntu9.04           | Ubuntu 9.04                                        | 9.04     | http://ubuntu.com/ubuntu/9.04
 ubuntu9.10           | Ubuntu 9.10                                        | 9.10     | http://ubuntu.com/ubuntu/9.10

Второй вариант требует наличия VNC-клиента.
На сервере будет открыта сессия VNC. Для того, чтобы узнать ее номер, надо выполнить команду:

ubuntu-kvm:~$virsh vncdisplay VM1
Полученный номер надо прибать к 5900, чтобы получить нужный порт VNC. А вот в первом мы делаем перенаправление консоли и успешно ставим ОС в текстовом режиме.

После установки надо перенаправить консоль в ВМ. Иначе мы ее опять не будем видеть. Взято тут. Нам потребуется пакет libguestfs-tools. Ставили его в начале статьи. Останавливаем ВМ:

ubuntu-kvm:~$ virsh shutdown Ubuntu-20.04-vm1
Далее монтируем образ ВМ и редактируем:
ubuntu-kvm:~$ sudo mkdir /mnt/vm-volume
ubuntu-kvm:~$ sudo guestmount -d Ubuntu-20.04-vm1 -i /mnt/vm-volume
ubuntu-kvm:~$ sudo vim /mnt/vm-volume/etc/default/grub
И редактируем следующие параметры в файле /mnt/vm-volume/etc/default/grub:
GRUB_CMDLINE_LINUX='console=tty0 console=ttyS0,19200n8'
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1"
Теперь правим файл /mnt/vm-volume/boot/grub/grub.cfg. Ищем пункт загрузочного меню:
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-ecc9accc-d640-47c2-8934-2cf3d5171290' {
        recordfail
        load_video
        gfxmode $linux_gfx_mode
        insmod gzio
        if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
        insmod part_msdos
        insmod ext2
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root  ecc9accc-d640-47c2-8934-2cf3d5171290
        else
          search --no-floppy --fs-uuid --set=root ecc9accc-d640-47c2-8934-2cf3d5171290
        fi
        linux   /boot/vmlinuz-5.4.0-65-generic root=UUID=ecc9accc-d640-47c2-8934-2cf3d5171290 ro console=ttyS0,19200 earlyprint=serial,ttyS0,19200
        initrd  /boot/initrd.img-5.4.0-65-generic
}
Размонтируем образ:
ubuntu-kvm:~$ sudo guestumount /mnt/vm-volume
Запускаем ВМ.
ubuntu-kvm:~$ virsh start Ubuntu-20.04-vm1
ubuntu-kvm:~$ virsh console Ubuntu-20.04-vm1
Когда появится текст Escape character is ^], нажмите несколько раз Enter. Должно появится приглашение авторизоваться
ubuntu-kvm:~$ virsh console Ubuntu-20.04-vm1
Connected to domain Ubuntu-20.04-vm1
Escape character is ^]

ubuntu-vm1 login:
Надо обновить Grub в виртуальной машине. В консоли ВМ надо выполнить команду:
ubuntu-vm1:~$ sudo update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.4.0-65-generic
Found initrd image: /boot/initrd.img-5.4.0-65-generic
done
Теперь ставим в гостевой ОС SSH и настраиваем вход без пароля. Источник. На ВМ ставим SSH:

ubuntu-vm1:~$ sudo apt install ssh vim
На хосте выполняем команды и отвечаем на вопросы:
ubuntu-kvm:~$ mkdir -p $HOME/.ssh
ubuntu-kvm:~$ chmod 0700 $HOME/.ssh
ubuntu-kvm:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa
Your public key has been saved in /home/user/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@ubuntu-vm1
The key's randomart image is:
+---[RSA 3072]----+
|   .o+ .o+oo.    |
|  . o o.o =oo.   |
| . o = o +.+.    |
|  E = o +...     |
|   . + +S=o      |
|    . o.= oo     |
|      .+ +  .    |
|      o+O .      |
|      +=+B.      |
+----[SHA256]-----+
Теперь копируем публичный ключ на ВМ
ubuntu-kvm:~$ ssh-copy-id -f -i ./.ssh/id_rsa.pub  user@10.43.0.201
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "./id_rsa.pub"

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'user@10.43.0.201'"
and check to make sure that only the key(s) you wanted were added.
Пробуем зайти, как рекомендуют. Если пользователи на хосте и в ВМ совпадают, можно указат только IP.
ubuntu-kvm:~$ ssh 'user@10.43.0.201'

Осталось немного. Клонирование ВМ. Гасим исходную ОС, копируем, проверяем, что все удалось, запускаем новую ВМ.

ubuntu-kvm:~$ virsh shutdown Ubuntu-20.04-vm1
Domain Ubuntu-20.04-vm1 is being shutdown

ubuntu-kvm:~$ ubuntu-kvm:~/.ssh$ virt-clone --original Ubuntu-20.04-vm1 --name Ubuntu-20.04-vm99 -f /var/lib/libvirt/images/ubuntu-20.04-vm99
Allocating 'ubuntu-20.04-vm99'                                                                           |  10 GB  00:00:02

Clone 'Ubuntu-20.04-vm99' created successfully.

ubuntu-kvm:~/.ssh$ virsh list --all
 Id   Name                State
------------------------------------
 -    Ubuntu-20.04-vm1    shut off
 -    Ubuntu-20.04-vm99   shut off

ubuntu-kvm:~$ virsh start Ubuntu-20.04-vm99
Domain Ubuntu-20.04-vm99 started

ubuntu-kvm:~/.ssh$ virsh console Ubuntu-20.04-vm99
Connected to domain Ubuntu-20.04-vm99
Escape character is ^]

ubuntu-vm1 login:

Но это еще не всё. Ведь новая машина имеет те же идентификаторы, что и исходная. Надо сделать ее уникальной. Для этого в гостевой ОС выполняем команды:

ubuntu-vm1:~$ sudo hostnamectl
   Static hostname: ubuntu-vm1
         Icon name: computer-vm
           Chassis: vm
        Machine ID: fc200f1b975b4bbaad2ec34b1ca31a66
           Boot ID: 984cc9447b6945a7b8c1e4a343e7ca3b
    Virtualization: kvm
  Operating System: Ubuntu 20.04.2 LTS
            Kernel: Linux 5.4.0-65-generic
      Architecture: x86-64

ubuntu-vm1:~$ sudo hostnamectl set-hostname  ubuntu-vm99

ubuntu-vm1:~$ sudo hostnamectl
   Static hostname: ubuntu-vm99
         Icon name: computer-vm
           Chassis: vm
        Machine ID: fc200f1b975b4bbaad2ec34b1ca31a66
           Boot ID: 984cc9447b6945a7b8c1e4a343e7ca3b
    Virtualization: kvm
  Operating System: Ubuntu 20.04.2 LTS
            Kernel: Linux 5.4.0-65-generic
      Architecture: x86-64
ubuntu-vm1:~$
Также надо отредактировать файл /etc/hosts. В выделенной строке поменять имя и IP-адрес гостевой ОС на новое:
127.0.0.1       localhost
10.43.0.201     ubuntu-vm1.domain.local       ubuntu-vm1
# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
В моем случае будет так
127.0.0.1       localhost
10.43.0.219     ubuntu-vm99.domain.local       ubuntu-vm99
# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Надо еще поменять IP-адрес в настройках Netplan - файл /etc/netplan/01-netcfg.yaml:
ubuntu-vm1:~$ cat /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    enp1s0:
      addresses: [ 10.43.0.219/16 ]
      gateway4: 10.43.255.254
      nameservers:
          search: [ domain.local ]
          addresses:
              - "192.168.143.240"
              - "16.110.135.52"

Если нужно изменить характеристики ВМ. Делается это через редактирование XML-файла настроек. Важно, что память указывается в килобайтах. Память - параметр memory, количество ядер - параметр vcpu, имя ВМ - параметр >name

ubuntu-kvm:~$ sudo virsh edit name_vhost
В этот же файл надо добавить блок подключения тома с СХД, который презентован хосту. Я разбил целый том на 4 части по ожидаемому числу виртуальных машин. Для первой машины это будет том /dev/disk/by-id/dm-name-mpatha-part2. Этот блок надо добавить по соседству с уже имеющимся блоком <disk>.
    <disk type='block' device='disk'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/disk/by-id/dm-name-mpatha-part2'/>
     <target dev='vdd' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
    </disk>
После редакирования надо обновить конфигурацию виртуальной машины. Машина должна быть выключена.
ubuntu-kvm:~$ sudo virsh define /etc/libvirt/qemu/Ubuntu-20.04-vm1.xml

Полезные ссылки:

  1. KVM/Installation
  2. KVM/Managing
  3. KVM/Virsh
  4. How clone a KVM virtual machine on Ubuntu Server
  5. Ubuntu Linux Change Hostname (computer name)
  6. KVM/Managing
  7. KVM/Managing

Комментариев нет: