Комментарии 70
Отличная статья!
Но на бою все окончилось неудачей, сервер не поднялся. Хозяевам сервер оказался не очень нужен, и дело так и заглохло, но у меня осталось ощущение нерешенной задачи.
Я так понял, все что после этого — лишь игры на стенде.
apt-get dist-upgrade, же.
Виртуальный KVM у сервера был, но извне на него попасть было нельзя; у как бы хостера не было лишних IP-адресов, а внутрь его сети попасть было невозможноЕсли например удаленная система стоит за NAT, можно во внутренней сети там поместить хост, который будет устанавливать VPN подключение к вашему внешнему VPN серверу, в таком случае этот хост можно считать «AccessServer'ом», через него можно например подключиться к ilo/ipmi/kvm-админке
Предупреждение! Надо понимать, что все, что мы будем делать — дорога в один конец, при ошибке мы теряем доступ к системе! Вполне возможно, что придется ехать 1500 километров и лезть в шахту, чтобы реанимировать сервер.Если это тестовый сервер для удаленной компиляции «hello world» — не беда, а если продуктовый — то всё же AccessServer надо иметь.
Ух. Самая эпическая трансректальная тонзиллэктомия автогеном, которую я видел. Восхитительно)
В итоге я написал и отладил на виртуалке чудо-скрипт, который сначала самые важные бинарники типа cp сохранял в закромах, потом всё сносил, кроме конфигов, с нуля разворачивал новый мир и ядро, и после этого дёргал прописывание нового бутлоадера. И оно даже отработало само!
Я проделывал такое через dropbear в initramfs. А еще лучше написать какую-нибудь автоматизацию с помощью того же ansible и проверять скрипты в kvm.
Можно сравнить с:
«удаленное конфигурирование файерволла — к дальней дороге» (с) IT-мудрость.
Круто!
Вы сегодня сговорились все =)
Качается нужный Live-CD образ, ставится GRUB, подправляется конфиг, чтоб при старте грузил LiveCD образ.
Дальше перегружаем сервер и коннектимся по ssh в Live-CD.
Дальше уже ставим нужную вам OS.
Если сетевые настройки не по DHCP, то чуть больше шаманства.
Так и было сделано изначально же.
Но на бою все окончилось неудачей, сервер не поднялся. Хозяевам сервер оказался не очень нужен, и дело так и заглохло, но у меня осталось ощущение нерешенной задачи.
warning: your core.img is unusually large. It won't fit in the embedding area.
error: embedding is not possible, but this is required for RAID and LVM install.
fdisk в свою очередь по умолчанию начинает отсчёт с 2048 сектора, чего в полне хватает для grub загрузчика с поддержкой lvm.
1. ставим «новую» систему на swap при помощи debootstrap, настраиваем GRUB, грузимся с неё
2. размечаем диск как хотим
3. копируем со swap-а новую систему на вновь размеченную, перенастраиваем GRUB, грузимся с нового раздела
4. возвращаем swap.
Сам неоднократно проделывал такие операции, единожды терял доступ к новой системе по собственной ошибке (на ssh отключил доступ рута, а нового пользователя не создал)
В истории о которой я писал, было так:
1. Один диск.
2. Система установлена в MBR разделы, без LVM.
3. Необходимо сконфигурировать LVM.
При попытке сделать pvceate на существующий раздел, LVM отвечает, что раздел занят.
Удаление и создание раздела не приводит к резильтату, т.к. ядре не обновляет таблицу разделов т.к. разделы заняты.
Тупик.
Если мы установим систему в свап и перегрузимся, мы придем ровно к первоначальной ситуации.
Как альтернатива:
- локально сделать «эталон» (учитывая специфику железа, особенно контроллер и сеть). Естественно, диск разбить с LVM, но так, чтобы потом можно было растянуть на весь диск;
- используя связку dd/nc залить образ на диск по сети;
- отправить в ребут (можно тем же способом);
- пойти поставить свечку и молиться, чтобы не пришлось заказывать вертолёт до объекта;
- растянуть LVM как требуется;
- перенести приклад.
Очень знакомая тема, выполнялось такое многократно.
Про связь оборвалась — был подобный опыт, выкрутиться можно, но седые волосы появятся.
Думаю, можно консолидировать подходы. Микрочрут в памяти накатить таром, потом отрываем диски, возвращаем, заливаем образ dd, чрутимся в него и делаем grub-install.
Контроля чуть больше.
Желательно менеджмент порт на удаленных площадках. Либо второй хост с PXE и управление питанием.
Упущено сообщение fdisk:
1. The new table will be used at the next reboot or
2. after you run partprobe(8) or kpartx(8).
В итоге пошли на сложные страшности.
# fdisk /dev/sda
Command (m for help): p
Disk /dev/sda: 8 GiB, 8589934592 bytes, 16777216 sectors
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 499711 497664 243M 83 Linux
/dev/sda2 501758 16775167 16273410 7.8G 5 Extended
/dev/sda5 501760 16775167 16273408 7.8G 8e Linux LVM
Command (m for help): d
...
Command (m for help): w
Re-reading the partition table failed.: Device or resource busy
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
# fdisk -l /dev/sda
Disk /dev/sda: 8 GiB, 8589934592 bytes, 16777216 sectors
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 16777215 16775168 8G 8e Linux LVM
# pvcreate /dev/sda1
Cant open /dev/sda1 exclusively. Mounted filesystem?
# apt-get install kpartx parted
# partprobe
Error: Partition(s) 1, 5 on /dev/sda have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use. As a result, the old partition(s) will remain in use. You should reboot now before making further changes.
# kpartx -l /dev/sda
sda1 : 0 16775168 /dev/sda 2048
# kpartx -a /dev/sda
device-mapper: reload ioctl on sda1 failed: Invalid argument
create/reload failed on sda1
# kpartx -f /dev/sda
sda1 : 0 16775168 /dev/sda 2048
# kpartx -fa /dev/sda
device-mapper: reload ioctl on sda1 failed: Invalid argument
create/reload failed on sda1
Разделы открыты на запись и ядро их просто так не отдаст.
Думаю айтишники бы заценили попадись такое в кино ))
Чумовая статья. Читал, затаив дыхание.
А описанный в статье действия, сколько недель суммарно заняли?
в случае отсутвия cd/dvd, они так же поддерживают vnc инсталяцию с загрузкой образа по сети.
А как запустить установку без доступа к апаратной консоли/KVM? Плюс статический реальный IP в чужой сети?
Да, тут вы меня поймали! Мне, по разным причинам, совсем не хотелось с тамошними админами общаться.
Может можно использовать pivot_root
как это делает initrd обычно? Т.е. сделать тоже самое что и initrd только на оборот.
- создаём RAM disk (если нет возможности создать раздел на диске)
pivot_root
внутрь.- подымаем нужные сервисы явно
- гасим все сервисы из старой системы.
- отмонтируем старую файловую систему.
- делаем что хотим с дисками
Вариант с initrd
— кажется более надёжным. Только эксперементировать с загрузкой, наверное, стоит через kexec
. И стоит внутри initrd
сделать какой-то watchdog который перезагрузит систему назад если в течении какого-то времени никто не зайдёт в неё по ssh
. Ну и panic
должен быть указан так чтобы в случае такой ситуации система перезагрузилась.
watchdog
, но я так и не придумал, как обойти вот это:1. Прописываем в груб как пункт по умолчанию ядро и
initrd
установщика. Мы ведь не можем выбрать другой пункт меню груба, у нас же нет доступа к консоли?2. Доступа мы не получаем, срабатывает собака, мы перегружаемся. Но как мы поменяем пункт по умолчанию в грубе? как выбрать при первой перезагрузке один пункт меню, а при второй другой?
Может я чего-то в грубе не раскопал?
watchdog
нужен для загрузки через kexec
. Т.е. grub
вообще не загружается в этом случае. Если загруженная система через kexec
детектится как нерабочая (kernel panic или watchdog
срабатывае), то происходит обычная перезагрузка и grub
загружает обычную систему.
Если всё же хочется через grub
, то во второй версии, вроде по умолчанию запоминается последний выбранный пункт (при включенном GRUB_SAVEDEFAULT
). Скорее всего, как-то связанно с grub-editenv. Наверное, можно и скрипт написать в нём или уже в initrd
.
Но я всегда боюсь трогать grub
. И незнаю почему, но с первой версией grub
'а я чувствовал себя немного уверенее.
Спасибо за статью. Узнал много нового.
А не думали ли вы сделать pivot_root
в tmpfs
? Получили бы корректно примонтированный (но пустой) неиспользуемый диск, не надо на уровне железа развлекаться. По-сути быстро перезагрузились бы в tmpfs
, получили себе как будто LiveCD, но с ssh.
Но мне выше написали про
pivot_root
и kexec
. Буду пробовать.@ioannes спасибо за материал. У меня как раз возникла такая потребность, а у тебя уже готова статья, которая сильно мне помогла.
На ее основе я создал скрипт для автоматизации все этого процесса и переустановки операционных систем в целой сети. Если кому-то будет полезно, то я описал это в своем посте на хабре https://habr.com/ru/post/653693/. Может кому-то пригодится эта автоматизация.
Ссылкой делюсь с целью взаимопомощи, т.к. подумал, что я не один кому это может быть полезно.
Удаленная переустановка Linux по ssh без доступа к консоли