Архив метки: update

Portsnap: Обновление дерева портов FreeBSD

http://pro-voip.com.ua freebsd

portsnap — штатная утилита для обновления дерева портов в FreeBSD. Подчеркну еще раз — дерева портов, а не программ, которые были установлены с этого самого дерева. Дерево портов представляет собой набор каталогов с файлами в директории /usr/ports, уже из которых собирается и компилируется необходимое ПО. Вот portsnap как раз и занимается обновлением вот этих самых файлов.

Обновление дерева портов предшествует обновлению самой установленной программы. Т.е. если нужно обновить, например, mysql-server, то сначала обновляем дерево портов, а затем из этого дерева, обновленного, устанавливаем/переустанавливаем программу (port). Для этих целей я использую утилиту portupgrade.

Файлы и директории

  • Файл конфигурации — /etc/portsnap.conf
  • Рабочая директория — /var/db/portsnap/
  • Дерево портов — /usr/ports/

Процесс обновления

Скачиваем snapshot («снимок», сжатую копию) дерева портов. Snapshot скачивается в рабочую директорию /var/db/portsnap:
portsnap fetch

Распаковываем дерево портов — берется snapshot (по сути это набор сжатых файлов) из директории /var/db/portsnap и разворачиваем в /usr/ports:
portsnap extract

! данная команда сначала трет все старое дерево, если оно есть, а потом разворачивает новое. Это занимает определенное время, поэтому именно для обновления портов extract не используется. extract используется чаще всего при установке свежей системы.

Для обновления дерева портов используется следующая команда:
portsnap update

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

Автоматизация

Чтобы дерево портов обновлялось без вашего активного участия в этом, задействуем cron. В этом случае в /etc/crontab вместо portsnap fetch, нужно прописывать команду portsnap cron — делает она то же самое (скачивает снепшот с серверов) — но с случайной задержкой из диапазона 1 — 3600 сек.

«portsnap fetch в cron’е не работает» — мною это утверждение не проверялось, поверим на слово

portsnap update рекомендуют запускать с ключем -I — т.е. не обновлять само дерево, а обновить только индекс. Для чего? Чтобы избежать вполне возможной ситуации, когда portsnap при обновлении удаляет/изменяет исходные файлы порта, а в этот же момент кто-то собирает из этих файлов порт.

ee /etc/crontab

#minute hour    mday    month   wday    who     command
0       0       *       *       0       root    portsnap -I cron update

 

Обновление системы

1. Устанавливаем subversion:

cd /usr/ports/devel/subversion
make install clean

2. Качаем исходники:

cd /usr/scr
svn co svn://svn0.us-west.freebsd.org/base/releng/9.2 /usr/src

3. Собираем новый мир со свежих исходников. Прежде всего соберется новый компилятор с нужными ему библиотеками, а затем и все базовое программное обеспечение. Результаты сборки помещаются в /usr/obj:

make buildworld

4. Собираем ядро:

make buildkernel

5. Устанавливаем ядро:

make installkernel

6. Перезагружаемся и загружаемся в однопользовательском режиме:

shutdown -r now

7. Если система отформатирована в UFS, выполняем следующие действия: монтируем корень в режиме read-write, затем монтируем все остальные файловые системы и подключаем swap:

mount -u /
mount -a -t ufs
swapon -a

8. Запускаем mergemaster для обновления конфигов системы; mergemaster сравнивает файлы в каталоге /etc, с новыми файлами /usr/src/etc, выявляет различия между ними и спрашивает, что делать — устанавливать новые файлы, оставить старые или отложить этот вопрос на потом.

mergemaster запускаем 2 раза — один раз перед установкой мира, чтобы удостовериться, что система может установить новые бинарники без ошибок, второй раз — после установки мира для синхронизации остальных конфигурационных файлов.

Ключ -p  задает режим предварительной оценки. Система в том числе проверяет наличие необходимых для установки мира пользователей и групп:

mergemaster -p

mergemaster устанавливает временный каталог /etc в /var/tmp/temproot, где сохраняются новые конфигурационные файлы, которые затем будут сравниваться с существующими.

9. Устанавливаем мир:

make installworld

10. Запускаем mergemaster второй раз:

mergemaster -iF

11. Перезагружаемся в систему с новым ядром и новым миром:

reboot

!!! Важно соблюдать порядок сборки и установки ядра и мира !!!