Смотрим на кейс, в котором на сервер без полноценного IP KVM, нужно было установить свою операционную систему. Делать всё будем с помощью портативной версии qemu.

Исходные данные.

Итак, у нас есть бюджетный сервер в online.net (но метод вполне подойдёт и для других ДЦ, я думаю), к которому есть простейший IPMI. Но подключить к нему виртуальный привод, или попросить ДЦ подключить к серверу USB\дисковод мы не можем (сервер совсем бюджетный). Задача, при этом, стоит простая — установить на сервер свою операционную систему, со своей разбивкой и шифрованием.

Так как KVM нам никто не подключит, rescue и панель нужного функционала не даст, пойдём мы следующим путём — закинем в память сервера бинарник портативного qemu, туда же закинем ISO с установщиком системы. В rescue запустим портативный qemu, подсунем ему образ, и организуем доступ к этой «виртуальной машине» по VNC.

Подготовка.

1. Загружаем сервер в rescue средствами панели датацентра. К слову, можно пробовать работать и из уже установленной ОС, но я предпочёл именно rescue режим.

2. Убеждаемся, что /tmp работает с памятью сервера, а не диском. Загружаем в /tmp всё необходимое (бинарник qemu, iso с установщиком):

# mount | grep "/tmp"
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,relatime)
# wget -qO- /tmp https://sysadmin.pm/vkvm.tar.gz | tar xvz -C /tmp
# wget -P /tmp http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso

3. Запускаем виртуальную машину, которая будет доступна через VNC по сети (в виртуальный cdrom монтируем iso, подключем диск сервера, выделяем 2048 памяти для работы):

# /tmp/qemu-system-x86_64 -net nic -net user,hostfwd=tcp::3389-:3389 -m 2048M -localtime -enable-kvm -cpu host,+nx -M pc -smp 2 -vga std -usbdevice tablet -k en-us -cdrom /tmp/CentOS-7-x86_64-Minimal-1810.iso -hda /dev/sda -boot once=d -vnc :1

4. И заходим на сервер по VNC, удобным для нас клиентом. Адрес для соединения в моём случае (1.2.3.0 — IP сервера) — 1.2.3.0:5901.

портативный qemu

Установка и настройка.

5. Выполняем установку привычным для нас путём (да, да, через GUI, потому что это действительно просто в данном случае). В процессе мы разбиваем диск, шифруем его при необходимости, настраиваем сеть (статический IP), задаём таймзону и т. п.

портативный qemu

6. Как только установка будет завершена, нажимаем на кнопку Reboot, в интефрейсе инсталлятора. При этом, должна будет перезагрузиться, только «виртуальная машина», к которой мы подключены по VNC. Физический сервер продолжает работать, мы всё ещё подключены к нему, и там запущен процесс с портативным qemu.

7. После перезагрузки, мы видим перед собой grub, загружаем установленную систему.

portable qemu

Если диск был зашифрован, на этом этапе система попросит нас ввести пароль для расшифровки.

8. Входим в установленную ОС, и проверяем что бы сеть в ней была настроена корректно (в моём случае это):

  • Статический IP и его настройки указаны в /etc/sysconfig/nework-scripts/ifcfg-ens3
  • Корректный резольвер прописан в /etc/resolv.conf

9. Активируем SSH, для того что бы иметь возможность удалённо подключиться к серверу в будущем.

# systemctl enable sshd.service

Активация консоли.

Продолжаем работать в нашей «виртуальной машине» и активируем критичные для нас сервисы — ssh для удалённого доступа к серверу и серийную консоль. Она потребуется нам для ввода пароля при загрузке сервера. Далее, настройка будет выполнена с учётом рекомендаций online.net, возможно у других провайдеров что-то здесь будет отличаться.

10. Активируем серийную консоль в самой системе:

# systemctl enable getty@ttyS1.service

11. Дополняем конфиг загрузчика, для того что бы и он поддерживал работу с консолью (в противном случае, мы не сможем ввести пароль для расшифровки диска). Итоговый конфиг у меня выглядит так:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --unit=1 --speed=9600 --word=8 --parity=no --stop=1"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/00 rd.luks.uuid=luks-1762b4f1-1e4a-4c23-ba75-6ee04fdcb9ad rhgb console=ttyS1"
GRUB_DISABLE_RECOVERY="true"

Сохраняем /etc/default/grub и генерируем конфиг:

# grub2-mkconfig -o /boot/grub2/grub.cfg

На этом этапе делаем остановку и ещё раз проверяем — на сервере у нас:

  • Должен быть активирован SSH;
  • Должна быть настроена серийная консоль;
  • Должен быть настроен загрузчик;
  • Не должно быть ошибок в конфиге сети.

Если всё сделано верно, и ошибок мы не допустили, отправляем физический сервер на перезагрузку и загружаем его в обычном режиме.

В моём случае, после перезагрузки сервера, в IPMI, который даёт online.net, я получил возможность ввести пароль для разблокировки диска при загрузке сервера, а сам сервер был установлен с нужной мне разбивкой (LVM, который не настроить из панели провайдера).

А если по какой-то причине, с VNC и портативным KVM возиться не хочется, имеет смысл посмотреть на скрипт takeover.sh, который позволяет развернуть ОС в памяти сервера, соединиться с этой ОС по SSH и сделать с сервером всё что нужно.