Сабж. Использовать ключи будет не очень хорошо.
Мы полностью переходим на загрузку по сети, для этого я формирую минимальный образ initramfs чтобы отдать его на загрузку вместе с ядром. Это будет первичное окружение, я его назвал earlyboot. Это первичная ОС размером 45мб вместе с ядром (на основе glibc), которая загружается на сервере.
Скорость передачи образа по PXE около 10мбит, это очень медленно, но для нашего образа earlyboot приемлемо.
После загрузки системы выполняется запуск dhcpcd, sshd и включён логин по паролю root/toor, а после того как система загрузилась, она просто цепляется к сети и сама ничего не делает.
Далее из этого earlyboot нужно получить уже более полноценную систему, и тут есть варианты. Много вариантов.
Вариант всегда загружать уже готовую систему – это не вариант, т.к. мне тупо лень перегенерировать образы под каждую железку, то, о чём я трындел эти три года, мне тупо лень, поэтому я решил, что тот самый конечный образ с системой должен откуда-то подсасываться со стороны после первичной загруженной системы (earlyboot) и переключаться в него.
earlyboot один раз сделал и забыл, пусть даёт доступ к железу по ssh root/toor, дальше мы сами разберёмся, чего нам от железки нужно.
И тут варианты.
-
kexec
-
switch_root
Благодаря тому, что загружена первичая ОС, она имеет полноценную поддержку всех устройств и сетевых карт, а это значит, что следующая загрузка по сети выполняется на все 1000мбит или даже 10000мбит. То есть следом загружаем afterboot, чтобы сделать в него либо kexec (и снова выйти в уже более полноценный initramfs) либо распаковать образ в tmpfs и выполнить switch_root в него из текущей стадии initramfs, получив уже готовую ОС в tmpfs. Способы загрузки, опять же, имеют варианты, можно хоть через torrent распределять нагрузку на корневые ноды.
Но главный вопрос заключается в том, чтобы earlyboot послать команду скачать, откуда скачать и как загрузиться дальше.
Как вы понимаете, я желаю иметь унифицированный earlyboot образ, который не имеет привязки к какому-то ssh-ключу или адресу шлюза, откуда надо качать.
Если, грубо говоря, я в rc.local напишу, curl -s 10.0.0.1/autorun.sh | bash -s
, это будет в корне не правильно, т.к. это ограничивает использование такого earlyboot-образа в рамках подсети 10/8.
Если я в него зашью ssh-ключ только ради того, чтобы автоматизировать логин по ssh для рута, то это тоже хреновое решение. Образ должен оставаться «как есть», своего рода «ванильным».
И возвращаясь к серверу, который загружается в earlyboot образ по PXE, мы имеем доступ к такому серверу по ssh логину и паролю root/toor.
Далее сервер получает IP-адрес от DHCP сервера, что мы видим в логах – новая машина загружена, а значит она доступна по root/toor и ждёт команды. Мы должны эту команду на загрузку ей послать, а уж что там будет, дело десятое.
Я думал альтернативные варианты, например прописать в earlyboot загрузку с веб-сервера, используя адрес шлюза ip route default, но это такое себе решение.
Я думал получать option 66, адрес next-server’а из dhcpd.conf, но dhcpcd -T этого сделать не смог. То есть загружать afterboot-образ с tftp сервера тоже уже не вариант.
Вшивать какой-то посторонний адрес точно не хочу. Вшивать в образ ssh-ключ я не тоже не хочу.
Поэтому единственное приемлемое для меня решения, это чтобы после загрузки сервера, он получая адрес от dhcpd сервера сети, тем самым сообщает нам «я в сети!» и готов принять следующую команду на загрузку по ssh с авторизацией по root/toor.
Весь вопрос в том, дак как же выполнить из скрипта команду на сервере, с авторизацией по паролю?