Смотрим на кейс, в котором на сервер без полноценного 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.
Установка и настройка.
5. Выполняем установку привычным для нас путём (да, да, через GUI, потому что это действительно просто в данном случае). В процессе мы разбиваем диск, шифруем его при необходимости, настраиваем сеть (статический IP), задаём таймзону и т. п.
6. Как только установка будет завершена, нажимаем на кнопку Reboot, в интефрейсе инсталлятора. При этом, должна будет перезагрузиться, только «виртуальная машина», к которой мы подключены по VNC. Физический сервер продолжает работать, мы всё ещё подключены к нему, и там запущен процесс с портативным qemu.
7. После перезагрузки, мы видим перед собой grub, загружаем установленную систему.
Если диск был зашифрован, на этом этапе система попросит нас ввести пароль для расшифровки.
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 и сделать с сервером всё что нужно.