Статья о переходе на FreeBSD 6-CURRENT


Предисловие и Предостережение

ВАЖНО: Обновляться до 6-CURRENT в настоящее время можно лишь тогда, когда вы знаете, для чего вам это нужно, и что нужно делать, если что-то заработает не так как нужно. Намного безопаснее подождать выхода 6.0-RELEASE (в конце августа 2005 года) и обновиться тогда.

ВАЖНО: Обновится до 6-CURRENT с помощью постройки системы из исходных кодов (make buildworld + make installworld) можно лишь при том условии, что у вас FreeBSD 5.3 или 5.4. Таково ограничение, сделанное разработчиками. Поэтому с более старых версий пятой ветки придется переходить в два этапа (например, 5.2.1 ? 5.4 ? 6-CURRENT) либо использовать binary upgrade, то есть ждать выхода диска (или заболванить снэпшот шестой ветки) и обновлятся через sysinstall с помощью опции "Upgrade". Для владельцев FreeBSD 4.X в 99% случаев нужно обновляться с помощью binary upgrade.

ВАЖНО: Тот факт, что у авторов этой статьи переход на 6-CURRENT прошел гладко, совсем не означает, что у вас тоже не возникнет проблем. Поэтому помните, что никакой ответственности за какие-то возникшие у вас проблемы мы не несем.
Новые возможности FreeBSD 6.x

ссылка на relnotes.html ссылка на интервью в OSNews

Support for 80386 processors (the I386_CPU kernel configuration option) has been removed.

Fine-grained locking to allow much of the VFS stack to run without the Giant lock has been added. This is enabled by default on the alpha, amd64, and i386 architectures, and can be disabled by setting the loader tunable (and sysctl variable) debug.mpsafevfs to 0.

The generic tty(4) driver interface has been added and many device drivers including cx(4) ({tty,cua}x), cy(4) ({tty,cua}c), digi(4) ({tty,cua}D), rc(4) ({tty,cua}m), rp(4) ({tty,cua}R), sab(4) ({tty,cua}z), si(4) ({tty,cua}A), sio(4) ({tty,cua}d), sx ({tty,cua}G), uart(4) ({tty,cua}u), ubser(4) ({tty,cua}y), ucom(4) ({tty,cua}U), and ucycom(4) ({tty,cua}y) have been rewritten to use it. Note that /etc/remote and /etc/ttys have been updated as well.

FreeBSD always uses the local APIC timer even on uni-processor systems now.

The default HZ parameter (which controls various kernel timers) has been increased from 100 to 1000 on the i386 and ia64. It has been reduced from 1024 to 1000 on the amd64 to reduce synchronization effects with other system clocks.

The acpi_ibm(4) driver for IBM laptops has been added and improved to support hotkeys and reading fan status and thermal sensors.

The acpi_fujitsu(4) driver for handling acpi(4)-controlled buttons Fujitsu laptops has been added.

The acpi_sony driver, which supports the Sony Notebook Controller on various Sony laptops has been added.

The hwpmc(4) hardware performance monitoring counter driver has been added. This driver virtualizes the hardware performance monitoring facilities in modern CPUs and provides support for using these facilities from user level processes. For more details, see manual pages of hwpmc(4), associated libraries, and associated userland utilities.

Support for 802.11 devices in the wlan(4) framework has been greatly overhauled. In addition to architectural changes, it includes completed 802.11g, WPA, 802.11i, 802.1x, WME/WMM, AP-side power-saving, and plugin frameworks for cryptography modules, authenticators, and access control. Note in particular that WEP now requires the wlan_wep module to be loaded (or compiled) into the kernel.

The if_bridge(4) network bridging implementation, originally from NetBSD, has been added. It supports the IEEE 802.1D Spanning Tree Protocol, individual interface devices for each bridge, and filtering of bridged packets. The ifconfig(8) utility now supports to configure if_bridge(4).

The old vinum(4) subsystem has been removed in favor of the new geom(4)-based version.

Read-only support for ReiserFS version 3 has been added. See mount_reiserfs(8) for details.
Допущения и принятые обозначения (?)

Все примеры приведены для i386-архитектуры. В случае amd64 и ia64 возможны некоторые особенности, не указанные здесь. Также предполагается, что любое упоминание "i386" в примерах файлов или путях к ним не относится к обладателям компьютеров с процессорами другой архитектуры.

Почти все действия выполняются под пользователем root, поэтому будьте предельно внимательны, даже если это просто тестовая машина.

Подразумевается, что обновление проводится непосредственно на самом компьютере, а не удаленно. Если нет физического доступа к компьютеру - знайте, что вы действуете на свой страх и риск.

На /usr (или в другом разделе) должно быть достаточно свободного дискового пространства (около 1,2 Гб)
Обновление через исходные коды: последовательность действий
Подготовительные мероприятия

1. Делаем копию исходников текущей (установленной) версии FreeBSD.

# cp -Rv /usr/src /usr/src5

2. Обновляем исходники системы до 6.0-BETA. Для этого создаем (или меняем существующий) файл следующего содержания:
*default host=cvsup.ru.FreeBSD.org
*default base=/usr/local/etc/cvsup
*default prefix=/usr
*default release=cvs
*default delete use-rel-suffix
*default compress

src-all tag=RELENG_6

default host вы можете поставить любой, тот, который к вам ближе. Определить таковой поможет программа fastest_cvsup (/usr/ports/sysutils/fastest_cvsup), в которой есть список всех официальных cvsup-сайтов FreeBSD.

default base тоже ставьте по своему усмотрению. У некоторых это будет, например, /var/db.

ВАЖНО! Непосредственно перед выходом FreeBSD 6.0 будет сформирована ветка RELENG_6_0, тогда будем писать src-all tag=RELENG_6_0.

Предроложим, что он называется supfile6 и лежит в домашнем каталоге пользователя root

# cvsup -g -L 2 ~/supfile6

Если все прошло успешно, мы имеем обновленный код в /usr/src.

3. Внимательно читаем файл /usr/src/UPDATING до самого конца. На самом деле там написано почти все, что нужно знать в таких случая.

4. Приступаем к редактированию /etc/make.conf, предварительно сделав копию этого файла.

Одновременно открываем /usr/src/share/examples/etc/make.conf, сличаем с ним наш действующий make.conf и вносим необходимые изменения.

В итоге должен получится файл с довольно консервативными настройками
CPUTYPE?=pentium4
CFLAGS= -O -pipe
COPTFLAGS= -O -pipe
NO_PROFILE=
NO_DOCCOMPRESS=

В CPUTYPE обязательно оставьте знак вопроса.

В CFLAGS и COPTFLAGS больше ничего не добавляйте, O2 тоже не нужно. Сначала сделаем апгрейд системы, а эксперименты оставим на потом.

Из всех возможных строк вида NO_FOO я оставляю только NO_PROFILE и NO_DOCCOMPRESS. Построим систему практически в полном объеме для чистоты эксперимента. Оптимизацию будете делать после сами. И помните, что в наименованиях данных строк произошли изменения. В предыдущих версиях FreeBSD присутствовали как строки NO_FOO= true, так и NOFOO= true. Теперь все пишутся со знаком подчеркивания и без слова "true". Но даже если вы оставите эти строки в прежнем виде, make просто выдаст warning'и. Тем не менее лучше сразу привыкнуть к нововведениям.

from sys CFLAGS и COPTFLAGS рекомендую в make.conf не добавлять(по умолчанию и так O2, и это желательно всем оттестировать). Я так же предпочитаю ядро без модулей(намного быстрее собирается и меньше весит в корневом разделе). NO_MODULES= . KERNCONF?=имя_кернела позволит использовать make buildkernel, make installkernel без дополнительного указания имени ядра(хотя сам я собираю по старинке - make clean && make depend && make && make install). NO_ATM=, NO_GAMES=, NO_INET6=, NO_INFO=, NO_IPFILTER= эти опции у меня так же вкючены(особенно полезна NO_INET6, если Вы не используете этот протокол).
Строим новый мир

# cd /usr/src
# rm -rf /usr/obj/*
# make buildworld

Не забудьте про rm, потому что /usr/obj должна обязательно быть пустой!

Процесс постройки системы занимает около 43 минут (на Pentium4 2,4 ГГц).
Ядро (часть 1)

Если предыдущая операция завершилась успешно, приступаем к компиляции ядра и модулей. Если нет какой-то очень веской причины сразу использовать свой конфиг, будем компилить GENERIC. KERNCONF= писать не нужно, так как по умолчанию подразумевается именно GENERIC.

# make buildkernel
# make installkernel

Если все прошло успешно, у вас в /usr/obj находится вся система и ядро (кстати, занимают они почти 700 Мб). А сам процесс постройки ядра занимает приблизительно 12 минут (на Pentium4 2,4ГГц).
FreeBSD: перезагрузка

Перезагружаемся в однопользовательский режим (single-mode). Обязательно перезагружаемся (с помощью reboot), а не просто делаем shutdown now. В меню выбираем пункт 4 (однопользовательский режим). Смотрим, как себя ведет ядро при загрузке. Прежде чем начать что-то делать, разумным будет прокрутить консоль назад на несколько экранов и посмотреть как опознались устройства, нет ли каких-нибудь явных сообщений об ошибках. Помните, что мы установили GENERIC, в котором на данном этапе разработки ветки -CURRENT по максимуму включены все опции для отладки. Поэтому будут выводится дополнительные сообщения.

Затем делаем выбираем шелл (или просто нажимаем "Enter", если не имеете ничего против /bin/sh) и делаем как учили, а именно:

# fsck -p
# mount -u /
# mount -a -t ufs
# adjkerntz -i
# cd /usr/src

И помните, что все последующие действия до второй перезагрузки будут выполняться именно в /usr/src.

Теперь настало время для первого (из двух) запусков программы mergemaster.
Mergemaster (часть 1)

Даже при переходе между двумя соседними версиями, еще до установки мира будет не лишним запустить mergemaster с опцией -p. Дело в том, что периодически создаются новые системные пользователи и группы, которым принадлежат новые файлы. Так, в 6-CURRENT добавлен пользователь _dhcp и одноименная группа. Это связано с тем, что совсем недавно был импортирован dhcp-клиент из OpenBSD.

# mergemaster -p

В нашем случае программа обнаружит несоответствие существующего файла /etc/master.passwd такому же файлу из 6-CURRENT. Помимо того, что в существующем файле нет пользователя _dhcp, в нем root имеет установленный пароль, а также наверняка есть один или более несистемных пользователей (то есть обычные учетные записи людей, работающих в системе).

Чтобы не вносить изменения в файл master.passwd вручную, в программе mergemaster существует очень удобная функция "merge", позволяющая построчно объединить два файла. Нажимаем "m" и видим, что экран разделился на две части: слева - существующий (старый) файл, справа - тот же файл из новой построенной системы. Программа предлагает построчно объединить эти файлы. Первая строка (которая покажется совершенно одинаковой) содержит номер версии файла в cvs-хранилище. Именно используя эту строку mergemaster узнает, что файл требует обновления. Нам нужна свежая версия файла - жмем "r" (от слова rigth - правый) и, понятно, клавишу Enter. Следующая строка наверняка будет учетной записью суперпользователя (root). Мы хотим сохранить свой пароль - жмем "l" (от слова "left" - левый). Затем mergemaster натолкнется на строку _dhcp, которая отсутствует в действущем файле, поэтому слева ее не будет, только справа. "r". Затем будут учетные записи пользователей, которые будут только слева. Жмем "l" и добавляются все записи. Все. Мы объединили два файла в один. Нажимаем "v", чтобы просмотреть объединенный файл и убедиться, что в нем есть все, что нужно. Жмем "i" - установить. Если что-то не так, вместо "i" жмем на "r" и проходим все заново.

Затем очередь дойдет до файла /etc/group. Аналогичным образом объединяем файлы, добавляя группу _dhcp.

По окончании работы mergemaster предложит удалить временные файлы в /var/tmp/temproot - соглашаемся ("yes"), а также синхронизировать текстовые и бинарные файлы с паролями (всего их 4, и их содержание должно совпадать) - обязательно соглашаемся ("y").

Ну и в самом конце mergemaster выдаст на экран различия между /etc/make.conf и образцом make.conf из новой версии системы. Мы это уже прошли, поэтому просто пролистываем.
Установка мира

# make installworld

Если все прошло успешно, можно сказать, что самое трудное осталось позади.

Нужно отметить, что при установке мира файлы в /etc остаются нетронутыми. Их обновление - работа для mergemaster. Поэтому, если вы еще не сделали бэкап /etc, это можно сделать сейчас.
Mergemaster (часть 2)

Cнова запускаем mergemaster, на этот раз без опций. Опять же, если файл вами ранее не редактировался, просто нажимаете "i", чтобы установить его свежую версию. Если же файл содержит ваши настройки и изменения, можно либо мерджить его с помощью mergemaster, или отредактировать вручную. А изменений достаточно много. Правда в большинстве случаев это просто добавления. (сказать о rc.d; о ppp)

В конце mergemaster предложить удалить все, что осталось в /var/tmp/temproot - соглашаемся ("yes"), а также, напоследок, обновить базу aliases - соглашаемся ("yes").

from sys полезный ключик для mergemaster "-a"
FreeBSD: перезагрузка 2

Перезагружаемся с помощью reboot. Можно просто выйти из однопользовательского режима с помощью exit, но для чистоты эксперимента лучше перезагрузится. После перезагрузки вы получаете действительно обновленную систему. Мы сделали это!!! Можно даже удалить все то, что находится в /usr/obj (rm -rf /usr/obj/*). Но не забывайте, что пока у нас ядро GENERIC. Поэтому самое время занятся ядром.
Ядро (часть 2)

Можно воспользоваться своим старым конфигом ядра. Но сначала сравним содержание старого и нового файлов GENERIC.

# diff -ignore-all-space -ignore-blank-lines -ignore-space-change /usr/src5/sys/i386/conf/GENERIC /usr/src/sys/i386/conf/GENERIC | more

Опции для отладки (которые пока присутствуют в GENERIC - ведь это ветка -CURRENT) нас не интересуют. Добавилась options PREEMPTION, пока еще закомментированная #options SCHED_ULE, SCSI_DELAY теперь равна 5000, device ehci раскомментировали, и еще есть небольшие изменения в сетевых интерфейсах. Теперь сгенерим два файла LINT - один для 5.4

# cd /usr/src5/sys/i386/conf/ && make LINT

а другой для установленной 6-CURRENT

# cd /usr/src/sys/i386/conf/ && make LINT

Затем сравниваем их и находим много нового.

# diff -ignore-all-space -ignore-blank-lines -ignore-space-change /usr/src5/sys/i386/conf/GENERIC /usr/src/sys/i386/conf/GENERIC | more

Так, например, добавились опции для ALTQ и NETGRAPH, устройства wlan_*. Звуковые устройства теперь пишутся без кавычек, и вообще кавычки нигде не употребляются. Добавились драйверы acpi для некоторых ноутбуков, drm ... Добавилась options REISERFS.

Когда конфиг ядра готов (пусть он называется KERN6T1), компилируем и устанавливаем ядро. Желательно строить ядро полностью, пока не указывая в /etc/make.conf лишь необходимые модули. Опять же, для чистоты эксперимента.

# make buildkernel KERNCONF=KERN6T1
# make installkernel KERNCONF=KERN6T1

и перезагружаемся с помощью reboot.

Если с ядром какие-то проблемы, всегда можно использовать //GENERIC//, который после установки KERN6T1 переместился в /boot/kernel.old. Собственно говоря, именно поэтому мы сначала установливали его - как гарантированно работающее ядро. Теперь запомните: если будете чинить или дополнять KERN6T1 и заново его компилировать, не забудьте на этапе установки ядра использовать не make installkernel KERNCONF=KERN6T1, а make reinstallkernel KERNCONF=KERN6T1, чтобы GENERIC оставался в /boot/kernel.old. А еще лучше скопировать его на всякий случай в отдельный каталог:

# cp -Rv /boot/kernel.old /boot/kernel.gen
Binary upgrade: последовательность действий

бла-бла-бла
Conclusion

бла-бла-бла

Комментарии

Смотрите и дополняйте. - sleepybrain 05/07/2005 13:36

После обновления приложения gtk2 (gnome2, OO и пр.) и не только gtk могут некоректно работать или отображать русские символы. Для исправления данной ситуации есть следущие пути:

1. Пересбор всех портов: portupgrade -af

2. Загружаемся монопольно в систему (или init 1), удаляем /lib/libc.so.5 и делаем симлинк с /lib/libc.so.6 на /lib/libc.so.5.

- sys 06/08/2005 19:11

http://wiki.bsdportal.ru/doc:freebsd6_transfer

Обновлено: 12.03.2015