Настройки ядра во FreeBSD

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

Прежде всего, необходимо увеличить значение опции MAXUSERS (по умолчанию оно равно 32). Эта настройка устанавливает не допустимое число пользователей, которые могут одновременно работать в системе (как можно было бы ошибочно предположить по ее названию), а важный внутренний параметр, на основе которого вычисляются другие значения (количество сетевых буферов памяти, или NMBCLUSTERS и т.д.). Для загруженных систем значение MAXUSERS следует установить равным 128 или 256 (и даже выше).

Значение опции NMBCLUSTERS, вычисляемое как (MAXUSERS * 1В) + 512, управляет числом доступных сетевых буферов памяти (их можно просмотреть с помощью команды netstat -m). Если вывод показывает, что все они использованы, а увеличение значения MAXUSERS не изменяет ситуацию, опцию NMBCLUSTERS можно настроить в ядре независимо, установив для сильно загруженных систем значение, равное 16384 или 32768. Можно поступить и подругому: установить значение соответствующей переменной на этапе запуска ядра. Для этого к файлу /boot/loader.conf необходимо добавить строку kern.ipc.nmbclusters="16384".

Система Soft Updates и асинхронная запись

Одним из свойств, которое позволяет FreeBSD надежно работать на маломощных системах, является синхронная запись (synchronous writes). Этот термин означает, что система ожидает, пока завершится каждая операция записи метаданных в файловой системе. При таком подходе в случае аварийного завершения работы системы или внезапном отключении питания маловероятно, что файловая система будет повреждена. В то же время это значит, что система будет работать заметно медленнее, чем подобные платформы, поскольку в ней установлен искусственный "потолок" производительности. Впрочем, при желании, его можно легко устранить.

В главе 9 обсуждался механизм Soft Updates, методика, при которой дисковые операции записи выполняются на уровне, управляемом программным обеспечением. При этом ускоряется дисковый ввод-вывод (I/O) и сохраняется требуемый уровень надежности файловой системы при возможных сбоях.

Механизм Soft Updates встроен в ядро GENERIC и поэтому им всегда можно воспользоваться. Однако для этого его необходимо включить с помощью утилиты tunefs. Последняя представляет собой вспомогательную программу для поддержки файловой системы FFS, используемой в FreeBSD. Программу tunefs следует запускать в однопользовательском режиме, чтобы изменения вступили в силу, поскольку файловые системы, на которые она воздействует, не могут быть в этот момент смонтированы. Так как tunefs размещается в каталоге /sbin, она доступна в однопользо-вательском режиме без монтирования дополнительных файловых систем.

Перегрузите систему в однопользовательском режиме (введите boot -s в пригла-шении загрузчика). В командной строке введите следующее:

tunefs -n enable / tunefs -n enable /usr tunefs -n enable /var

Выполните эту команду и для других файловых систем на диске. Возможно, вам потребуется указать полный путь команды /sbin/tunefs вместо tunefs.

Другой способ обойти синхронную запись (если не используется Soft Updates) состоит в монтировании файловых систем в асинхронном режиме, когда операции записи не препятствуют выполнению системных функций. Преимуществом является выигрыш в скорости, недостатком - снижение надежности. Если система аварийно завершит работу в момент записи на диск, файловая система будет повреждена (в некоторых случаях непоправимо).

Если вы готовы пойти на риск, присущий асинхронному монтированию файловой системы, воспользуйтесь опцией async команды mount в файле /etc/fstab. Команда mount, выполняемая из командной строки, выглядит следующим образом:

# mount -о async /usr /dev/adOslf

Для автоматического монтирования в асинхронном режиме добавьте опцию async в четвертом столбце файла /etc/fstab, например:

/dev/adOslf /usr ufs rw,async 2 2

Вопросы геометрии диска

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

Вот почему большое значение имеет порядок, в котором разделы записаны в таблице разделов. Первая запись начинается от края диска, а все последующие раз-мещаются ближе к центру (на оптических носителях, например, компакт-дисках, хранение данных организовано по-другому: диск вращается с постоянной линейной скоростью, поэтому угловая скоростью зависит от точки, с которой в этот момент происходит чтение). Чаще всего обращение происходит к корневому разделу и разделу подкачки, поэтому они должны находиться ближе к краю. Кроме того, файловые системы меньшего размера предпочтительнее разместить как можно ближе к краю диска. Таким образом, оптимальное разбиение диска выглядит так: вначале располагается небольшой корневой раздел, за ним - раздел подкачки (вдвое больший, чем объем физической памяти). Далее следуют /var, /usr и /home (обычно, их размер растет именно в таком порядке).

В UNIX алгоритмы управления виртуальной памятью, как правило, оптимизированы таким об-разом, чтобы раздел подкачки был вдвое больше, чем объем физической памяти. Поэтому, например, при 256 Мб оперативной памяти следует создавать раздел подкачки в 512 Мб. Раздел меньшего размера приведет к замедлению, когда операции постраничной записи будут перекрывать друг друга.

Несколько настроек с помощью sysctl

Программа sysctl управляет несколькими переменными ядра (например, kern.ipc.nmbclusters, с которой мы уже сталкивались ранее). Их значения отвечают устойчивой работе системы на маломощном оборудовании с низкой производитель-ностью. Настроить значения требуемых переменных можно в файле /etc/sysctl.conf, обработка которого происходит при загрузке системы. В инсталляции по умолчанию файл /etc/sysctl.conf отсутствует. Поэтому его необходимо создать и добавить следующие записи:

vf s.vmiodirenable=l

kern.ipc.maxsockbuf=2097152

kern.ipc.somaxconn=8192

kern.ipc.maxsockets=l6424

kern.maxfiles=65536

kern.maxfilesperproc=32768

net.inet.tcp.rfc1323=l

net.inet.tcp.delayed_ack=0

net.inet.tcp.sendspace=65535

net.inet.tcp.recvspace=65535

net.inet.udp.recvspace=65535

net.inet.udp.maxdgram=57344

net.local.stream.recvspace=65535

net.local.stream.sendspace=65535

Отметьте, что значения этих переменных, в большинстве случаев, неочевидны и недокументированы. До того, как перезагрузить системы с новым файлом /etc/ sysctl.conf, можно воспользоваться командой sysctl для просмотра значений по умолчанию:

# sysctl vfs.vmiodirenable

vfs.vmiodirenable: 0

Любое значение можно настроить и вручную, воспользовавшись ключом -w:

# sysctl -w vfs.vmiodirenable=l

vfs.vmiodirenable: 0 -> 1

Резервные копии

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

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

Старым испытанным методом создания копий является встроенная в UNIX утилита dump. Ее выполнение определяется уровнями dump, заданными в файле /etc/ fstab (см. главу 9). Программа позволяет создавать "инкрементные" резервные копии, когда в первый раз производится копирование всей системы, а затем копируют-ся только измененные или новых файлов. Это позволяет сэкономить пространство на магнитной ленте и затрачиваемое время.

Чтобы воспользоваться этой возможностью, необходимо соответствующее устройство. Подойдет носитель на магнитной ленте (/dev/rsaO по умолчанию), внешний жесткий диск или любое другое устройство, которое можно монтировать и производить запись на него с помощью стандартных операций. Зачастую для таких устройств, как носители на магнитной ленте, в качестве интерфейса выбирался SCSI. Поэтому вам потребуется и SCSI-контроллер. Альтернативой могут послужить устройства Fire Wire (IEEE 1394). Кроме того, существуют носители на магнитной ленте с интер-фейсом IDE/ATAPI. Прежде чем покупать устройство, убедитесь, что система FreeBSD поддерживает его! Для команды dump монтировать устройство не требуется, поскольку эта команда записывает информацию непосредственно на это устройство.

Следующая команда выполняет полное резервное копирование файловой системы

/home:

# dump -Ou -f /dev/nrsaO /home

Опция 0 отвечает копированию на уровне 0 (т.е. копируются все файлы), а опция ц указывает на запись в файл /etc/dumpdates. Это файл в текстовом формате, необходимый утилите dump, чтобы при "инкрементном" резервном копировании установить, какие файлы требуют сохранения.

ПРИМЕЧАНИЕ

Устройство nrsaO совпадает с rsaO за исключением того, что первое имя указывает на "не-перематываемое" устройство. Это имя указывает программе, что по окончании записи ленту перематывать не нужно. Носители на магнитной ленте, в

частности со SCSI-интерфейсом, ис-пользуют имена устройства как опции, задающие утилите dump режим работы с лентой.

См. табл. 20.3.

Таблица 20.3 Метаимена устройства в качестве опций управления Мвтаимя устройства Действие

/dev/saO Реальное имя устройства

/dev/rsaO Указывает dump перемотать ленту к началу по завершении записи

/dev/nrsaO Указывает dump не перематывать ленту к началу по завершении

записи

/dev/ersaO Указывает dump возвратить кассету из кассетоприемника по

завершении записи

После этого можно производить "инкрементное" резервное копирование, используя тот же синтаксис команды, но более высокий номер уровня dump:

# dump -lu -f /dev/nrsaO /home

Уровни dump позволяют копировать только те файлы, которые изменились с момента копирования на более низком уровне. Поэтому, если производится копирование на уровне 3, а затем на уровне 4, в последнем случае обрабатываются только те файлы, которые изменились с момента предыдущего копирования на уровне 3. Если затем произвести копирование на уровне 2, все файлы, обработанные на уров-нях 3 и 4, будут скопированы снова. Чем ниже уровень, тем больше файлов будет скопировано. Уровень 0 отвечает глобальному резервному копированию, когда сохраняются все файлы, независимо от предыдущих сеансов резервного копирования.

Обычно применяют следующую процедуру: вначале создают резервную копию системы на уровне 0, затем в начале каждой недели - на уровне 1, используя новую ленту (или набор лент). Каждый день производится копирование более высокого уровня. Подробнее об этом см. man dump.

Восстановление

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

# restore -if /dev/nrsaO

В оболочке программы поддерживается набор команд: cd, Is, pwd, add, delete и др. Они позволяют перемещаться по структуре каталогов резервной копии, просматривать файлы и добавлять в список (командой add). Удалить файлы из списка (но не с ленты или диска) позволяет команда delete. Команда extract восстанавливает с ленты все файлы, находящиеся в списке на момент ее запуска. Полный синтаксис всех интерактивных команд программы restore содержится на странице справочного руководства man restore.

restore> add frank restore> extract

Восстановить все файлы с ленты можно с помощью неинтерактивных опций:

# restore -rf /dev/nrsaO

На ленте часто содержится несколько сеансов резервного копирования, например для разных дней недели. Так, на одной ленте может содержатся полная ежене-дельная копия и шесть ежедневных инкрементных сеансов. Если требуется файл, отвечающий определенной копии, для его извлечения необходимо вначале правильно позиционировать ленту. Для это предназначена утилита mt (magnetic tape - магнитная лента).

После того, как кассета с лентой вставляется в привод, она автоматически пере-матывается к началу. Для перемотки, например, к третьему сеансу используется опция fsf (fast forward - быстрая перемотка вперед):

mt -f /dev/nrsaO fsf 2

Параметр fsf 2 указывает программе mt перемотать ленту на два сеанса вперед, т.е. к началу третьего. Для перехода ко второму сеансу следует вновь перемотать ленту к началу (командой mt) и воспользоваться опцией fsf:

mt -f /dev/nrsaO rewind mt -f /dev/nrsaO fsf 1

С командами dump и restore связано гораздо больше особенностей, чем можно привести в этой книге. Они включают в себя: использование опции -s команды restore в неинтерактивном режиме для перехода к определенному сеансу копирования, дополнительные возможности утилиты mt, работа с несколькими лентами, удаленные устройства резервного копирования и многое другое. Хорошее руководство для начинающих, где рассказано о dump и restore, находится по адресу http:// www.nethamilton.net/dump.html. Кроме того, обязательно ознакомьтесь со справочными руководствами команд dump, restore и mt.

Зеркальные сервера

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

Добавив немного денег к той сумме, которая требуется для установки полноцен ной системы резервного копирования, можно создать зеркальный сервер - еще одну FreeBSD-машину, чьей единственной задачей будет ежедневная синхронизация фай-лов с основным сервером. Если с последним что-либо случиться, его можно будет мгновенно заменить зеркальным сервером. Для этого применяется уже известная нам утилита CVSup.

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

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

Предположим, что требуется создать зеркальные копии четырех каталогов: /home, usr/local/www, /var/mail и /etc. В принципе, необходимо дублировать больше дан-ных, но для примера этого будет вполне достаточно. Вначале необходимо настроить основной каталог, указывающий демону cvsupd (который устанавливается в каталог /usr/local/sbin как часть порта или пакета cvsup), какие данные пересылать клиен-там, т.е. зеркальной машине.

Обладая полномочиями root, введите следующие команды:

# cd /usr/local/etc

# mkdir -p cvsup/sup

# cd cvsup/sup

# mkdir home www mail etc

Затем в каждом из четырех новых подкаталогов необходимо создать два файла:.cvs и releases. Эти файлы описывают "набор" для сервера cvsupd и включают егообслуживание. В подкаталоге home необходимо создать файл home.cvs со следующимсодержимым:

upgrade home rsymlink *

В файле releases разместите следующее:

home list=home.cvs prefix=/

Те же действия нужно проделать для остальных подкаталогов, изменяя лишь имя файла .cvs и соответствующую ссылку на него. После этого необходимо запустить сервер cvsupd:

# cvsupd -b /usr/local/etc/cvsup -С 1 -1 /dev/stdout

Когда действия на основном сервере выполнены, переходим к зеркальной машине.

В каталоге /etc нужно создать файл mirror-supfile (или с любым другим именем). Его содержимое приведено на листинге 20.2, где serverl.hostname.com соответствует имени хоста основного сервера.

Листинг 20.2 Пример конфигурационного файла CVSup (mirror-supfile)

*default host=serverl.hostname.com *default delete use-rel-suffix *default compress *default preserve

*default base=/usr

*default release=home

home

*default base=/usr/local *default release=www

www

*default base=/var

*default release=mail

mail

*default base=/usr *default release=etc

etc

Обратите внимание на последнюю запись: размещение зеркального каталога /etc происходит не в /etc, а в /usr/etc. Причины очевидны! Это лишний раз демонстри-рует, какой гибкостью обладает CVSup при копировании набора каталогов в опреде-ленную точку файловой системы на зеркальном сервере.

После создания файла mirror-supfile все готово для первого сеанса. Для запуска процесса CVSup используется команда:

# cvsup -L 2 /etc/mirror-supfile

На экране появится обширный вывод, указывающий, какие файлы пересылаются и в каком режиме. Чтобы остановить сеанс можно воспользоваться комбинацией клавиш Ctrl+C. При этом CVSup корректно закончит работу и при следующем запуске начнет оттуда, где ее работа была прервана. Очевидно, что первый процесс пере-сылки будет длинным, ведь ему требуется полностью передать все сохраняемые дан-ные с одного сервера на другой. Однако все последующие процессы будут быстрыми и эффективными.

Когда в каталог /usr/etc будут перенесены файлы с основного сервера, из этого каталога можно скопировать файл master.passwd и с помощью команды pwd_mkdb синхронизовать пользователей (как было показано выше в разделе "Переход От Linux"). Если в системе имеется достаточно много пользователей или часто добавля-ются новые, подобную операцию можно производить автоматически. CVSup пропус-кает те файлы, для которых совпадает контрольная сумма и права владения. Если на основном сервере и зеркальной машине присутствуют разные учетные записи пользо-вателей, информация о правах владения файлов может не совпасть! Если владельцем какого-то файла является некоторый пользователь, который отсутствует в базе дан-ных второй системы, CVSup будет проводить копирование этого файла всякий раз при запуске процесса зеркалирования. Поэтому синхронизации баз данных пользо-вателей позволяет ускорить процесс CVSup от 4-5 часов до 15 минут,

После того как процесс синхронизации серверов начнет выполняться гладко, его можно добавить в сценарий /etc/periodic/daily или файл crontab пользователя root. Подробный вывод процесса будет высылаться по электронной почте. Чтобы сокра-тить его, нужно воспользоваться опцией -L.

На серверной стороне можно создать большее число наборов. Для этого достаточ-но создать требуемые каталоги внутри иерархии /usr/local/etc/cvsup/sup и добавить их в файл mirror-supfile. Процесс cvsupd перезапускать не нужно - он обработает новые наборы каталогов автоматически.

Важно помнить, что создание зеркальных серверов отнюдь не является полной заменой инкрементного резервного копирования. Это решение, подходящее для тех администраторов, кому не нужен аудит истории, контроль версий или

внешние ре-зервные архивы. Проще говоря, это не лучшее решение там, где FreeBSD использу-ется как корпоративный

сервер. Зеркалирование обеспечивает быстрое и простое решение на случай катастрофического сбоя системы. В серьезном

бизнесе, к сожа-лению, не обойтись без резервных копий на ленточных носителях.

Обновлено: 12.03.2015