RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Первый день во FreeBSD - Три первых шага к комфортной работе
Три первых шага к комфортной работе
Несмотря на то, что все мы используем, как правило, одинаковый набор программ и выполняем на ПК одни и те же операции, есть некоторые действия, которые всегда полезны после установки FreeBSD. Давай взглянем на эту ОС исключительно в разрезе настольного применения, и будем помнить, что важное на сервере далеко не всегда имеет первостепенное значение для домашнего компьютера.
Шаг №1. После первой загрузки
Прежде всего отмечу, что речь пойдет про пятую версию FreeBSD, а на данный момент актуален релиз. 5.3. 4.x уже морально устарела, и на настольном компьютере нет никаких причин использовать "четверку". Впрочем, многое из написанного мной относится и к старым релизам FreeBSD. Во время установки система предложила тебе зарегистрировать отдельного пользователя. Разумеется, ты выполнил эту операцию и не забыл добавить созданного пользователя в группу wheel, чтобы он мог повышать свои привилегии с помощью команды su. Первым делом нужно озаботиться своевременным обновлением системы. FreeBSD team, как и многие проекты, хранит исходные коды системы в репозитарии CVS - системе контроля версий, позволяющей отслеживать изменения и синхронизировать локальное дерево исходников с той или иной его версией. Подробнее про CVS и доступные ветки (branches) системы можно прочитать во FreeBSD Handbook. Ставим пакет CVSup, как наиболее удобный для синхронизации дерева исходных текстов. Причем даже если в дальнейшем планируется собирать все программы из портов, cvsup(1) проще всего поставить из прекомпилированного пакета, так как он, написанный на языке modula3, при сборке тянет в систему компилятор этого языка, и сборка затягивается.
Для работы cvsup не нужен modula3. Кроме того, cvsup имеет frontend, который абсолютно ни к чему даже на настольной машине. Итак, ставим пакет с установочного диска или с ftp-сервера:
~# pkg_add cvsup-without-gui-16.1h.tbz
После чего составим конфигурационные файлы для обновления системы, портов и документации. Они весьма просты, их синтаксис описан в том же Handbook, а рабочие примеры располагаются в /usr/share/examples/cvsup/.
~# cat /etc/src-supfile
*default host=cvsup5.ru.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=RELENG_5
*default delete use-rel-suffix compress
src-all
~# cat /etc/ports-supfile
*default host=cvsup5.ru.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix compress
ports-all
~# cat /etc/doc-supfile
*default host=cvsup5.ru.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix compress
doc-all
Нетрудно заметить, что мы поддерживаем систему на уровне 5-STABLE, все остальное - порты и документацию - синхронизируем до текущей (CURRENT) версии. Впрочем, из-за того что применение FreeBSD на настольном компьютере позволяет экспериментировать, можно все обновлять до CURRENT, и тогда ты в качестве бонуса получишь новые возможности и новые глюки ветки 6-CURRENT :-)
~# cat /etc/all-supfile
*default host=cvsup5.ru.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix compress
src-all
ports-all
doc-all
Возникает закономерный вопрос: "А нужно ли тянуть из портов японские, вьетнамские, еврейские и прочие локализации, и нужна ли соответствующая документация?" Конечно, нет, поэтому создаем файл /usr/sup/refuse (потому что префикс *default prefix=/usr) следующего содержания:
~# cat /usr/sup/refuse
doc/bn_*
doc/da_*
doc/de_*
doc/es_*
doc/el_*
doc/fr_*
doc/it_*
doc/ja_*
doc/nl_*
doc/no_*
doc/pl_*
doc/pt_*
doc/sr_*
doc/tr_*
doc/zh_*
ports/arabic
ports/chinese
ports/french
ports/german
ports/hebrew
ports/hungarian
ports/japanese
ports/korean
ports/portuguese
ports/polish
ports/ukrainian
ports/vietnamese
Если ты ставил систему с компакт-диска, то установи с него же коллекцию портов и дерево исходных текстов и документации, а потом обнови их:
~# cvsup -L2 /etc/all-supfile
Можно еще больше облегчить себе жизнь внимательно прочитав /usr/src/Makefile, а потом - man make.conf. /etc/make.conf при правильной настройке позволяет здорово уменьшить количество телодвижений при обновлении системы. В данный момент нас интересуют следующие переменные, которые нужно вписать в /etc/make.conf (их названия говорят сами за себя и комментариев не требуют):
SUP_UPDATE=yes
SUP=/usr/local/bin/cvsup
SUPFLAGS=-L 2
SUPHOST=cvsup5.ru.freebsd.org
SUPFILE=/etc/src-supfile
PORTSSUPFILE=/etc/ports-supfile
DOCSUPFILE= /etc/doc-supfile
DOC_LANG=en_US.ISO8859-1 ru_RU.KOI8-R
Теперь можно обновить разом порты, исходники системы и документации одной командой:
~# cd /usr/src %26%26 make update
Обновление системы из полученных исходников отложу на потом, а пока потрачу пару минут на отключение в /etc/rc.conf лишних сервисов, совершенно не нужных на настольном ПК, а кроме этого впишу некоторые полезные переменные:
fsck_y_enable="YES"
usbd_enable="YES"
sendmail_enable="NONE"
sshd_enable="NO"
syslogd_flags="-ss"
Тем самым полностью был отключен запуск sendmail(8) и всех его агентов, syslogd'у было запрещено слушать сетевой сокет (514/udp), включен демон мониторинга USB-устройств usbd, а также была "автоматизирована" работа программы восстановления целостности файловой системы после сбоев (fsck), чтобы она не спрашивала, исправлять ошибки или нет, а молча фиксила их. До кучи также отключили sshd. Зачем он на домашней машине? Хотя если ты планируешь получать доступ к рабочей машине из локальной сети или интернета, то можешь его оставить. В остальном можно полагаться на разумные значения в /etc/defaults/rc.conf. И тут (внимание!) проявляется одна из самых частых ошибок начинающих администраторов. Отключив sendmail за ненадобностью, они забывают о том, что система все еще продолжает слать локальному root’у письма-отчеты о состоянии системы (генерируемые утилитой periodic(8). Разумеется, она пытается использовать для этого локальный почтовый сервер, который только что тихонько был убит. В итоге за пару недель/месяцев/лет эксплуатации в /var/spool/clientmqueue накапливается столько недоставленной макулатуры, что администратор узнает об этом лишь при переполнении раздела /var, когда уже поздно пить "Боржоми". Не будем повторять ошибок ушедших поколений и просто отключим системные отчеты. Все-таки это настольный компьютер. Для этого закомментируем в /etc/crontab следующие строчки:
# Perform daily/weekly/monthly maintenance.
#1 3 * * * root periodic daily
#15 4 * * 6 root periodic weekly
#30 5 1 * * root periodic monthly
Есть и другой выход: можно не убивать sendmail, а отрезать его от внешнего мира, заставив слушать только на 127.0.0.1. Все подробности этого процесса - в man sendmail или у OpenBSD, в которой sendmail по умолчанию принимает соединения только от lokalhost (/etc/mail/localhost.cf).
Венцом "первого этапа" будет обновление системы до выбранной версии, то есть сборка из исходных текстов ядра, базового окружения и документации. Но перед тем как компилировать все и вся, вспомним про волшебный /etc/make.conf. В базовое окружение FreeBSD входит много программ и сервисов, но разве нам нужен на рабочей станции сервер имен named или недавно убитый почтовый сервер sendmail? Наконец, зачем целых три пакетных фильтра (pf, ipfw2, ipf), службы UUCP, I4B (isdn for freebsd), ATM или поддержка IPv6? Тщательное прочтение man make.conf поможет сэкономить много времени при пересборке системы из исходников. Так что смело можно добавлять в /etc/make.conf как минимум следующее:
CFLAGS= -O2 -pipe -march=pentium4
COPTFLAGS= -O2 -pipe -march=pentium4
CPUTYPE?=pentium4
NOINET6=true
NO_BIND=true
NO_SENDMAIL=true
NO_MAILWRAPPER=true
NO_KERBEROS=true
NO_LPR=true
NO_UUCP=true
NO_PF=true
NO_I4B=true
NO_IPFILTER=true
Разумеется, то, что уже существует в системе после установки, никуда не исчезнет, но новые версии этих программ не будут собраны, и ты можешь раз и навсегда потерять bind, sendmail, etc. Заметь, что кроме указаний на то, какие части системы собирать не собираемся, мы прописали флаги оптимизации GCC под свой процессор.
Теперь нужно выполнить следующие команды:
~# cd /usr/src && make buildkernel && make buildworld && make installkernel
~# reboot
(система перезагрузится с новым ядром)
~# mergemaster -p
~# cd /usr/src && make installworld
~# mergemaster
Потом поставить "мета-порт" docproj, который установит утилиты, необходимые для сборки документации:
~# cd /usr/ports/textproc/docproj && make install clean
А после этого соберем саму документацию. Я предпочитаю любоваться на нее в формате html:
~# cd /usr/doc && make FORMATS="html" install clean
За подробностями всего магического процесса пересборки системы из исходников обращайся к Handbook, я же могу только констатировать, что в результате ты получишь свежую систему с необходимым набором базового софта и актуальной документацией. Неплохо для первого этапа, правда?
Шаг №2. Добавляем программы
Следующий шаг - добавление в систему необходимых пакетов, без которых жизнь была бы скучна и неинтересна. Учитывая, что на десктопе, как правило, стоит современное мощное железо и что для сборки программ из исходных текстов имеется достаточно времени, то ничто не мешает использовать систему портов для добавления нужных программ.
Впрочем, в целях экономии трафика, времени и при наличии дисков с полным релизом системы первоначальную установку можно провести из прекомпилированных пакетов, а потом уже обновлять программы из портов. Первым делом поставим sudo и окончательно забудем, что такое "сидеть под root".
~# cd /usr/ports/security/sudo && make install clean
Так как в группе wheel присутствуют только root и наш пользователь, то разрешим им выполнять команды без ввода пароля:
~# visudo
root ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: ALL
Если ты сидишь за прокси-сервером, то утилита Fetch, которая используется в системе портов за скачивание файлов, может обломиться. Дать ей директиву работать через прокси-сервер ты можешь следующей строчкой в /etc/make.conf:
Вторая по значимости программа, которую я рекомендую поставить, - это Portaudit. Этот скрипт скачивает базу уязвимых портов, сравнивает ее с установленными пакетами и показывает установленные уязвимые порты, которые следует обновить или удалить.
~# cd /usr/ports/security/portaudit && make install clean
~# portaudit -Fa
auditfile.tbz 100% of 15 kB 19 kBps
New database installed.
Affected package: open-motif-2.2.3
Type of problem: xpm -- image decoding vulnerabilities.
You are advised to update or deinstall the affected package(s) immediately.
Если ты решил не убивать sendmail и оставить периодическую генерацию системных отчетов, то можно прописать запуск portaudit в конфиг /etc/periodic.conf уже знакомой нам утилиты periodic(8) и получать по почте отчеты об уязвимостях в установленных пакетах:
Уж раз решено всецело положиться на сборку программ из портов, то без утилиты Portupgrade не обойтись. Стандартных pkg_* утилит явно недостаточно для эффективной работой с портами.
~# cd /usr/ports/sysutils/portupgrade && make install clean
Вообще, в портах утилит для работы с ... портами :) очень много, но для начала достаточно Porupgrade.
Примеры эффективной работы с Portupgrade
Просмотр outdated-портов, которые можно обновить:
~# portversion -l \ <
ImageMagick <
cd2mp3 <
fluxbox-devel <
javavmwrapper <
net-snmp <
p5-BerkeleyDB <
pdflib <
razor-agents <
ru-openoffice <
Обновление outdated-портов:
~# portupgrade -arR
Построение индекса /usr/ports/INDEX всех доступных на текущий момент портов (требуется для работы двух приведенных выше команд):
~# portsdb -Uu
Основным минусом является то, portsdb строит индекс с нуля, что может занять много времени (портов-то более десяти тысяч). В данном случае можно посоветовать утилиту Portindex (sysutils/p5-FreeBSD-Portindex), которая генерирует INDEX инкрементально.
Прежде чем ставить остальные программы, снова направляем взгляд на многострадальный make.conf. В нем, помимо указания системных переменных, можно указывать переменные для конкретного порта. Для этого нужно обрамить переменные в условия:
.if ${.CURDIR:N*/ports/editors/vim} == ""
NO_GUI=yes
.endif
Эта запись означает, что если считывающий ее Makefile находится в заданном каталоге CURDIR, то указанная переменная считывается как переменная окружения и используется при сборке порта. Так как /etc/make.conf считывается при сборке каждого порта, то указание опций в make.conf аналогично тому, как если бы они были указаны при компиляции:
~# cd /usr/ports/editors/vim && make NO_GUI=yes install clean (первый вариант)
~# cd /usr/ports/editors/vim && make -DNO_GUI install clean (второй вариант)
Однако при обновлении порта той же утилитой portupgrade была бы "потеряна" опция, если бы ее не указали в make.conf. Теперь же не о чем беспокоиться, до тех пор пока такая опция есть в Makefile порта.
Следующая на очереди программа - это рабочий shell. Действительно, можно довольствоваться стандартным tcsh, но я предпочитаю что-нибудь более удобное. И хотя самой популярной оболочкой является bash, по возможностям сейчас нет равных Z-shell. Так что я попытаюсь обратить тебя в свою веру ;-).
~# cd /usr/ports/shells/zsh %26%26 make install clean
~# chsh -s zsh user
Шаг №3. Послесловие
В принципе, основные настройки сделаны, теперь система может быть полностью отдана в твое распоряжение. Можешь делать с ней что хочешь и ставить что хочешь, благо 12 с лишним тысяч портов не дадут тебе скучать. Однако напоследок - пара маленьких приемов, которые могут пригодиться. Во-первых, на хороших LCD-мониторах стандартная 80x25 консоль смотрится весьма печально. Поправить это можно следующими опциями в /etc/rc.conf:
allscreens_flags="-g 8x14 VGA_80x30 green black"
font8x14="ter-k14n"
font8x16="ter-k16n"
где "ter-*" это шрифты из набора terminus, который можно взять по адресу www.is-vn.bg/hamster/terminus-font-4.11.tar.gz. Распаковав архив и перейдя в целевой каталог, следует набрать make raw для создания шрифтов под freebsd'шный консольный драйвер syscons. Затем нужные шрифты просто скопировать в /usr/share/syscons/fonts. Твоему монитору сразу полегчает :). Во-вторых, в качестве X-сервера ты наверняка используешь X.Org: он заменил опальный XFree86. Однако старый сервер все еще присутствует в системе, и чтобы при сборке портов система правильно определяла требуемые иксовые библиотеки, можно явно прописать использование xorg:
~# echo X_WINDOW_SYSTEM=xorg >> /etc/make.conf
В-третьих, если в качестве рабочей станции ты используешь ноутбук, обязательно прочти серию заметок "Мобильные Юниксы" (3 части), которые публиковались в разных выпусках Х и уже доступны на нашем сайте.
А нужен ли файрвол?
Ты заметил, что на рабочей станции мы не особо-то уделили внимание пакетному фильтру, даже оставили "за бортом" PF и IPF. Действительно, а зачем? FreeBSD - не Windows, и светить открытыми портами во все стороны привычки не имеет. То немногое, что запускалось при старте системы, было отключено. Но если паранойя не дает тебе спать, можно ограничиться старым добрым ipfw2:
firewall_enable="YES"
firewall_quiet="YES"
firewall_type="client"
где тип файрвола - client - указан в /etc/rc.firewall. Тебе нужно лишь слегка подправить его с тем расчетом, чтобы он пропускал все соединения от тебя сохраняя сеанс (statefull filtering), но запрещал все входящие пакеты. Если твоя рабочая freebsd-станция является одновременно и шлюзом для домашней сетки, могу тебе только посочувствовать (для этих целей должна быть выделена отдельная машина :) и предложить почитать OpenBSD PF User's Guide (www.openbsd.org/faq/pf/index.html) - самый продвинутый на сегодняшний день пакетный фильтр, входящий в базовое окружение FreeBSD. Разумеется, про NO_PF=true в /etc/make.conf в этом случае лучше забыть.
На этом начальную настройку прошу считать оконченной. И помни, что на все твои вопросы ответит всемогущий Google.