Обновил статью 28.11.2023
Здесь будут рассмотрены 2 способа: через git и через freebsd-update (бинарное обновление).
через freebsd-update (бинарное обновление, только для ядра GENERIC)
Это так сказать полное обновление всех бинарников и ядра на GENERIC.
Последовательно выполним следующие команды (при условии, что у вас ядро GENERIC. Иначе будет ругань):
# freebsd-update -r 7.2-RELEASE upgrade
# freebsd-update install
# reboot
# freebsd-update install
# reboot
Если при выполнении freebsd-update … upgrade получаем ошибку:
no mirrors remaining giving up
то пробуем указать IP одного из серверов (update.freebsd.org – update7.freebsd.org):
# freebsd-update -s 63.140.118.125 -r 7.2-RELEASE upgrade
и дальше как обычно.
через git – новый метод
# git clone -b releng/13.0 https://git.freebsd.org/src.git src
через svn (или svnup) (Официально уже закрыт, используйте только git)
Используйте одну из 2-х команд:
# svnlite co svn://svn.freebsd.org/base/releng/10.1/ /usr/src/
# svn co https://svn.FreeBSD.org/src/head /usr/src
# cd /usr/src && svn update
через cvsup/csup (Официально уже закрыт, используйте только git)
Здесь будет описан метод обновления с FreeBSD 7.0 до FreeBSD 7.1-RELEASE-p2, то есть до последнего релиза на момент обновления. Сам процесс состоит из нескольких этапов.
Примечание.
В процессе обновления нужно придерживаться такого порядка: собрать мир (не не инсталлировать), собрать и инсталлировать новое ядро (если вдруг что-то пойдёт не так, можно всегда загрузить старое ядро) и только после того, как вы поняли, что всё нормально работает – инсталлировать мир. В ином случае вы можете получить новый мир и старое ядро (если к примеру, новое не грузиться) – а это уже очень плохо, вплоть до незагружаемости сервера.
Будьте внимательны!
1) Установка cvsup и предварительная настройка. (Официально уже закрыт, используйте только git)
Ставим cvsup-without-gui. (у кого оболочка bash, команду rehash делать не нужно!) Если у вас 7.0 и выше, то cvsup ставить не надо, есть уже штатный csup.
# cd /usr/ports/net/cvsup-without-gui && make install clean && rehash
Примечание.
А можно и не ставить csvup, а использовать штатный csup. В новых версиях переходят усиленно на svn, поэтому рекомендую использовать утилиту snvup (есть в портах) – легковесная замена стандартному svn.
После этого создаём файл такого содержания
*default tag=RELENG_7_1
*default host=cvsup5.ua.freebsd.org
*default prefix=/usr
*default base=/var/db
*default release=cvs tag=RELENG_7_1
*default delete use-rel-suffix
#*default compress
src-all
#*default tag=.
#ports-all
и обзываем его, например, /etc/cvs.conf
Примечание:
Если указать вместо 7_1 просто 7, то мы обновимся до PRERELEASE.
Теперь собственно будем выкачивать обновления. У кого трафик ограниченный – можно расскомментировать строку *default compress.
# cvsup /etc/cvs.conf
или так
# csup /etc/cvs.conf
Эта процедура очень длительная. Кстати, есть ещё несколько альтернативных зеркал
cvsup5.ua.freebsd.org
cvsup7.ua.freebsd.org
2) Пересобираем ядро.
После того, как всё было выкачано, приступаем к пересброрке ядра. Если у вас ядро отличается от GENERIC, рекомендуется пересобрать сначало GENERIC, а потом после того, когда система обновлена – только тогда пересобрать уже изменённое. От версии к версии некоторые переменные могут меняться. Если вы находитесь в непосредственно близко, можете пересобирать изменённое ядро, а не GENERIC. Первый мой опыт был именно пересборка не GENERIC, а моего. Хотя довольно много слышал, как некоторые админы после удалённых обновлений спешили к сервакам, ибо ядро не грузилось :). Такое вероятнее всего бывает, когда обновляете, например, с 5 до 6, или 6 до 7. Если обновления происходят в пределах главной версии (с 7.0 до 7.1) то можно пробовать и не GENERIC пересобирать.
Перед сборкой рекомендуется сделать
# rm -rf /usr/obj/usr/src/
а потом уже
# cd /usr/src && make -j4 -s buildworld && make -j4 -s buildkernel KERNCONF=GENERIC INSTKERNNAME=kernel.new
Примечание: при апдейте на версию 10.3 и выше, нужно дополнительно выполнить:
# cd /usr/src && make -C sys/boot install
после этого продолжаем:
# cd /usr/src && make -s -j4 installkernel KERNCONF=GENERIC INSTKERNNAME=kernel.new
Параметр -j4 означает собирать в 4 потока, а параметр -s – показывать только то, что скомпиллилось, а не полностью процесс компиляции. То есть, если у вас как минимум dual-core, тогда имеет смысл использовать этот параметр и сборка теоретически должна пройти в несколько раз быстрее.
После 20171003 если параметр KERNCONF содержит несуществующее имя, будет выдана соответствующая ошибка. Раньше, просто прерывался процесс сборки и было неясно, в чем проблема.
Так же можно использовать параметры:
– INSTKERNNAME=kernel.new, который установит новое ядро с именем kernel.new. Если этого не требуется, то можете убрать INSTKERNNAME=kernel.new
– KODIR=/boot/kernel.other, явно указывает куда устанавливать ядро
– KERNCONFDIR=/usr/local/kernel_config, где искать конфиг файл ядра
Если всё удачно (а что бы было всё удачно, рекомендую использовать nextboot), то выполняем ребут чтобы в случае проблем можно было остаться со старой версией системы (загрузить старое ядро и потом скопировать его в /boot/kernel):
# /sbin/shutdown -r now
3) Согласование паролей и групп.
После этого предстоит довольно щепетильная процедура – процесс внесения изменений в конфигурационные файлы. Очень внимательно читайте то, что пишется. Сдесь будут задаваться вопросы о перезаписи существующий файлов групп и паролей. Поэтому, если не внимательны будете – можете затереть существующих юзеров.
# mergemaster -p
UPD.
Начиная с 9-ой (а в 14-ой уже obsoleted) версии рекомендуют использовать вместо mergemaster использовать etcupdate:
# etcupdate -p
4) Обновляем “мир”
# cd /usr/src && make -s -j4 installworld
При выполнении следующей команды, будьте внимательны, так как она удаляет старые библиотеки, с которыми могут быть слинкованы, например, ssh или bash. Эту команду лучше делать уже после полного пересбора критичного ПО. Если вы обновляетесь в пределах релиза (например, с 10.1 на 10.3), то данная команда практически безобидна, но лучше ещё раз всё проверить.
# yes | make delete-old && yes | make delete-old-libs
5) Обновления всех конфигурационных файлов.
Сейчас предстоит самая-самая трудоёмкая процедура. Будут задаваться вопросы о замене или сохранении существующих файлов конфигурации. Для большего познания mergemaster рекомендую прочесть хороший обзор этой утилиты здесь
Выполняем команду:
# mergemaster -F
А можно попробовать выполнить и в автоматическом режиме (естественно, на свой страх и риск):
# mergemaster -iFUP
UPD.
Начиная с 9-ой (а в 14-ой уже obsoleted) версии рекомендуют использовать вместо mergemaster использовать etcupdate: (n – dry-run mode)
# etcupdate -nFB
6) Заключительный reboot.
Вообщем, делаем эту команду, и сидим молимся :). Если что-то пошло не так – тогда читаем, думаем и гуглим 🙂
7) PS
Обязательно проверьте, одной ли версии ядро и мир:
$ uname -K
1003000
$ uname -U
1001000
После удачной загрузки рекомендую проверить установленные пакеты (если используете pkg-ng):
# pkg check -Ba
и по возможности обновить порты и обновить весь софт, который стоит. Как обновить порты описано здесь, а как обновить софт – используем следующую команду:
# portupgrade -af
Эта команда обновит все установленных пакеты, а так же обновит базу, в которой находится инфа о пакетах (название, версии, зависимости, и прочее).
Так же важно проверить ABI установленых пакетов, что бы они были той версии, которой ОС. Сделать это можно так:
$ pkg query "%n-%v: %q"
А вот так проверить ABI самой ОС:
$ pkg -vv | grep -i abi
Больше информации по работе с пакетами здесь
PPS. А можно всё это и одной командой сделать:
# csup /etc/cvs.conf && rm -rf /usr/obj && make cleanworld && make buildworld && make buildkernel KERNCONF=GENERIC && make installkernel KERNCONF=GENERIC && reboot
Примечание.
При обновлении с 7.2 на 8.0-RC2 после выполнения конечного mergemaster – начали сыпаться ошибки. И что я только не делал, и очищал всё и закачивал заново сорцы и пересобирал. Ошибки начали сыпаться уже при сборке мира. Почитал в инете, что одному человеку помог ребут. Я ребутнул, ядро загрузилось новое, а вот “мир” – остался прежний. Это я понял, потому что большинство прог отказались запускаться. Я пересобрал ещё раз ядро, мир и перегрузился. После этого всё заработало.
На другой машине вылетела ошибка при выполнении mergemaster. Я перегрузился, и заново запустил mergemaster, после чего ошибок уже не было.