Многие администраторы OpenBSD предпочитают собирать систему самостоятельно,
из исходных текстов, а также собирать и устанавливать packages из дерева
портов. При этом часто используется файл /etc/mk.conf
,
позволяющий указать, какие именно возможности требуются от системы.
Наиболее часто этот файл используется, чтобы отключить Kerberos и тому
подобные возможности, которые нужны довольно редко. Но это далеко не
единственная область, где возможно применение файла mk.conf
.
Часто нам хочется включить в систему некоторые возможности, которые не включены в системных компонентах, но поддерживаются этими компонентами (например SMTP Authentication в sendmail). Однако ставить для этого данные компоненты "вручную" из исходных кодов неудобно:
Очень часто мы бываем недовольны некоторыми особенностями программ, устанавливаемых из портов, или просто хотим немного подправить устанавливаемую программу под свои конкретные цели... Словом, иногда возникает ситуация, когда есть потребность сделать что-то, ради чего не стоит беспокоить народ из ports@openbsd.org. :)
И здесь нам снова поможет mk.conf
.
Рассмотрим некоторые варианты использования mk.conf
на примере
набора для облегчения жизни site.tar.gz.
Данный набор состоит собственно из файла mk.conf
и набора
патчей, используемых им в своих целях. Данный набор можно установить в
свою систему и дополнять по мере надобности. Для установки достаточно
скачать файл site.tar.gz и выполнить
следующие команды:
# cd /etc # tar xfz <путь-до-файла>/site.tar.gz # ln -sf site/mk.conf .
После установки данного набора остается только отредактировать файл mk.conf и настроить его под свои нужды (рассматриваемые в данной статье настройки могут отличаться от настроек в текущей версии site.tar.gz):
# Настройки собираемой системы. # SKEY?= Yes # Включать поддержку S/Key KERBEROS5?= Yes # Включать поддержку Kerberos V YP?= Yes # Включать поддержку NIS TCP_WRAPPERS?= Yes # Включать поддержку libwrap и tcpd AFS?= Yes # Включать поддержку AFSДанные настройки определяют, какие стандартные компоненты должны быть включены в собираемую из исходных текстов систему.
NOPROFILE?= No # Не собирать profiled библиотекиДанные настройки определяют, нужно ли собирать profiled библиотеки.
CRUNCH?= No # Собирать crunchgen и crunchideДанная настройка определяет, нужно ли собирать crunchgen и crunchide, необходимые для сборки дистрибутива OpenBSD.
# Настройки suexec для хостинга # PATCH_SUEXEC?= Yes # Научить suexec понимать login.conf SUEXEC_DOCROOT?= /home/www # Корневой каталог серверов SETUID_SUEXEC?= Yes # Устанавливать как setuidДанные настройки определяют, требуется ли поддержка login классов в suexec, корневой каталог для документов с точки зрения suexec и следует ли его устанавливать как setuid программу (необходимо, если планируется использование suexec).
SENDMAIL_SASL?= No # Включить поддержку SASL2 #SENDMAIL_LIBMILTER?= No # Включить поддержку libmilter #INSTALL_LIBMILTER?= No # Устанавливать libmilterДанные настройки определяют, следует ли собирать sendmail с поддержкой SASL2 для использования возможности авторизации SMTP (в системе должен быть установлен порт secuity/cyrus-sasl2, а также следует ли включить поддержку Milter API и устанавливать библиотеку libmilter (обычно требуется для почтовых антивирусных программ и некоторых спам-фильтров). Начиная с OpenBSD 3.6, последние две настройки не нужны, так как libmilter всегда собирается и устанавливается.
# Разрешение авторизации в ppp по PostgreSQL базе # # Авторизация по PostgreSQL включается в ppp.conf командой # set postgres ["conninfo"]. # # В базе должна присутствовать таблица как минимум со следующими полями: # # CREATE TABLE ppp ( # authname VARCHAR(32) NOT NULL UNIQUE, # authkey TEXT, # hisaddr TEXT, # label TEXT, # enabled BOOLEAN NOT NULL DEFAULT TRUE # ); # # Типы TEXT/VARCHAR взаимозаменяемы. # PPP_PGSQL?= No # Разрешить авторизацию по PostgreSQLДанная настройка определяет, следует ли включать в ppp поддержку авторизации по PostgreSQL базе данных.
# Разное # PATCH_MOUNT?= Yes # Патчить mount с целью слегка # # укоротить кое-какие надписи PATCH_MODLOAD?= Yes # Заставляет работать modload так, # # как он и должен работать :) PATCH_LOCALE?= Yes # Подпатчить libc на предмет LC_CTYPE, # # дабы подружить ru XKB и X программыДанные настройки определяют, следует ли патчить mount (на предмет укорачивания некоторых сообщений), modload (на предмет спасения системы от краха, если был загружен кернел не из /bsd) и libc (на предмет locale, чтобы подружить XKB и старые X программы).
# Качать distfiles для портов сначала отсюда # MASTER_SITE_OVERRIDE?= ftp://pdp-11.org.ru/pub/OpenBSD/distfiles/${DIST_SUBDIR}/Данная настройка позволяет указать сервера, которые должны просматриваться в первую очередь в поисках distfiles для портов.
PIPE?= -pipe # Использовать pipes вместо /tmp при # # компиляцииДанная настройка заставляет gcc использовать unix pipes вместо временных файлов в /tmp.
SUDO?= /usr/bin/sudo # sudo (для make build)Устанавливает переменную SUDO, которая используется при сборке от лица простого пользователя, входящего в группу wsrc.
SITEDIR?= /etc/site # Где все это лежит BSDSRCDIR?= /usr/src # Где находится src BSDOBJDIR?= /usr/obj # Где находится obj PORTSDIR?= /usr/ports # Где находится portsДанный настройки указывают расположение исходных текстов системы, дерева портов и других каталогов, используемых при сборке.
# Научка GQmpeg конвертировать windows-1251 заголовки в koi8-r # .if ${.CURDIR} == ${PORTSDIR}/audio/gqmpeg CONFIGURE_ARGS+= --enable-russian .endifДанный фрагмент включает автоматическую перекодировку заголовков MP3 файлов windows-1251 в koi8-r в программе GQMpeg, собираемой из порта audio/gqmpeg.
# Установка IRC сервера по умолчанию для BitchX и IrcII на irc.pdp-11.org.ru # .if ${.CURDIR} == ${PORTSDIR}/net/ircII || ${.CURDIR} == ${PORTSDIR}/net/bitchx CONFIGURE_ARGS+= --with-default-server=irc.pdp-11.org.ru .endifДанный фрагмент устанавливает IRC сервер по умолчанию для ircII и BitchX, собираемых из портов net/ircII и net/bitchx соответственно.
# Научка ipfm запускать несколько копий и создавать pidfile в виде # /var/run/ipfm-<interface>.pid # .if ${.CURDIR} == ${PORTSDIR}/net/ipfm post-patch: @${PATCH} ${PATCH_ARGS} < ${SITEDIR}/patches/ipfm.patch .endifДанный фрагмент исправляет порт net/ipfm, добавляя в него поддержку одновременной работы с несколькими сетевыми интерфейсами. При этом PID файл будет создаваться в виде /var/run/ipfm-<интерфейс>.pid
# Отучка courier-imap писать IPv4->IPv6 mapped адреса в логе (и от IPv6 :) # .if ${.CURDIR} == ${PORTSDIR}/mail/courier-imap CONFIGURE_ARGS+= --without-ipv6 .endifДанный фрагмент убирает из логов все, что похоже на IPv6 для порта mail/courier-imap.
# Улучшение SPAM-protect feature в hypermail # .if ${.CURDIR} == ${PORTSDIR}/mail/hypermail post-patch: @${ECHO_MSG} "===> Applying SPAM-protect patch" @cd ${WRKSRC} && ${PATCH} -sp0 < ${SITEDIR}/patches/hypermail.patch .endifДанный фрагмент улучшает spamprotect feature для порта mail.hypermail. При этом вместо почтовых адресов в HTML документах будут фигурировать только имена пользователей без указания почтовых доменов.
# Грязный хак для sylpheed, чтобы subject не поганил # (не нужен, если выше включена опция PATCH_LOCALE). # #.if ${.CURDIR} == ${PORTSDIR}/mail/sylpheed #post-patch: # @${ECHO_MSG} "===> Applying ugly charset hack" # @cd ${WRKSRC} && ${PATCH} -sp0 < \ # ${SITEDIR}/patches/sylpheed-charset.patch #.endifДанный фрагмент с помощью грубой физической силы заставляет порт mail/sylpheed писать поле Subject по-русски. Криво, но на безлокальи сойдет. :) Данный хак не нужен, если используется настройка PATCH_LOCALE.
# Включение поддержки SSL в postgresql. Начиная с OpenBSD 3.6, поддержка # уже включена в порте. # #.if ${.CURDIR} == ${PORTSDIR}/databases/postgresql #CONFIGURE_ARGS+= --with-openssl=/usr #.endifДанный фрагмент свключает поддержку SSL для порта databases/postgresql. Начиная с OpenBSD 3.6, поддержка SSL включена в порте сразу.
# Запись IP адреса PPTP клиента в env PPTP_CLIENT для poptop. # .if ${.CURDIR} == ${PORTSDIR}/net/poptop post-patch: @${ECHO_MSG} "===> Applying PPTP_CLIENT env patch" @cd ${WRKSRC} && ${PATCH} -sp0 < ${SITEDIR}/patches/poptop.patch .endifДанный фрагмент заставляет порт net/poptop записывать адрес клиента в переменную PPTP_CLIENT. Данную переменную можно затем использовать в скриптах /etc/ppp/ppp.linkup и /etc/ppp/ppp.linkdown.
.if ${.CURDIR} == ${BSDSRCDIR}/usr.sbin/httpd && defined(PATCH_SUEXEC) \ && ${PATCH_SUEXEC:U} == YES && ${.CURDIR} != ${.OBJDIR} prereq: ${.OBJDIR}/config.status @echo "Patching suexec..." @sh ${SITEDIR}/patches/suexec.sh ${SUEXEC_DOCROOT} .endif .if ${.CURDIR} == ${BSDSRCDIR}/usr.sbin && defined(SETUID_SUEXEC) && \ ${SETUID_SUEXEC:U} == YES afterinstall: @chmod u+s ${DESTDIR}/usr/sbin/suexec .endifДанный фрагмент занимается разборками с suexec на тему вышеописанных настроек.
.if ${.CURDIR} == ${BSDSRCDIR}/gnu/usr.sbin/sendmail/sendmail && \ exists(/usr/local/include/sasl/sasl.h) && \ defined(SENDMAIL_SASL) && ${SENDMAIL_SASL:U} == YES ENVDEF+= -DSASL -I/usr/local/include/sasl LDADD+= -L/usr/local/lib -lsasl2 .endif # Начиная с OpenBSD 3.6, libmilter автоматически собирается и # устанавливается. #.if ${.CURDIR} == ${BSDSRCDIR}/gnu/usr.sbin/sendmail && \ # defined(SENDMAIL_LIBMILTER) && ${SENDMAIL_LIBMILTER:U} == YES #WANT_LIBMILTER= 1 #.if !make(install) #SUBDIR:= libmilter ${SUBDIR} #.elif defined(INSTALL_LIBMILTER) && ${INSTALL_LIBMILTER:U} == YES #SUBDIR:= libsm libmilter ${SUBDIR} # #afterinstall: # install -o ${BINOWN} -g ${BINGRP} -m ${DIRMODE} -d \ # ${DESTDIR}/usr/include/libmilter # install -o ${BINOWN} -g ${BINGRP} -m ${NONBINMODE} \ # ${.CURDIR}/include/libmilter/*.h ${DESTDIR}/usr/include/libmilter #.endif #.endif # #.if (${.CURDIR} == ${BSDSRCDIR}/gnu/usr.sbin/sendmail/libmilter || \ # ${.CURDIR} == ${BSDSRCDIR}/gnu/usr.sbin/sendmail/sendmail) && \ # defined(SENDMAIL_LIBMILTER) && ${SENDMAIL_LIBMILTER:U} == YES #WANT_LIBMILTER= 1 #.endifРазборки с sendmail на тему вышеописанных настроек.
# Разборки с ppp # .if ${.CURDIR} == ${BSDSRCDIR}/usr.sbin/ppp/ppp && defined(PPP_PGSQL) && \ ${PPP_PGSQL:U} == YES && exists(/usr/local/lib/libpq.a) && \ ${.CURDIR} != ${.OBJDIR} CFLAGS+= -DPOSTGRES -I/usr/local/include/postgresql CFLAGS+= -I${.CURDIR} CLEANFILES+= auth.c auth.c.orig bundle.h bundle.h.orig CLEANFILES+= command.c command.c.orig DPADD+= /usr/local/lib/libpq.a ${LIBSSL} ${LIBCRYPTO} LDADD+= /usr/local/lib/libpq.a -lssl -lcrypto beforedepend: auth.c.orig bundle.h.orig command.c.orig auth.c.orig bundle.h.orig command.c.orig: .if !defined(SITE_REENTER) @echo "Applying PostgreSQL authentication patch..." && \ cp ${.CURDIR}/auth.c ${.CURDIR}/bundle.h ${.CURDIR}/command.c \ ${.OBJDIR} && \ patch -sp0 < ${SITEDIR}/patches/ppp-pgsql.patch && \ cd ${.CURDIR} && ${MAKE} depend SITE_REENTER=Yes .endif .endifРазборки с PPP на предмет включения поддержки PostgreSQL авторизации.
# Разборки с mount # .if ${.CURDIR} == ${BSDSRCDIR}/sbin/mount && defined(PATCH_MOUNT) && \ ${PATCH_MOUNT:U} == YES && ${.CURDIR} != ${.OBJDIR} CFLAGS+= -I${.CURDIR} CLEANFILES+= mount.c mount.c.orig beforedepend: mount.c.orig mount.c.orig: .if !defined(SITE_REENTER) @echo "Patching mount..." && \ cp ${.CURDIR}/mount.c ${.OBJDIR} && cd ${.OBJDIR} && \ patch -sp0 < ${SITEDIR}/patches/mount.patch && \ cd ${.CURDIR} && ${MAKE} depend SITE_REENTER=Yes .endif .endifРазборки с mount на предмет укорачивания сообщений.
# Разборки с modload # .if ${.CURDIR} == ${BSDSRCDIR}/sbin/modload && defined(PATCH_MODLOAD) && \ ${PATCH_MODLOAD:U} == YES && ${.CURDIR} != ${.OBJDIR} CFLAGS+= -I${.CURDIR} CLEANFILES+= modload.8 modload.8.orig modload.c modload.c.orig beforedepend: modload.8.orig modload.c.orig modload.8.orig modload.c.orig: .if !defined(SITE_REENTER) @echo "Patching modload..." && \ cp ${.CURDIR}/modload.8 ${.CURDIR}/modload.c ${.OBJDIR} && \ cd ${.OBJDIR} && patch -sp0 < ${SITEDIR}/patches/modload.patch && \ cd ${.CURDIR} && ${MAKE} depend SITE_REENTER=Yes .endif .endifРазборки с modload на предмет использования /dev/ksyms вместо /bsd и предотвращения краха при использовании в системе, загруженной не из /bsd.
# Разборки с локалью # .if ${.CURDIR} == ${BSDSRCDIR}/lib/libc && defined(PATCH_LOCALE) && \ ${PATCH_LOCALE:U} == YES && ${.CURDIR} != ${.OBJDIR} CLEANFILES+= setlocale.c setlocale.c.orig beforedepend: setlocale.c.orig setlocale.c.orig: .if !defined(SITE_REENTER) @echo "Patching locale..." && \ cp ${.CURDIR}/locale/setlocale.c ${.OBJDIR} && cd ${.OBJDIR} && \ patch -sp0 < ${SITEDIR}/patches/locale-hack.patch && \ cd ${.CURDIR} && ${MAKE} depend SITE_REENTER=Yes .endif .endifРазборки с локалью с целью подружить XKB и старые X программы, не умеющие им пользоваться.
# Разборки с игрушками # .if ${.CURDIR} == ${BSDSRCDIR} && defined(NO_GAMES) && ${NO_GAMES:U} == YES SKIPDIR+= games .endif # Разборки с библиотеками # .if defined(NO_PROFILE) && ${NO_PROFILE:U} == YES && \ ${.CURDIR:C/^${BSDSRCDIR}\/lib\///1} != ${.CURDIR} NOPROFILE= .endifРазборки с играми и profiled библиотеками на предмет надобности их собирать и устанавливать.
# Разборки с crunch # .if ${.CURDIR} == ${BSDSRCDIR} && defined(CRUNCH) && ${CRUNCH:U} == YES && \ !make(obj) && !make(clean) && !make(cleandir) SUBDIR+= distrib/crunch .endifРазборки с crunchgen и crunchide на предмет сборки и установки их.