Обновление rescue для облачных серверов: автоматическая конфигурация сети

Новость одним абзацем: rescue initrd (специальный комплект из ядра и initrd) теперь автоматически конфигурируется на ipv4/ipv6 адреса, назначенные облачному серверу и автоматически же запускает ssh-сервер после загрузки.


Как это устроено?


Обычно загрузка виртуальной машины выглядит так: с загрузочного диска виртуальной машины (с его загрузочного раздела) читается grub.cfg/grub.lst, из него выбирается ядро и initrd. Domain builder (специальное приложение, которое создаёт домен при старте виртуальной машины, кладёт туда ядро/initrd, фомирует start page с настройками и добавляет памяти) это ядро загружает и запускает домен.

Дальше ядро уже загружается как в обычном сервере — запускается скрипт инициализации в initrd, который подготавливает корневую файловую систему, делает туда pivot_root (переключение корневого каталога) и запускается уже настоящий init, который читает inittab, запускает систему инициализации system-v или upstart, systemd, кому уж что больше нравится.

Если же возникает проблема: не доступна корневая файловая система, подозрение на взлом, исследование какой-либо проблемы, то может возникнуть необходимость в загрузке альтернативного ядра.

В этом случае ядро, вместо того, чтобы читаться с диска гостевой виртуальной машины, берётся из каталога готовых ядер. Оттуда же берётся и initrd. Гостевая машина запускается «как есть».

Всего у нас есть несколько комплектов ядер и initrd — большая часть из них позволяет запускать обычную систему, но есть несколько специфичных initrd, которые делают что-то полезное, оставаясь «вне» операционной системы.

Это:

Что умеет rescue initrd?


Подробнее мы про него писали сразу после запуска: habrahabr.ru/company/selectel/blog/122667
Вкратце:


Что поменялось?


Теперь rescue initrd сам определяет сетевые настройки. Магии тут никакой — при выставлении аргументов ядра в них дописываются текущие настройки виртуальных машин, а скрипты в initrd получают эти настройки и конфигурируют сеть в соответствии с ними.

Заодно теперь автоматически запускается ssh-сервер.

Есть одна проблема, теоретического решения которой мы не знаем. Это проблема приватного ключа ssh-сервера. Если он поменяется (для того же самого ip-адреса), то ssh-клиент выдаст неприятное предупреждение про «поменявшийся ключ сервера» (а на большинстве ssh-клиентов даже не даст подключиться, пока ключ не будет поменян/удалён в known_hosts).

Вариантов тут несколько:


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

… Или просто использовать консоль.

Использование supload


В состав rescue initrd входит скрипт, позволяющий загружать данные на любое swift-хранилище. Например, на наше облачное хранилище.

Выглядит это так:

supload.sh -u пользователь -k пароль контейнер file.tar.gz


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

Ближайшие перспективы


Копирование публичного ключа пользователя пользователю root в rescue-initrd. Будет реализовано в ближайшие 1-2 обновления.
@amarao
21.05.2013 17:48 UTC
Первоисточник