вторник, 9 сентября 2008 г.

Пересборка мира в FreeBSD 7.0


0. Задача
Обновление свежеустановленной FreeBSD 7.0 до STABLE, а дерева портов - до CURRENT. В качестве методического руководства использовался FreeBSD Handbook. Написание этой заметки вызвано тем, что в Handbook нужная информация "размазана" по большому количеству страниц (на каждой из которых страшно много букв - да еще и нерусских :), а тут я попробовал собрать все в кучу - и описать процедуру как неветвящуюся последовательность.

1. Установка FreeBSD
Ставим FreeBSD как обычно, только не забываем исходные тексты (src) и коллекцию портов (FreeBSD ports).

2. Получение свежей версии исходных текстов
Для синхронизации использовался csup (1) (рекомендуемый в handbook cvsup нужно ставить из /usr/ports/net/cvsup, а он хочет еще компилятор языка Modula 3 (кто когда последний раз на таком программировал? :) - а нам зачем все это надо?) Болванки для supfile лежат в /usr/share/examples/cvsup.
Чтобы их использовать, нужно изменить строку
*default host=CHANGE_THIS.FreeBSD.org
на какой-то реальный адрес. Я поставил cvsup4.ru.FreeBSD.org, но на всякий случай - вот здесь есть полный список зеркал. Нам интересны два файла stable-supfile и ports-supfile. Правим их - и поехали:
# csup stable-supfile
# csup ports-supfile


3. Пересборка пользовательского окружения
Если не хочется собирать много лишнего, можно создать файл /etc/make.conf (по умолчанию не существут) и добавить в него что-нибудь типа:
CPUTYPE=pentium4
WITHOUT_INET6=YES
WITHOUT_IPX=YES
WITHOUT_ZFS=YES
(представление о возможных опциях можно получить, изучая содержимое файлов /usr/share/examples/etc/make.conf и /usr/share/mk/bsd.own.mk)
Крайне не рекомендую писать WITHOUT_FORTH - если, конечно, вы не знаете точно, чего хотите от этой опции добиться - дело в том, что интерпретатор экзотического языка Forth входит в загрузчик FreeBSD. У меня собранная с этой опцией система насмерть зависала при начале загрузки ядра.

А теперь собственно пересборка:
# cd /usr/src
# make buildworld


4. Пересборка ядра
Обычно нужно что-то подправить в конфиге GENERIC (напр. закоментить options INET6 и device trm), так что создадим свой конфиг:
# cd /usr/src/sys/i386/conf
# cp GENERIC MYCFG

... правим его...
# cd ../../..
# make buildkernel KERNCONF=MYCFG

# make installkernel KERNCONF=MYCFG

на всякий случай перед обновлением системы забекапим файлы конфигурации. Например, так:
# mkdir -p ~/tmp/etc
# cd /etc
# find . -print | cpio -p -m ~/tmp/etc

5. Перезагрузка в однопользовательском режиме
Теперь перегружаемся - и в меню загрузки FreeBSD выбираем Single user mode (Клавиша 4). Когда видим приглашение для /bin/sh нажать RETURN, жмем этот самый RETURN - и начинается самое увлекательное:
# fsck -p
# mount -u /
# mount -a -t ufs

# swapon -a

(эти операции не относятся к пересборке - просто Single user mode ничего лишнего не запускал - вот мы ручками и поднимаем более-менее работоспособное окружение - примонтируем на чтение-запись файловые системы и подключаем раздел подкачки).
А теперь - пора за дело:
# cd /usr/src
# mergemaster -p
# make installworld

# mergemaster -U
опции последней команды задают автоматическое обновление всех файлов в /etc , которые не изменялись пользователем.
И - на перезагрузку. Теперь уже - обычную.

6. Пейзаж после битвы
Перезагрузились? Любуемся на новый вывод команды
$ uname -a
И - если все остались живы - самое время убрать после себя мусор:
# cd /usr/src
# make delete-old
(перед тем, как дать эту команду можно посмотреть
$ make check-old
увидим список того, что предполагается удалить. А то вдруг там что-то ценное? :)
# rm -rf /usr/obj

Комментариев нет: