Aug. 15, 2010, 3:28 p.m.
Posted by soar

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

ТЗ

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

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

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

В статье используются следующие допущения:

  1. у вас стоит дебиан, и ставить вы планируете дебиан;
  2. используется grub установленный в MBR.

Краткий план работ

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

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

Отключение раздела подкачки

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

[email protected]:~$ free -m
...
Swap: 470 0 470

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

[email protected]:~$ 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 — своп. Запутаться сложно, но всякое бывает.

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

[email protected]:~# swapoff -a

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

[email protected]:~# free
...
Swap: 0 0 0

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

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

[email protected]:~# 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:

[email protected]:~# mke2fs -j /dev/sda5
Writing inode tables: done
Creating journal (4096 blocks): done

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

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

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

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

Использование debootstrap

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

[email protected]:~# aptitude install debootstrap
...
Настраивается пакет debootstrap (1.0.10lenny1) ...

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

[email protected]:~# debootstrap --arch i386 lenny /mnt/temp http://ftp.ru.debian.org/debian/

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

I: Base system installed successfully.

Конфигурирование новой системы

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

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

[email protected]:~# cp /etc/{resolv.conf,hosts,rc.local} /mnt/temp/etc
[email protected]:~# cp /etc/network/interfaces /mnt/temp/etc/network
[email protected]:~# cp /etc/your-stuff /mnt/temp/etc

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

[email protected]:~# cat > /mnt/temp/etc/fstab << "#EOF"
proc /proc proc defaults 0 0
/dev/sda5 / ext3 errors=remount-ro 0 1
#EOF

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

[email protected]:~# mount --bind /dev /mnt/temp/dev
[email protected]:~# chroot /mnt/temp /bin/bash
[email protected]:~# mount -t proc proc /proc

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

[email protected]:~# wget http://debian.soar.name/sources.list -O /etc/apt/sources.list
[email protected]:~# aptitude update

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

[email protected]:~# dpkg-reconfigure tzdata

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

[email protected]:~# aptitude install locales
[email protected]:~# dpkg-reconfigure locales
[email protected]:~# aptitude install console-data
[email protected]:~# aptitude install ssh
[email protected]:~# aptitude install sudo

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

[email protected]:~# adduser --ingroup users soar
[email protected]:~# visudo

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

[email protected]:~# aptitude install grub
[email protected]:~# grub-install /dev/sda

Подготовка загрузчика

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

[email protected]:~# grub
grub> root (hd0,
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

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

[email protected]:~# aptitude search linux-image
[email protected]:~# aptitude install linux-image-2.6.26-2-686

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

[email protected]:~# update-grub
Found kernel: /boot/vmlinuz-2.6.26-2-686
Updating /boot/grub/menu.lst ... done

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

[email protected]:~# exit
[email protected]:~# reboot

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

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

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

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

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

[email protected]:~# mkdir /mnt/temp
[email protected]:~# mount /dev/sda1 /mnt/temp

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

Копирование системы

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

[email protected]:~# cp -a -x / /mnt/temp/

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

[email protected]:~# cat > /mnt/temp/etc/fstab << "#EOF"
# /etc/fstab: static file system information.
#
#

proc            /proc           proc    defaults           0      0
/dev/sda1       /               ext3    defaults,errors=remount-ro 0 0
#EOF

Подготовка загрузчика

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

[email protected]:~# mount --bind /dev /mnt/temp/dev
[email protected]:~# chroot /mnt/temp/ /bin/bash
[email protected]:~# grub-install /dev/sda
[email protected]:~# 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

[email protected]:~# update-grub
Updating /boot/grub/menu.lst ... done

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

[email protected]:~# sed -i -e 's/sda5/sda1/g' /boot/grub/menu.lst
[email protected]:~# sed -i -e 's/(hd0,4)/(hd0,0)/g' /boot/grub/menu.lst

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

[email protected]:~# exit
[email protected]:~# reboot

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

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

Включение раздела подкачки

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

[email protected]:~# 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.

[email protected]:~# cat >> /etc/fstab << "#EOF"
/dev/sda5       none            swap    sw                   0      0
#EOF

[email protected]:~# mkswap /dev/sda5
[email protected]:~# swapon -a

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

[email protected]:~# free -m
Swap:          470          0        470

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

[email protected]:~# update-grub
Updating /boot/grub/menu.lst ... done

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

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

Comments