Полная переустановка OS FreeBSD со сменой архитехтуры с i386 на amd64 на удаленном сервере

freebsd

Постановка задачи. Имеется сервер с ОС FreeBSD i386 (далее реальный сервер). Физического доступа к серверу нет, только SSH. Требуется переустановить систему на последнюю версию ОС FreeBSD с архитектурой amd64. С первого взляда задача проста, но т.к. при этом нужно не уронить систему, права на ошибку у нас нет.

Скачать archive.sh и update.sh

ШАГ 1. Подготовка новой системы. Берем любой эмулятор виртуальной машины (WMware, qemu итд), создаем конфигурацию виртуальной машины (в WMware с помощью визарда, в qemu — настройками и опциями), максимально приближенную к вашей реально работающей системе (идентичную дисковую подсистему, сетевой интерфейс и т.д.). Устанавливаем последнюю версию ОС FreeBSD amd64 в эмуляторе (далее виртуальный сервер). Дерево портов пока можно не ставить.

ШАГ 2. Проверка пригодности. Настраиваем на виртуальном сервере ip адрес, шлюз по умолчанию идентичные реальному серверу, не забываем настроить ssh сервер. Проверяем: возможность входа по ssh, совпадение имен сетевых интерфейсов. Если имена интерфейсов на реальном хосте и на виртуальном получились разные, то обязательно добавьте в rc.conf виртуального блок настроек с именем интерфейса как на реальном сервере, пусть временно будет 2 блока, после завершения ненужный удалите.

ШАГ 3. Проверка загрузки. Просматриваем опции загрузки ядра, опции загрузчика, файл /etc/fstab реальной системы и делаем соответствующие дописки/изменения в нашей виртуальной, чтобы сервер беспрепятственно загрузился после обновления.

ШАГ 4. Паковка данных. Я приверженец стандартной для FreeBSD разбивки файловой системы (отдельные разделы для корня, /tmp, /usr, /var.). Ниже приведен скрипт, который пакует новую систему автоматически, требуется только свободное место на разделе, подмонтированном к /usr. ВНИМАНИЕ! Скрипт необходимо разместить в папке /usr/archive/, предварительно её создав.
Итак, если все шаги проделанны и конфигурация виртуальной системы соотвествует реальному серверу (что не помешает ещё раз перепроверить), пускаем скрипт:

virtualserver# cd /usr/archive/
virtualserver# sh ./update.sh

На моем компьютере это заняло 5 минут. Пока идет паковка, переходим к следующему шагу.

ШАГ 5. Сохранение данных реального сервера. ВСЕ СТАРЫЕ ДАННЫЕ БУДУТ УДАЛЕНЫ! В связи с чем прошу грамотно заранее всё сохранить, запаковать, и положить либо в папку /usr/update, которая не удаляется в процессе обновления, либо временно скопировать ваши данные на другой сервер. Моя процедура сохранения данных выглядела следующим образом:

realserver# mkdir -p /usr/update/rescue
realserver# cd /
realserver# cp -rf etc usr/local/etc boot usr/home var /usr/update/rescue/

Пока идет копирование, запускаем закачку полученных архивов usr.tar.gz, var.tar.gz, root.tar.gz на переустанавливаемый сервер:

virtualserver# cd /usr/archive
virtualserver# scp *.tar.gz [email protected] :~/
realserver# cd /home/hash
realserver# mv usr.tar.gz var.tar.gz root.tar.gz /usr/update/

ШАГ 6. Итак, мы получили 3 архива usr.tar.gz, var.tar.gz, root.tar.gz в папке /usr/update.
ВНИМАНИЕ! В Процессе обновления в цикле будут удалены все лишние папки корневой структуры реального сервера, и если к некой папке будет примонтированны дополнительные разделы — все данные в них тоже будут удалены! С связи с чем нужно выполнить:

realserver# mount 

и убедиться что все лишнее отмонтированно!
Копируем скрипт обновления в папку /usr/update/ и запускаем его:

realserver# ./update.sh

после его отработки, и если всё прошло без критических ошибок, пускаем команду 
realserver# /tmp/rescue/reboot

Внимание! Если вы что-то забыли исправить, и после выполнения скрипта update.sh заметили, вы можете отредактировать файлы и после отработки скрипта обновления копиями резервных утилит, которые теперь находятся в папке /tmp/rescue. Например для редактирования /etc/fstab нужно написать:

realserver# /tmp/rescue/vi /etc/fstab

Ждем несколько секунд затаив дыхание

[[email protected] disk]# ping 192.168.0.99
PING 192.168.0.99 (192.168.0.99) 56(84) bytes of data.
From 192.168.0.15 icmp_seq=15 Destination Host Unreachable
From 192.168.0.15 icmp_seq=16 Destination Host Unreachable
64 bytes from 192.168.0.99: icmp_seq=17 ttl=64 time=1001 ms
64 bytes from 192.168.0.99: icmp_seq=18 ttl=64 time=1.45 ms
64 bytes from 192.168.0.99: icmp_seq=19 ttl=64 time=0.236 ms

Заходим по ssh, проверяем

server# uname -a
FreeBSD server.is 7.1-RELEASE FreeBSD 7.1-RELEASE #0: Thu Jan 1 08:58:24 UTC 2009[email protected] :/usr/obj/usr/src/sys/GENERIC amd64

Теперь можно приступить к выкачиванию последней версии портов (рекомендуем утилиту portsnap) и настройке системы.

Заключение. Проверяя данный метод я достиг результат за 2 часа 34 минуты. Изложенный в данной статье способ безусловно может быть подвержен критике, т.к. многие специалисты посоветую многоэтапное обновление, с выкачиванием последних исходников по cvs, пересборкой их под другую архитектуру и т.д, мотивируя что «так будет правильно». Мое личное мнение — правильно то, что эффективно, быстро и надежно, а усовершенствовать систему путем пересборки спокойно можно после смены архитектуры. Обсуждение статьи на форуме в соответствующем разделе.

Автор: Игнатьев Алексей Николаевич

Источник: http://ww.inf-sys.ru/

Leave a Reply

Your email address will not be published. Required fields are marked *