войти зарегистрироваться

BSDельники whois

индекс
106,19

Мастер-класс управления FreeBSD: обновление системы из исходников

Пересборка системы FreeBSD из исходников состоит из следующих этапов:
  • загрузка файлов с исходными кодами
  • редактирование конфигурационных файлов
  • непосредственная компиляция и сборка системы из исходников
  • инсталляция собранных ядра и системного окружения
  • слияние новых настроечных файлов системы с существующими
  • перезагрузка для вступления в силу всех изменений


Рассмотрим эти этапы подробнее.


Конфигурационные файлы



В системе должны быть три файла, влияющие на этапы загрузки (обновления), компиляции и сборки системы. Это файлы: /etc/make.conf, /etc/src.conf и /etc/sys-supfile. При этом файлы src.conf и sys-supfile необязательно присутствуют в системе, но их можно и нужно создать на основе примеров.

Примерный файл /etc/make.conf:
#Имя ядра
KERNCONF=COMP
#Флаги оптимизации компиляции
CPUTYPE=pentium3
CFLAGS= -O -pipe
NO_PROFILE=true
#Рабочий каталог компиляции портов, если в /usr/ports нету места
WRKDIRPREFIX=/home/compile
#Отдельный каталог складирования архивов с исходниками ПО для портов
DISTDIR=/usr/distfiles
#Отдельный каталог складирования бинарных пакетов после сборки из исходников
#иначе пакеты будут собираться в /usr/ports/packages
PACKAGES=/usr/packages
#Поддерживаемые кодировки для документации
DOC_LANG= en_US.ISO8859-1 ru_RU.KOI8-R
FORMATS= html
# see /usr/share/examples/etc/make.conf
MAKE_KERBEROS4=false
MAKE_KERBEROS5=false
NO_KERBEROS=true
#Для OpenSSL можно использовать алгоритм IDEA, который запрещён к экспорту в США
MAKE_IDEA=true
#Многие опции перенесены в /etc/src.conf, они влияют на сборку системы
#NO_BIND=true
NO_IPFILTER=true
NO_SENDMAIL=true
NO_GAMES=true
WITH_THREADS=true
#Опции сборки из портов
WITH_GECKO=xulrunner
#WITH_GECKO=firefox
WITHOUT_DEBUG=true
WITHOUT_SAMBA=true
WITHOUT_MDNS=true
WITHOUT_MYSQL=true
WITH_LCD_FILTERING=true
WITHOUT_IMAGEMAGICK_TESTS=true
WITHOUT_TTF_BYTECODE_ENABLED=false
WITH_TTF_BYTECODE_ENABLED=true
WITH_EVOLUTION=false
WITHOUT_EVOLUTION=true
# OpenOffice.org
LOCALIZED_LANG=ru
WITH_CUPS=true
WITHOUT_KDE=true
# automatic
PYTHON_DEFAULT_VERSION=python2.5
NOPORTDOCS=true
# added by use.perl 2008-10-05 01:01:16
PERL_VER=5.8.8
PERL_VERSION=5.8.8
LOADER_ZFS_SUPPORT=yes

Как не трудно заметить, опции файла make.conf влияют на компиляцию не только операционной системы, но и прикладного программного обеспечения, устанавливаемого из коллекции портов. Но вот опции компиляции ПО из коллекции портов не влияют на сборку системы.

Примерный файл /etc/src.conf (дополнительно см. man src.conf):
WITHOUT_ASSERT_DEBUG=yes
WITHOUT_ATM=yes
WITHOUT_AUDIT=yes
#-WITHOUT_BIND=yes
WITHOUT_BIND_DNSSEC=yes
WITHOUT_BIND_ETC=yes
WITHOUT_BIND_LIBS_LWRES=yes
WITHOUT_BIND_MTREE=yes
WITHOUT_BIND_NAMED=yes
#-WITHOUT_BIND_UTILS=yes
WITHOUT_GAMES=yes
WITHOUT_HTML=yes
WITHOUT_INFO=yes
WITHOUT_I4B=yes
WITHOUT_IPX=yes
WITHOUT_IPX_SUPPORT=yes
#-WITHOUT_INET6=yes
#-WITHOUT_INET6_SUPPORT=yes
WITHOUT_IPFILTER=yes
WITHOUT_NCP=yes
WITHOUT_LPR=yes
WITHOUT_PROFILE=yes
WITHOUT_RESCUE=yes
WITHOUT_SENDMAIL=yes
WITHOUT_MAILWRAPPER=yes
WITHOUT_NIS=yes
WITHOUT_KERBEROS=yes
WITH_IDEA=yes
WITHOUT_GSSAPI=yes
WITHOUT_KERBEROS_SUPPORT=yes
WITHOUT_PROFILE=yes
WITHOUT_GDB=yes


Мне нужен не весь BIND, а только некоторые утилиты из него. MTA Sendmail и отладчик GDB на обычной рабочей станции не нужны. Также ненужны устаревшие сетевые протоколы ATM и IPX. Каталог восстановления RESCUE лично мне не нужен. KERBEROS тоже не использую.

Примерный файл /etc/sys-supfile:
*default host=cvsup10.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs
*default tag=RELENG_7
*default delete use-rel-suffix
*default compress
src-all

То есть при использовании этого файла будут загружены исходные коды FreeBSD 7-STABLE.

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


(непосредственно процесс обновления по шагам расписан позднее, здесь даются лишь базовые понятия)

Обновление исходников системы производится системной утилитой csup примерно так:
% csup /etc/sys-supfile

Необходимое и достаточное условие: активное прямое Интернет-соединение!
(здесь и далее символ "%" говорит о том, что используется командная оболочка /bin/tcsh с правами рута; символ ">" говорит о том, что используется командная оболочка /bin/tcsh с правами пользователя.)

Потом необходимо сделать копию файла настроек ядра GENERIC:
% cd /sys/i386/conf/ && cp GENERIC COMP

и отредактировать эту копию. Проследите, чтобы имя файла, в данном случае /sys/i386/conf/COMP, совпало с именем ядра переменной KERNCONF в файле make.conf.

Файл /sys/i386/conf/COMP здесь не весь(!!!), а лишь несколько строчек, в которых я что-то меняю:
# $FreeBSD: src/sys/i386/conf/GENERIC,v 1.474.2.14 2008/08/29 18:54:35 jhb Exp $

#cpu I486_CPU
#cpu I586_CPU
cpu I686_CPU
ident COMP #Имя ядра

# To statically compile in device wiring instead of /boot/device.hints
#hints "GENERIC.hints" # Default places to look for devices.

#makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols ненужно

options SCHED_ULE # ULE scheduler
options PREEMPTION # Enable kernel thread preemption
options INET # InterNETworking
options INET6 # IPv6 communications protocols
options SCTP # Stream Control Transmission Protocol
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
options UFS_DIRHASH # Improve performance on big directories
options UFS_GJOURNAL # Enable gjournal-based UFS journaling
#options MD_ROOT # MD is a potential root device ненужно
options NFSCLIENT # Network Filesystem Client
options NFSSERVER # Network Filesystem Server
options NFSLOCKD # Network Lock Manager
options NFS_ROOT # NFS usable as /, requires NFSCLIENT
options MSDOSFS # MSDOS Filesystem
options CD9660 # ISO 9660 Filesystem
options PROCFS # Process filesystem (requires PSEUDOFS)
options PSEUDOFS # Pseudo-filesystem framework
options GEOM_PART_GPT # GUID Partition Tables.
options GEOM_LABEL # Provides labelization
options COMPAT_43TTY # BSD 4.3 TTY compat [KEEP THIS!]
options COMPAT_FREEBSD4 # Compatible with FreeBSD4
options COMPAT_FREEBSD5 # Compatible with FreeBSD5
options COMPAT_FREEBSD6 # Compatible with FreeBSD6
options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
#options KTRACE # ktrace(1) support ненужно
#options STACK # stack(9) support ненужно
options SYSVSHM # SYSV-style shared memory
options SYSVMSG # SYSV-style message queues
...


Полная инструкция сборки всего системного окружения и ядра FreeBSD


  1. Удаляем бинарники от предыдущей компиляции:
    % cd /usr/obj/ && chflags -R noschg * && rm -rf *
  2. Редактируем файл /etc/sys-supfile для обновления исходников до нужной версии системы:
    % ee /etc/sys-supfile
  3. Синхронизируем дерево исходного кода с серверным:
    % cd /usr/src/ && chflags -R noschg * && csup /etc/sys-supfile
  4. На этом шаге делаем копию конфига ядра:
    % cd /sys/i386/conf/ && cp GENERIC COMP
  5. Редактируем конфиг будущего ядра:
    % ee /sys/i386/conf/COMP
  6. На этом этапе редактируем make.conf и src.conf, если нужно:
    % ee /etc/make.conf
    и
    % ee /etc/src.conf
  7. Очищаем исходники:
    % cd /usr/src/ && make cleandir && make cleandir && make cleandir
  8. Собираем Мир и Ядро:
    % cd /usr/src/ && make buildworld buildkernel
  9. Инсталлируем Ядро:
    % cd /usr/src/ && make installkernel
    % reboot
  10. После нормальной загрузки нового ядра переходим в однопользовательский режим и инсталлируем Мир:
    % shutdown now
    # cd /usr/src/ && make installworld
  11. Обновляем интерактивно конфиги системы:
    # mergemaster
    В одних случаях может быть достаточно нажимать клавишу [i] на вопросы утилиты — инсталлировать новые файлы конфигурации, но сначала посмотрите, какой файл обрабатывается, прежде чем что-то конкретно сделаете с ним: заменить старую версию файла новым [i], оставить старый конфиг [d], посмотреть изменения [v] и произвести слияние нового со старым [m] или сделать ссылку [l] (бывает и такое). В завершение процесса на вопрос об удалении временного каталога можно нажать клавишу [y].
  12. Перезагружаемся:
    # reboot
  13. Загружаемся в однопользовательском режиме и удаляем мусор от предыдущей инсталляции:
    # /sbin/mount -a
    # cd /usr/src/ && make BATCH_DELETE_OLD_FILES=true delete-old delete-old-libs
    # reboot


Вот и всё.

комментарии (41)

  • под кат!
    • Как это сделать? Я искал, но не нашёл.
      • пишите в нужном месте
        • <habracut>
          • Куда его вствить?!!!
          • Спасибо. Нашёл.

            Впредь буду внимательнее.
  • Да чтоб ты жил на одну зарплату, чтоб дети твои боялись телевизора и чтоб с тёщей всю жизнь одну жилплощадь делил! Cut для кого придумали?! =E
  • и в блог BSDельники
    • Как сделать, чтобы название этого блога появилось в списке «В какой блог публикуем?» при редактировании топика?
    • Ага, присоединился к этому блогу.
  • обоже как я ЛЮБЛЮ GENTOO!
    • В Gentoo кроме поддержки версионности ПО в системе портэжей ничего такого существенного и нет.

      Ах да, в Gentoo ядро — Linux. Ну это кому как…
  • Коротко и по делу…
  • Вообще если не нужно обновляться до prerealese 7.1, то лучше ставить *default tag=RELENG_7_0
    • Извините хабра глюк=(

      В эту ветку добавляются только обновления связанные безопасностью и стабильностью
  • Еще очень рекомендую использовать опцию к компилятору -j4 или -j8 при сборке мира на многопроцессорных системах… а то просто make buildworld — это просто уж0с как долго работает.
  • ls# cat /etc/sys-supfile
    cat: /etc/sys-supfile: No such file or directory
    У меня нет такого файла.
    Статья копипаст откуда-то :)

    Проще надо жить, проще

    csup -h cvsup3.freebsd.org /usr/share/examples/cvsup/stable-supfile

    Имя конфига ядра не надо указывать в /etc/make.conf
    куда проще собирать нужное и ставить
    типа
    make buildkernel KERNCONF=COMP
    make installkernel KENCONF=COMP
    • к слову о проще жить надо:
      # freebsd-update fetch
      # freebsd-update install
      • Это бинарное обновление, а не из сорцов.

        Более правильным будет:
        % freebsd-update upgrade -r 7.1-BETA2
        % freebsd-update install
        % shutdown -r now
        % freebsd-update install
        % shutdown -r now
        • а смысл сорцового апдейта?
          только, если ядро(ну, у большинства оно кастомное, думаю) обновить, а сам мир проще бинарниками
        • в чем преимущества сорцового обновления перед бинарным?
          иными словами, ради чего нужно тратить больше времени на
          сборку всего?
          • Давате я отвечу на два вопроса, а не на один.

            > в чем преимущества сорцового обновления перед бинарным?

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

            > иными словами, ради чего нужно тратить больше времени на
            сборку всего?

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

            Посчитайте сами, что для вас выгоднее, и действуйте так, как считаете нужным.
    • > cat: /etc/sys-supfile: No such file or directory
      >У меня нет такого файла.

      Читайте внимательно: «При этом файлы src.conf и sys-supfile необязательно присутствуют в системе, но их можно и нужно создать на основе примеров.»

      > Статья копипаст откуда-то :)

      Ага. :)) Собрана по кусочкам из моих долгих объяснений на форумах другим как всё делать.

      > Проще надо жить, проще

      Кто как хочет, так тот и живёт.

      > Имя конфига ядра не надо указывать в /etc/make.conf

      Да в этом файле половина опций не нужна. ;)

      > куда проще собирать нужное и ставить

      Опять же: кому как приспичит. Можно и другие опции в командной строке с make указывать вместо использования опций в файле make.conf.

      > make installkernel KENCONF=COMP

      Вот видите, вы уже сделали ошибку. ;)
  • Статья копипаст из FreeBSD Handbook.
  • А есть какая-нибудь разница между csup и cvsup, кроме того, что первый написан на Си, а второй на Модуле?
    • csup — часть системы, не имеет графического интерфейса.
      cvsup — собирается из порта ports/net/cvsup, основная версия имеет графический интерфейс.
      • Использую cvsup no-gui из пакета (чтобы не устанавливать модулу) сразу после minimal установки. Может я делаю «неправильно» и есть какие-нибудь преимущества использования csup перед cvsup?
        • > Может я делаю «неправильно» и есть какие-нибудь преимущества использования csup перед cvsup?

          Преимущества csup: работает сразу после установки системы (даже без развёртывания локального дерева коллекции портов); для обновления исходников системы ничего не надо устанавливать из коллекции портов.

          При наличии соответствующего файла ports-supfile:

          *default host=cvsup10.FreeBSD.org
          *default base=/var/db
          *default prefix=/usr
          *default release=cvs
          *default delete use-rel-suffix
          *default compress
          *default tag=.
          ports-all

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

          % csup /path/to/ports-supfile
          • После обновления дерева портов нужно сделать обновление INDEX-файла.
            Загрузить бинарник:
            % cd /usr/ports/ && make fetchindex

            или построить его самому:
            % cd /usr/ports/ && make index


            Потом определить, какие из установленных пакетов нуждаются в обновлении:
            % pkg_version -v | grep "<"

            И обновить их.

            Для начала неплохо бы отремонтировать базу данных установленного ПО:
            % pkgdb -vfFu


            Обновить установленное ПО из исходников/портов:
            % portupgrade -apr

            (ключ -p создаёт бинарные пакеты в каталоге $PACKAGES/All/, так что их можно распространять; ключ -r задаёт рекурсивно проверить и обновить зависимые пакеты, если нужно; ключ -a — выполнять для всех пакетов).

            Обновить установленное ПО из бинарных пакетов, загружаемых из Сети:
            % portupgrade -aPP

            (Примечание. Утилита portupgrade устанавливается из ports/ports-mgmt/portupgrade)
            • Дополню себя же.

              Если с обновлением установленных пакетов что-то пойдёт не так, то прочтите файл /usr/ports/UPDATING. Там могут быть важные замечания по правильному обновлению установленного ПО.
          • Вы наверно не так меня поняли. Я сначала делаю установку типа custom -> minimal. Потом из пакета (единственный минус, который я вижу) устанавливаю cvsup. Делаю supfile и качаю все src.

            cvsup -g -L 2 /path/to/src-supfile

            Из GENERIC делаю нужную конфигурацию ядра. Ну а потом мир, ядро и приступаю к выкачиванию портов таким же образом.

            Так вот, есть ли какие-то преимущества csup в этом случае? В моем случае, cvsup работает почти сразу после установки системы…
            • > В моем случае, cvsup работает почти сразу после установки системы…

              Ключевое слово: почти
              • Ну если разницы действительно больше никакой нет, то попробую как-нибудь при случае csup использовать. Спасибо.
                • Добрался до оф. сайта. csup не умеет аутентификацию и работать в режиме CVS. Но мне, похоже, его функционала достаточно.
            • Да, я понял, как делаете вы. Можно и так. Можно вообще не пользоваться портами, а ставить всё бинарниками — так быстрее будет, если есть широкополосный доступ в Интернет или копия бинарных пакетов.
  • Очень важно после:

    #cd /usr/src/ && make installkernel KERNCONF=COMP

    перезагрузиться в однопользовательский режим и уже с новым ядром устанавливать мир т.к. старое ядро не совместимо с новым миром и установка нового мира может пройти с ошибками

    поэтому уже в однопользовательском режиме после fsck -p и монтирования файловых систем, а также mergemaster -p стоит приступать к

    #cd /usr/src/ && make installworld
    • Согласен. Для полноты картины при переходе с версии на версию это так.
  • Мне непонятно вот что: Что же было у самих создателей дистрибутива FreeBSD 7.1 i386 в их /etc/make.conf и /etc/src.conf? И чем они компилировали? А то что бы я ни компилировал в /src, ну скажем вот мучаю сейчас /usr/bin/ls, как бы я ни крутил опции, мой бинарник всегда отличается от того, что идет в дистрибутиве.
    • Опс, дальнейшие эксперименты дали ответ:
      Пустые etc/make.conf и /etc/src.conf; затем strip --strip-unneeded ./ls.
      И diff /bin/ls ./ls не показывает разницы!
      • Нда, теперь бы еще допереть, есть ли какой эквивалент в CFLAGS или etc/make.conf для strip --strip-unneeded
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.