Продолжаю установку ПО (первая часть "Настройка 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" План:
- Ставим необходимые пакеты
- Настраиваем сеть
- Создаем и настраиваем виртуальную машину. Настройка доступа
- Клонируем виртуальные машины до нужного количества (4) и установка уникальных настроек
- Прокидывание диска с хоста в виртуальные машины
Начнем с установки пакетов
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:
Появился новый интерфейс 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:
Теперь создаем новый мост. На этом этапе я потерял много времени. Для этого редактируем файл конфигурации /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: Отключаем проверку, есть ли уже такой образ ВМ. Удобно, если до этого при попытке создания ВМ были ошибки, и вы пытаетесь сделать это снова.
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
Полезные ссылки:
Комментариев нет:
Отправить комментарий