Управление виртуальными машинами KVM

Команды, приведенные ниже могут требовать от вас рутовых прав. Это зависит от того, под каким пользователем у вас работают ВМ. У меня они работают подо мной, поэтому и рутовых прав не нужно. Мануал на русском по первоначальной установке и настройке KVM на CentOS 7 (Red Hat Enterprise Linux 7).. А здесь пример установки Red Hat Enterprise Linux 8.0 Beta под KVM.

  1. Основные команды для управления виртуальными машинами под KVM
  2. Клонирование виртуальной машины
  3. Подключение носителей (флэшек) к виртуальной машине
  4. Изменение параметров виртуальной машины
  5. Удаление виртуальной машины

Основные команды для управления виртуальными машинами под KVM

Просмотр списка виртуальных машин
virsh list --all

Запуск виртуальной машины, где vm_name – имя машины.
virsh start vm_name

Запуск окна для подключения к виртуальной машине (окно для просмотра/управления самой ОС). Если virt-viewer не запускается…
virt-viewer

Показывает использование cpu/памяти для всех запущенных VM
virt-top

Выключение VM (выключение ОС)
virsh shutdown vm_name

Помечает VM для автостарта (например, после перезагрузки хоста)
virsh autostart vm_name

Убирает метку автостарта (теперь VM не запустится сама после ребута хоста)
virsh autostart --disable vm_name

Информация о VM
virsh dominfo vm_name

Информация о разделах диска VM (займет несколько минут)
virt-df vm_name

Клонирование виртуальной машины

  1. Приостановите VM для клонирования.
    virsh suspend vm
  2. Запустите команду virt-clone:
    virt-clone \
     --connect qemu:///system \
     --original vm \
     --name vm-clone \
     --file /vm-images/vm-clone.img

    Эта операция займет несколько минут в зависимости от размера машины.

  3. По завершению, возобновите работу исходной VM:
    virsh resume vm1
  4. Клонированная машина выключена. При необходимости запустите ее:
    virsh start vm1-clone

Подключение носителей (флэшек) к виртуальной машине

Сначала определите имя вашего устройства после его подключения к хосту. В нашем случае это /dev/sdb. Затем выполните:
virsh attach-disk vm_name /dev/sdb vdb --driver qemu --mode shareable
здесь vdb – имя устройства в VM. Т.е. путь к устройству внутри VM – /dev/vdb.
Устройство можно примонтировать более чем к одной виртуальной машине. Но тут нет контроля доступа на запись, так что последствия могут быть неожиданными.
Для отключения устройства от VM выполните:
virsh detach-disk vm_name vdb

Изменение параметров виртуальной машины

Управление оперативной памятью (добавление/удаление)

Вы можете нагорячую изменять память в VM, не превышая размер, заданный при установке (параметр ram). Например, если вы создали VM с 1 ГБ памяти, вы можете динамически уменьшить этот объем не выключая VM.
Если вы хотите получить объем памяти больший, чем указывали при установке VM, то VM придется сначала отключить.

Начнем с первого варианта. Уменьшим объем памяти нагорячую с 1Гб до 512 Мб.

  1. Посмотрим какой максимум памяти на машине, выполнив
    virsh dominfo vm_name | grep memory или
    virsh dominfo vm_name | grep память
    У меня так:
  2. Устанавливаем необходимое значение памяти в KB ( 512 х 1024 = 524288 ):
    virsh setmem vm_name 524288
  3. Заглядываем в virsh dominfo vm_name и видим, что максимальный объем памяти остался прежним, а используемый изменился на 524288.

Второй вариант. Увеличение объема памяти сверх установленного при создании VM.

  1. Для этого необходимо будет изменить файл конфигурации, а сначала надо погасить машину:
    virsh shutdown vm_name
  2. Правим файл конфигурации. Выполняем:
    virsh edit vm_name
    и изменяем значение (в KB)
    У кого-то это будет:

    <memory>2097152</memory>

    У меня это:

    <memory unit='KiB'>2097152</memory>
    <currentMemory unit='KiB'>2097152</currentMemory>

    Если у вас так же, то 4й шаг не понадобится.
    Для тех, кто не работал с vi: Чтобы начать править файл нажмите кнопку Insert, когда внесете необходимые изменения нажимайте Esc, а затем ZZ (две большие Z). Язык должен стоять английский, иначе редактор команду не поймет.

  3. Перезапускаем виртуальную машину из обновленного файла конфигурации:
    virsh create ~/.config/libvirt/qemu/vm_name.xml, либо
    virsh create /etc/libvirt/qemu/vm_name.xml
  4. Проверяем память. Max.memory должна измениться, а Used Memory могла остаться прежней:
    virsh dominfo vm_name | grep memory
    Если все изменилось – прекрасно. Если нет, то теперь выполняем:
    virsh setmem vm_name 2097152 и у вас тоже все прекрасно.

Изменение количества cpu

  1. Чтобы изменить количество виртуальных процессоров необходимо отредактировать файл конфигурации VM. Для этого сначала гасим нашу машину, потом открываем файл на редактирование:
    virsh shutdown vm_name
    virsh edit vm_name
  2. Далее изменяем количество в тэгах vcpu:
    <vcpu placement='static'>1</vcpu>
  3. Перезапускаем виртуальную машину из обновленного файла конфигурации:
    virsh create ~/.config/libvirt/qemu/vm_name.xml или
    virsh create /etc/libvirt/qemu/vm_name.xml

Управление объемом диска VM (добавление диска к VM)

Мы всегда можем добавить дополнительные “диски” к своей виртуальной машине на KVM. Давайте добавим еще 10 Гб дискового пространства.

  1. Создадим пустой файл на 10 Гб (естественно, путь выбираем свой):
    dd if=/dev/zero of=/vm-images/vm_name-add.img bs=1M count=10240
  2. Выключаем VM
    virsh shutdown vm_name
  3. Добавим дополнительную запись для «диска» в XML-файл виртуальной машины. Удобно скопировать блок с описанием уже существующего диска и отредактировать значения в тегах target и address:
    virsh edit vm_name
    Например у нас было такое описание диска:

     <disk type='file' device='disk'>
     <driver name='qemu' type='raw' cache='none' io='threads'/>
     <source file='/vm-images/vm1.img'/>
     <target dev='vda' bus='virtio'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x04'
    function='0x0'/>
     </disk>

    Мы добавляем после него еще вот такой блок для подключения нашего нового диска:

     <disk type='file' device='disk'>
     <driver name='qemu' type='raw' cache='none' io='threads'/>
     <source file='/vm-images/vm1-add.img'/>
     <target dev='vdb' bus='virtio'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x06'
    function='0x0'/>
     </disk>

    В тэге target мы изменили имя устройства. Оно должно следовать за первым в алфавитном порядке (первый наш диск vda, второй будет vdb).
    В тэге address необходимо использовать уникальный адрес слота (здесь это slot=’0x06′). Проверяйте адрес слота ВСЕХ устройств, а не только дисков.

  4. Перезапустим нашу виртуальную машину с обновленным конфигом XML:
    virsh create /etc/libvirt/qemu/vm1.xml, а может
    virsh create ~/.config/libvirt/qemu/vm_name.xml

Удаление виртуальной машины

  1. Удаляем VM с названием vm-clone. Сначала выключите VM:
    virsh shutdown vm-clone
    Если VM не отвечает, либо не может выключиться, выключите ее принудительно:
    virsh destroy vm-clone
  2. Undefine the VMs configuration:
    virsh undefine vm-clone
  3. Наконец, удалите img-файлы машины.
    rm /vm-images/vm-clone.img


Если virt-viewer не запускается, возможно он не установлен. Установите его, и , заодно, virt-manager можно:

yum install virt-manager virt-viewer

Если virt-viewer ругается, что не может найти виртуальные машины, проверьте с помощью команды virsh list --all, что виртуалки есть и запущены.
virt-viewer при запуске отобразит список запущенных виртуалок:

Как скачать и установить Red Hat Enterprise Linux 8

Не так давно стала доступна для скачивания версия RHEL 8 Beta. Естественно, я не могу пройти мимо нее. Получить в пользование 30-дневную версию RHEL 8 можно по этой ссылке. По данной ссылке доступно два варианта скачивания: для тех кто не имеет платной подписки и для тех у кого она есть. У меня нет. И мой старый аккаунт почему-то не подтянулся, может он уже не активный. Пришлось регистрироваться.
Для начала необходимо иметь или завести (это можно сделать по ссылке выше) девелоперскую учетку. После заполнения всех форм на почту придет письмо для верификации аккаунта. И в ссылке выше выбираем какую версию мы хотим качать, соглашаемся на все и ждем. DVD-образ весит 6,5 Гб.
Пока качается, немного из гайда по установке:

  • Бету нельзя использовать в продакшене. Совсем.
  • У Беты нет гарантийной поддержки.
  • RHEL приветствуют отправку баг-репортов и открыты к взаимодействию.
  • Апгрейды Беты и до Беты не поддерживаются и не рекомендуются.

Образ скачан, я ставлю Red Hat 8 на виртуалке KVM. По своему-же мануалу, проблем не возникло)
Создаю виртуалку и запускаю установку:

virt-install \
--name=RHEL8 \
--ram=1024 --vcpus=1 \
--network bridge:br0 \
--disk path=/home/Lector/vm-images/vm_rhel.img,size=30 \
--cdrom /home/Lector/rhel-8.0-beta-1-x86_64-dvd.iso \
--os-variant=Linux

Если вы ставите RHEL с флэшки, то там иногда возникает проблема – инсталлятор не видит саму флэшку как установочный диск. Люди решают проблему как-то хитро и расово-верно, а я делаю все очень просто: после создания загрузочной флэшки кладу туда еще и сам iso. И потом его выбираю как источник установки.
Появляется привычное окно, жмем Install Red Hat Enterprise Linux 8.0

Выбираем язык, который мы хотим использовать в процессе установки. То ли у меня нет глаз, то ли там действительно нет русского языка.

Получаем сообщение:
“Это предварительно выпущенное программное обеспечение, предназначенное только для разработки и тестирования. * Не * используйте это программное обеспечение для любой критической работы или в продакшене.
Нажав «I want to proceed», вы понимаете и принимаете риски, связанные с предварительно выпущенным ПО, которое вы намерены использовать только для целей тестирования и разработки и готовы сообщать о любых ошибках или проблемах, чтобы улучшить эту работу.
Если вы не понимаете или не принимаете эти риски, пожалуйста, выйдите из этой программы, выбрав «I want to exit» из вашей системы.”
Но мы то все понимаем и выбираем «I want to proceed».

Попадаем в окно настроек, которые можно сделать предварительно. Проблем с секцией LOCALIZATION возникнуть не должно ни у кого. Выбираем настройку клавиатуры, язык и установки даты/времени. Чтобы принять изменение, нажмите кнопку Done в левом верхнем углу.


Переходим к разделу SOFTWARE. В моем случае Installation Source – это local media. Секция Software Selection предлагает выбрать вариант установки. В левой части представлены варианты установки: Minimal Install (сделаю в следующем посте), Custom Operating System, Server и Workstation. Я хочу попробовать Workstation.
В правой части мы видим дополнительные пакеты, которые можно сразу установить. Не хочу греть голову ( это ж не минимал))) и выбираю все. Нажимаем Done.


Дальше секция SYSTEM, которой стоит уделить особое внимание. Состоит из 5ти пунктов:

    1. В разделе Installation Destination можно выбрать разбивку диска. Здесь мы выберем авторазбивку.
    2. KDUMP по умолчанию включен, так и оставлю. KDUMP это механизм аварийного дампа ядра. Когда происходит падение системы, он фиксирует содержимое системной памяти. Это может понадобиться для дальнейшего анализа причины сбоя. Когда KDUMP включен, он резервирует небольшой объем оперативной памяти. Эта часть памяти недоступна для основного ядра.
    3. Дальше Network & HostName. Я предпочитаю настроить и включить все сразу здесь. Переводим переключатель в положение on, жмем кнопку Configure. В моем случае настройки сети приходят по DHCP. Слева внизу можно сразу задать hostname.

    1. Далее идет Security Policy. Их можно вообще отключить, переведя переключатель “Apply security policy” в положение off. Либо щелкнуть на один из профилей и нажать кнопку “Select profile”. Применение политик безопасности не является обязательным. При применении какой-либо политики устанавливается пакет openscap-scanner, как инструмент для проверки соответствия и поиска уязвимостей. После завершения установки система будет отсканирована, отчет о результатах будет сохранен в директории /root/openscap_data .


В разделе System Purpose мы можем выбрать, как будем использовать нашу систему.

Итак. Если мы все выбрали, жмем кнопку Begin Installation. Пока система устанавливается, задаем пароль рута (Root password) и заводим себе пользователя (User Creation). Пользователя сразу можно сделать администратором. Это позволит использовать sudo.

После окончания установки нам станет доступна кнопка Reboot. Жмем и наслаждаемся тем же серым цветом загрузочного экрана, но теперь с цифрой 8.))))

После перезагрузки нас ждет приятный сюрприз. Ось сразу и сама предлагает принять лицензию. Уверенно жмем, что мы согласны и попадаем на логин.

Рабочий стол довольно веселый, стоит гном. Отвечаем на несколько вопросов о настройке и идем тестить нашу ось.

Виртуализация. KVM на CentOS 7 (RHEL 7), простой мануал.

Устанавливаем и настраиваем KVM на CentOS 7. Я поставлю на виртуалку Astra Linux. Хочу просто ознакомиться с этим дистрибутивом.

Сначала посмотрим, поддерживает ли наш проц виртуализацию:

grep -E 'svm|vmx' /proc/cpuinfo

Вывод команды не должен быть пустым.
Установим несколько пакетов, которые не входят в базовую установку RHEL и CentOS 7.

sudo yum -y install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install virt-viewer

Включим сервис libvirtd и добавим его в загрузку (от рута).

sudo systemctl enable libvirtd && systemctl start libvirtd

Сеть. Мы создадим мост br0. Для этого создаем файлик ifcfg-br0.

sudo nano /etc/sysconfig/network-scripts/ifcfg-br0

Примерно следующего содержания:

DEVICE="br0"
BOOTPROTO="dhcp"
ONBOOT="yes"
TYPE="Bridge"
DELAY="0"

А сейчас внимание! После того, как мы создали новый бридж (br0 в нашем случае), для него в файле /etc/qemu-kvm/bridge.conf (в других дистрибутивах может быть несколько иной путь, типа /etc/qemu/bridge.conf) необходимо добавить строку:

allow br0

, а иначе можно получить что-то вроде: “failed to retrieve file descriptor for interface: transport endpoint is not connected” при попытке создания новой гостевой ОС. И мост не поднимется.
Теперь включим перенаправление (network forwarding), в файле /etc/sysctl.conf добавим строку:

net.ipv4.ip_forward = 1

Перечитаем файл и перезапустим сеть:

sudo sysctl -p /etc/sysctl.conf
sudo systemctl restart NetworkManager

Диски и SELinux.
Я буду хранить диски виртуалок в домашнем каталоге, в директории ~/vm-images.

mkdir ~/vm-images

Для управления SELinux установим policycoreutils-python (содержит утилиту semanage):

sudo yum -y install policycoreutils-python

Установим контекст для нашей директории. От рута выполняем:

sudo semanage fcontext --add -t virt_image_t '/home/Lector/vm-images(/.*)?'

Проверим, что контекст создан (1я строка наша):

sudo semanage fcontext -l | grep virt_image_t
/home/Lector/vm-images(/.*)?                        all files          system_u:object_r:virt_image_t:s0 
/var/lib/imagefactory/images(/.*)?                 all files          system_u:object_r:virt_image_t:s0 
/var/lib/libvirt/images(/.*)?                      all files          system_u:object_r:virt_image_t:s0

Далее выполяем:

sudo restorecon -R -v /home/Lector/vm-images

Проверяем, что контекст был изменен:

sudo ls -aZ /home/Lector/vm-images
drwxrwxr-x. Lector Lector unconfined_u:object_r:virt_image_t:s0 .
drwx------. Lector Lector unconfined_u:object_r:user_home_dir_t:s0 ..

Перейдем к созданию виртуальной машины.
Но сначала обязательно проверьте кому принадлежат права на vm-images и при надобности, смените владельца (chown -R user:user some/dir/vm-images). Я создаю машины от имени своего пользователя. (Проверьте, что интерфейс br0 появился)

virt-install \
> --name=astra \
> --ram=1024 \
> --vcpus=1 \
> --network bridge:br0 \
> --disk path=~Lector/vm-images/vmastra.img,size=20 \
> --cdrom ~Lector/Downloads/orel_live_2015030601.iso \
> --os-variant=Linux

Здесь, в принципе, все ясно, но все же:

--name - имя новой машины
--ram - оператива
--vcpus - колическтво виртуальных процессоров
--network - сеть
--disk - место хранения жесткого диска для нашей машины, size - размер в Гб
--cdrom - указываем где лежит файл образа, с которого ставим
--os-variant - тип оси

Также примеры можно посмотреть в мануале, с которого была взята основа. Там же управление, клонирование и прочее. В переводе он не особо нуждается. Еще пример создания машины на сайте Red Hat.