Удалённая переустановка linux на примере Debian
Существует множество фичей упрощающих жизнь системному администратору. Различные системы удаленного управления позволяют установить ОС на девственно-чистый сервер и сегодня это совсем не проблема. Даже наличие второго винчестера превращает проблему переустановки операционки в банальность. Поэтому в этой статье рассмотрим самый суровый из случаев: пусть на сервере имеется только один полностью разбитый винчестер, а наша задача — удалённо переустановить ОС.
Удивлённо поднимем брови, умиляясь тому, как гибка наша любимая операционка, засучим рукава и приступим к делу.
В основе данного метода лежит идея о том, что мы можем использовать SWAP-раздел для установки временной операционной системы, а когда она встанет на ноги — заняться основной. Главное и единственное, что нам нужно — это своп размером не менее 420 Мб (именно столько занимает lenny со всем необходимым).
В статье используются следующие допущения:
— у вас стоит дебиан, и ставить вы планируете дебиан,
— используется grub установленный в MBR.
Краткий план наших работ будет выглядеть так:
- превращаем swap-раздел в ext3;
- устанавливаем на него чистую ОС;
- перезагружаемся в нее;
- делаем нужные изменения на основном разделе;
- копируем чистую ОС из временного в основной раздел;
- загружаемся с основного раздела, включаем swap.
Подготовка раздела.
Первое, что мы сделаем — убедимся, есть ли у нас этот своп-раздел вообще:
Как видим — есть, и размер (отображается в Мб) вполне удовлетворяет требованиям. Осталось выяснить, как у нас разбит диск:
Видно, что на sda1 — текущая ОС, на sda5 — своп. Запутаться сложно, но всякое бывает.
Убедиться, что мы его выключили, можно выполнив всё тот же free:
Обновим нашу таблицу разделов:
Нам заботливо сообщили, что ядро не увидит изменений до перезагрузки, но нам это пока и не нужно. Теперь самое время подготовить файловую систему на нашем старом новом разделе. Например, ext3:
Примонтируем раздел куда-нибудь и на этом его подготовка будет закончена.
Установка «временной» ОС.
Здесь нужно заметить, что временной она является только по своему местоположению. Чтобы дважды не прогонять все действия по сборке чистой системы в дальнейшем мы просто скопируем её на основной раздел.
Используем отличное средство для получения минимальной установки — debootstrap. Здесь и далее мы будем считать что проблем с интернетом на сервере нет (иначе какой же он после этого сервер ?), поэтому выкачиваем всё из репозитория.
Данной утилите достаточно передать четыре параметра: желаемая архитектура, название релиза, директория установки и ссылка на полное зеркало. Архитектуру можно определить по выводу `uname -a`, дистрибутив выбираем на свой вкус, директория в данном случае та, куда мы смонтировали наш раздел, а ссылку на зеркало можно взять здесь: http://www.debian.org/mirror/list. Получается, что строка запуска выглядит примерно так:
После нажатия enter начнется процесс загрузки и установки пакетов, при достаточно среднем интернет-соединении (
10 Мбит) на это уходит порядка 5-10 минут — я даже не успел допить свой чай. В конце вы увидите сообщение о том, что система успешно установлена:
Теперь начинается одна из самых ответственных процедур: нам нужно правильно сконфигурировать новую систему. Любому сис-админу, наверное, снились кошмары о том, как он теряет удаленный контроль над машиной, да и в конце концов всё это мы затевали именно для того, чтобы не ехать в дата-центр. Поэтому отложим кружку кофе и сосредоточимся.
Сначала скопируем все важные настройки. Наверное, у каждого найдутся достаточно важные файлы, которые лежат не там где положено. У меня, к примеру, есть некий /etc/rc.routes со всеми нестандартными маршрутами. Главное не забыть ничего. Приводить тут какой-либо список, мне кажется, совершенно бессмысленно, но у меня это выглядит примерно так:
В fstab напишем самое необходимое — proc и наш корневой раздел:
Теперь смонтируем dev-окружение, перейдем в чрут нашей временной системы и сразу примонтируем proc:
Очевидно нам понадобится менеджер пакетов, думаю рассказывать о его настройке отдельно не нужно.
Настроим часовой пояс:
Также нам понадобятся следующие пакеты:
Сразу же, чтобы не забыть, создадим пользователя и назначим ему пароль, иначе в ssh нас потом не пустят:
Теперь переустановим загрузчик. Сначала необходимо создать все файлы загрузчика на новом диске:
После чего необходимо инициализировать МБР на загрузку с нашего нового раздела. Для этого всё там же, в чруте, войдем в консоль граба и напишем следующее:
Своеобразный автокомплит по табу подскажет нам, какие разделы есть в нашем распоряжении. Как видим всё на единицу меньше чем в названии в системе. Инициализируем загрузку с нашего sda5:
Загрузчик установлен куда нужно. Теперь выберем и установим подходящее ядро:
В ходе установки нас спросят «Create a symbolic link to the current kernel image?», на что мы ответим утвердительно. Так же сообщат, что мы устанавливаем ядро, требующее от загрузчика поддержку initrd, и уточнят, не передумали ли мы.
Отвечаем «Нет» и установка заканчивается. Осталось обновить меню загрузчика:
Выходим из чрута, собираем нервы в кулак и отправляем сервер в первую перезагрузку:
Если все было сделано правильно — машина перезагрузится в нашу временную систему. Мы можем зайти в ssh как пользователь, которого мы только что добавили.
Перенос системы на основной раздел.
Форматируем и монтируем наш старый раздел:
К слову, на этом этапе можно провести и обслуживание диска: например переразбить основной раздел и проверить файловую систему.
Остается скопировать нашу чистую ОС на основной раздел:
Обновляем fstab. На этот раз причешем его по всем правилам:
В очередной раз нужно обновить граб. На этот раз — для загрузки уже с нашего основного раздела:
Тут стоит отметить, что у меня в этом месте, в отличие от первого случая, menu.lst обновляться отказался, и там по-прежнему оставались ссылки на sda5. Почему это происходит — я так и не разобрался, поэтому вручную подредактировал этот файл:
Выходим из чрута и делаем вторую перезагрузку:
После перезагрузки можно убедиться, что мы снова на родном основном разделе:
Остается создать и включить своп:
Убедимся что всё нормально:
Ну и в конце, если вы редактировали /boot/grub/menu.lst врукопашную — стоит все-таки запустить скрипт его обновления еще раз:
Подводя итоги.
Данный способ безусловно не самый простой путь переустановки системы, однако, во многих случаях, он становится единственно возможным. Тем более вся процедура занимает около 25 минут, поэтому если ваш ДЦ не через дорогу, то в любом случае выходит совсем неплохая экономия времени. Получилось на удивление много букв — я пытался расписать подробно и понятно, но на самом деле операция простая и достаточно быстрая.
Источник
Удаленная переустановка Linux по ssh без доступа к консоли
Понадобилось мне переустановить сервер, который как бы хостился у знакомых знакомых. Там был сильно устаревший Debian, а, самое главное, система стояла на обычных разделах без lvm и пространство было распределено очень не оптимально. Физический доступ получить к нему было практически нереально, местного админа попросить что-то сделать было можно, но занять это могло неделю. Виртуальный KVM у сервера был, но извне на него попасть было нельзя; у как бы хостера не было лишних IP-адресов, а внутрь его сети попасть было невозможно. Надо было переустановить сервер из-под работающей системы по ssh. Ага, давайте поменяем ротор у турбины не выключая, потом её перезапустим и будет она с новым ротором работать!
Первой идеей было создать chroot окружение на ram-диске и с него создать lvm и залить систему. Но не тут-то было, не дает система изменить таблицу разделов.
Второй идеей было взять исходники дистрибутива Debian, зашить в них IP-адрес сервера, пересобрать initrd с установщиком Debian, ssh сервером и моими IP, подставить этот initrd в конфиг grub блоком по умолчанию и перегрузиться. После этого я должен был получить ssh консоль с сетевым установщиком. На стенде у меня получилось! Но на бою все окончилось неудачей, сервер не поднялся. Хозяевам сервер оказался не очень нужен, и дело так и заглохло, но у меня осталось ощущение нерешенной задачи.
Как-то с коллегами обсуждали всякие деструктивные действия с системой (типа rm -rf /) и один из коллег сказал, что можно отключить scsi диск, на котором находится корневой раздел и система не пикнет. Это дало мне идею номер три, взять идею один, оторвать диск, вернуть диск и возвращенный диск будет уже другим, не тем который система не отдавала. Именно так и оказалось. А теперь по пунктам, как же все-таки переустановить систему без доступа к физической консоли.
Предупреждение! Надо понимать, что все, что мы будем делать — дорога в один конец, при ошибке мы теряем доступ к системе! Вполне возможно, что придется ехать 1500 километров и лезть в шахту, чтобы реанимировать сервер.
Будем считать, что IP нашей системы 192.168.56.102. Именно так было у меня на стенде. Плюс доступ к интернету через прокси:
Начинаем работу на исходной системе.
# System #0
Заходим по ssh на сервер:
Создаем каталог и файловую систему для «Системы убийцы», монтируем её:
Ставим отличную утилиту debootstrap, которая разворачивает минимальную установку Debian, при помощи неё мы создадим chroot окружение:
Существуют аналогичные утилиты для Федоры и Centos, соответственно febootstrap и yumbootstrap, но я с ними не работал.
Первый аргумент — версия, второй — каталог установки, третий — репозиторий.
Бекапим самое необходимое:
Самое важное — настройки сетевых интерфейсов, без них не получится попасть в переустановленную систему.
Даем имя chroot-окружению:
Слово «Killer_system» будет показываться в приглашении bash. Это важная штука, без неё будет не понятно, где мы в данный момент находимся.
Переходим в новое окружение.
# System #1
Монтируем полезные fs:
Еще раз ставим debootstrap:
Дальше мои заморочки: у дебиановского пакета openssh-server в рекомендованных пакетах есть пакет xauth, а у него в зависимостях всякие иксовые библиотеки. Я, как сторонник минимализма, не хочу, чтобы на сервере, где не было и не будет графики, ставились огрызки иксов. Поэтому ставим с ключиком —no-install-recommends:
Правим конфиги. Ставим альтернативный порт для ssh демона, чтобы мы могли зайти на chroot систему по ssh:
И разрешаем доступ для root:
Можно не давать доступ root, а создать пользователя и дать ему sudo права, но тут я сознательно упрощаю.
Дальше надо задать пароль root, так как по умолчанию debootstrap не устанавливает никакие пароли:
Заходим в chroot окружение по ssh:
Это мы делаем для того, чтобы полностью отвязаться от старой системы, у которой мы оторвем диски. А так у нас будет полностью автономная система в оперативной памяти, никак не связанная со старой.
Такой трюк очень хорошо подходит, если мы уходим от хостера, а оставлять ему наши файлы очень не хочется (я знаю, паранойя). На этом этапе просто забиваем диски нулями, если хотим быстро:
Или случайными данными в несколько проходов, если хотим хорошо. Достоинство метода в том, что мы можем дождаться окончания работы dd и, при необходимости, повторить. Если же затирать диски непосредственно из боевой системы, то посмотреть на результаты работы dd мы уже не сможем.
Попробуем простой путь, удалим тома и разделы:
Но неудача. При этом раздел удалится, и система сломается, но воспользоваться простым путем без перезагрузки не получится. А перегружаться будет некуда.
Мы пойдем другим путем. Проверяем, где у нас что находится:
Будем считать, что корневой раздел у нас на диске sda.
Затираем диск, чтобы ни в коем случае его не подцепил lvm.
Предупреждение! После этого момента возврата нет, даже следующий шаг не такой вредоносный. Задумаемся на минуту, проверим консоль, за которой сидим и оправдаем имя нашего chroot’а:
Проверяем, диск оторвался:
Подключаем диск обратно:
Проверяем, что вернулось:
Был sda, стал sdb, отлично.
Важный момент: на згрузочном диске необходимо создать один первичный раздел размером на весь диск и этот раздел отдать lvm’у для того чтобы на него смог встать grub. Все остальные диски можно отдавать lvm’у целиком не создавая систему разделов (pvcreate /dev/sdc). Создаем таблицу разделов и один первичный раздел типа 8e, Linux LVM:
В первоначальной версии скрипта было создание одного логического тома под всю систему, но когда мой коллега переустанавливал Linux по этому скрипту, оказалось, что создание нескольких разделов представляет некоторую трудность, особенно отдельный раздел под логи. Внимание надо обратить на порядок создания точек монтирования и собственно монтирования разделов.
Разворачиваем уже боевую систему на новое место на жестком диске:
Возвращаем на место резервные копии конфигов:
Теперь нас ждет новая система:
# System #2
Обратите внимание, в приглашении командной строки теперь имя нового chroot окружения.
Монтируем файловые системы:
Ещё можно примонтровать эти файловые системы из родительского chroot’а:
Устанавливаем и конфигурируем openssh:
Устанавливаем пакеты, без которых не обойтись:
Да, я не могу жить без vim и ненавижу nano:
В принципе grub прописывается куда надо ещё при установке, но, всё же, для поддержки штанов и морального духа повторим:
Теперь правим конфиги, вначале самый важный, без которого система не поднимется:
В файле interfaces все должно быть в порядке, ведь как-то сеть у нас работала?
В конфиг apt’а добавляем информацию о прокси:
Добавляем строчку в /etc/hosts:
Размонтируем файловые системы:
И выходим из chroot’а:
Размонтируем файловые системы:
Если размонтировать /dev не удалось, то не удастся размонтировать и /target, но это не страшно.
Если удалось, то делаем так:
Если нет, то так:
Эти команды сбросят дисковые кеши и перемонтируют корневую файловую систему в read only. После этого можно перегружаться.
Тут-то нас ждет сюрприз от всеми любимого systemd! Он знает, что мы в chroot и не дает перегрузиться! Google дает советы выйти из chroot, но нам-то выходить некуда. Но на помощь приходит Magic SysRq!
Активируем SysRq (он, скорее всего, активирован, но нам же надо убедиться?).
Барабанная дробь, тревожное ожидание, неужели мы что-то забыли, и сервер не поднялся?
Ура! Мы в новой системе!
Пересоздадим initrd. Это не обязательно, но в дальнейшем избавит от некоторых ошибок при перезагрузке:
Удаляем файлик с именем chroot окружения:
Источник