Обновление FreeBSD

Тут описывается нелёгкий путь настройки ОС FreeBSD, начиная с установки дистрибутива и заканчивая настройкой каждого сервиса
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Обновление FreeBSD - 10 лет спустя

Сообщение RomA »

Вступление:
Итак, прошло время, у нас в системе хаос и с этим надо как-то бороться. Именно этим мы сегодня и займёмся.

Предыстория:
Решил я тут в очередной раз обновить установленные программы и понял что капец что у меня в системе наверчено - порты не хотят обновляться, затык на каждом шагу, система после обновления работает на перекосяк. И понял я что пора с этим что-то делать - и начал делать.

Решение:
Первое что хотелось бы сказать - так это что всё надо делать вовремя, и не забывать после каждого обновления портов скачивать новую базу, но я это успешно забываю. Потому файл /root/cvsup/update.sh добавил скачивание файла

Код: Выделить всё

#!/bin/sh
cvsup -g -L 2 /root/cvsup/ports-supfile
cd /usr/ports
make fetchindex
теперь после обновления мы увидим что-то в этом духе

Код: Выделить всё

Edit ports/x11-wm/xfce4-session/pkg-plist
  Add delta 1.26 2013.03.08.21.25.45 svnexp
Shutting down connection to server
Finished successfully
/usr/ports/INDEX-9.bz2                        100% of 1664 kB  115 kBps 00m00s
То есть после каждого обновления портов будет обновляться и база. Это гуд. Поехали дальше

Выше я говорил что база у меня кривая, потому найдём и починим все потерявшиеся зависимости - делать это будем командой

Код: Выделить всё

pkgdb -L
после этого чиним базу

Код: Выделить всё

pkgdb -F
потом опять первую команду, потом вторую. по пути удаляем или ставим то что надо - я решил всё что вылазило удалять, причём со всеми зависимостями. Удалял я командой pkg_deinstall
И так много-много раз пока не будет всё хорошо, и команда pkgdb -L не будет на всё отвечать ок а команда pkgdb -F скажет что фиксить нечего - вывод будет выглядеть примерно так

Код: Выделить всё

stat# pkgdb -L
.....
zoneinfo-2012.j: ok
zsh-5.0.2: ok
stat# pkgdb -F
--->  Checking the package registry database
Мне пришлось делать это примерно раз 20 и удалил я при этом порядка сотни портов

Теперь, когда всё хорошо стало с деревом портов, надо бы пересобрать установленные проги, что бы они поставили все зависимости, которые я с горяча им тут понаудалял, но сначала надо бы сразу ответить системе на пару вопросов раз и навсегда, что бы она не спрашивала больше этого у нас - идём в файл /etc/make.conf и приводим его к такому виду

Код: Выделить всё

OPTIONS_UNSET=DOCS IPV6 X11
WITH_PKGNG=yes
BATCH=yes
DEFAULT_VERSIONS+=perl5=5.30
Ну теперь можно и пересобрать все установленные программы со всеми зависимостями волшебной командой

Код: Выделить всё

portupgrade -afrR
но это было бы слишком просто, ну а точнее сложно - так как надо смотреть на это весь день и переодически отвечать на какие то вопросы. Времени столько нет, но, к счастью, есть другой путь.

Для начала мы ответим на все вопросы системы сразу и только потом поставим пересобираться... на дочь, так сказать
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Обновление FreeBSD после 23.02.2013г

Сообщение RomA »

И вот настали новые времена и cvsup больше не работает с нами... теперь порты обновлять надо по другому - как именно описано в англоязычном хендбуке http://www.freebsd.org/doc/en_US.ISO885 ... using.html

Обновление через subversion:
Для начала, пока всё ещё работает :-) ставим новый способ обновления

Код: Выделить всё

zabbix# cd /usr/ports/devel/subversion
zabbix# make install clean
Раз что-то так кардинально изменилось, то я решил что нет смысла тянуть за собой старые хвосты, и первое что сделал - это удалил существующее дерево портов со всем скарбом

Код: Выделить всё

zabbix# rm -R /usr/ports
и только потом воспользовался инструкцией с сайта - закачал новое дерево портов из репозитория

Код: Выделить всё

svn checkout https://svn.FreeBSD.org/ports/head /usr/ports
Если вы увидели что-то вроде этого:

Код: Выделить всё

svn: E125001: Couldn't determine absolute path of '.'
svn: E000002: No such file or directory
Просто перегрузитесь - пройдёт :-)[/color]

Коллекция портов появилась. Теперь я возжелал обновить саму систему, как это описано тут http://www.freebsd.org/doc/en_US.ISO885 ... rimer.html опять же предварительно удалив всё что, что там накопилось за предыдущие годы. Какой пусть выставить для обновления - модно увидеть по этой ссылке http://svnweb.freebsd.org/base/ - я буду обновляться до стабильной ветки 9той фри

Код: Выделить всё

zabbix# rm -R /usr/src
zabbix# svn checkout https://svn0.us-east.FreeBSD.org/base/stable/9 /usr/src
Итак - мы обновились. Дальнейшее обновление будет проходить другими командами, но давайте их рассмотрим применительно к тому, что мы уже привыкли делать - возвращаемся к файлам нашего старого обновления:
1) файл /root/cvsup/ports-supfile удаляем
2) файл /root/cvsup/update.sh модернизируем так:

Код: Выделить всё

#!/bin/sh
/usr/local/bin/svn up /usr/ports
cd /usr/ports
make fetchindex
/usr/local/bin/svn up /usr/src
Далее немного ликбеза - cvs и svn - это по сути 2 разные конкурирующие системы хранения изменений исходного кода. Таким образом мы с вами работали на одной, а теперь перешли на другую. Но каталог, где это всё лежит, называется cvsup - потому что бы не забыть самим, и не вводить в заблуждение последующие поколения - переместим файлик, а каталог сотрём за ненадобностью

Код: Выделить всё

zabbix# cp /root/cvsup/update.sh /root/update.sh 
zabbix# rm -R /root/cvsup
Ну вот и всё. теперь для обновления системы мы будем запускать файлик zabbix# /root/update.sh
Обновления идут очень быстро - за 10 минут пока я писал эту статью и, эксперементируя, несколько раз запускал /root/update.sh релиз поменялся с "Updated to revision 316802." до "Updated to revision 316805."
А ещё случилась у меня такая беда - сервер не хотел обновляться и говорил вот такое

Код: Выделить всё

Updating '/usr/src':
svn: E170000: Unrecognized URL scheme for 'https://svn0.us-east.freebsd.org/base/stable/9'
Так как обновиться хотелось - пришлось лечить - для этого я пошёл в

Код: Выделить всё

cd /usr/ports/devel/subversion
сделал там

Код: Выделить всё

make config
и поставил галочку на

Код: Выделить всё

[x] SERF              WebDAV/Delta-V (HTTP/HTTPS) repo access module
после чего переставил порт

Код: Выделить всё

make deinstall
make install clean
После этой процедуры я смог нормально обновить порты
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Обновление до FreeBSD 10

Сообщение RomA »

Ну вот и настала пора опять прыгать по веткам. Я немножко подождал, по 10 ветка оттестируется и решил ставить на сервер. обновляться я буду с последний на сегодня версии 9той ветки
zabbix# uname -a
FreeBSD zabbix.cz6.ru 9.3-STABLE FreeBSD 9.3-STABLE #9 r271302:
Да и способ обновления будет старый - сборка из исходников. Поехали.

Далим старые сырцы

Код: Выделить всё

zabbix# rm -R /usr/src
Закачаем исходники нового ядра

Код: Выделить всё

zabbix# svn checkout https://svn0.us-east.FreeBSD.org/base/stable/10 /usr/src
Переходим в директорию исходников

Код: Выделить всё

zabbix# cd /usr/src
И соберём в привычной манере

Код: Выделить всё

zabbix# make buildworld
zabbix# make buildkernel
zabbix# make installkernel
По идее дальше должно быть make installworld но команда не сработает и нас отправят читать что же там слочилось.
zabbix# make installworld
ERROR: Required unbound user is missing, see /usr/src/UPDATING.
*** Error code 1

Stop.
bmake: stopped in /usr/src
*** [installworld] Error code 1

Stop in /usr/src.
А случилось там, что добавился новый юзер. Такая ситуауия уже была и мы добавляли учётку руками - такой способ уже описан, потому не будем повторяться, и воспользуемся утилиткой mergemaster

Код: Выделить всё

zabbix# mergemaster -p
Нам будет задано несколько вопросов - внимательно читаем, так как можно покорёжить системные файлы.
Сначало он нас спросит про директории - нажимаем d

Код: Выделить всё

 Use 'd' to delete the old /var/tmp/temproot and continue
  Use 't' to select a new temporary root directory
  Use 'e' to exit mergemaster
Дальше разговор будет идти о файлах. если это то, что вы не знаете - ставьте новыю версию, для этого нажимайте i
Use 'd' to delete the temporary ./etc/master.passwd
Use 'i' to install the temporary ./etc/master.passwd
Use 'm' to merge the temporary and installed versions
Use 'v' to view the diff results again
Но вот файл паролей мне захотелось сохранить, потому я выбрал вариант сравнения - итак, если вы хотите обьединить новый и старый файлы, то надо нажать m после чего вы "провалитесь" в область обьединения файлов - слева будет старый файл, справа новый - вам необходимо выбирать левая или правая строка попадёт в итоговый файл. Что бы попала левая - надо нажать l а что бы правая - нажимаем r Вам будут предлогаться различия, а вы должны выбрать, что попадёт в итокге. Появляться различия будут построчно (возможно блоками). Когда все различия закончатся у вас появится i для записи итогового файла.
Use 'i' to install merged file
Use 'r' to re-do the merge
Use 'v' to view the merged file
Как сохраните, появится вопрос вроде такого

Код: Выделить всё

*** You installed a new master.passwd file, so make sure that you run
    '/usr/sbin/pwd_mkdb -p /etc/master.passwd'
     to rebuild your password files

    Would you like to run it now? y or n [n] 
Тут следует ответь y иначе система будет говорить что пользователя всё ещё нет


Если вы решили обновиться, скажем, с 8.2 сразу до 10.1, как я, то без нескольких каков вам не обойтись. Во первых вы столкнётесь с тем что у вас не устанавливается мир и не компенсируются программы - решение было найдено тут https://forums.freebsd.org/threads/issu ... nds.46291/

Код: Выделить всё

server# pkg_add -r http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/ports/i386/packages-9.0-release/devel/bmake-20111111.tbz
Fetching http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/ports/i386/packages-9.0-release/devel/bmake-20111111.tbz... Done.
server# rm /usr/bin/make
server# ln -sv /usr/local/bin/bmake /usr/bin/make
/usr/bin/make -> /usr/local/bin/bmake
server# 
Ну а что бы обновить порты надо поставить новый менеджер портов

Код: Выделить всё

server# cd /usr/ports/ports-mgmt/pkg
server# make -m /usr/share/mk UPGRADEPKG=1 install clean
server# rehash
server# pkg2ng
Второй прикол - это то, что я не смог зайти в систему после обновления - решение было взято отсюда (оригинал на момент написания статьи не работает) http://webcache.googleusercontent.com/s ... clnk&gl=ru
В файле /etc/pam.d/sshd мне пришлось строку

Код: Выделить всё

auth           required        pam_nologin.so          no_warn
заменить на

Код: Выделить всё

account         required        pam_nologin.so          no_warn
после чего система пустила. Сделайте это заранее :-)
[/color][/i]

Как только вы это сделаете мы сможем установить мир

Код: Выделить всё

zabbix# make installworld
И перегрузить сервер. Загрузился я уже на 10 фрю

Код: Выделить всё

zabbix# uname -a
FreeBSD zabbix.cz6.ru 10.1-PRERELEASE FreeBSD 10.1-PRERELEASE #10 r271303:
Ну раз с ядром всё, то займёмся программами - на всякий случай я всё удалю, как и раньше и закачаю заново

Код: Выделить всё

zabbix# rm -R /usr/ports
zabbix# svn checkout https://svn0.us-west.freebsd.org/ports/head /usr/ports
Теперь поговорим о make.conf - как вы помните у меня там прописаны какие-то строки, и вот начиная с 9.3, ну а в 10 и подавно, у них поменялись переменные - о чём говорится при сборке, потому пока качаются порты сразу исправим этот файлик, и вместо WITHOUT_X11=yes надо прописать OPTIONS_UNSET=X11

Ну и теперь рабюота с портами. для начала мы их конвертонём в новый формат

Код: Выделить всё

zabbix# pkg2ng
После того, как база сконвертируется надо обновить базу данных

Код: Выделить всё

zabbix# pkgdb -fu
Теперь Опишем репозиторий - для начала удалим старый файл конфига

Код: Выделить всё

zabbix# rm -f /usr/local/etc/pkg.conf
и создадим новый из шаблона

Код: Выделить всё

zabbix# cp /usr/local/etc/pkg.conf.sample /usr/local/etc/pkg.conf
Создадим и каталог репозитория

Код: Выделить всё

zabbix# mkdir -p /usr/local/etc/pkg/repos
затем прописываем в конфиг параметры

Код: Выделить всё

zabbix# ee /usr/local/etc/pkg/repos/FreeBSD.conf
с таким содержимым
FreeBSD: {
url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
mirror_type: "srv",
enabled: yes
}
Теперь можно обновить базу нашего pkg

Код: Выделить всё

zabbix# pkg update -f
на всякий случай и ради эксперемента сделал ещё

Код: Выделить всё

zabbix# pkg audit -F
zabbix# pkg check -Bd
ну вот и всё. программы я обновлял привычным portupgrade -arR

Никаких трудностей при переходе на FreeBSD 10 я не испытал - все программы обновились, работают - всё хорошо.
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Команды кратко

Сообщение RomA »

Ядро:
grep -A 2 'TYPE="' /usr/src/sys/conf/newvers.sh - посмотреть текущую версию исходников ядра

Посмотреть разновидности ядра можно на сайте https://svnweb.freebsd.org/base/ - если коротко, то

svn checkout http://svn.freebsd.org/base/releng/12.2/ /usr/src - обновление до последней стабильной ветки - только исправление критических ошибок;
svn checkout http://svn.freebsd.org/base/stable/12/ /usr/src - обновление до "живой" ветки

# make buildkernel KERNCONF=ВашеЯдро - компилируем ядро с нашими параметрами
# make installkernel KERNCONF=ВашеЯдро - если мы так компилировали, то так же и должны ставить

pkg install ca_root_nss - обновить корневые сертификаты

Порты:
portupgrade -afrR - пересобрать все установленные программы
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Возможные ошибки

Сообщение RomA »

Ситуация. Вновь установленная фря, но при обновлении портов или скачивания индекса получаем бесконечное
fetch: https://www.FreeBSD.org/ports/INDEX-11.bz2: Authentication error
Certificate verification failed for /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
34374371912:error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed:/usr/src/crypto/openssl/ssl/s3_clnt.c:1269:
Всё что нужно сделать - обновить корневые сертификаты:

Код: Выделить всё

pkg install ca_root_nss
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Обновление релиза с 11 до 12

Сообщение RomA »

Очередная проблема ждала при обновлении машин с 11 ядром на 12 ветку:
root@unifi:/usr/src # make installworld
make[1]: "/usr/obj/usr/src/amd64.amd64/toolchain-metadata.mk" line 1: Using cached toolchain metadata from build at unifi on воскресенье, 5 января 2020 г. 16:57:19 (MSK)
ERROR: Required ntpd user is missing, see /usr/src/UPDATING.
*** Error code 1

Stop.
make[1]: stopped in /usr/src
*** Error code 1

Stop.
make: stopped in /usr/src
Решение заключается в запуске mergemaster -p, так как произошли изменения - в частности в системе не хватает пользователя ntpd. Приведу самый конец диалога:

Код: Выделить всё

  Use 'i' to install merged file
  Use 'r' to re-do the merge
  Use 'v' to view the merged file
  Default is to leave the temporary file to deal with by hand

    *** How should I deal with the merged file? [Leave it for later] i

     *** Merged version of ./etc/master.passwd installed successfully


*** Comparison complete

*** /var/tmp/temproot is empty, deleting

*** You installed a new master.passwd file, so make sure that you run
    '/usr/sbin/pwd_mkdb -p /etc/master.passwd'
     to rebuild your password files

    Would you like to run it now? y or n [n]

       *** Cancelled

    Make sure to run /usr/sbin/pwd_mkdb -p /etc/master.passwd yourself

root@unifi:/usr/src # /usr/sbin/pwd_mkdb -p /etc/master.passwd

После этого можно делать make installword - всё получится
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

FreeBSD 13

Сообщение RomA »

В очередной раз изменились способы обновления FreeBSD.

Обновление операционной системы:

Обновление из исходных кодов теперь скачивает новые версии при помощи команды git (предварительно должна быть установлена):

Если вы не знаете что, как, зачем и почему там сейчас, то лучше старое переименовать, а там можно будет и удалить, если всё хорошо:

Код: Выделить всё

rm -rf /usr/src/* && rm -rf /usr/src/.*
Первый раз это делается командой:

Код: Выделить всё

git clone --branch stable/13 https://git.FreeBSD.org/src.git /usr/src
Ну или если надо до другой ветки, то:

Код: Выделить всё

git clone --branch releng/13.2 https://git.FreeBSD.org/src.git /usr/src
Последующие разы командой:

Код: Выделить всё

cd /usr/src/ && git pull
Ну а дальше всё как обычно

Код: Выделить всё

make -j8 buildworld
make -j8 buildkernel
make installkernel
make installworld
Где -j8 - количество одновременных потоков сборки (в данном случае 8) - как правило ставится цифра в 2 раза больше реальных ядер процессора

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

Один первый раз удаляем старое:

Код: Выделить всё

rm -rf /usr/ports/* && rm -rf /usr/ports/.*
И получаем новые

Код: Выделить всё

cd /usr/ports/
git clone https://git.freebsd.org/ports.git --branch main /usr/ports/
make fetchindex
И последующее обновления:

Код: Выделить всё

cd /usr/ports/ && git pull
make fetchindex
Файл обновления:
В итоге файл последующего обновления update.sh будет выглядеть так:

Код: Выделить всё

#!/bin/sh
cd /usr/src/
git pull
cd /usr/ports/
git pull
make fetchindex
Литература:
https://docs.freebsd.org/en/books/handb ... aining-src
https://vds-admin.ru/freebsd/obnovlenie ... a-portsnap
Ответить