Главная
Главная Руководства FreeBSD › Обновление ядра и мира в FreeBSD 10.2+



Автор:

Статья опубликована: 2016-02-26 20:38:48
Последние правки: 2021-11-12 22:50:06

FreeBSD 10.2. Компилируем и ставим ядро и мир. Статья подходит и для FreeBSD 11.1, FreeBSD 12.1.

Вначале, необходимо обновить исходный код (см статью внизу странички). Отключать IPV6 или нет - дело личных предпочтений.

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

    Редактируем файлы /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
    
    Система обновлена


  • Ошибки

    Новое ядро не загрузилось
    В стартовом меню FreeBSD выбираем "Escape to loader prompt", после чего появится приглашение командной строки. Далее, в консоли:
    OK unload   # выгрузка текущего ядра
    OK boot kernel.old   # загружаем старое ядро
    
    Делаем старое ядро текущим:
    # cp -Rp /boot/kernel.old /boot/kernel
    
    После чего перезагружаем сервер


    kernel requires linker ifunc support
    Анамнез: ошибка может выскочить при компиляции ядра FreeBSD 12.1 на установленной FreeBSD 11.2.
    Диагноз: вы забыли скомпилировать мир.
    Лечение: перед компиляцией ядра вначале скомпилировать мир


    dependency on /lib/libreadline.so.8 not registered
    А: При обновлении FreeBSD 11 до FreeBSD 12, выскакивает во время установки/обновления Python 3.6
    Д: libreadline стал частью ОС, поэтому хорошо бы удалить установленную из портов версию
    Л:
    # cd /usr/ports/devel/readline
    # make deinstall