Freebsd где находится файл конфигурации ядра. Использование утилиты freebsd-update. Установка и обновление исходных текстов системы Freebsd

Сегодня мы научимся собирать ядро и мир (основные исполняемые файлы, библиотеки и тд) FreeBSD из сходных кодов. Ранее в заметке PostgreSQL: сборка из исходников и настройка под Linux мы выясняли, зачем нужно уметь собирать что-то из исходников. Основными сценариями являются оптимизация под конкретное железо и получение самого свежака прямо из ветки master. Кроме того, вы можете настроить ядро под свои конкретные нужды — выбрать шедулер, отключить IPv6, убрать поддержку лишнего железа и тд. Наконец, если вдруг вы планируете когла-нибудь стать коммитером в ядро FreeBSD, знания о том, как это ядро собирается, будут не лишними.

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

Подготовка окружения

При написании заметки я использовал следующий установочный диск:

FreeBSD-10.2-RELEASE-amd64-disc1.iso

Лишней железки под рукой у меня не было, поэтому все эксперименты ставились на VirtualBox. Был выбран VirtualBox, а не Vagrant , так как нам понадобится доступ к монитору системы. В VirtualBox в настройках сети было создана два адаптера — один NAT и один Host Only. Первый нужен для доступа гостевой системы в интернет. Второй позволит ходить в гостевую систему с хост-системы по SSH.

После установки системы ставим пакеты git-lite, vim-lite, tree, bash, sudo, правим /usr/local/etc/sudoers, затем меняем оболочку пользователя:

sudo chsh -s / usr/ local/ bin/ bash eax

В ~/.gitconfig дописываем:


pager = less -S

Мне лично еще очень нравится иметь в системе привычный htop:

cd / usr/ posts
sudo portsnap fetch extract
cd sysutils/ htop
sudo make -DBATCH install clean

Подробности про первоначальную настройку системы и управление пакетами во FreeBSD вы найдете в заметках Использование FreeBSD на десктопе, версия 2.0 и Управление пакетами во FreeBSD при помощи утилиты pkg соответственно.

Собираем ядро

То, как будет собираться ядро FreeBSD, контролируется несколькими файлами конфигурации.

Часть настроек лежит в /etc/make.conf. Этот файл влияет на сборку портов, мира, ядра FreeBSD, и вообще любых программ на C. Здесь можно указать CPU, под который производится сборка, флаги оптимизации, и так далее. Перечень всех доступных опций можно подглядеть в /usr/share/examples/etc/make.conf и man make.conf . Пример /etc/make.conf:

# используем Clang 3.7 вместо идущего по дэфолту 3.4
CC=/usr/local/bin/clang37
CXX=/usr/local/bin/clang++37
CPP=/usr/local/bin/clang-cpp37

# оптимизируем код под используемый на машине CPU
CPUTYPE?=native

# флаги при компиляции кода на C и C++
CFLAGS+=-O2 -pipe
CXXFLAGS+=-O2 -pipe

Еще есть /etc/src.conf, который имеет немного другие настройки и затрагивает только ядро и мир. Подробности смотри в man src.conf . Пример /etc/src.conf:

CPUTYPE?=native
CFLAGS+=-O2 -pipe
COPTFLAGS+=-O2 -pipe

Наконец, также существует и файл конфигурации самого ядра. Про него будет рассказано далее.

Если при установке FreeBSD вы поставили галочку «установить все исходники», то исходники ядра и мира будут находится в каталоге /usr/src. Информацию о том, что в каком подкаталоге находится, можно найти в Developer’s Handbook и файле README .

# вместо head укажите интересующую вас ветку или тэг
cd / usr/ src && sudo svn co http:// svn.freebsd.org/ base/ head/ ./

Настройки, с которыми собирается ядро, лежат в файле:

/usr/src/sys/(архитектура)/conf/(конфиг)

Название архитектуры зависит от вашего CPU. Как правило, это либо i386, либо amd64. Конфиг ядра, идущего в системе по умолчанию, называется GENERIC. Можно скопировать его и назвать, например, MYKERNEL.

cd sys/ amd64/ conf
sudo cp GENERIC MYKERNEL

Конфиг хорошо документирован. К примеру, можно отключить поддержку IPv6 и IPSec, закомментировав две строчки:

#options INET6
#options IPSEC

Важно! В CURRENT по умолчанию включен механизм witness , предназначенный для поиска дэдлоков . Имейте в виду, что он может выводить в консоль пугающие стэктрейсы , некоторые из которых являются багами и должны быть зарепорчены в рассылку freebsd-current@, а некоторые являются вполне безобидными. Также сообщается, что механизм этот довольно тормозной, и потому вам вполне может захотеться его отключить.

Собираем ядро с нашими настройками:

cd ../ ../ ..
sudo make -j4 buildkernel KERNCONF =MYKERNEL

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

sudo cp -r / boot/ kernel/ / boot/ kernel.good

При установке нового ядра резервная копия создается автоматически, но эта копия будет затерта при следующей установке. После создания резервной копии вручную у нас под рукой всегда будет 100% рабочий GENERIC, с которого можно будет загрузиться в случае возникновения проблем.

Устанавливаем новое ядро:

sudo make installkernel KERNCONF =MYKERNEL

После установки ядро окажется в каталоге /boot/kernel, а резервная копия текущего ядра будет лежать в /boot/kernel.old.

Вместо пары шагов buildkernel и installkernel также можно было использовать команды:

sudo make -j4 kernel KERNCONF =MYKERNEL INSTKERNNAME =kernel.test
sudo nextboot -k kernel.test

Этим мы бы сказали положить ядро в /boot/kernel.test и использовать его один раз при следующей закрузке. Если все пройдет хорошо, после перезагрузки /boot/kernel.test можно будет переименовать в /boot/kernel. Этот вариант может быть удобнее, если к машине нет физического доступа.

Перезагружаемся:

sudo reboot

После загрузки системы проверяем версию ядра:

uname -a

Должны увидеть что-то вроде

FreeBSD vbox 11.0-CURRENT FreeBSD 11.0-CURRENT #0 6a8922d(master): Tue
Feb 28 13:40:05 MSK 2016 root@vbox:/usr/obj/usr/src/sys/MYKERNEL amd64

Если что-то пошло не так, при загрузке системы в меню можно выбрать загрузку с kernel.old (нажатием цифры 5). Также можно выбрать «Escape to a loader prompt» (нажатием цифры 3) и выбрать вообще любое ядро, например:

boot kernel.good

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

Собираем мир

Мир от FreeBSD 10 почти наверняка будет не лучшим образом работать с ядром FreeBSD 11. Поэтому не лишено смысла вместе с пересборкой ядра системы обновить сразу и мир.

Важно! Компиляция мира может занять очень много времени, особенно если в VirtualBox вы дали виртуалке только одно ядро. Если вы используете реальную машину, вам потребуется физический доступ к ней. Также от вас потребуется вручную смержить множество конфигов, подтвердить удаление множества файлов, а потом (!) переустановить все установленные пакеты и пересобрать все установленные порты. Возможно, вместо сборки нового мира, вам будет проще временно вывести машину из эксплуатации, поставить на нее новую систему, и настроить поверх все необходимое. Или воспользоваться уже упомянутым механизмом бинарного обновления. Как мне кажется, пересборка мира — процедура больше для разработчиков FreeBSD, чем администраторов боевых серверов.

Итак, переходим в каталог с исходниками:

cd / usr/ src

Чистим временные файлы, которые могли остаться с предыдущей сборки:

sudo rm -rf / usr/ obj

Собираем мир:

sudo make -j4 buildworld

Чтобы минимизировать риски, связанные с обновлением уже запущенных и работающих приложений, рекомендуется перевести ОС в однопользовательский режим:

# в окне VirtualBox или стоя рядом с сервером
sudo shutdown now

Теперь монтируем файловую систему (у меня ZFS):

zfs set readonly =off zroot
zfs mount -a

Если вы используете UFS, тогда.

статей в инете завались как хочешь так ядро и собирай, я напишу чем пользуюсь я и почему так, кто не согласен пишем ниже:)

1. Копируем наше хорошее ядро, вдруг че..(да я в курсе что при инстале старое переместиться в kernel.old)

# cp -R kernel/ kernel.good/

2. Собираем инфу: что у нас на маме за контролеры и что за железо

# cat /var/run/dmesg.boot Смотрите какие контролеры, что нам пригодиться # pciconf -lv

3. Проверяем на месте ли исходные коды

# ls /sys

3.0 Если их там не оказалось, забираем или с диска или с инета:
3.0а С диска

Mount /cdrom cd /cdrom ls ; должны увидеть папочки на диске cd src/ ./install.sh all cd /usr/src/ umount /cdrom

3.0b Если же у нас случайно есть инет, а диска нет то(в моем случае Фря 8.3):

Cd /usr/ports/devel/subversion make config-recursive svn checkout http://svn.freebsd.org/base/releng/8.3/ /usr/src grep -A 2 "TYPE="" /usr/src/sys/conf/newvers.sh Должно показать что-то типа такого TYPE="FreeBSD" REVISION="8.3" BRANCH="RELEASE-p4"

Если захотим обновить еще когда либо исходные коды то:

Svn update /usr/src/

Нам нужен еще и впн, пппое сервер со сжатием и шифрованием MPPE, то
3.1 тянем http://mavhome.dp.ua/MPPC/mppc-1.0.tgz

Wget http://mavhome.dp.ua/MPPC/mppc-1.0.tgz

3.2 Распаковываем в /usr/src/sys/net

Cd /usr/src/sys/net tar -xvf /usr/home/username/mppc-1.0.tgz

4. Копируем конфиг дженерика(его перепишемс и будет у нас свое ядро)
Кусочек теории
Конфигурационные файлы можно найти в каталоге /sys/»arch»/conf. В каталоге находятся несколько файлов, из которых наиболее важными являются:
DEFAULTS Это список параметров и устройств, поддержка которых включена по умолчанию для данной архитектуры.
GENERIC Этот файл содержит конфигурацию стандартного ядра.
GENERIC.hints Это файл с указаниями, который впоследствии устанавливается как /boot/device.hints. В данном файле содержится конфигурационная информация, необходимая для настройки устаревших аппаратных устройств.
MAC Этот конфигурационный файл ядра обеспечивает поддержку обязательного контроля доступа (Mandatory Access Controls) — системы многоуровневого управления доступом, используемой в средах с высокой степенью защиты. Этот конфигурационный файл требуется только в случае использования MAC.
NOTES Это комплексная конфигурация ядра для заданной аппаратной архитектуры, включены все особенности, характерные для той или иной платформы. Платформонезависимые особенности можно найти в файле /usr/src/sys/conf/NOTES.

# cd /usr/src/sys/i386/conf # mkdir /root/kernels # cp GENERIC /root/kernels/MYKERNEL # ln -s /root/kernels/MYKERNEL

5. Смотрим из чего наше ядро состоит и попутно правим дженерик
Параметры ядра:
cpu Данная метка указывает, какие типы процессоров поддерживаются ядром. Конфигурация ядра для аппаратной платформы amd64/EM64T включает в себя единственную запись с указанием типа процессора.
ident содержит имя ядра, произвольная строка
makeoptions Данная строка содержит инструкции для программного обеспечения, выполняющего сборку ядра. Наиболее распространенный параметр — DEBUG=-g, который сообщает компилятору о необходимости включения в ядро отладочной информации.
options Записи этого типа описывают функции ядра, которые непосредственно не связаны с аппаратным обеспечением. Сюда входят файловые системы, сетевые протоколы и отладчики, встроенные в ядро.
devices Записи этого типа описывают устройства или драйверы устройств, они содержат инструкции, которые описывают, как ядро должно взаимодействовать с определенными устройствами.

Ядро которое будет поддерживать пеньки первые нам не нужно поэтому оставляем:

Cpu I686_CPU ident MYKERNEL # опции отладки ядра (в жизни, вероятно не пригодится, но если поймаете глюк # и захотите сообщить об этом разработчикам - то пригодится) makeoptions DEBUG=-g #4Crypt_and_compress options NETGRAPH_MPPC_ENCRYPTION options NETGRAPH_MPPC_COMPRESSION #4PF: device pf device pflog device pfsync options ALTQ options ALTQ_CBQ options ALTQ_RED options ALTQ_RIO options ALTQ_HFSC options ALTQ_CDNR options ALTQ_PRIQ options ALTQ_NOPCC options ALTQ_DEBUG #4MPD options NETGRAPH options NETGRAPH_ETHER options NETGRAPH_SOCKET options NETGRAPH_TEE options NETGRAPH_BPF options NETGRAPH_IFACE options NETGRAPH_KSOCKET options NETGRAPH_PPP options NETGRAPH_PPTPGRE options NETGRAPH_TCPMSS options NETGRAPH_VJC #polling НЕ делайте это, сейчас 2012год!! #options DEVICE_POLLING #options HZ=1000 # или 2000 или 4000 чем больше тем шустрее буит ходить траф #Multiple routing tables options ROUTETABLES=3 # # Определяет количество дескрипторов в системе # (0 - значит определяет "автопилот" :))) maxusers 0 # ULE планировщик(распределяет потоки) options SCHED_ULE # Возможность вытеснения (preemption) повышает эффективность FreeBSD # в многозадачном режиме. options PREEMPTION # InterNETworking IPv4 options INET # IPv6 communications protocols IPv6 options INET6 # без этого ипв6 не пашет options SCTP # файловая система FreeBSD options FFS # Этот параметр включает в ядре технологию Soft Updates, которая повышает # скорость записи на диски. Несмотря на то, что эта технология включена # в ядре, она должна быть включена для отдельных дисков. options SOFTUPDATES # позволяют определять подробные права доступа к файлам options UFS_ACL # обеспечивает поддержку индексирования каталогов, что повышает скорость # работы с каталогами, содержащими тысячи файлов. options UFS_DIRHASH # включает gjournal-based UFS журналирование options UFS_GJOURNAL # можем сделать корнем / мемори диск options MD_ROOT # Этот параметр (и все остальные параметры, оканчивающиеся на _R00T) # позволяет использовать в качестве дискового устройства для корневого раздела # другие файловые системы, отличные от FFS. Инсталлятор использует в качестве # корневой файловой системы устройство памяти (MD). Если вы используете # бездисковые системы, вам потребуется поддержка NFS в качестве корневого # раздела. Если вы устанавливаете FreeBSD на стандартный компьютер - # с жестким диском и клавиатурой, то все эти параметры вам не потребуются. #options NFSCLIENT # Network Filesystem Client #options NFSSERVER # Network Filesystem Server # Эти два параметра обеспечивают поддержку сетевой файловой системы (NFS). # Параметр NFSCLIENT позволит монтировать разделы, которые обслуживаются # другим компьютером в сети, а параметр NFSSERVER позволит обеспечить доступ # к своим разделам для других компьютеров. # Network Lock Manager #options NFSLOCKD # NFS usable as /, requires NFSCLIENT #options NFS_ROOT # MSDOS Filesystem поддержка фат разделов options MSDOSFS # ISO 9660 Filesystem поддержка разделов CD options CD9660 # Process filesystem (requires PSEUDOFS) файловая система процессов options PROCFS # Pseudo-filesystem framework options PSEUDOFS # GUID Partition Tables. options GEOM_PART_GPT # Provides labelization options GEOM_LABEL #совместимость со старыми версиями # BSD 4.3 TTY compat (sgtty) options COMPAT_43TTY options COMPAT_FREEBSD4 options COMPAT_FREEBSD5 options COMPAT_FREEBSD6 options COMPAT_FREEBSD7 # Delay (in ms) before probing SCSI # Задержка при загрузке для того, чтобы SCSI-контроллер успел # обнаружить все подключенные к нему устройства. #options SCSI_DELAY=5000 #options KTRACE # ktrace(1) support options STACK # stack(9) support # Эти параметры обеспечивают поддержку разделяемой памяти и межпроцессных # взаимодействий в стиле System V. На эту возможность опираются многие # программы управления базами данных. #Этот параметр предоставляет поддержку разделяемой памяти System V. #Наиболее распространенное применение этого - расширение XSHM в X, которое #многие приложения, интенсивно работающие с графикой, будут автоматически #использовать для повышения скорости работы. Если вы используете X, эта опция #будет необходима. options SYSVSHM # SYSV-style shared memory # Поддержка сообщений System V. Этот параметр добавляет в ядро # всего лишь несколько сотен байт. options SYSVMSG # SYSV-style message queues # Поддержка семафоров System V. Не настолько часто используемая # возможность, но в ядро добавляет всего несколько сотен байт. options SYSVSEM # SYSV-style semaphores options P1003_1B_SEMAPHORES # POSIX-style semaphores # Расширения реального времени, добавленные 1993 POSIX®. # Определенные приложения из коллекции используют их, например StarOffice™. options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed. #options KBD_INSTALL_CDEV # inst a CDEV entry in /dev для клав USB-овых options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4) options AUDIT # Security event auditing options MAC # TrustedBSD MAC Framework options FLOWTABLE # per-cpu routing cache #options KDTRACE_HOOKS # Kernel DTrace hooks options INCLUDE_CONFIG_FILE # Include this file in kernel # параметры для отладки options KDB # Kernel debugger related code options KDB_TRACE # Print a stack trace for a panic # To make an SMP kernel, the next two lines are needed options SMP # Symmetric MultiProcessor Kernel device apic # I/O APIC (i386 only) # активируют симметричную многопроцессорную обработку (Symmetric # Multiprocessing, SMP) в ядрах, предназначенных для работы в архитектуре i386: # Параметр SMP предписывает ядру производить планирование работы процессов # на нескольких CPU, а параметр apic обеспечивает поддержку ввода/вывода для # ядер SMP. FreeBSD распространяется с поддержкой SMP, вкл по умолчанию. # Устройство apic разрешает использование набора I/O APIC для распределения прерываний. Оно может быть использовано как с однопроцессорными, так и с многопроцессорными ядрами (для последних наличие apic является обязательным). # CPU frequency control device cpufreq # Bus support. device acpi device eisa device pci # Убирать их следует в том случае, если в системе действительно нет таких шин. # Велико количество систем «без поддержки традиционных устройств» (legacy-free), # в которых шина ISA скрыта где-то внутри. # Floppy drives #device fdc # ATA and ATAPI devices device ata device atadisk # ATA disk drives device ataraid # ATA RAID drives device atapicd # ATAPI CDROM drives #device atapifd # ATAPI floppy drives #device atapist # ATAPI tape drives options ATA_STATIC_ID # Static device numbering # В статическом режиме контролер рассматривается как железяка соответственно # мы имеем 2 канала по 2 устройства 0-1 и 2-3 соответственно PrMaster PrSlave # и SecMaster SecSlave для фрюхи ad0 ad1 ad2 ad3. и если переставить винт с # PriMaster на SecMaster то тома на нем из ad0 станут ad2. # Если выключить ATA_STATIC_ID, то получаем динамическую нумерацию не по # каналам и устройствам, а по устройствам, т. е. винтам. Проще сказать так, # если у нас стоял один винт PriMaster и мы выключили эту опцию, то после # запуска нового ядра номер разделов не изменится. Теперь если переключить, # кабелем или перемычками, винт на место любого другого, например SecSlave, # он всеравно останется ad0! Он один в машине;) # Соответственно добавив второй винт, система будет определять их старшинство # по порядку подключения # Например мы включим 2 винта на PriSlave и SecMaster # Получим PriSlave - ad0 и SecMaster - ad1. # SCSI Controllers (закоментил весь раздел) #device ahb # EISA AHA1742 family #device ahc # AHA2940 and onboard AIC7xxx devices #options AHC_REG_PRETTY_PRINT # Print register bitfields in debug # output. Adds ~128k to driver. #device ahd # AHA39320/29320 and onboard AIC79xx devices #options AHD_REG_PRETTY_PRINT # Print register bitfields in debug # output. Adds ~215k to driver. #Строки вида *_REG_PRETTY_PRINT включают режим отладки для соответствующих драйверов. # SCSI peripherals оставил ибо нужно для USB) device scbus # SCSI bus (required for SCSI) device ch # SCSI media changers device da # Direct Access (disks) device sa # Sequential Access (tape etc) device cd # CD device pass # Passthrough device (direct SCSI access) device ses # SCSI Environmental Services (and SAF-TE) # atkbdc0 controls both the keyboard and the PS/2 mouse device atkbdc # AT keyboard controller device atkbd # AT keyboard device psm # PS/2 mouse device kbdmux # keyboard multiplexer device vga # VGA video card driver device splash # Splash screen and screen saver support # syscons is the default console driver, resembling an SCO console # системная консоль - без этого пункта всё работает, но на # локальном мониторе ничего не показывает:)) device sc device agp # support several AGP chipsets # Power management support (see NOTES for more options) #device apm # Add suspend/resume support for the i8254. device pmtimer # PCCARD (PCMCIA) support # PCMCIA and cardbus bridge support на всяк случай #device cbb # cardbus (yenta) bridge #device pccard # PC Card (16-bit) bus #device cardbus # CardBus (32-bit) bus # Serial (COM) ports device uart # Generic UART driver # Parallel port device ppc # Интерфейс параллельного порта на ISA. device ppbus # Parallel port bus (required) device lpt # Printer #device plip # TCP/IP over parallel #device ppi # ввода/вывод общего назначения (""geek port"") + IEEE1284 ввод/вывод. #device vpo # Драйвер привода Iomega Zip. Требует наличия scbus и da. # PCI Ethernet NICs. Оставил только одну:) device em # Intel PRO/1000 Gigabit Ethernet Family # Pseudo devices. # Это петлевой интерфейс, позволяющий системе взаимодействовать с самой # собой через сетевые сокеты, с использованием сетевых протоколов. device loop # Network loopback # Это устройство обеспечивает генерацию псевдослучайных чисел, необходимых в # операциях шифрования и таких важных программах, как игры. FreeBSD # обеспечивает поддержку разнообразных источников случайных чисел, и все они # объединяются в виде устройств псевдослучайных чисел # /dev/random /dev/urandom. device random # обладает массой особенностей, характерных для устройств, и потому FreeBSD # представляет его как устройство. Оставьте эту строку! device ether # Ethernet support device vlan # 802.1Q VLAN support # логический пакетный канал (logicalpacket tunnel). Используется различными # программами для обмена пакетами с ядром. Такое псевдоустройство необходимо # для поддержки РРР средствами, не входящими в ядро (userland PPP), - # обычными коммутируемыми соединениями. device tun # Packet tunnel. # это псевдотерминал. Когда вы подключаетесь к системе по протоколам telnet или # SSH, FreeBSD должна иметь возможность отслеживать терминальные сеансы, # выводить символы на экран и читать ввод с клавиатуры. Система обслуживает # удаленное соединение как обычный физический монитор и клавиатуру. # Псевдотерминал - это псевдоустройство, напоминающее терминал, # связанное с соединением. device pty # BSD-style compatibility pseudo ttys # позволяет хранить файлы в памяти. Это очень удобно для организации очень # быстрых хранилищ временных данных. Для большинства (но не для всех) # серверов Интернета диски в памяти - это просто непродуктивное # растрачивание оперативной памяти. Кроме того, диски в памяти могут # использоваться для монтирования и доступа к образам дисков. device md # Memory "disks" device gif # IPv6 and IPv4 tunneling device faith # IPv6-to-IPv4 relaying (translation) device firmware # firmware assist module # The `bpf" device enables the Berkeley Packet Filter. # Be aware of the administrative consequences of enabling this! # Note that "bpf" is required for DHCP. device bpf # Berkeley packet filter # USB support все что мне потребовалось options USB_DEBUG # enable debug msgs device uhci # UHCI PCI->USB interface device ohci # OHCI PCI->USB interface device ehci # EHCI PCI->USB interface (USB 2.0) device usb # USB Bus (required) #device udbp # USB Double Bulk Pipe devices device uhid # "Human Interface Devices" device ukbd # Keyboard device ulpt # Printer device umass # Disks/Mass storage - Requires scbus and da device ums # Mouse #device urio # Diamond Rio 500 MP3 player # USB Serial devices device u3g # USB-based 3G modems (Option, Huawei, Sierra)

6. Переходим к сорцам

# cd /usr/src

7. Собираем ядро

# make buildkernel KERNCONF=MYKERNEL

8. Ставим ядро

# make installkernel KERNCONF=MYKERNEL

10. Если собирали удаленно то ждем, или делаем одноразовую загрузку нового ядра

App0. Дополнение о железе
Если у вас имеется аппаратное устройство, которое не поддерживается ядром GENERIC, загляните в файл NOTES. Некоторые из перечисленных в этом файле особенностей имеют неясное назначение, но если у вас имеется определенное Включения, исключения и расширения ядра устройство, то вы сможете разобраться, какая запись ему соответствует.
Механизм конфигурирования ядра FreeBSD обладает двумя интересными возможностями, которые способны упростить обслуживание ядра: ключевые слова с префиксом nо и включения. Возможность подключения позволяет добавить отдельный файл в конфигурацию ядра. Например, если имеется конфигурация ядра, которая описана как «GENERIC с парой дополнительных настроек», к ней можно было бы подключить конфигурацию GENERIC с помощью оператора include: include GENERIC Так, например, если необходимо собрать ядро, которое обладает функциональностью GENERIC, но кроме того поддерживает микропроцессор Soekris, можно было бы создать конфигурацию, составленную из следующих строк:
ident MYKERNEL
include GENERIC
options CPU_SOEKRIS
также можно использовать
nodevice
nooption

App1. Одноразовая загрузка нового ядра:
1. Копируем собраное ядро в тестовую папку хорошее ядро в папку ядра

# mv /boot/kernel /boot/kernel.test # mkdir /boot/kernel # cp /boot/kernel.good/* /boot/kernel/

2. При след запуске единожды будет загружено тестовое, если понравилось делаем его основным

Nextboot -k kernel.test

3. Если все прошло гладко

# mv /boot/kernel /boot/kernel.previous # mv /boot/kernel.test /boot/kernel

Если нет просите обслуживающий персонал выключить и включить:)

App2. ПРОБЛЕМЫ:
Когда система извергает страшное проклятие: «lock order reversals» (аннулирован запрос на блокировку), Основные источники проблем — это ACPI, РАЕ(не отключается), SMP и аннулирование запроса на блокировку.
http://ipv4.sources.zabbadoz.net/freebsd/lor.html

hint. apic. 0. disabled=1. отключение в уже собраном ядре
kern. smp. disabled=1 отключение в уже собраном ядре
hint. acpi. 0. disabled=1 отключение в уже собраном ядре

App3. ОТЛАДКА при панике
1.Ядро должно быть с
makeoptions DEBUG=-g
options KDB
options KDB_TRACE
options DDB # отказ от автоматической перезагрузки
2.Получение обратной трассировки
cd /boot/kernel.panicked/
# kgdb kernel.symbols /var/crash/vmcore.0
Backtrace
3.Повтор паники в однопользовательском режиме
mount -аr
# /etc/rc.d/dumpon start

App4. LOADER
Если же чтото напутали, и сервак не стартует, то с помощью лоадера мы можем загрузить старое ядро
lsdev - список устройств доступных для загрузки
show - значение переменных загрузки из конф файла
set - изменение параметра загрузки
lsmod - модули и ядро загруженные в память
unload - полностью выгрузить из памяти ядро и модули
boot – продолжить загрузку
Загрузка альтернативного ядра
unload
load /boot/kernel.good/kernel
load /boot/kernel.good/acpi.ko все остальное по желанию
boot

App5. Модули ядра
kldstat список загруженых модулей

Kldload wlan_wep или kldload /boot/kernel/wlan_wep.ko

kldunload выгрузка модуля

Kldunload wlan_wep.ko

прописав в /boot/kernel/loader.conf нужный модуль, он будет автоматически загружаться при запуски системы

Procfs_load="YES"

App6. Выборочная пересборка модулей
По умолчанию, при построении ядра, все модули ядра так же будут пересобраны. Если вы хотите обновить ядро быстрее или построить только определённые модули, то вам нужно отредактировать файл /etc/make.conf перед началом процесса сборки ядра:

MODULES_OVERRIDE = linux acpi sound/sound sound/driver/ds1 ntfs
Эта переменная устанавливает список модулей, которые нужно построить вместо построения всех модулей.

WITHOUT_MODULES = linux acpi sound ntfs
В этой переменной перечисляются основные модули, которые необходимо исключить из процесса сборки. За другими переменными, которые вы можете посчитать полезными в процессе сборки ядра, обращайтесь к странице справочника make.conf(5).


Решил прояснить для себя вопрос с обновлением системы. В freebsd есть определенная неоднозначность в этом процессе. Один раз я попал в неприятную ситуацию при обновлении и потратил много времени, пока не понял, в чем же было дело. Сейчас постараюсь рассказать обо всех нюансах обновления freebsd. В качестве подопытной машины у меня выступает версия 10.1

Использование утилиты freebsd-update

Установить все обновления безопасности на сервер freebsd можно легко и быстро с помощью утилиты freebsd-update . Итак, у нас имеется:

# uname -a FreeBSD websrv.local 10.1-RELEASE FreeBSD 10.1-RELEASE #0 r274401: Tue Nov 11 21:02:49 UTC 2014 [email protected]:/usr/obj/usr/src/sys/GENERIC amd64

Запускаем freebsd-update , проверяем наличие обновлений и скачиваем необходимые:

# freebsd-update fetch Looking up update.FreeBSD.org mirrors... none found. Fetching public key from update.FreeBSD.org... done. Fetching metadata signature for 10.1-RELEASE from update.FreeBSD.org... done. Fetching metadata index... done. Fetching 2 metadata files... done. Inspecting system... done. Preparing to download files... done. Fetching 19 patches.....10.... done. Applying patches... done. The following files will be updated as part of updating to 10.1-RELEASE-p1:

Устанавливаем обновления:

# freebsd-update install Installing updates... done.

Если после этого мы снова проверим версию системы с помощью uname, то окажется, что ничего не изменилось. Будет показана та же версия. Что же произошло после этого обновления? Произошло бинарное обновление системы до актуальных значений. При этом, если у вас собрано и установлено свое ядро, отличное от GENERIC, то после перезагрузки у вас будет загружено ядро GENERIC. Про это обязательно нужно помнить. Я так долго разбирался, почему вдруг перестала работать команда forward в ipfw. Перепроверил все, что только мог, опустились руки. А все потому, что процесс обновления и перезагрузки сервера были сильно разделены по времени, а заметил я то, что не работает перенаправление еще позже, поэтому не сопоставил эти два события. О том, что у меня не то ядро загружено я и представить не мог. Я же знаю и помню, что ядро собирал и не трогал с тех пор. Вот такой нюанс, о котором нужно не забывать.

Чтобы отразить изменения в версии системы, пересоберем и установим ядро GENERIC. Исходные тексты системы, нужные для сборки, находятся в папке /usr/src. Если у вас там пусто, то их необходимо установить.

Установка и обновление исходных текстов системы Freebsd

Для установки исходных текстов системы есть много способов. Я предлагаю воспользоваться, как мне кажется, самым простым — с помощью программы subversion . Устанавливаем ее из портов:

# cd /usr/ports/devel/subversion # make install clean # rehash

И качаем исходники для версии 10.1:

# svn checkout https://svn0.ru.freebsd.org/base/release/10.1.0 /usr/src

Или для версии 10.2:

# svn checkout https://svn0.ru.freebsd.org/base/release/10.2.0 /usr/src

# svn checkout https://svn0.ru.freebsd.org/base/release/10.3.0 /usr/src

После того, как скачали исходники, снова запускаем обновление системы. Она найдет исправления, которые нужно внести в тексты:

# freebsd-update fetch # freebsd-update install

После этого собираем и устанавливаем ядро GENERIC:

# cd /usr/src # make buildkernel # make installkernel # shutdown -r now

Проверяем версию:

# uname -a FreeBSD websrv.local 10.1-RELEASE-p1 FreeBSD 10.1-RELEASE-p1 #0 r275828M: Tue Dec 16 16:55:19 MSK 2014 [email protected]:/usr/obj/usr/src/sys/GENERIC amd64

Все изменения вступили в силу и отображены.

Теперь для того, чтобы иметь всегда актуальную версию критических обновлений безопасности системы, создадим задание cron на ежедневную проверку обновлений:

# echo "20 3 * * * root freebsd-update cron" >> /etc/crontab

По этому заданию каждый день в 3.20 будет проверяться наличие новых критических обновлений безопасности системы freebsd 10. В случае, если таковые найдутся, они будут закачаны и пользователю root отправлено оповещение. Устанавливать их необходимо вручную.

Помогла статья? Есть возможность автора

Дополнительные материалы по Freebsd

Онлайн курс "Администратор Linux"

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «Администратор Linux» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров. Проверьте себя на вступительном тесте и смотрите программу детальнее по.

Дистрибутив фрюхи часто называют самым подходящим для решения прикладных сетевых задач в локальной сети. Сегодня мы займемся решением одной из сетевых задач — настройкой шлюза на Freebsd 10 для доступа в интернет из локалки. Это простой, популярный и востребованный функционал сервера, который можно расширять дополнительными возможностями.

Будем использовать следующую версию системы для решения нашей задачи по настройке шлюза:

# uname -v FreeBSD 10.2-RELEASE-p8 #0 r292756M: Sat Dec 26 22:49:34 MSK 2015 root@freebsd:/usr/obj/usr/src/sys/GENERIC

На сервере установлены 2 сетевые карты:

  • hn0 — внешний интерфейс, получает интернет от провайдера, настройки по dhcp
  • hn1 — локальная сеть, адрес 10.20.30.1, установлен вручную

В нашу задачу по настройке программного freebsd роутера будет входить настройка маршрутизации на сервере, установка и настройка ipfw, включение nat, настройка локального dhcp и dns сервера.

Подготовка сервера к настройке шлюза

Информацию о выданных leases dhcp сервера dnsmasq можно посмотреть в файле /var/db/dnsmasq.leases .

Анализ сетевой активности в freebsd с помощью iftop

Иногда хочется посмотреть, что происходит на роутере и кто использует интернет в данный момент. По-умолчанию, в системе нет готового средства для получения этой информации. На помощь нам придет простая программа iftop, которая позволяет в режиме реального времени посмотреть активность на сетевом интерфейсе.

Устанавливаем iftop на настроенный Freebsd шлюз:

# pkg install iftop

Запускаем iftop с указанием интерфейса и отображением используемых портов:

# iftop -i hn1 -P

Видим любопытную картину — кто, куда, по какому порту и с какой скоростью лезет.

Я для примера на одном из компьютеров запустил генератор трафика интернета. Он занял почти весь канал и это стало отлично видно на роутере с помощью iftop. Конечно, эта простая утилита не решает всех вопросов по мониторингу сетевой активности, но для представления текущей картины подходит, если вам не нужно что-то большее.

Заключение

Подведем итог того, что сделали. За короткое время настроили полноценный шлюз (по сути программный роутер) на базе Freebsd 10 для обеспечения выхода в интернет клиентов за сервером. При этом обеспечили автоматическое получение настроек. Даже на скромном виртуальном сервере такой шлюз способен переварить достаточно большой траффик.

Вся настройка занимает буквально 10-15 минут. Основное время уходит на сборку ядра. Чем выше версия Freebsd, тем дольше оно собирается, несмотря на то, что скорости железа существенно возрастают.

Пройдемся по пунктам и разберемся с тем, что конкретно мы сделали:

  1. Подготовили сервер к настройке шлюза.
  2. Пересобрали ядро с необходимыми параметрами.
  3. Настроили ipfw и nat, включили маршрутизацию.
  4. Установили и настроили dnsmasq для раздачи сетевых настроек по dhcp и dns сервера.
  5. Установили iftop для простейшего анализа сетевой активности на внешнем интерфейсе.

Этого достаточно для полноценной работы шлюза на Freebsd 10. Если есть необходимость подсчета пользовательского траффика или ограничения доступа к определенным ресурсам, можно к нему.