Первоначальная настройка FreeBSD

Приветствие

Разговор всегда должен начинаться с приветствия. Приветствие для авторизовавшегося по ssh (или с физической консоли) пользователя можно поменять в файле /etc/motd (Message Of The Day, Сообщение дня). В motd можно добавить контакты технического отдела, важную информацию об особенностях настройки, текущие невыполненные работы по серверу «TO DO» и многое другое, что важно увидеть залогиневшемуся пользователю.

# vi /etc/motd

Welcome to the Online Sever company!

Have a nice day!

Добавляем системного пользователя

Работать под суперпользователем root не рекомендуется. Человек - не машина, и даже самый ответственный и внимательный администратор может допустить такую критическую ошибку (даже в один символ), которая может вывести систему из строя, или даже безвозвратно уничтожить важные данные.

Заводим пользователя с логином kak (Kotov Andrey Konstantinovich), и, для возможности получения привилегий суперпользователя, добавим данного пользователя в группу wheel. Когда утилита запросит пароль для нового пользователя, не удивляйтесь, что при вводе не отображаются «звёздочки», как это повсеместно в мире Windows. В мире FreeBSD, Linux и других UNIX- и UNIX-подобных системах это нормально, аспект безопасности.

# adduser
Username: kak
Full name: Kotov Andrey Konstantinovich
Uid (Leave empty for default):
Login group [kak]: wheel
Login group is wheel. Invite kak into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]: tcsh
Home directory [/home/kak]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password: указываем пароль
Enter password again: указываем пароль
Lock out the account after creation? [no]:

Проверяем введённую информацию и подтверждаем её правильность.

OK? (yes/no): yes
adduser: INFO: Successfully added (kak) to the user database.
Add another user? (yes/no): no
Goodbye!

Установка портов

Укажем утилите make собирать всё без X11 (для серверного назначения машины).

# echo "OPTIONS_UNSET=X11" >> /etc/make.conf

Теперь, собственно, скачиваем и разворачиваем порты.

# portsnap fetch extract

Русификация консоли в KOI8-R

Если есть интерес в русификации консоли и отображении русских символов - нужно настроить для консоли кодировку KOI8-R.

Добавляем в /etc/rc.conf.

font8x8="cp866-8x8"
font8x14="cp866-8x14"
font8x16="cp866b-8x16"
scrnmap="koi8-r2cp866"
keymap="ru.koi8-r"

Редактируем в /etc/ttys.

ttyv0   "/usr/libexec/getty Pc"         cons25r on  secure

Т.е. там, где было cons25, стало cons25r (т.е. +r).

Приглашение prompt

Сделаем стандартное приглашение prompt (символы »#» или »>» в начале строки, перед вводом команды) более информативным. Для этого в файле /usr/share/skel/dot.cshrc (для всех новых пользователей) и в файле /home/kak/.cshrc (для уже созданного пользователя kak) заменим одну строку.

# vi /usr/share/skel/dot.cshrc
# vi /home/kak/.cshrc

Удаляем строки содержащие какое-либо приглашение (set prompt):

set prompt = "..."

Вставляем строку:

set prompt = "%{\033[33m%}[%T] %{\033[0;4;31m%}`/usr/bin/whoami`%{\033[0;1;31m%}@%{\033[0;4;31m%}%m%{\033[0;1;34m%} %/%{\033[0;32m%} # "

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

# vi /root/.cshrc

Удаляем строки содержащие какое-либо приглашение (set prompt):

set prompt = "..."

Добавить взамен строку:

set prompt = "%{\033[33m%}[%T] %{\033[0;4;31m%}`/usr/bin/whoami`%{\033[0;1;31m%}@%{\033[0;4;31m%}%m%{\033[0;1;34m%} %/%{\033[0;32m%} # "

Тем самым, вместо стандартных промптов # и > мы получим информативное (текущее время, имя авторизованного пользователь, хостнэйм сервера, текущая директория) и цветное приглашение на ввод команд.

[1:51] kak@gate /home/kak #

Настройка подсветки в консоли

В повседневной жизни системному администратору приходится использовать системную утилиту grep каждый день. Для того, чтобы искомые строки подсвечивались цветом, что очень удобно, добавим алиас рядом со стандартными алиасами в .cshrc для root'a, системного пользователя kak и для всех новых пользователей.

# vi /home/kak/.cshrc
# vi /root/.cshrc
# vi /usr/share/skel/dot.cshrc
alias grep grep --color=auto

Также, для суперпользователя, системного пользователя и всех создаваемых пользователей добавим подсветку консоли. Необходимо в .cshrc-файлах после всех алиасов (alias) добавить следующие четыре строки.

# vi /home/kak/.cshrc
# vi /root/.cshrc
# vi /usr/share/skel/dot.cshrc
setenv  LSCOLORS ExFxBxDxCxEgEdAbAgAcAd
setenv CLICOLOR
set autolist
set color

Другие настройки консоли

Укажем сколько системе можно ждать бездействия пользователя, прежде чем перевести экран монитора в энергосбережающий режим (в секундах, 90 секунд).

# vi /etc/rc.conf
blanktime="90"

Также следует указать, что мы будем использовать в виде заставке в энергосберегающем режиме монитора, например, графический логотип FreeBSD.

# vi /etc/rc.conf
saver="logo_saver"

Если хочется, чтобы отклик клавиатуры был больше (а мы хотим, чтобы курсор перемещался быстро), опять же в /etc/rc.conf укажем скорость нажатия клавиш.

# vi /etc/rc.conf
keyrate="fast"

Время на сервере

Проверим текущую дату и время, установленные на сервере.

# date
четверг,  6 июня 2013 г. 08:38:45 (MSD)

Если всё в порядке, то двигаемся дальше, если же нет, указываем часовой пояс нахождения сервера (Europe/Moscow) и устанавливаем точные дата и время.

# cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
# date 201306061345
# date
четверг,  6 июня 2013 г. 13:45:10 (MSK)

Дополнительно добавим в крон сверку времени каждые 10 минут.

# crontab -e
*/10 * * * *    /usr/sbin/ntpdate pool.ntp.org >> /var/log/ntp.log

Обновление часовых поясов

В 2011 и 2014 году некоторые политические личности отменили в России переход на зимнее время. В связи с этим, программное обеспечение множества устройств работало некорректно, по-старинке переводило время на зимнее, ведь устройства не в состоянии читать новые законы и подстраиваться под них. Этим должен заниматься системный администратор, добрым словом вспоминая слуг народа, принявших эти полезные законы.

В новых версиях FreeBSD часовые пояса уже сделаны на новый лад. Но если вам, как и мне попался дистрибутив FreeBSD, вышедшей перед принятием закона - необходимо обновить файлы часовых поясов на сервере.

Можно обновить временные зоны часовых поясов автоматически, запустив одну единственную команду.

# fetch http://wiki.onsever.ru/_media/freebsd/update_zoneinfo.sh; chmod 500 ./update_zoneinfo.sh; ./update_zoneinfo.sh

Или произвести операцию обновления вручную.

Настройка сети

Можно настроить через sysinstall, но привычнее вручную. Для начала смотрим что у нас с сетевыми интерфейсами

# ifconfig
nfe0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8010b<RXCSUM,TXCSUM,VLAN_MTU,TSO4>
        ether 90:e6:ba:40:d7:1d
        inet 195.9.14.15 netmask 0xffffffff broadcast 195.9.14.15
        media: Ethernet autoselect (100baseTX <full-duplex,flag0,flag1>)
        status: active
ipfw0: flags=8801<UP,SIMPLEX,MULTICAST> metric 0 mtu 65536
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>

После этого пишем в /etc/rc.conf:

hostname="def.wm.ru"
ifconfig_nfe0="inet 195.9.14.15  netmask 255.255.255.0 -nopromisc"
ifconfig_nfe0="DHCP" (взамен, если DHCP)
defaultrouter="195.9.14.6" (если DHCP, то не нужно)

Далее добавляем dns-сервера в /etc/resolve.conf:

domain  wm.ru
nameserver      195.9.14.117
nameserver      193.125.152.91

Можно вместо «domain wm.ru» указать несколько, только внимательно следим, чтобы были точки на конце доменов, например так…

search wm.ru. relis.ru.
nameserver      195.9.14.117
nameserver      193.125.152.91

Лучше будет всем, когда сканеры сетей не могут определить информацию об операционной системе. Заберём у них эту возможность.

# echo 'tcp_drop_synfin="YES"' >> /etc/rc.conf

Рекомендуется также собирать ядро с указанной опцией.

options         TCP_DROP_SYNFIN

Также, чтобы интерфейс работал в одном режиме full-duplex и внезапно не переключался - желательно явно указывать, в каком режиме ему следует работать (чтобы в какой-то нежелательный момент канал резко не ужался или не отвалился вовсе). Для этого смотрим текущий режим работы интерфейса.

# ifconfig | grep media
        media: Ethernet autoselect (100baseTX <full-duplex>)

Добавляем в /etc/rc.conf.

ifconfig_nfe0="inet 195.9.14.50 netmask 255.255.255.0 media 100baseTX mediaopt full-duplex"

И либо перезагружаем сервер, либо перезапускаем netif и routing.

# shutdown -r now
# /etc/rc.d/netif restart && /etc/rc.d/routing restart

Начальная настройка демона SSH

Для запуска демона SSH при старте системы добавляем в /etc/rc.conf.

sshd_enable="YES"

Отключаем в конфиге sshd резолвинг IP, чтобы не было тормозов при медленной работе DNS. Также, запретим удалённым пользователям авторизовываться в системе под root'ом. В таком случае, даже если пароль будет правильный - система сбросить соединение.

# vi /etc/ssh/sshd_config
UseDNS no
PermitRootLogin no

Также, можно указать порт, на котором будет прослушивать соединения ssh, указать принимать соединения только по протоколу второй версии (аспект безопасности, протокол 1 версии не безопасен и практически не используется в современных системах). Директивой Allow Groups можно устанавливать группы пользователей, которым разрешена авторизация по ssh.

Port 22
Protocol 2
AllowGroups wheel

После этого нужно перезапустить sshd.

# /etc/rc.d/sshd restart

Небольшая настройка демона sendmail

Если не требуется - отключаем входящую и исходящую почту от sendmail.

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

Если планируется только отправлять сообщения - отключаем входящую почту.

sendmail_enable="NO"

Модули и загрузка

Для того, чтобы сократить время загрузки, уменьшим ожидание выбора в boot loader'e (меню перед стартом системы).

# echo 'autoboot_delay="2"' >> /boot/loader.conf

Для поддержки модуля linux и linux-вещей добавляем в /etc/rc.conf.

# echo 'linux_enable="YES"' >> /etc/rc.conf

Для того, чтобы система не тормозилась при старте восстановлением сессий vi.

# echo 'virecover_enable="NO"' >> /etc/rc.conf

Sysctl-переменные

Если новое ядро уже собрано и в него добавлена поддержка firewall'а, неплохим шагом будет увеличить в ядре количество допустимых динамических правил для ipfw.

# sysctl net.inet.ip.fw.dyn_max=65536
net.inet.ip.fw.dyn_max: 4096 -> 65536
# echo "net.inet.ip.fw.dyn_max=65536" >> /etc/sysctl.conf

Делаем из сервера чёрную дыру для непрослушиваемых портов. Установка данных директив замедляет работу сетевых сканеров и система не тратит ресурсы на формирование ответа на такие запросы. TCP и UDP.

# sysctl net.inet.tcp.blackhole=2
net.inet.tcp.blackhole: 0 -> 2
# echo 'net.inet.tcp.blackhole=2' >> /etc/sysctl.conf
# sysctl net.inet.udp.blackhole=1
net.inet.udp.blackhole: 0 -> 1
# echo 'net.inet.udp.blackhole=1' >> /etc/sysctl.conf

Запрещаем всем пользователям кроме root'а просматривать информацию о всех процессах, сокеты и тому подобное. Непривилегированный пользователь сможет наблюдать только за своими процессами.

# sysctl security.bsd.see_other_uids=0
security.bsd.see_other_uids: 1 -> 0
# echo 'security.bsd.see_other_uids=0' >> /etc/sysctl.conf
# sysctl security.bsd.see_other_gids=0
security.bsd.see_other_gids: 1 -> 0
# echo 'security.bsd.see_other_gids=0' >> /etc/sysctl.conf

Если спикер (speaker) на машине не нужен (например, на десктопе уже надоел, а на сервере нет надобности), отключаем.

# sysctl hw.syscons.bell=0
# echo "hw.syscons.bell=0" >> /etc/sysctl.conf

После того, как соединение устанавливается, оно попадает в очередь «listen socket queue», пока серверный демон, прослушивающий порт, не займётся обработкой запроса в этом соединении. Увеличиваем размер очереди на порты TCP (до 4096).

# echo 'kern.ipc.somaxconn=4096' >> /etc/sysctl.conf

Увеличиваем допустимое количество кэшированных файлов, это помогает разгрузить дисковую подсистему, при наличии большого объёма памяти. Например, для 16ГБ ОЗУ подойдёт 400 тысяч виртуальных узлов (vnodes).

# sysctl kern.maxvnodes=400000
kern.maxvnodes: 100000 -> 400000
# echo 'kern.maxvnodes=400000' >> /etc/sysctl.conf

Энергосбережение с помощью powerd

Для того чтобы во время простоя процессора экономить электричество, можно включить демон powerd. По-умолчанию, рабочая частота процессора установлена в максимальное значение.

# sysctl dev.cpu.0.freq
dev.cpu.0.freq: 3600

При работающем powerd и при отсутствии нагрузки, частота процессора занижается данным демоном. По-умолчанию powerd управляет частотой процессора в адаптивном режиме. Включаем powerd при старте системы.

# vi /etc/rc.conf
powerd_enable="YES"

# /etc/rc.d/powerd start
Starting powerd.

Чтобы узнать текущую частоту работы процессора, просматриваем sysctl-переменную dev.cpu.0.freq.

# sysctl dev.cpu.0.freq
dev.cpu.0.freq: 200

В данном случае, сервер из-за простоя с максимальной частоты 3600 переключился на минимальную 200! Счета за электроэнергию станут меньше, если действительно большую часть времени серверные ресурсы не используются.

Автоматическая очистка временных файлов

Если требуется, чтобы каждый раз при старте системы очищался раздел временных файлов /tmp, можно включить опцию clear_tmp_enable в rc.conf. При использовании FreeBSD в качестве рабочей станции, желательно эту опцию включать, но если система выполняет серверную роль - не всегда. Например, для хостинг-серверов эту опцию лучше не включать, потому что в /tmp как минимум могут храниться файлы пользовательские веб-сессии, которые могут «жить» и после перезагрузки сервера, а при включённой опции clear_tmp_enable они, как полагается, удалятся, что создаст пользователям некоторый дискомфорт. Так что, на вкус и цвет.

# echo 'clear_tmp_enable="YES"' >> /etc/rc.conf

Автоматическая проверка разделов на наличие ошибок

При старте, прежде чем монтировать разделы, система проверяет все разделы на ошибки и на корректность размонтирования в предыдущем сеансе работы. По-умолчанию поведение системы различается:

# fsck -y

Добавим в rc.conf следующие директивы.

# echo 'fsck_y_enable="YES"' >> /etc/rc.conf
# echo 'background_fsck="NO"' >> /etc/rc.conf

Первая строка указывает системе при старте и обнаружении ошибок запускать fsck с ключом » -y » (на все вопросы отвечать «Yes»).

Второй строкой background_fsck=«NO» мы запрещаем при незначительных ошибках запускать многопользовательский режим и в нём фоновую проверку, ведь это создаёт на дисковую подсистему большую нагрузку от background fsck и пользовательских процессов, работающих в многопользовательском режиме. Диск будет в итоге перегружен и все процессы будут медленно исполняться, «тормозить».

Что получаем в итоге. Система стартует, проверяет разделы. Если ошибок нет - загружается многопользовательский режим. Если есть хоть одна незначительная ошибка - fsck проверяет все сбойные разделы и только после этого загружает многопользовательский режим.

Установка исходного кода системы

В случае отсутствия исходного кода системы, можно исходники установить через subversion. Собственно устанавливаем сам subversion.

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

Потом устанавливаем исходный код в /usr/src. Обращаем внимание на версию операционной системы в URL'е ниже.

# svn checkout https://svn0.us-west.freebsd.org/base/release/10.0.0 /usr/src

Дополнительные системные утилиты

Искушённым рекомендуется установить на сервер дополнительные системные утилиты администрирования. Как минимум не будет лишним с ними познакомиться.