The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  правила/FAQ  поиск  регистрация  вход/выход  слежка  RSS
"Раздел полезных советов: Удалённая замена одного Linux-дистр..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Удалённая замена одного Linux-дистр..."  +/
Сообщение от auto_tips (ok) on 14-Фев-17, 05:33 
Для решения задачи полной переустановки Linux-дистрибутива на удалённом сервере, к которому имеется только доступ по SSH, подготовлен скрипт
[[https://github.com/marcan/takeover.sh takeover.sh]]. Скрипт создаёт минималистичное рабочее окружение в памяти, состоящее из инструментария busybox и простейшего init-процесса. Подключившись по SSH к данному окружению можно провести переустановку с отмонтированием корневого раздела. В том числе можно выполнить операции полной очистки всех данных или переразбить дисковые разделы.

Скрипт обеспечивает только создание окружения, непосредственно операции по переустановке выполняются вручную, после соединения к созданному окружению по SSH. Скрипт перемонтирует корневой раздел, но не трогает данные, поэтому в случае если что-то пошло не так и вручную не были произведены необратимые изменения для возврата к исходному состоянию достаточно перезагрузить сервер. После завершения установки новой ОС для выхода из созданного окружения и загрузки новой системы достаточно инициировать перезагрузку. Перед выполнением операции на реальном внешнем сервере рекомендуется провести тестовую переустановку с использованием виртуальной машины.

++ Порядок операций:

Создадим директорию с окружением для запуска скрипта (/takeover) и примонтируем к ней раздел tmpfs для хранения нового раздела в оперативной памяти:

   mount -t tmpfs none /takeover

Скопируем в директорию рабочее окружение одного из минималистичных дистрибутивов для восстановления после сбоев, например,  [[https://www.system-rescue-cd.org/ SystemRescueCD]]. После копирования убедимся, что окружение работоспособно при помощи команды:

   chroot /takeover /bin/sh

Скопируем в корень созданного окружения статически собранный вариант пакета
[[https://www.busybox.net/downloads/binaries/1.26.2-defconfig-.../ busybox]] (/takeover/busybox) и проверим его работоспособность:

   /takeover/busybox sh

Скопируем в окружение скрипт [[https://github.com/marcan/takeover.sh/blob/master/takeover.sh takeover.sh]] и простейший init-процесс fakeinit, предварительно скомпилировав его из файла  [[https://github.com/marcan/takeover.sh/blob/master/fakeinit.c fakeinit.c]]:
  
   gcc -static ./fakeinit.c -o ./fakeinit


Отключаем  по возможности все сервисы на переустанавливаемом сервере, убиваем процесс cron и завершаем работу http-сервера (скрипт по умолчанию открывает новый SSH-вход на 80 порту (на 22 порту пока висит старый SSH), поэтому важно, чтобы на этом порту не было обработчиков).

Запускаем /takeover/takeover.sh и выполняем предложенные действия (задаём пароль входа и соглашаемся с продолжением выполнения операции). Далее заходим в новое окружение по SSH:

   ssh -p 80 root@my_host

После входа удаляем все оставшиеся фоновые процессы старой системы и отмонтируем все разделы старой системы из директории /old_root, после чего отмонтируем корень старой системы (/old_root). Предварительно копируем в текущее окружение набор модулей ядра от старой системы /old_root/lib/modules, на случае если они понадобятся в процессе замены старой системы.


Выполняем операции по замене системы, не забываем отмонтировать  дисковые разделы. После завершения работы  перезагужаем систему

   reboot -f
или
   echo b > /proc/sysrq-trigger


Скрипт takeover.sh:

   #!/bin/sh
   set -e

   TO=/takeover
   OLD_TELINIT=/sbin/telinit
   PORT=80

   cd "$TO"

   if [ ! -e fakeinit ]; then
       ./busybox echo "Please compile fakeinit.c first"
       exit 1
   fi

   ./busybox echo "Please set a root password for sshd"

   ./busybox chroot . /bin/passwd

   ./busybox echo "Setting up target filesystem..."
   ./busybox rm -f etc/mtab
   ./busybox ln -s /proc/mounts etc/mtab
   ./busybox mkdir -p old_root

   ./busybox echo "Mounting pseudo-filesystems..."
   ./busybox mount -t tmpfs tmp tmp
   ./busybox mount -t proc proc proc
   ./busybox mount -t sysfs sys sys
   if ! ./busybox mount -t devtmpfs dev dev; then
       ./busybox mount -t tmpfs dev dev
       ./busybox cp -a /dev/* dev/
       ./busybox rm -rf dev/pts
       ./busybox mkdir dev/pts
   fi
   ./busybox mount -t devpts devpts dev/pts

   TTY="$(./busybox tty)"

   ./busybox echo "Checking and switching TTY..."

   exec <"$TO/$TTY" >"$TO/$TTY" 2>"$TO/$TTY"

   ./busybox echo "Type 'OK' to continue"
   ./busybox echo -n "> "
   read a
   if [ "$a" != "OK" ] ; then
       exit 1
   fi

   ./busybox echo "Preparing init..."
   ./busybox cp $OLD_TELINIT tmp/telinit
   ./busybox cat >tmp/init <<EOF
   #!${TO}/busybox sh
   exec <"${TO}/${TTY}" >"${TO}/${TTY}" 2>"${TO}/${TTY}"
   cd "${TO}"
   ./busybox echo "Init takeover successful"
   ./busybox echo "Pivoting root..."
   ./busybox pivot_root . old_root
   ./busybox echo "Chrooting and running init..."
   exec ./busybox chroot . /fakeinit
   EOF
   ./busybox chmod +x tmp/init
  
   ./busybox echo "Starting secondary sshd"
  
   ./busybox chroot . /usr/bin/ssh-keygen -A
   ./busybox chroot . /usr/sbin/sshd -p $PORT

   ./busybox echo "You should SSH into the secondary sshd now."
   ./busybox echo "Type OK to continue"
   ./busybox echo -n "> "
   read a
   if [ "$a" != "OK" ] ; then
       exit 1
   fi

   ./busybox echo "About to take over init. This script will now pause for a few seconds."
   ./busybox echo "If the takeover was successful, you will see output from the new init."
   ./busybox echo "You may then kill the remnants of this session and any remaining"
   ./busybox echo "processes from your new SSH session, and umount the old root filesystem."

   ./busybox mount --bind tmp /sbin

   ./tmp/telinit u

   ./busybox sleep 10

init-процесс fakeinit.c


   #define _XOPEN_SOURCE 700
   #include <signal.h>
   #include <unistd.h>
   #include <sys/wait.h>

   int main()
   {
    sigset_t set;
    int status, i;

    for (i = 0; i < 64; i++)
        close(i);

    if (getpid() != 1) return 1;

    sigfillset(&set);
    sigprocmask(SIG_BLOCK, &set, 0);

    for (;;) wait(&status);
   }


URL: https://github.com/marcan/takeover.sh http://unix.stackexchange.com/questions/226872/how-to-shrink...
Обсуждается: http://www.opennet.ru/tips/info/3007.shtml

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +1 +/
Сообщение от _KUL (ok) on 14-Фев-17, 05:33 
Очень интересно, но очень страшно. Как в одной примете "удалённая перенастройка сервера, - это к долгой дороге".
Мне кажется, безопаснее было бы взять live-дистрибутив, подправить сетевые настройки/ssh, и образ grub'y 2 скормить на загрузку live-iso по умолчанию.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

8. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от Аноним (??) on 16-Фев-17, 23:22 
А если нет груба? Если там какой-нибудь VZ или LXC,
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

14. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от nur (ok) on 25-Фев-17, 10:26 
если там какой нибуть VZ, то есть вероятность что не заменится совсем никак, OpenVZ умеет запускать только системы на том же ядре что и хост, к примеру FreeBSD туда не воткнешь уже

а вообще для эксперимента можно сперва тренироваться на кошках^W тестовом сервере
(что впрочем не гарантирует результата на сервере вашего продакшна)

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

9. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от vitalif (ok) on 18-Фев-17, 18:35 
Я так делал руками как в посте описано примерно)))) основной фокус это заменить на ходу init, чтобы он дал / отмонтировать. Хотя можно и без этого, вообще-то можно просто поставить в дебиане busybox и dropbear, и в процессе загрузки туда залогиниться.

Но там цель была именно на / переделать ФС и мдадм рейд переразбить, а не дистр переустановить. Для переустановки я бы конечно что то попроще придумал))

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

2. "Раздел полезных советов: Удалённая замена одного Linux-дистр..."  +/
Сообщение от Andrey Mitrofanov on 14-Фев-17, 12:46 
> Для решения задачи полной переустановки Linux-дистрибутива на удалённом сервере, к которому
> имеется только доступ по SSH, подготовлен скрипт
> [[https://github.com/marcan/takeover.sh takeover.sh]].
>простейший init-процесс fakeinit, предварительно скомпилировав его из файла

Куда катится этот мир?! P-Q

>    ./tmp/telinit u
>    ./busybox sleep 10
> init-процесс fakeinit.c
>    int main()

Там внизу оригинала-README есть ссылка на ответ на StackExchange (а, она ж и под статьёй есть
> URL: https://github.com/marcan/takeover.sh http://unix.stackexchange.com/questions/226872/how-to-shrink...

) от июля '16 со ссылкой на бложик 2007-го...

> Обсуждается: http://www.opennet.ru/tips/info/3007.shtml

Помню, что видел же что-то такое.

Вот нашлось: "HOWTO Replace RedHat with Gentoo, Remotely over SSH" by Jordan Ritter --http://www.darkridge.com/~jpr5/doc/rh-gentoo.html
(даты нет... 2004-ый, видимо :)) https://web.archive.org/web/*/http://www.darkridge.com/~jpr5/doc/rh-gentoo.html )

( https://forums.gentoo.org/viewtopic.php?t=8884 вот тут с тем же заголовком - 2002ой... Но не та же статья, видимо. RedHat 7.2 != 9.)

Гентушники были там первыми. И безо всяких system-d.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

17. "Раздел полезных советов: Удалённая замена одного Linux-дистр..."  +1 +/
Сообщение от freehck email(ok) on 08-Мрт-17, 01:02 
По-видимому автор узнал про pivot_root и не нарадуется. Ну, изучать системные утилиты - занятие весьма похвальное.

Единственное что, я не понимаю, зачем нужно усложнение в виде своего инита-заглушки и busybox-а. Можно же было, например, debootstrap-нуть какой-нибудь debian-based дистрибутив, и точно также подменить корень.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

3. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от antitroll on 14-Фев-17, 17:05 
Я думал товарищ открыл для себя lvm и bootstrap, а тут огого on-air-crutch
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от Аноним123 on 14-Фев-17, 18:10 
http://www.opennet.ru/tips/info/2223.shtml

Изврат же. Есть же depenguinator!

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от аноном on 15-Фев-17, 10:32 
> Для удаленной установки FreeBSD из Linux

Иди проспись.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от Аноним (??) on 15-Фев-17, 22:01 
А винду могёт?
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от vodz (ok) on 15-Фев-17, 18:10 
Запуск sshd не из busybox всё превращает в фарс.  К чему тогда вот это всё /bin/busybox echo и т д?  
busybox с sshd можно взять мой из соседнего совета от 07.02.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

10. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от svsd_val (ok) on 19-Фев-17, 19:38 
Интересная реализация, нужно будет опробовать ! ;)
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

11. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  –1 +/
Сообщение от лютый жабист__ on 21-Фев-17, 07:45 
Интересно. Но неужели существуют серверы без ILO и ему подобного?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

12. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от Аноним (??) on 22-Фев-17, 06:07 
Круто! Заменил на домашнем сервере убунту сервер на арч! Не могу нарадоваться!
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

13. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от anon76906 on 23-Фев-17, 11:11 
детский сад. Я понимаю, на 10000 машинах с разными конфигами бы :)
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

15. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от nur (ok) on 25-Фев-17, 10:34 
если сперва надо определить способ блокировки - можно как вариант вбить в браузер ип какого нибудь несуществующего веб сервера (ну там где гарантировано нет веб-сервера)
возможно сразу станет видно, какой именно squid грозит вашему диванному благополучию

http://i.imgur.com/H7Ax0fg.png

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

18. "Удалённая замена одного Linux-дистрибутива на другой по SSH"  +/
Сообщение от Нониус on 24-Мрт-17, 09:59 
хрень какая-то
все сервера - виртуалки, и доступ к консоли на раз-два щёлкнуть пальцами.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру