DTop CMS - система управления контентом
Текущая версия: 3.4.1


© 2002-2018

Статья опубликована: 2012.12.06
Последние изменения: 2014.02.13

FreeBSD 9, обновление из исходных кодов и бинарных репозиториев при помощи csup, portsnap, portupgrade и pkgng




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

  • Получением исходников из репозитория занимается встроенная в FreeBSD утилита csup.

    - Создаем директорию /etc/csup, в которой будут храниться конфигурационные файлы, а также скрипты для обновления системы и портов.
    # mkdir -p /etc/csup
    

    - Копируем файл для обновления исходных кодов (stable-supfile):
    # cp /usr/share/examples/cvsup/stable-supfile /etc/csup/stable-supfile
    

    - Редактируем
    # ee /etc/csup/stable-supfile
    
    В файле нам нужно поменять только одну строчку
    * default host=CHANGE_THIS.FreeBSD.org
    
    Меняем на любой понравившийся адрес сервера из списка, который находится тут:
    http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/cvsup.html#CVSUP-MIRRORS

    - Загружаем исходники операционной системы:
    # csup -L 2 /etc/csup/stable-supfile
    
    параметр -L задает детализацию информации, показываемой на экране в процессе работы. Допустимые значения от 0 (показывает только ошибки) до 2. Значение 1 является значением по умолчанию.


  • Настройка конфигурационных файлов

    - Редактируем файлы /etc/make.conf и /etc/src.conf. Эти файлы управляют процессом компиляции.
    # cp /usr/share/examples/etc/make.conf /etc/make.conf
    # ee /etc/make.conf
    
    Ищем в файле строчку вида
    #CPUTYPE?=pentium3
    
    Эта строка описывает процессор, который стоит в сервере. Выше в файле /etc/make.conf находится список значений, которые на данный момент распознаются операционной системой. Если в списке есть нужный процессор, то раскомментируйте эту строку и поменяйте тип процессора на свой. Узнать тип своего процессора можно командой
    # cat /var/log/messages | grep CPU:
    
    или командой
    # sysctl -a | grep hw.model
    
    После этого все закомментированные строки в /etc/make.conf можно удалить. Добавляем своё:
    # отключаем использование IPV6
    NO_INET6=yes
    WITHOUT_INET6=yes
    WITHOUT_INET6_SUPPORT=yes
    WITHOUT_IPV6=yes
    
    # задаем директорию дерева портов
    PORTSDIR?=/usr/ports
    
    # настройки для portupgrade
    .if ${.CURDIR} == ${PORTSDIR}/ports-mgmt/portupgrade
    WITHOUT_X11=yes
    .endif
    
    Редактируем /etc/src.conf
    # ee /etc/src.conf
    
    В только что установленной операционной системе этого файла нет, так что пишем туда следующее:
    WITHOUT_GAME=true # никаких игрушек, у нас сервер
    WITHOUT_INET6=true # IPV6 пока тоже не надо
    WITHOUT_ATM=true # не используем этот протокол
    WITHOUT_IPX=true # и этот тоже
    #WITHOUT_MAN=true # спорный вопрос, нужны руководства или нет, себе я их оставил
    


  • Конфигурация собственного ядра

    Конфигурация ядра - дело не такое уж и сложное, нужно только быть внимательным.
    Обычно бывает достаточно изучения хендбука, благо он есть даже на русском языке:
    Конфигурация ядра - http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/kernelconfig-config.html
    Настройка и компиляция - http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/kernelconfig.html

    - Создаем свой файл конфигурации
    Так как мы делаем сервер, то у него должен быть максимальный запас прочности по быстродействию, поэтому будем использовать архитектуру amd64. Есть один важный момент - не оставляйте свой конфиг ядра там, где он находится по умолчанию, вместо этого используйте ссылку на него. Это спасет вас тогда, когда вам приспичит удалить все исходники и залить их по-новой.
    Создаем отдельную директорию где будет храниться конфиг нашего ядра, копируем туда конфиг GENERIC под новым именем SERVER и делаем на него ссылку:
    # mkdir -p /root/system/KERNEL
    # cd /usr/src/sys/amd64/conf
    # cp GENERIC /root/system/KERNEL/SERVER
    # ln -s /root/system/KERNEL/SERVER
    
    Далее в файле /root/system/KERNEL/SERVER делаем следующее:

    1) как написано в хендбуке, меняем строку
    ident GENERIC
    
    на строку
    ident SERVER
    
    отключаем ipv6, для этого необходимо закомментировать строки
    #options INET6
    #options SCTP
    

    2) закомментируйте все устройства (строка device), которых нет на вашем сервере, например, всяческие контроллеры SCSI, RAID-контроллеры, PCMCIA, ISA, беспроводные карты, флоппи. Это уменьшит файл ядра и, соответственно, занимаемую им память.

    3) самое главное - не отключить сетевые карты, которые установлены в сервере, список можно посмотреть командой
    # ifconfig
    
    Вот мой ifconfig:
    # ifconfig
    ale0: flags=8843 metric 0 mtu 1500
            options=c319a
            ether XX:XX:XX:XX:XX:XX
            inet XXX.XXX.XXX.XXX netmask 0xffffff00 broadcast XXX.XXX.XXX.XXX
            media: Ethernet autoselect (100baseTX )
            status: active
    rl0: flags=8802 metric 0 mtu 1500
            options=3808
            ether XX:XX:XX:XX:XX:XX
            media: Ethernet autoselect
            status: no carrier
    ipfw0: flags=8801 metric 0 mtu 65536
    lo0: flags=8049 metric 0 mtu 16384
            options=3
            inet 127.0.0.1 netmask 0xff000000
    tun0: flags=8051 metric 0 mtu 1500
            options=80000
            inet XXX.XXX.XXX.XXX --> 10.0.0.2 netmask 0xffffff00
            Opened by PID XXXX
    
    Как видим, в системе присутствуют две сетевухи - это ale0 и rl0. В моем конфигурационном файле ядра в разделе сетевых карт остались раскомментированы эти два устройства
    device ale
    device rl
    

    4) Добавьте options для поддержки utf-8, работы ipfw (брандмауер), nat и netgraph так как они понадобятся почти сразу. Я их добавил после строки
    options SMP
    
    ##UTF8
    options TEKEN_UTF8
    ##FIREWALL
    options IPFIREWALL
    options IPFIREWALL_VERBOSE # разрешает запись информации о пакетах в syslog
    options IPFIREWALL_FORWARD # разрешает перенаправление пакетов, например, для прозрачного прокси
    options IPFIREWALL_DEFAULT_TO_ACCEPT # задает последней строкой правил "разрешить всё"
    options DUMMYNET # для регулирования полосы пропускания в ipfw
    ##NAT
    options IPDIVERT # для использования nat на уровне ядра
    options IPFIREWALL_NAT # используем NAT встроенный в ядро
    options LIBALIAS # обязательная опция для "ядерного" NAT
    ##VPN
    options NETGRAPH
    options NETGRAPH_PPP # поддержка ppp
    options NETGRAPH_PPTPGRE # поддержка gre-туннелирования
    
    Добавьте устройство для получения температуры процессора (оно нам дальше понадобится для мониторинга при помощи mrtg)
    ##CPU TEMPERATURE
    device coretemp
    
    На этом настройка файла конфигурации ядра закончена.


  • Компилируем и устанавливаем ядро и мир

    Чистим директории
    # cd /usr/obj && chflags -R noschg *
    # cd /usr/obj && rm -rf *
    # cd /usr/src && make cleandir && make cleandir && make cleandir
    
    Компилируем мир
    # cd /usr/src && make -j2 buildworld
    
    -j2 указывает компилировать в два потока, если процессор многоядерный, то можно вместо -j2 задать -j6

    Компилируем ядро
    # cd /usr/src && make buildkernel KERNCONF=SERVER
    
    Устанавливаем ядро
    # cd /usr/src && make installkernel KERNCONF=SERVER
    
    После того, как ядро скомпилировалось и установилось, нас ждет самое интересное - перезагрузка в однопользовательский режим на новом ядре.
    # reboot
    
    Во время загрузки в стартовом меню не забудьте выбрать Single User Mode.

    После загрузки выполняем проверку файловой системы
    # fsck -p
    
    Затем монтируем разделы и своп
    # mount /
    # mount -a
    # swapon -a
    
    Устанавливаем мир
    # cd /usr/src && make installworld
    
    Перезагружаемся в обычном режиме
    # reboot
    
  • Система обновлена, можно приступать к обновлению портов


  • Обновление портов

    Важно! Начиная с 1 марта 2013 года в FreeBSD для обновления портов используется portsnap.

    Важно! Начиная с 1 сентября 2014 года в FreeBSD прекращается поддержка утилит из pkg_install, вместо этого нам предлагают использовать утилиты системы управления и установки портов из бинарных пакетов pkgng. При этом к возможности компиляции программ из исходников добавляется возможность установки программ из бинарных репозиториев, что является несомненным плюсом, так как очень экономит время установки и обновления программ.
    UPD Идея была хорошей, но как всегда подкачала реализация:
    - многих пакетов нет в бинарных репозиториях, а обновлять их pkg пытается (естественно, обновить не получается);
    - pkg не реагирует на конфигурации портов в /etc/make.conf и в /var/ports/*/options, считает что они все включены (но, может быть это я не до конца разобрался);
    - бинарные пакеты "отстают" от дерева портов, пример editors/libreoffice, после установки из пакетов при попытке запуска выдал Shared object "libicuuc.so.50" not found, required by "libsvtlo.so". В портах devel/icu уже 52.1, а libreoffice в репозитории собран с версией 50.
    Исходя из всего этого в статье pkg рассматривается только в качестве замены утилит pkg_install, так как эти утилиты в ближайшее время будут удалены.

    Первоначальное получение и распаковка портов:
    # portsnap fetch extract
    
    Обновление уже установленного дерева портов:
    # portsnap fetch update
    
    В FreeBSD 9.1 и более поздние включена программа для установки и конфигурации pkgng, запускаем:
    # /usr/sbin/pkg
    The package management tool is not yet installed on your system.
    Do you want to fetch and install it now? [y/N]: y
    
    После установки вам выдадут список команд утилиты, его всегда можно увидеть выполнив:
    # pkg help
    
    Добавляем в /etc/make.conf
    WITH_PKGNG=yes
    
    Создаем директорию и файл для хранения данных о репозиториях:
    # mkdir -p /usr/local/etc/pkg/repos
    # touch /usr/local/etc/pkg/repos/FreeBSD.conf
    
    Пишем в /usr/local/etc/pkg/repos/FreeBSD.conf следующее:
    FreeBSD: {
        url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
        mirror_type: "srv",
        enabled: yes
    }
    
    Удаляем файл /usr/local/etc/pkg.conf
    # rm /usr/local/etc/pkg.conf
    
    Тащим к себе базу репозитория:
    # pkg update
    
    Для компиляции из исходников ставим программу portupgrade из бинарного репозитория:
    # pkg install ports-mgmt/portupgrade
    
    или (с компиляцией):
    # cd /usr/ports/ports-mgmt/portupgrade
    # make install clean
    
    Обновляем порты при помощи portupgrade:
    # portupgrade -arR
    
    Ключ a задает обновление всех портов, ключи r и R указывают, что необходимо также обновить как приложения, зависящие от обновляемого, так и те, от которых зависит обновляемое приложение.

  • Повседневное использование

    Для дальнейшего обновления можно использовать набор скриптов. Создаем файлы в директории /etc/csup, делаем их исполняемыми (chmod +x)

    Скрипт для обновления системы systemupdate.sh:
    #!/bin/sh
    
    /usr/bin/csup -L 1 /etc/csup/stable-supfile
    
    cd /usr/obj && chflags -R noschg *
    cd /usr/obj && rm -rf *
    cd /usr/src && make cleandir && make cleandir && make cleandir
    
    cd /usr/src && make -j2 buildworld
    cd /usr/src && make buildkernel KERNCONF=SERVER
    cd /usr/src && make installkernel KERNCONF=SERVER
    
    # напоминалка что нужно сделать
    # reboot in single user mode
    # fsck -p
    # mount /
    # mount -a
    # swapon -a
    # cd /usr/src && make installworld
    # reboot
    
    Скрипт для обновления портов portsupdate.sh:
    #!/bin/sh
    
    /usr/sbin/pkg update
    /usr/sbin/pkg autoremove
    /usr/sbin/pkg clean
    
    /usr/sbin/portsnap fetch update
    /usr/local/sbin/portupgrade -arR
    /usr/local/sbin/portsclean -D
    
    Утилита portsclean удаляет ненужные дистрибутивы (от предыдущих версий, удаленных программ), которые хранятся в /usr/ports/distfiles, с целью экономии места на диске.

  • Переход от csup на использование portsnap
    # mv /usr/ports /usr/ports.old
    # portsnap fetch extract
    # mv /usr/ports.old/distfiles /usr/ports/
    # rm -r /usr/ports.old
    
  • Переход от pkg_install на pkgng

    Эти операции нужно делать только если до этого пакеты устанавливались при помощи утилиты pkg_install.

    Устанавливаем и настраиваем pkgng как написано выше

    Делаем резервную копию базы данных установленных пакетов:
    # cp -R /var/db/pkg /var/tmp/pkg
    
    Запускаем утилиту конвертации базы данных установленных пакетов утилиты pkg_install к новому формату:
    # pkg2ng
    # pkgdb -fu
    
    Если это ещё не было сделано, то конвертируем опции установленных портов, которые находятся в /var/db/ports/
    # /usr/ports/Tools/scripts/options2ng.sh -p