IP-KVM через QEMU

Устранение неисправностей при загрузке операционной системы на серверах без KVM — непростое занятие. Создаем себе KVM-over-IP через образ восстановления и виртуальную машину.

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

Удаленный KVM

Получить доступ к консоли сервера можно с помощью встроенных средств, таких как IPMI или Intel® vPro™, или с помощью внешних устройств, именуемых IP-KVM. Существуют ситуации, в которых все из перечисленных технологий недоступны. Однако, это не конец. Если сервер можно удаленно перезагрузить в образ восстановления на базе операционной системы семейства Linux, то можно быстро организовать KVM-over-IP.

Образ восстановления представляет собой полноценную операционную систему, которая размещается в оперативной памяти. Таким образом, мы можем запускать любое программное обеспечение, в том числе и виртуальные машины (ВМ). То есть можно запустить ВМ, внутри которой будет работать операционная система сервера. Доступ к консоли ВМ может быть организован, например, через VNC.

Для запуска операционной системы сервера внутри ВМ необходимо указать диски сервера в качестве дисков ВМ. В операционных системах семейства Linux физические диски представляются блочными устройствами вида /dev/sdX, с которыми можно работать как с обычными файлами.

Некоторые гипервизоры, такие как QEMU и VirtualBox позволяют хранить данные ВМ в «сыром» виде, то есть только данные хранилища без метаданных гипервизора. Таким образом, ВМ можно запустить с использованием физических дисков сервера.

Подобный способ требует ресурсов на запуск образа восстановления и ВМ внутри него. Однако, при наличии четырех и более гигабайт оперативной памяти это не станет проблемой.

Подготовка окружения

В качестве виртуальной машины можно использовать легковесную и простую программу QEMU, которая чаще всего не является частью образа восстановления, поэтому должна быть установлена отдельно. Образ восстановления, который мы предлагаем клиентам, основан на Arch Linux, в котором используется пакетный менеджер pacman.

Сперва необходимо удостовериться, что образ восстановления использует последнии версии программного обеспечения. Выполнить проверку и обновить все компоненты ОС можно следующей командой:

pacman -Suy

После обновления необходимо установить QEMU. Команда на установку через pacman будет выглядеть так:

pacman -S qemu

Проверим, что qemu установилась корректно:

root@sel-rescue ~ # qemu-system-x86_64 --version
QEMU emulator version 4.0.0
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers

Если все так, то образ восстановления готов к работе.

Запуск виртуальной машины

Сперва необходимо определиться с количеством ресурсов, выделяемых ВМ, и выяснить пути до физических дисков. В нашем случае мы выделим два ядра и два гигабайта оперативной памяти виртуальной машине, а диски находятся по пути /dev/sda и /dev/sdb. Запустим ВМ:

qemu-system-x86_64 \
    -m 2048M \
    -net nic -net user \
    -enable-kvm \
    -cpu host,nx \
    -M pc \
    -smp 2 \
    -vga std \
    -drive file=/dev/sda,format=raw,index=0,media=disk \
    -drive file=/dev/sdb,format=raw,index=1,media=disk \
    -vnc :0,password \
    -monitor stdio

Немного подробнее о том, что значит каждый из параметров:

  • -m 2048M — выделяем 2 ГБ оперативной памяти на ВМ;
  • -net nic -net user — добавляем простое подключение к сети через гипервизор с использованием NAT (Network Address Translation);
  • -enable-kvm — включаем полную виртуализацию KVM (Kernel Virtual Machine);
  • -cpu host — говорим виртуальному процессору получить весь функционал процессора сервера;
  • -M pc — тип оборудования PC;
  • -smp 2 — виртуальный процессор должен быть двухъядерным;
  • -vga std — выбираем стандартную видеокарту, которая не поддерживает большие разрешения экрана;
  • -drive file=/dev/sda,format=raw,index=0,media=disk
    • file=/dev/sdX — путь до блочного устройства, представляющего диск сервера;
    • format=raw — помечаем, что в указанном файле все данные лежат в «сыром» виде, то есть как на диске;
    • index=0 — номер диска, должен увеличиваться для каждого следующего диска на единицу;
    • media=disk — виртуальная машина должна распознать это хранилище как диск;
  • -vnc :0, password — запускаем VNC-сервер по умолчанию на 0.0.0.0:5900, в качестве авторизации используем пароль;
  • -monitor stdio — общение администратора с qemu будет происходить через стандартные потоки ввода-вывода.

Если все в порядке, то запустится QEMU монитор:

QEMU 4.0.0 monitor - type 'help' for more information
(qemu)

Мы указали, что авторизация происходит по паролю, но не указали сам пароль. Сделать это можно отправив команду change vnc password в QEMU-монитор. Важное замечание: пароль не может быть больше восьми символов.

(qemu) change vnc password
Password: ******

После этого мы можем подключиться любым VNC-клиентом, например, Remmina, по IP-адресу нашего сервера с указанным нами паролем.

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

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

По окончании работ необходимо завершить виртуальную машину. Это можно сделать как внутри ОС, подав сигнал на выключение, либо дать команду system_powerdown в QEMU-монитор. Это будет эквивалентно однократному нажатию кнопки выключения: операционная система внутри виртуальной машины плавно завершится.

Установка операционной системы

Виртуальная машина имеет полный доступ к дискам сервера и потому может быть использована для установки операционной системы вручную. Единственное ограничение заключается в количестве оперативной памяти: не всегда ISO-образ можно разместить в оперативной памяти. Выделим в оперативной памяти четыре гигабайта для хранения образа в /mnt:

mount -t tmpfs -o size=4G tmpfs /mnt

Также загрузим установочный образ операционной системы FreeBSD 12.0:

wget -P /mnt ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/12.0/FreeBSD-12.0-RELEASE-amd64-bootonly.iso

Теперь можно запускать ВМ:

qemu-system-x86_64 \
    -m 2048M \
    -net nic -net user \
    -enable-kvm \
    -cpu host,nx \
    -M pc \
    -smp 2 \
    -vga std \
    -drive file=/dev/sda,format=raw,index=0,media=disk \
    -drive file=/dev/sdb,format=raw,index=1,media=disk \
    -vnc :0,password \
    -monitor stdio \
    -cdrom /mnt/FreeBSD-12.0-RELEASE-amd64-bootonly.iso \
    -boot d

Флаг -boot d устанавливает загрузку с CD-привода. Подключаемся VNC-клиентом и видим загрузчик FreeBSD.

Загрузчик FreeBSD.

Так как для доступа в интернет использовалось получение адреса по DHCP, возможно, после настройки будет необходимо загрузиться в только что установленную систему и исправить сетевые настройки. В некоторых случаях может потребоваться установка драйверов сетевого адаптера, так как сетевая карта, установленная в сервере и эмулируемая в ВМ отличаются.

Заключение

Данный способ организации удаленного доступа к консоли сервера потребляет часть ресурсов сервера, однако, не предъявляет никаких особенных требований к аппаратной составляющей сервера, а потому может быть выполнен в практически любых условиях. Использование такого решения позволяет значительно облегчить диагностику программных неисправностей и восстановление работоспособности удаленного сервера.