Пользователь
0,0
рейтинг
13 августа 2010 в 21:38

Администрирование → Удалённая переустановка linux на примере Debian

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

Удивлённо поднимем брови, умиляясь тому, как гибка наша любимая операционка, засучим рукава и приступим к делу.



В основе данного метода лежит идея о том, что мы можем использовать SWAP-раздел для установки временной операционной системы, а когда она встанет на ноги — заняться основной. Главное и единственное, что нам нужно — это своп размером не менее 420 Мб (именно столько занимает lenny со всем необходимым).

В статье используются следующие допущения:
— у вас стоит дебиан, и ставить вы планируете дебиан,
— используется grub установленный в MBR.

Краткий план наших работ будет выглядеть так:


  1. превращаем swap-раздел в ext3;
  2. устанавливаем на него чистую ОС;
  3. перезагружаемся в нее;
  4. делаем нужные изменения на основном разделе;
  5. копируем чистую ОС из временного в основной раздел;
  6. загружаемся с основного раздела, включаем swap.


Подготовка раздела.



Первое, что мы сделаем — убедимся, есть ли у нас этот своп-раздел вообще:

# free -m
...
Swap:          470          0        470


Как видим — есть, и размер (отображается в Мб) вполне удовлетворяет требованиям. Осталось выяснить, как у нас разбит диск:

# fdisk -l /dev/sda
...
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         462     3710983+  83  Linux
/dev/sda2             463         522      481950    5  Extended
/dev/sda5             463         522      481918+  82  Linux swap / Solaris


Видно, что на sda1 — текущая ОС, на sda5 — своп. Запутаться сложно, но всякое бывает.

Отключаем своп:

# swapoff -a


Убедиться, что мы его выключили, можно выполнив всё тот же free:

# free
...
Swap:            0          0          0


Обновим нашу таблицу разделов:

# fdisk /dev/sda
Command (m for help): t
Partition number (1-5): 5
Hex code (type L to list codes): 83
Changed system type of partition 5 to 83 (Linux)
Command (m for help): w
The partition table has been altered!

WARNING: Re-reading the partition table failed with error 16: Устройство или ресурс занято.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.


Нам заботливо сообщили, что ядро не увидит изменений до перезагрузки, но нам это пока и не нужно. Теперь самое время подготовить файловую систему на нашем старом новом разделе. Например, ext3:

# mke2fs -j /dev/sda5
Writing inode tables: done
Creating journal (4096 blocks): done


Примонтируем раздел куда-нибудь и на этом его подготовка будет закончена.

# mkdir /mnt/temp
# mount /dev/sda5 /mnt/temp
# df -h
Файловая система      Разм  Исп  Дост  Исп% смонтирована на
/dev/sda1             3,5G  600M  2,8G  18% /
...
/dev/sda5             456M   11M  422M   3% /mnt/temp


Установка «временной» ОС.



Здесь нужно заметить, что временной она является только по своему местоположению. Чтобы дважды не прогонять все действия по сборке чистой системы в дальнейшем мы просто скопируем её на основной раздел.

Используем отличное средство для получения минимальной установки — debootstrap. Здесь и далее мы будем считать что проблем с интернетом на сервере нет (иначе какой же он после этого сервер ?), поэтому выкачиваем всё из репозитория.

# aptitude install debootstrap
...
Настраивается пакет debootstrap (1.0.10lenny1) ...


Данной утилите достаточно передать четыре параметра: желаемая архитектура, название релиза, директория установки и ссылка на полное зеркало. Архитектуру можно определить по выводу `uname -a`, дистрибутив выбираем на свой вкус, директория в данном случае та, куда мы смонтировали наш раздел, а ссылку на зеркало можно взять здесь: http://www.debian.org/mirror/list. Получается, что строка запуска выглядит примерно так:

# debootstrap --arch i386 lenny /mnt/temp http://ftp.ru.debian.org/debian/


После нажатия enter начнется процесс загрузки и установки пакетов, при достаточно среднем интернет-соединении (~10 Мбит) на это уходит порядка 5-10 минут — я даже не успел допить свой чай. В конце вы увидите сообщение о том, что система успешно установлена:

I: Base system installed successfully.


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

Сначала скопируем все важные настройки. Наверное, у каждого найдутся достаточно важные файлы, которые лежат не там где положено. У меня, к примеру, есть некий /etc/rc.routes со всеми нестандартными маршрутами. Главное не забыть ничего. Приводить тут какой-либо список, мне кажется, совершенно бессмысленно, но у меня это выглядит примерно так:

# cp /etc/{resolv.conf,hosts,rc.local} /mnt/temp/etc
# cp /etc/network/interfaces /mnt/temp/etc/network
# cp /etc/your-stuff /mnt/temp/etc


В fstab напишем самое необходимое — proc и наш корневой раздел:

# cat > /mnt/temp/etc/fstab << "#EOF"
> proc            /proc           proc    defaults              0       0
> /dev/sda5       /               ext3    errors=remount-ro     0       1
> #EOF


Теперь смонтируем dev-окружение, перейдем в чрут нашей временной системы и сразу примонтируем proc:

# mount --bind /dev /mnt/temp/dev
# chroot /mnt/temp /bin/bash
# mount -t proc proc /proc


Очевидно нам понадобится менеджер пакетов, думаю рассказывать о его настройке отдельно не нужно.

# wget http://debian.soar.name/sources.list -O /etc/apt/sources.list
# aptitude update


Настроим часовой пояс:

# dpkg-reconfigure tzdata


Также нам понадобятся следующие пакеты:

# aptitude install locales
# dpkg-reconfigure locales
# aptitude install console-data
# aptitude install ssh
# aptitude install sudo


Сразу же, чтобы не забыть, создадим пользователя и назначим ему пароль, иначе в ssh нас потом не пустят:

# adduser --ingroup users soar
# visudo


Теперь переустановим загрузчик. Сначала необходимо создать все файлы загрузчика на новом диске:

# aptitude install grub
# grub-install /dev/sda


После чего необходимо инициализировать МБР на загрузку с нашего нового раздела. Для этого всё там же, в чруте, войдем в консоль граба и напишем следующее:

# grub
grub> root (hd0,<TAB>
 Possible partitions are:
   Partition num: 0,  Filesystem type is ext2fs, partition type 0x83
   Partition num: 4,  Filesystem type is ext2fs, partition type 0x83


Своеобразный автокомплит по табу подскажет нам, какие разделы есть в нашем распоряжении. Как видим всё на единицу меньше чем в названии в системе. Инициализируем загрузку с нашего sda5:

grub> root (hd0,4)
 Filesystem type is ext2fs, partition type 0x83

grub> setup (hd0)
...
Done.

grub> quit


Загрузчик установлен куда нужно. Теперь выберем и установим подходящее ядро:

# aptitude search linux-image
# aptitude install linux-image-2.6.26-2-686


В ходе установки нас спросят «Create a symbolic link to the current kernel image?», на что мы ответим утвердительно. Так же сообщат, что мы устанавливаем ядро, требующее от загрузчика поддержку initrd, и уточнят, не передумали ли мы.
Отвечаем «Нет» и установка заканчивается. Осталось обновить меню загрузчика:

# update-grub
Found kernel: /boot/vmlinuz-2.6.26-2-686
Updating /boot/grub/menu.lst ... done


Выходим из чрута, собираем нервы в кулак и отправляем сервер в первую перезагрузку:

# exit
# reboot


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

Перенос системы на основной раздел.



Форматируем и монтируем наш старый раздел:

# mke2fs -j /dev/sda1
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

# mkdir /mnt/temp
# mount /dev/sda1 /mnt/temp


К слову, на этом этапе можно провести и обслуживание диска: например переразбить основной раздел и проверить файловую систему.

Остается скопировать нашу чистую ОС на основной раздел:

# cp -a -x / /mnt/temp/


Обновляем fstab. На этот раз причешем его по всем правилам:

# cat > /mnt/temp/etc/fstab << "#EOF"
> # /etc/fstab: static file system information.
> #
> # <file system> <mount point>   <type>  <options>          <dump> <pass>
> proc            /proc           proc    defaults           0      0
> /dev/sda1       /               ext3    defaults,errors=remount-ro 0 0
> #EOF


В очередной раз нужно обновить граб. На этот раз — для загрузки уже с нашего основного раздела:

# mount --bind /dev /mnt/temp/dev
# chroot /mnt/temp/ /bin/bash
# grub-install /dev/sda
# grub

grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83

grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  17 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.

grub> quit

# update-grub
Updating /boot/grub/menu.lst ... done


Тут стоит отметить, что у меня в этом месте, в отличие от первого случая, menu.lst обновляться отказался, и там по-прежнему оставались ссылки на sda5. Почему это происходит — я так и не разобрался, поэтому вручную подредактировал этот файл:

# sed -i -e 's/sda5/sda1/g' /boot/grub/menu.lst
# sed -i -e 's/(hd0,4)/(hd0,0)/g' /boot/grub/menu.lst


Выходим из чрута и делаем вторую перезагрузку:

# exit
# reboot


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

# df -h
Файловая система      Разм  Исп  Дост  Исп% смонтирована на
/dev/sda1             3,5G  436M  2,9G  13% /


Остается создать и включить своп:

# fdisk /dev/sda
Command (m for help): t
Partition number (1-5): 5
Hex code (type L to list codes): 82
Changed system type of partition 5 to 82 (Linux swap / Solaris)
...
The new table will be used at the next reboot.
Syncing disks.

# cat >> /etc/fstab << "#EOF"
> /dev/sda5       none            swap    sw                   0      0
> #EOF

# mkswap /dev/sda5
# swapon -a


Убедимся что всё нормально:

# free -m
Swap:          470          0        470


Ну и в конце, если вы редактировали /boot/grub/menu.lst врукопашную — стоит все-таки запустить скрипт его обновления еще раз:

# update-grub
Updating /boot/grub/menu.lst ... done


Подводя итоги.



Данный способ безусловно не самый простой путь переустановки системы, однако, во многих случаях, он становится единственно возможным. Тем более вся процедура занимает около 25 минут, поэтому если ваш ДЦ не через дорогу, то в любом случае выходит совсем неплохая экономия времени. Получилось на удивление много букв — я пытался расписать подробно и понятно, но на самом деле операция простая и достаточно быстрая.
Алексей Смирнов @soar
карма
19,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (39)

  • +3
    Хорошая, подробная статья, одно мне не понятно только, зачем? Зачем переустанавливать работающий Linux тем паче Debian. Я не вижу use case для этого.
    • +4
      Вариантов масса, например, передача сервера под другой проект или другие задачи. Бывает, когда нужно переустановить систему после того, когда она была скомпрометированна каким-либо сервисом. Да и вообще в некоторых случаях или после некоторых пользователей переустановить систему проще, чем вычистить ее.
      • 0
        Если система была скомпрометирована, то делать debootstrap, хм, несколько глупо.

        Если же речь идёт про частую переустановку, то PXE + preseed решает весь вопрос.

        Установка debian в чистую занимает 2 минуты 30 секунд полного времени. Центос — около 4-5 минут.
        • +11
          Статья — только метод. Бывают случаи, когда нет ничего, а сделать что-то нужно. Находить выходы из таких ситуаций всегда занятно и приятно.
          • +2
            Статья хороша :) в свое время танцевал 32 на 64 у херцнеров с сохранением структуры.
            А на самом деле — лучший выход в такой ситуации, если возможно — ip kvm.
        • +1
          ну, например, это очень поможет, если у хетзнеров хочется получить нестандартный конфиг дисков (напр / 100 GB в RAID1, а остальное — в RAID0 или просто свалкой. Или LVM).
        • 0
          Не думаю, что в многих датацентрах стоят сервера, обеспечивающие загрузку по PXE, да ещё и с опцией запуска установщика lenny…
          • –1
            (хихикнув) Насчёт многих не знаю, а у нас — да. А ещё у нас есть IPKVM, через который можно ставить что угодно как угодно не напрягаясь.
        • 0
          Центось в последних ревизия принудительно форматирует жесткие диски, что может занять краааааааайне много времени. Таким образом при установке системы на диск в 250Гб, это займет порядка часа.
          • 0
            Что означает «принудительно форматирует»? mkfs не отличается повышенной скоростью, но, в принципе, 250Гб за минуты 2-3 делает.

            И в каких «последних ревизиях»?
            • 0
              5+
              • 0
                очень странно, ставил недавно 5.5 на терабайтное зеркало заняло 10 минут.
      • +4
        1) Смена архитектуры (i386 -> amd64). Делал такое на FreeBSD.
        2) Слетевшая частично файловая система на основном диске (read-only). Чтобы чинить нужно отмонтировать. Либо полуубитая после восстановления система.
        3) Операции с диском (смена fs, конвертация в RAID, etc).
        4) Необходимость получить полностью чистую систему (например для установки хитрого ПО, вроде панелей управления хостингом).

        Это навскидку. Если подумать — можно еще десяток use-case придумать.
    • +2
      Use Case — я хочу сменить архитектуру (для полноценного использования MongoDB), удаленно, без глючного IPKVM, без заявок и без бюрократии.

      Пойдет?
    • +1
      У меня в одном сервере было два винта. Один системный посыпался, второй жив по сей день. Точно так же разворачивал систему на втором.

      И да, после reboot не помешает поплясать с бубном, пока пинг не восстановится.

  • +5
    сенсей!
  • +1
    Самое обидное в этой ситуации — осечка.

    На своей практике ограничивался удалённой сборкой ядра. Самое обидное — когда руки по привычке делают быстрее, чем соображает голова. Я как-то опустил сетевой интерфейс. :-)
    • 0
      А, ну и ядро иногда сбоило из-за конфликтов или неподходящей конфигурации.
      • +3
        Я часто для себя пишу подробные мануалы, чтобы операцию можно было выполнить хоть во сне. Естественно со списком всех необходимых файлов и прочего. Это очень помогает.
        • 0
          Я наступал на эти грабли при переходе с 2.0 на 2.2 и с 2.2 на 2.4. Тут мануалы не помогут.
          Просто потому, что меняется архитектура ядра, меняется набор драйверов и опций сборки.
          Сейчас тоже бывают значительные изменения в ядре, но я пишу про свой опыт, а сейчас я это делаю «очно» и таких проблем не испытываю. :-)
    • +3
      Думаю, сетевой интерфейс все опускали, хотя бы ради интереса. =)
      • +3
        Это не интересно, это неприятно.
  • 0
    Проще скачать образ установочного диска, прописать до него путь в грубе, ребутнуться и начать установку, как обычно и с использованием ssh в том числе. Не?
    • 0
      Я это к тому, что способ описанный в статье нужно использовать, если требуется минимализировать простой сервисов и всякое такое. А если на втроом этапе всё равно диски переразбиваются и выполняются всякие стандартные операции по установке, то городить все эти штуки смысла маловато.
      • +2
        Мне кажется вы читали не очень внимательно.
  • +4
    один полностью разбитый винчестер
    сидел и размышлял какое-то время, как это люди умудряются переустановить ОС на разломанном винчестере :)
  • 0
    в мемориз, однозначно!
  • +1
    Более надежный метод по ссылке
    www.opennet.ru/base/sys/freebsd_to_linux_debian.txt.html
  • 0
    Круто на самом деле. Очень рад, что меня пока не беспокоят ситуации «я тут, а сервер в Австралии». Мне проще в серверную спуститься) Но возьму на заметку) Кто его знает какие ситуации могут случиться.
  • +1
    Если сетевушка экзотическая, не забыть прописать её модуль в /etc/modules
  • +2
    Год назад подобным образом удаленно переехал с x86 на amd64,
    позже на другом тазике с Gentoo на Debian.
    Жаль, не было вдохновения и времени написать статью,
    в то время русскоязычных доков по debootstrap было мало.
  • –2
    за статью 5+, soar. Поднял бы карму, да не хватает одного голоса :)
    Уверен, что не раз буду вспоминать Вас добрым словом.
    • +1
      всё. как и обещал, поднял Вам карму. Еще раз спасибо!
      • 0
        Рад, если статья оказалась полезной.
  • +1
    Респект. У меня вот тоже в планах перетащить пару серверов с Gentoo (исторически сложилось) на Debian, да всё собраться не могу.

    Обязательно перечитаю перед переездом, дабы чего не забыть.
  • +2
    Народная примета: Удаленная переустановка ОС — к дороге :)
  • +1
    наверное надо устанавливать не определённое ядро а метапакет типа linux-image-2.6-686
    что видимо более дебианвей
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Спасибо за статью!

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