Pull to refresh

Comments 70

Так гланды еще никто не удалял…

Отличная статья!
Я всё читал и ждал «и вдруг связь оборвалась...»
Но на бою все окончилось неудачей, сервер не поднялся. Хозяевам сервер оказался не очень нужен, и дело так и заглохло, но у меня осталось ощущение нерешенной задачи.

Я так понял, все что после этого — лишь игры на стенде.

Да, все что после — игры на стенде. Больше не было нужды что-то такое сделать.
Это обновит систему, а основной цель был перераспределить место на диске.
Хотя, по-моему, при переходе с Lenny на Squeeze были сложности с конфигурацией сети. За давностью подробностей не помню, но вроде сеть оно внезапно теряло…
Не, не, не. С dist-upgrade проблем не было.
Проблема была в том, что при обновлении ломалась сеть после перезагрузки.
что-то подобное было популярно во времена FreeBSD, например при смене архитектуры i386 -> x86_64
Просто блеск, люблю статьи подобного рода.
Прочитал как детектив, особенно после слов о том, что в случае ошибки надо ехать 1500 км…
не то слово, прочитал как на духу!
Виртуальный KVM у сервера был, но извне на него попасть было нельзя; у как бы хостера не было лишних IP-адресов, а внутрь его сети попасть было невозможно
Если например удаленная система стоит за NAT, можно во внутренней сети там поместить хост, который будет устанавливать VPN подключение к вашему внешнему VPN серверу, в таком случае этот хост можно считать «AccessServer'ом», через него можно например подключиться к ilo/ipmi/kvm-админке
Предупреждение! Надо понимать, что все, что мы будем делать — дорога в один конец, при ошибке мы теряем доступ к системе! Вполне возможно, что придется ехать 1500 километров и лезть в шахту, чтобы реанимировать сервер.
Если это тестовый сервер для удаленной компиляции «hello world» — не беда, а если продуктовый — то всё же AccessServer надо иметь.

Ух. Самая эпическая трансректальная тонзиллэктомия автогеном, которую я видел. Восхитительно)

Я не врач, но даже я восхитился этакому загибу)))
Да не, я прикольнее делал. Надо было обновить OpenBSD с ветки 2.х до 3.0, попутно они поменяли дефолтный формат исполняемых файлов с a.out на elf, то есть новые бинарники не работали со старым ядром и наоборот. Вдогонку, бутлоадер тоже надо было обновить. Всё это было установлено на роутере, который стоял на крыше пятиэтажки, метрах в 300-400 от моего дома.

В итоге я написал и отладил на виртуалке чудо-скрипт, который сначала самые важные бинарники типа cp сохранял в закромах, потом всё сносил, кроме конфигов, с нуля разворачивал новый мир и ядро, и после этого дёргал прописывание нового бутлоадера. И оно даже отработало само!
шедевр админского искусства! Реально читается как детектив)) Спасибо за приоткрытие восхитительный таинств линукса)
Ещё один детектив: https://medium.com/@george.shuklin/my-upgrade-from-i386-to-amd64-and-fix-dpkg-without-dpkg-72c730369912

Я проделывал такое через dropbear в initramfs. А еще лучше написать какую-нибудь автоматизацию с помощью того же ansible и проверять скрипты в kvm.

Для этого даже есть некоторая автоматизация github.com/roginvs/early-ssh — делает ssh внутри initramfs, продолжает загрузку если никто не подключился. Я так несколько раз переносил виртуалки между хостерами — просто заливая fs через rsync
Великолепно!
Можно сравнить с:
«удаленное конфигурирование файерволла — к дальней дороге» (с) IT-мудрость.
Как вариант можно было бы попробовать развернуть debootstrap на сетевом блочном устройстве.
Как раз недавно увидел скрипт takeover.sh. Для желающих повторить описанное в статье.
https://www.opennet.ru/tips/3007_linux_remote_install_ssh_init_busybox_mount.shtml
Вы сегодня сговорились все =)
Это идеи в ноосферу прорываются.
Как все сложно.
Качается нужный Live-CD образ, ставится GRUB, подправляется конфиг, чтоб при старте грузил LiveCD образ.
Дальше перегружаем сервер и коннектимся по ssh в Live-CD.
Дальше уже ставим нужную вам OS.
Если сетевые настройки не по DHCP, то чуть больше шаманства.

Так и было сделано изначально же.


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

Извиняюсь, но вы вообще вступление к посту читали?


На стенде у меня получилось!
Поэтому и я написал — полноценно тестировать.
В статье один общий раздел под lvm создаётся fdisk'ом и это правильно, т.к. если создавать через cfdisk, то он начнёт отсчёт с 63-его сектора из за чего потом grub-install не сможет вам заинсталить загрузчик из за не достаточного места:
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.
Ещё можно qemu использовать для проверки того, не накосячил ли где
Можно проще, идея с хабра:
1. ставим «новую» систему на swap при помощи debootstrap, настраиваем GRUB, грузимся с неё
2. размечаем диск как хотим
3. копируем со swap-а новую систему на вновь размеченную, перенастраиваем GRUB, грузимся с нового раздела
4. возвращаем swap.
Сам неоднократно проделывал такие операции, единожды терял доступ к новой системе по собственной ошибке (на ssh отключил доступ рута, а нового пользователя не создал)
именно так (или почти так) работает depenguinator
Не пройдет.
В истории о которой я писал, было так:
1. Один диск.
2. Система установлена в MBR разделы, без LVM.
3. Необходимо сконфигурировать LVM.

При попытке сделать pvceate на существующий раздел, LVM отвечает, что раздел занят.
Удаление и создание раздела не приводит к резильтату, т.к. ядре не обновляет таблицу разделов т.к. разделы заняты.
Тупик.

Если мы установим систему в свап и перегрузимся, мы придем ровно к первоначальной ситуации.
Ну так перегрузиться после установки системы в swap, не?
Оу, а lvm-то мы не заметили. Извиняюсь, правда ваша
Если нужно просто переставить и переразбить слегка разделы, свап самое то.

Сейчас я без LBM'а Linux не ставлю.
Интересный вариант. Видимо, в шахте особо ограничений на канал нет :)

Как альтернатива:
  1. локально сделать «эталон» (учитывая специфику железа, особенно контроллер и сеть). Естественно, диск разбить с LVM, но так, чтобы потом можно было растянуть на весь диск;
  2. используя связку dd/nc залить образ на диск по сети;
  3. отправить в ребут (можно тем же способом);
  4. пойти поставить свечку и молиться, чтобы не пришлось заказывать вертолёт до объекта;
  5. растянуть LVM как требуется;
  6. перенести приклад.


Очень знакомая тема, выполнялось такое многократно.
Про связь оборвалась — был подобный опыт, выкрутиться можно, но седые волосы появятся.
О, да. так эффективней. Трафик экономится. Но практически нет контроля, нет фидбека от груба, на пример. Шаг в право, шаг в лево, небольшая разница в дисках и все.

Думаю, можно консолидировать подходы. Микрочрут в памяти накатить таром, потом отрываем диски, возвращаем, заливаем образ 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



Разделы открыты на запись и ядро их просто так не отдаст.
Может зависит от версии ядра? На CentOS 6 тоже не работает, зато прекрасно работает на семёрке.
Возможно. У меня Дебиан:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.0 (jessie)
Release:        8.0
Codename:       jessie

$ uname -a
Linux jessie0 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) x86_64 GNU/Linux

Получился отличный сценарий для сцены фильма где хакеру нужно чтото пошаманить.
Думаю айтишники бы заценили попадись такое в кино ))
> местного админа попросить что-то сделать было можно, но занять это могло неделю
А описанный в статье действия, сколько недель суммарно заняли?
а еще все современные дистрибутивы умеют установку по vnc, и это делается в пару строчек.
в случае отсутвия cd/dvd, они так же поддерживают vnc инсталяцию с загрузкой образа по сети.

А как запустить установку без доступа к апаратной консоли/KVM? Плюс статический реальный IP в чужой сети?

В смысле? Это ж стандартная практика. Вы в grub вписываете строчку, которая запускает вместо kernel образ netinstall с ISO диска. netinstall как параметры получает адреса сети и пароли, все запускается и не зависит от потери связи. Ну вот пример для centos 7 http://www.danpros.com/2016/02/how-to-install-centos-7-remotely-using-vnc. Если у вас нет такого образа netinstall, он элементарно делается на основе isolinux с вашего диска.
Ок, следующая статья будет про мою неудавшуюся попытку более подробно.
А точнее про конфигурацию и компиляцию debian-installer'а. Крутейшая вещь!
Просто kvm это реально редкий зверь в мире дешевых хостингов, удаленных серверов в говно-датацентрах и аутсорс-админов. Люди давно подсуетилися, еще лет 5 назад.

Да, тут вы меня поймали! Мне, по разным причинам, совсем не хотелось с тамошними админами общаться.

Может можно использовать pivot_root как это делает initrd обычно? Т.е. сделать тоже самое что и initrd только на оборот.


  1. создаём RAM disk (если нет возможности создать раздел на диске)
  2. pivot_root внутрь.
  3. подымаем нужные сервисы явно
  4. гасим все сервисы из старой системы.
  5. отмонтируем старую файловую систему.
  6. делаем что хотим с дисками

Вариант с 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'а я чувствовал себя немного уверенее.

kexec это, похоже, то что надо!
Обязательно попробую.

И да, grub2 это тот еще монстр. Первый был сильно проще.
А еще лучше lilo!
Мало что понял в силу необразованности, но жутко интересно. :)
Спасибо за статью. Узнал много нового.
UFO just landed and posted this here

А не думали ли вы сделать pivot_root в tmpfs? Получили бы корректно примонтированный (но пустой) неиспользуемый диск, не надо на уровне железа развлекаться. По-сути быстро перезагрузились бы в tmpfs, получили себе как будто LiveCD, но с ssh.

Нет, я был не в курсе таких прекрасных инструментов.
Но мне выше написали про pivot_root и kexec. Буду пробовать.

@ioannes спасибо за материал. У меня как раз возникла такая потребность, а у тебя уже готова статья, которая сильно мне помогла.

На ее основе я создал скрипт для автоматизации все этого процесса и переустановки операционных систем в целой сети. Если кому-то будет полезно, то я описал это в своем посте на хабре https://habr.com/ru/post/653693/. Может кому-то пригодится эта автоматизация.

Ссылкой делюсь с целью взаимопомощи, т.к. подумал, что я не один кому это может быть полезно.

Sign up to leave a comment.

Articles