Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> настройка —> 4.x => 7.x

Удаленная бинарная миграция с 4.x на 7.x

Автор: Ivanko.


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

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

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

Что ж, приступим.

# uptime
 3:02PM  up 215 days, 15:03, 3 users, load averages: 0.00, 0.08, 0.07

Красиво, но придётся испортить.
Для начала надо было придумать, как загрузиться с ядром от седьмой версии.
При первых же тренировках обнаружилось, что loader от четвёрки седьмое ядро загрузить не в состоянии, а наоборот - запросто.
Возиться с всякими MFS было не менее лениво, но, на счастье, на диске имелся раздел, на который можно было установить систему и который не жалко было стереть - это был отдельный раздел для сквидового кэша.

# mount
/dev/ad0s1a on / (ufs, local)
/dev/ad0s1e on /tmp (ufs, local, soft-updates)
/dev/ad0s1f on /usr (ufs, local, soft-updates)
/dev/ad0s1h on /var (ufs, local, soft-updates)
/dev/ad0s1g on /var/squid (ufs, local, soft-updates)

Положим систему с диска куда-нибудь, где есть место.
У меня место было на /var и, не мудрствуя лукаво, я создал директорий под именем "1" (сейчас понимаю, что единица выглядит в этом шрифте как буква l, но поздно)
Для промежуточной перезагрузки с диска нам понадобится только base и boot. Но, поскольку место было достаточно, я положил туда ещё man, src и свежесобранные пакаджи.

Разворачиваем систему руками в очищенный сквидовый слайс.
# cd /var/1/7.1-RELEASE/base
# export DESTDIR=/var/squid; ./install.sh
You are about to extract the base distribution into /var/squid - are you SURE
you want to do this over your installed system (y/n)? y

В процессе распаковки будет некоторая ругань на невозможность развернуть некоторые файлы.
Это не страшно, всего-лишь вместо флагов, которые нам пока несущественны, появится несколько директорий под названием PaxHeader, которые можно удалить потом (или вообще не удалять).

Cтавим загрузчик от седмой версии, предварительно сбэкапив старый
# mv /boot /boot.old
# cp -R /var/squid/boot

Поскольку в четвёрке ядро тупо валялось в корне, а в загрузчик седьмой версии хочет его видеть в /boot/kernel, то, чтоб не править никаких конфигов, не менее тупо копируем ядро туда, куда ему надо.
# cp /kernel /boot/kernel

Копируем новое ядро с модулями в наш промежуточный слайс
# cd /var/1/boot
# cp -R kernel /var/squid/boot
# cd /var/squid/boot

Перетаскиваем rc.conf и редактируем его
# cp /etc/rc.conf /var/squid/etc
# ee /var/squid/etc/rc.conf

Выключаем в нём все ненужные демоны, оставляем sshd и firewall.
Контролируем название сетевого интрефейса, так как некоторые драйверы в четвёртой и седьмой версиях имеют разные названия.
Копируем ещё несколько необходимых для сетевого доступа вещей
# cp /etc/resolv.conf /var/squid/etc
# cp /etc/ssh/ssh_host* /var/squid/etc/ssh

А теперь ещё более необходимая для загрузки штука - fstab
# cp /etc/fstab /var/squid/etc
# ee /var/squid/etc/fstab

Меняем следующие вещи
/dev/ad0s1g теперь у нас должен быть /
/dev/ad0s1a положим в /mnt/oldroot
А /usr и /var переименуем в /mnt/oldusr и /mnt/oldusr.
Создаём директории для этого всего
# mkdir -p /var/squid/mnt/oldroot
# mkdir -p /var/squid/mnt/oldvar
# mkdir -p /var/squid/mnt/oldusr

Перетаскиваем юзеров и группы
# cp /etc/master.passwd /var/squid/etc/temp
# ee /var/squid/etc/temp
# cat /var/squid/etc/temp >> /var/squid/etc/master.passwd
# vipw -d /var/squid/etc

Там удаляем пустую по умолчанию рутовую запись и системных юзеров из старого файла.
Обращаем внимание на то, какой шелл установлен у того пользователя, каким мы собираемся туда логиниться.
В том смысле, что у нас имеется в наличии только sh, csh и tcsh, соответственно, если записан bash, то мы не попадём никуда при логине.
# rm /var/squid/etc/temp

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

Reboot!

Если после перезагрузки всё нормально - мы наблюдаем всю ту же четвёрку, какая и была.
Продолжаем.
Сейчас попробуем загрузиться в седьмую версию. Для этого подсунем загрузчику новое ядро и попробуем перегрузиться.
# mkdir /boot/kernel7
# cp /var/squid/boot/kernel/kernel /boot/kernel7
# cp /var/squid/boot/kernel/acpi.ko /boot/kernel7

Если железо у вас старое и вызывает подозрение, то acpi.ko можно не копировать.
Воспользуемся полезной фичей загрузчика
# ee /boot/nextboot.conf

Запишем в этот файл указание включить эту фичу, указание на директорий с новым ядром и слайс, который должен быть рутом для него.
nextboot_enable="YES"
kernel="kernel7"
vfs.root.mountfrom="ufs:ad0s1g"

В процессе следующей загрузки системы, если загрузка не дойдёт до режима multiuser, а конкретнее - до скрипта /etc/rc, который удалит nextboot.conf, то можно нажать ресет, или дёрнуть питание, и следующая загрузка будет прежней. Разумеется, это потребует наличие кого-нибудь, кто этот ресет нажмёт.

Итак, reboot!
Если всё удачно - мы наблюдаем свежепоставленную седьмую версию на бывшем сквидовом разделе (прости, друг кальмар, мы тебе его вернём позже).
Старая система у нас смонтирована в /mnt/oldroot
Начинаем её методично удалять. После этого, конечно, обратного пути уже нет.
# cd /mnt/oldroot
# rm -rf bin boot boot.old dev modules modules.old sbin stand 
# chflags noschg kernel
# rm -f kernel
# mv etc etc.old

В процессе удаления некоторые файлы могут не удалиться по той же причине, что и ядро.
Помогаем себе командой chflags
Копируем новую систему

# cd /
# cp -pR bin boot etc lib libexec sbin /mnt/oldroot
# cd /mnt/oldroot
# cp etc.old/fstab /etc
# mkdir dev

# /mnt/oldusr
# rm -rf bin include lib libdata libexec sbin share
# rm -rf obj src
# cd /usr
# cp -pR bin include lib libdata libexec sbin share /mnt/oldusr

Тут тоже может потребоваться помощь chflags

После всех этих действий мы имеем ту же самую свежепоставленную систему, но уже на настоящем рутовом слайсе.

Пробуем делать reboot.

Если всё удачно и на сервер удалось залогиниться, продолжаем.
Теперь надо поставить систему по-человечески.
Набираем
# sysinstall

Там выбираем Upgrade.
В качестве Media Type выбираем File System, указываем место, где лежат файлы с сидюка, а именно /var/1
В процессе установки программа сообщит две важные штуки.
Первое - что текущее ядро оно снесло в /boot/kernel.prev, поэтому по выходу из программы вернём его обратно
# cd /boot
# mv kernel.prev kernel

Второе - что она забэкапила /etc. Впрочем, она спросит, куда его класть. Выбираем сами.

Reboot!

Получаем свеженькую седьмую версию.
Далее - ставим заготовленные пакаджи, правим конфиги и пр. рутинные работы.
Не забываем вернуть сквиду его кэш.

В процессе тренировок на виртуальной машине был испробован способ загрузки седьмого ядра старым загрузчиком. Для этого в / надо положить файл boot.config следующего содержания
0:ad(0,g)/boot/loader

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



размещено: 2009-04-21,
последнее обновление: 2009-04-21,
автор: Ivanko


coool, 2010-01-11 в 1:13:36

Красиво, спасибо:)

Gendalf, 2010-03-04 в 14:59:03

:) блин... сразу не увидел эту статью. Два дня бился с обновлением системы с 5,4 до 6,2 путем обновления мира по здешней статье. Ну ничего, еще есть три сервака которым предстоит обновление.

^-^ автору респект.

222, 2010-06-19 в 4:28:35

Бредятина



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1679 секунд
Из них PHP: 45%; SQL: 55%; Число SQL-запросов: 77 шт.
Исходный размер: 31814; Сжатая: 8343