В жизни системного администратора однажды настает момент, когда приходится с нуля разворачивать инфраструктуру предприятия либо переделывать уже имеющуюся, перешедшую по наследству. В этой статье я расскажу о том, как правильно развернуть гипервизор на основе Linux KVM и libvirt c поддержкой LVM (логических групп).
В этой статье мы коснемся всех тонкостей управления гипервизором, включая консольные и GUI-утилиты, расширение ресурсов и миграцию виртуальных машин на другой гипервизор.
Для начала разберемся с тем, что значит виртуализация.
Что такое виртуализация
Официальное определение звучит так: «Виртуализация — это предоставление набора вычислительных ресурсов или их логического объединения, абстрагированное от аппаратной реализации и обеспечивающее при этом логическую изоляцию друг от друга вычислительных процессов, выполняемых на одном физическом ресурсе». То есть, если выражаться человеческим языком, имея один мощный сервер, мы можем превратить его в несколько средних серверов, и каждый из них будет выполнять свою задачу, отведенную ему в инфраструктуре, не мешая при этом другим.
Системные администраторы, работающие вплотную с виртуализацией на предприятии, мастера и виртуозы своего дела, поделились на два лагеря. Одни — приверженцы высокотехнологичной, но безумно дорогой VMware для Windows. Другие — любители open source и бесплатных решений на основе Linux VM. Можно долго перечислять преимущества VMware, но здесь мы остановимся на виртуализации, основанной на Linux VM.
Технологии виртуализации и требования к железу
Сейчас есть две популярные технологии виртуализации: Intel VT и AMD-V. В Intel VT (от Intel Virtualization Technology) реализована виртуализация режима реальной адресации; соответствующая аппаратная виртуализация ввода-вывода называется VT-d. Часто эта технология обозначается аббревиатурой VMX (Virtual Machine eXtension). В AMD создали свои расширения виртуализации и первоначально называли их AMD Secure Virtual Machine (SVM). Когда технология добралась до рынка, она стала называться AMD Virtualization (сокращенно AMD-V).
Перед тем как вводить аппаратное обеспечение в эксплуатацию, убедись, что оборудование поддерживает одну из этих двух технологий (посмотреть можно в характеристиках на сайте производителя). Если поддержка виртуализации имеется, ее необходимо включить в BIOS перед развертыванием гипервизора.
Вот полезный список процессоров с поддержкой технологии виртуализации.
Среди других требований гипервизоров — поддержка аппаратного RAID (1, 5, 10), которая повышает отказоустойчивость гипервизора при выходе жестких дисков из строя. Если поддержки аппаратного RAID нет, то можно использовать программный на крайний случай. Но RAID — это мастхэв!
Решение, описанное в этой статье, несет на себе три виртуальные машины и успешно работает на минимальных требованиях: Core 2 Quad Q6600 / 8 Гбайт DDR2 PC6400 / 2 × 250 Гбайт HDD SATA (хардверный RAID 1).
Установка и настройка гипервизора
Я покажу, как настраивать гипервизор, на примере Debian Linux 9.6.0 — Х64-86. Ты можешь использовать любой дистрибутив Linux, который тебе по душе.
Когда ты определишься с выбором железа и его наконец-то привезут, придет время ставить гипервизор. При установке ОС все делаем, как обычно, за исключением разметки дисков. Неопытные администраторы часто выбирают опцию «Автоматически разбить все дисковое пространство без использования LVM». Тогда все данные будут записаны на один том, что нехорошо по нескольким причинам. Во-первых, если жесткий диск выйдет из строя, ты потеряешь все данные. Во-вторых, изменение файловой системы доставит массу хлопот.
В общем, чтобы избежать лишних телодвижений и потери времени, рекомендую использовать разметку диска с LVM.
Logical Volume Manager
Менеджер логических томов (LVM) — это подсистема, доступная в Linux и OS/2, построенная поверх Device Mapper. Ее задача — представление разных областей с одного жесткого диска или областей с нескольких жестких дисков в виде одного логического тома. LVM создает из физических томов (PV — Phisical Volumes) логическую группу томов (VG — Volumes Group). Она, в свою очередь, состоит из логических томов (LV — Logical Volume).
Сейчас во всех дистрибутивах Linux с ядром 2.6 и выше есть поддержка LVM2. Для использования LVM2 на ОС с ядром 2.4 надо устанавливать патч.
После того как система обнаружила жесткие накопители, запустится менеджер разбивки жестких дисков. Выбираем пункт Guided — use entire disk and set up LVM.
Теперь выбираем диск, на который будет установлена наша группа томов.
Система предложит варианты разметки носителя. Выбираем «Записать все файлы на один раздел» и идем дальше.
Система оповестит о том, что необходимо сохранить созданные изменения при разметке. Смело соглашаемся, выбрав Yes.
После сохранения изменений мы получим одну логическую группу и два тома в ней. Первый — это корневой раздел, а второй — это файл подкачки. Тут многие зададут вопрос: а почему не выбрать разметку вручную и не создать LVM самому?
Я отвечу просто: при создании логической группы VG загрузочный раздел boot не пишется в VG, а создается отдельным разделом с файловой системой ext2. Если этого не учесть, то загрузочный том окажется в логической группе. Это обречет тебя на мучения и страдания при восстановлении загрузочного тома. Именно поэтому загрузочный раздел отправляется на том без LVM.
Переходим к конфигурации логической группы для гипервизора. Выбираем пункт «Конфигурация менеджера логических томов».
Система оповестит о том, что все изменения будут записаны на диск. Соглашаемся.
Далее в менеджере логических томов удаляем сначала созданные логические тома vg-<hostname>_root и vg-<hostname>_swap. А потом и саму логическую группу vg-<hostname>.
Создадим новую группу — к примеру, назовем ее vg_sata.
В серверах используются носители SATA, SSD, SAS, SCSI, NVMe. Хорошим тоном при создании логической группы будет указывать не имя хоста, а тип носителей, которые используются в группе. Советую логическую группу назвать так: vg_sata, vg_ssd, vg_nvme и так далее. Это поможет понять, из каких носителей построена логическая группа.
Далее выберем место на физическом томе, где будет размещена новая логическая группа. В данном случае спутать физический том не получится: загрузочный раздел помечен файловой системой ext2.
Создаем наш первый логический том. Это будет том для корневого раздела операционной системы. Выбираем пункт «Создать логический том».
Выбираем группу для нового логического тома. У нас она всего одна.
Присваиваем имя логическому тому. Правильнее всего при назначении имени будет использовать префикс в виде названия логической группы — например, vg_sata_root, vg_ssd_root и так далее.
Указываем объем для нового логического тома. Советую выделить под корень 10 Гбайт, но можно и меньше, благо логический том всегда можно расширить.
По аналогии с примером выше создаем следующие логические тома:
- vg_sata_home — 20 Гбайт под каталоги пользователей;
- vg_sata_opt — 10 Гбайт для установки прикладного ПО;
- vg_sata_var — 10 Гбайт для часто меняющихся данных, к примеру логов системы и других программ;
- vg_sata_tmp — 5 Гбайт для временных данных, если объем временных данных велик, можно сделать и больше. В нашем примере этот раздел не создавался за ненадобностью;
- vg_sata_swap — равен объему оперативной памяти. Это раздел для свопа, и создаем мы его для подстраховки — на случай, если закончится оперативная память на гипервизоре.
После создания всех томов завершаем работу менеджера.
Теперь имеем несколько томов для создания разделов операционной системы. Нетрудно догадаться, что для каждого раздела есть свой логический том.
Создаем одноименный раздел под каждый логический том.
Сохраняем и записываем проделанные изменения.
После сохранения изменений разметки диска начнут ставиться базовые компоненты системы, а затем будет предложено выбрать и установить дополнительные компоненты системы. Из всех компонентов нам понадобится ssh-server и стандартные системные утилиты.
После установки будет сформирован и записан на диск загрузчик GRUB. Устанавливаем его на тот физический диск, где сохранен загрузочный раздел, то есть /dev/sda.
Теперь ждем, пока закончится запись загрузчика на диск, и после оповещения перезагружаем гипервизор.
После перезагрузки системы заходим на гипервизор по SSH. Первым делом под рутом устанавливаем нужные для работы утилиты.
1 |
$ sudo apt-get install -y sudo htop screen net-tools dnsutils bind9utils sysstat telnet traceroute tcpdump wget curl gcc rsync |
Настраиваем SSH по вкусу. Советую сразу сделать авторизацию по ключам. Перезапускаем и проверяем работоспособность службы.
1 2 |
$ sudo nano /etc/ssh/sshd_config $ sudo systemctl restart sshd; sudo systemctl status sshd |
Перед установкой софта для виртуализации необходимо проверить физические тома и состояние логический группы.
1 2 |
$ sudo pvscan $ sudo lvs |
Устанавливаем компоненты виртуализации и утилиты для создания сетевого моста на интерфейсе гипервизора.
1 2 |
$ sudo apt-get update; apt-get upgrade -y $ sudo apt install qemu-kvm libvirt-bin libvirt-dev libvirt-daemon-system libvirt-clients virtinst bridge-utils |
После установки настраиваем сетевой мост на гипервизоре. Комментируем настройки сетевого интерфейса и задаем новые:
1 |
$ sudo nano /etc/network/interfaces |
Содержимое будет примерно таким:
1 2 3 4 5 6 7 8 9 10 11 12 |
auto br0 iface br0 inet static address 192.168.1.61 netmask 255.255.255.192 gateway 192.168.1.1 broadcast 192.168.0.61 dns-nameserver 127.0.0.1 dns-search tech-geek.ru bridge_ports enp2s0 bridge_stp off bridge_waitport 0 bridge_fd 0 |
Добавляем нашего пользователя, под которым будем работать с гипервизором, в группы libvirt и kvm (для RHEL группа называется qemu).
1 2 |
$ sudo gpasswd -a iryzhevtsev kvm $ sudo gpasswd -a iryzhevtsev libvirt |
Теперь необходимо инициализировать нашу логическую группу для работы с гипервизором, запустить ее и добавить в автозагрузку при запуске системы.
1 2 3 4 |
$ sudo virsh pool-list $ sudo virsh pool-define-as vg_sata logical --target /dev/vg_sata $ sudo virsh pool-start vg_sata; sudo virsh pool-autostart vg_sata $ sudo virsh pool-list |
Для нормальной работы группы LVM с QEMU-KVM требуется сначала активировать логическую группу через консоль virsh.
Теперь скачиваем дистрибутив для установки на гостевые системы и кладем его в нужную папку.
1 2 |
$ sudo wget https://mirror.yandex.ru/debian-cd/9.5.0/amd64/iso-cd/debian-9.5.0-amd64-netinst.iso $ sudo mv debian-9.5.0-amd64-netinst.iso /var/lib/libvirt/images/; ls -al /var/lib/libvirt/images/ |
Чтобы подключаться к виртуальным машинам по VNC, отредактируем файл /etc/libvirt/libvirtd.conf:
1 |
$ sudo grep "listen_addr = " /etc/libvirt/libvirtd.conf |
Раскомментируем и изменим строчку listen_addr = "0.0.0.0". Сохраняем файл, перезагружаем гипервизор и проверяем, все ли службы запустились и работают.
Чтобы отличить разделы гостевых ОС от разделов гипервизора, рекомендую использовать такое обозначение логических томов: vg_sata_<guestos_hostname>_root. Например: vg_sata_test_root, vg_sata_test_tmp и так далее.
Создание виртуальной машины и управление ей
Создадим диски для новой виртуальной машины из консоли на гипервизоре:
1 2 3 4 5 6 |
$ sudo lvcreate -L 10G -n vg_sata_test_root vg_sata $ sudo lvcreate -L 20G -n vg_sata_test_home vg_sata $ sudo lvcreate -L 10G -n vg_sata_test_opt vg_sata $ sudo lvcreate -L 10G -n vg_sata_test_var vg_sata $ sudo lvcreate -L 5G -n vg_sata_test_tmp vg_sata $ sudo lvcreate -L 2G -n vg_sata_test_swap vg_sata |
Запускаем утилиту screen и в новом скрине создаем новую виртуальную машину следующей командой:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ sudo virt-install \ --connect qemu:///system \ --name=test.tech-geek.local \ --ram 2048 \ --cpu host \ --vcpus 1 \ --disk path=/dev/vg_sata/vg_sata_test_root,format=raw,bus=virtio,cache=none \ --cdrom /var/lib/libvirt/images/debian-9.5.0-amd64-netinst.iso \ --description="debian-test.tech-geek.local" \ --graphics vnc,listen=0.0.0.0,keymap=us,password=12345 \ --os-type=linux \ --os-variant=debiansqueeze \ --network bridge:br0 \ --video=vga \ --hvm \ --accelerate |
Подробную информацию по параметрам установки ВМ можно получить командой virt-install —help.
Отсоединяем на время скрин комбинацией Ctrl + A + D и подключаем созданные нами логические тома к машине нехитрой манипуляцией. Для каждого логического тома новой ВМ создаем такой файл XML.
vg_sata_test_home.xml
1 2 3 4 5 |
<disk type='block' device='disk'> <driver name='qemu' type='raw' cache='none' io='native'/> <source dev='/dev/vg_sata/vg_sata_test_home'/> <backingStore/> <target dev='vdb' bus='virtio'/></disk> |
В теге source указываем местоположение логического тома на гипервизоре, в теге target — название диска (vdb, vdc и так далее). Повторяем для каждого логического тома, кроме root (он уже подключен как vda и активен). После того как все файлы будут созданы, подключим все тома к виртуальной машине:
1 |
$ sudo virsh attach-device --config <имя новой ВМ> vg_sata_<имя ВМ>_<имя раздела>.xml |
Если все сделано правильно, на экране появится сообщение Device attached successfully.
Теперь можно подключаться к машине по VNC и устанавливать ОС, используя, например, krdc или любую другую утилиту. При подключении нужно указать сетевой адрес гипервизора и порт 5900. Проверить, какие порты открыты, можно вот так:
1 2 |
$ sudo netstat -tulnp | grep qemu $ sudo virsh vncdisplay <имя новой ВМ> |
:0 соответствует порту 5900, а :1 — порту 5901.
При установке гостевой системы делаем ручную разметку диска с файловой системой ext4. Каждому разделу выделен свой диск vdX. Загрузчик прописываем в VDA.
В результате всех действий ты получишь рабочую виртуальную машину, которая будет иметь адрес в локальной сети.
Для любителей GUI тоже есть приятная новость. Если ты предпочитаешь работать в «Иксах», то тебе пригодится утилита virt-manager. Ниже я опишу работу с ней в Debian 9 и KDE.
Устанавливаем пакет. После установки запускаем утилиту.
1 |
$ sudo apt-get install -y virt-manager |
Подключаемся к гипервизору по IP, вводим логин и пароль пользователя, который добавлен в группу libvirt на гипервизоре. Связь установлена. Теперь приступаем к созданию и настройке виртуальной машины. После подключения гипервизора кликаем правой кнопкой и выбираем «Добавить новое». Появится окно менеджера создания виртуальных машин.
В окне выбираем «Установка с локального образа» и нажимаем «Далее».
Выбираем «Использовать ISO-образ» и находим его на гипервизоре. Нажимаем «Выбрать образ» и «Далее».
Выставляем параметры ЦП и памяти, жмем «Далее».
Указываем носитель для системы — логический том LVM. Выбираем уже имеющийся пул vg_sata и нажимаем значок «плюс» (добавить). Создаем новый корневой раздел vg_sata_<имя ВМ>_root и указываем объем носителя. Жмем «Финиш».
В последнем окне проверяем настройки сети: ВМ должна использовать сетевой мост. Ставим галку «Конфигурация машины до установки ОС». Жмем «Финиш».
В появившемся окне добавляем остальные созданные логические тома к ВМ через добавление новых девайсов.
После того как все тома будут подключены, нажимаем кнопку «Начать установку» и устанавливаем ОС на новую ВМ.
Расширение ресурсов гипервизора
Для расширения ресурсов на гипервизоре может понадобиться даунтайм. Поэтому машины с гипервизора нужно мигрировать на другой гипервизор. Это касается обновления и расширения ресурсов ЦП и памяти. Исключение — если сервер поддерживает технологию hot-plug, которая позволяет добавлять компоненты, не выключая сервер. С ней можно попробовать провести расширение без даунтайма.
В качестве примера рассмотрим расширение VG. Проверим нашу логическую группу томов.
1 |
$ sudo vgs |
Проверяем доступные диски.
1 |
$ sudo lsblk -l | grep disk |
Необходимо подготовить новый диск под использование LVM.
1 |
$ sudo fdisk /dev/sdb |
Создаем новый физический том.
1 |
$ sudo pvcreate /dev/sdb1 |
Проверяем, что новый физический том создался.
1 |
$ sudo pvscan |
Расширяем группу с помощью нового физического тома.
1 |
$ sudo vgextend vg_sata /dev/sdb1 |
Проверяем, что группа расширена на 116 Гбайт.
1 |
$ sudo pvscan |
1 |
$ sudo pvcreate /dev/sdb1 |
1 |
$ sudo pvscan |
Проверяем, что свободного места стало больше.
1 |
$ sudo vgdisplay | grep "Free PE / Size" |
Можно также при необходимости удалить физический том из логической группы.
1 |
1$ sudo vgreduce vg_sata /dev/sdb1 |
1 |
$ sudo vgdisplay | grep "Free PE / Size" |
Расширение ресурсов виртуальной машины
С виртуальными машинами все примерно так же, как с гипервизором. При расширении ресурсов CPU и RAM необходима перезагрузка ВМ (то есть даунтайм). А с дисками все намного проще: LVM позволяет расширить объем диска на лету, без перезагрузки ВМ.
Расширить ресурсы ВМ можно командой virsh edit <имя ВМ>. Перед изменением конфигурации делаем резервную копию ее конфигурационного файла.
1 |
$ virsh dumpxml <имя ВМ> >> /var/lib/libvirt/images/<имя ВМ>-20181126.xml |
Теперь можно производить расширение ресурсов.
1 |
$ virsh edit <имя ВМ> |
Редактируем следующие параметры:
- <memory unit=KiB>4194304 — общий (максимальный) объем памяти ВМ (в килобайтах);
- <currentMemory unit=KiB>4194304 — объем используемой памяти ВМ (в килобайтах);
- <vcpu placement=static>2 — количество ядер процессора.
После редактирования сохраняем файл конфигурации ВМ. И в самой ВМ завершаем работу:
1 |
$ sudo shutdown -h now |
После выключения ВМ на гипервизоре включаем ВМ с помощью такой команды:
1 |
$ sudo virsh start <имя ВМ> |
Все, ресурсы ЦП и память расширены, можно проверять.
Расширяем диски
Расширение объемов дисков на ВМ достаточно простая операция. Надо просто соблюдать определенную последовательность действий.
Сначала на гипервизоре проверяем, какой раздел будем расширять.
1 |
$ sudo lvs --units g /dev/mapper/vg_sata-vg_sata_pxe_opt |
Теперь расширяем том на нужное количество гигабайтов (это число строго ограничено объемом группы, но его тоже можно расширить).
1 |
$ sudo lvextend -L +5G /dev/vg_sata/vg_sata_pxe_opt |
Убеждаемся, что логический том расширен. Запоминаем значение LSize.
1 |
$ sudo lvs --units k /dev/mapper/vg_sata-vg_sata_pxe_opt |
Увеличить размер блочного устройства можно из консоли virsh.
1 |
$ sudo virsh |
Смотрим список виртуальных машин.
1 |
virsh # list |
Проверяем имеющиеся логические тома на виртуальной машине.
1 |
virsh # domblklist pxe |
Расширяем выбранный том на нужный размер (вспоминаем значение LSize).
1 |
virsh # blockresize pxe --path /dev/vg_sata/vg_sata_pxe_opt --size 26214400 |
Выходим из консоли:
1 |
virsh # quit |
Переходим к настройкам на гостевой ОС. Запрашиваем информацию о состоянии расширяемого раздела:
1 |
$ sudo df -h /opt/ |
Запускаем утилиту parted, вводим информацию о разделе и указываем, какой раздел и насколько увеличить.
1 |
$ sudo parted /dev/vdb |
Чтобы расширить файловую систему на нужном разделе, пишем
1 |
$ sudo resize2fs /dev/vdb1 |
Проверяем состояние раздела, его объем должен стать больше.
1 |
$ sudo df -h /opt/ |
Миграция виртуальной машины на другой гипервизор
Жизнь часто готовит нам сюрпризы. Щедрое руководство может решить обновить парк серверов и списать старые. А иногда может, например, выйти из строя материнская плата на сервере времен крестовых походов.
В любом случае на помощь нам приходит миграция виртуальных машин с одного физического сервера на другой. Но тут встает один вопрос: мы же используем LVM и нам надо копировать блочные устройства. Как это правильно сделать?
Кто-то верно сказал, что любую задачу можно решить командой dd, надо только правильно подобрать параметры. А в совокупности с утилитой nc можно вообще победить вселенское зло. Это как раз и есть наш случай.
Если использовать rsync или scp для копирования по сети, то пока оно будет идти, ты успеешь выйти на пенсию. Утилита nc поможет сохранить наше драгоценное время.
Делаем резервную копию конфига нашей мигрирующей ВМ и выключаем ВМ.
1 |
$ sudo virsh dumpxml test >> /tmp/test-20181128.xml |
Определим объем передаваемых данных. В нашем примере это 57 Гбайт. Не хило, правда?
Заодно убедись, что блочное устройство не занято другими процессами (ВМ должна быть потушена), об этом нам скажет флаг -wi-a-----. Если занято, то там будет -wi-ao----.
1 |
$ sudo lvs --units g | grep vg_sata_test |
Создаем на гипервизоре-получателе логические тома по аналогии с гипервизором-отправителем:
1 |
$ sudo lvcreate -L 10G -n vg_sata_test_root vg_sata |
Передаем файл конфигурации на другой гипервизор. Тут можно использовать и rsync.
1 |
$ sudo rsync -avzP /tmp/test-20181128.xml 192.168.1.52:/tmp/ |
Теперь передаем блочные устройства между двумя гипервизорами. На получателе выполняем такую команду:
1 |
$ sudo nc -l -p 27015 | pv | dd bs=16M of=/dev/vg_sata/vg_sata_test_swap |
На источнике запускаем
1 |
$ sudo dd bs=16M if=/dev/vg_sata/vg_sata_test_swap | nc <ip-адрес получателя> 27015 |
Ждем, пока закончится передача данных и запись блочного устройства в системе. Повторяй операцию для всех логических томов мигрирующей ВМ.
После передачи необходимо инициализировать нашу виртуальную машину, запустить и добавить в автозагрузку.
1 2 3 |
$ sudo virsh create /tmp/test-20181128.xml $ sudo virsh start test $ sudo virsh autostart test |
На этом миграция виртуальной машины закончена!