RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Стоял себе сервер малый, делал свои нехитрые
дела, и не потребовался бы ему никакой апгрэйд, но, к сожалению, ClamAV
давно перестал собираться на четвёрке без дополнительных пинков. И вот,
после выхода очередной версии сего антивируса, я решил, что хватит
извращаться, пора идти в ногу со временем.
Поскольку контора, где живёт сервер, далеко, ехать лениво, то решил попытать счастья с удалённым апгрэйдом.
Понимая, что затея непростая, да и в src/UPDATING честно написано, что
ниже пятой версии даже и не пробуйте, то я решил сначала
потренироваться на кошках, т.е. в виртуальной машине. Вся процедура
была проведена двумя способами. В довешении всего, там же были собраны
необходимые порты с нужными параметрами и сжаты в пакаджи, чтобы на
реальном железе всё заняло как можно меньше времени.
Сразу оговорюсь, что в силу природной лени я пытаюсь не совершать
лишних движений, поэтому не ждите в статье особо правильных
переименований и использований хитрых утилит, которые делают всё за
один раз, но после того, как полдня почитаешь ман. Так же предупреждаю,
что стопроцентный результат зависит только от вашего внимания и
аккуратности. Лично мне так и не удалось сделать всё самостоятельно и
пришлось по телефону два раза просить юзера нажать ресет. Один раз
из-за того, что модуль ACPI на этом железе отказался работать, второй -
из-за банальной опечатки.
Красиво, но придётся испортить.
Для начала надо было придумать, как загрузиться с ядром от седьмой версии.
При первых же тренировках обнаружилось, что 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.
Контролируем название сетевого интрефейса, так как некоторые драйверы в четвёртой и седьмой версиях имеют разные названия.
Копируем ещё несколько необходимых для сетевого доступа вещей
теперь ещё более необходимая для загрузки штука - fstab
# cp /etc/fstab /var/squid/etc # ee /var/squid/etc/fstab
еняем следующие вещи
/dev/ad0s1g теперь у нас должен быть /
/dev/ad0s1a положим в /mnt/oldroot
А /usr и /var переименуем в /mnt/oldusr и /mnt/oldusr.
Создаём директории для этого всего
ам удаляем пустую по умолчанию рутовую запись и системных юзеров из старого файла.
Обращаем внимание на то, какой шелл установлен у того пользователя, каким мы собираемся туда логиниться.
В том смысле, что у нас имеется в наличии только sh, csh и tcsh,
соответственно, если записан bash, то мы не попадём никуда при логине.
# rm /var/squid/etc/temp
результате всех этих действий мы получили новый загрузчик со старым ядром и рабочую седьмую версию
на другом разделе. То есть, для установленной системы мы изменили пока только загрузчик.
Reboot!
Если после перезагрузки всё нормально - мы наблюдаем всю ту же четвёрку, какая и была.
Продолжаем.
Сейчас попробуем загрузиться в седьмую версию. Для этого подсунем загрузчику новое ядро и попробуем перегрузиться.
В
процессе следующей загрузки системы, если загрузка не дойдёт до режима
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
то есть, вместо ядра ему подсовывается новый загрузчик, что вполне успешно происходит.