Печать

Осторожно! Многобукафф!

Это вторая часть длинного повествования об одном исследовании, цели которого:

1. Автоматизация процесса установки и переустановки.

2. Определение оптимального разбиения диска.

3. Определение оптимальной процедуры установки.

Здесь описывается эксперимент по объему занимаемого места.

В нашем анализе процесса установки мы опустим второстепенные пункты типа выбора кодовой страницы и часового пояса. Первый интересный вопрос — выбор способа загрузки LiveCD.

FreeBSD1

Install. При выборе этого пункта попадаем в интерактивный установщик, который проведет нас по всем пунктам.

Shell. Получаем шелл в LiveCD от имени root в монопольном режиме и домашним каталогом в корне диска. При выходе из шелла (команда exit) попадаем опять в этот экран. Таким образом, мы можем что-то поделать с рутовыми правами, потом вернуться и начать сначала.

LiveCD. Выход из установщика и вход в LiveCD и многопользовательский режим. Пользователь root без пароля. Причем можно вызвать установщик в любой момент командой bsdinstall.

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

Рассмотрим установку новой машины с помощью менеджера bsdinstall. Все пункты будем проходить по умолчанию, кроме тех, о которых будем говорить. Одна из прелестей FreeBSD (как и всех unix-like систем) — возможность донастроить систему в любой момент простым редактированием файлов и командами из терминала. Самое главное — получить работоспособную систему на выходе. Итак, выбираем install. При установке можно указать либо полное имя, либо короткое, по большому счету это не имеет большого значения. Например, при запуске веб-сервера в лог может записываться ошибка, но он все равно будет работать прикоротком имени машины. Некоторые сервисы также могут при запуске ругаться на недостойное имя, или запускаться с третьего раза, но в итоге все включится и будет работать, а нам только этого и надо. Однако, лучше, конечно, указать полное имя.

 FreeBSD2

Далее выберем дополнительные компоненты:

FreeBSD3
Я выбрал поддержку 32-битных приложений, порты (считаю более правильным компилировать приложения прямо в системе) и исходные коды системы (так как неминуемо буду компилировать ядро). Но последние пункты можно и не отмечать, а при хорошем интернете нет никакой проблемы скачать их в любой момент, причем в уже обновленном виде. Я же считаю, что пусть лучше будут, вдруг в нужный момент не будет интернета.

И вот оно — разбиение диска:

FreeBSD4
Первый пункт — автоматическое разбиение в файловую систему ufs с помощью мастера. Второй — ручная разметка диска также с помощью мастера, третий — выход в командную строку и разбиение с помощью утилит и последний — автоматическое разбиение в zfs файловой системе также с помощью мастера. Считаю необходимым здесь остановиться подробнее, поскольку обсуждение способов разметки и файловых систем вызывает много вопросов, часто является предметом обсуждений, иногда даже вызывает холивары. Итак, как разбить диск, сколько и каких разделов надо создать, какие использовать утилиты для разбиения диска, какие использовать файловые системы при установке FreeBSD? Сразу отвечу: «Не знаю.» Однако, могу немного помочь Вам с выбором. Мы выделили четыре вопроса, ответ на первый Вы получите, разобравшись с тремя последними.

А. Какую выбрать файловую систему? Выделим двух кандидатов из всего многообразия: ufs и zfs. Мы не большие специалисты в файловых системах, поэтому нам хватит и этих. Технически zfs является более продвинутой (мы преднамеренно избегаем специальных терминов и научных объяснений, которых на просторах интерета предостаточно), современной, обеспечивает более надежное хранение информации, защиту от сбоев, возможность изменять размер раздела «на лету», на работающей системе. Сплошные плюсы, только один минус — она новее, ufs «проверена веками», отказоустойчивость подтверждена практикой. На мой взгляд, zfs как минимум не хуже ufs, при этом обладает массой фишечек. При этом чуть более требовательна к ресурсам. Поэтому здесь мы рассмотрим обе системы. Поэтому я бы рекомендовал для чистой новой системы использовать уже zfs.

Б.Какие использовать утилиты для разбиения диска? Здесь мы рассмотрим способы разбиения диска. Начнем с самого простого: авто ufs.

FreeBSD5
Вы хотите использовать весь диск или только какой-то его раздел? Если мы выберем весь диск, соответственно весь диск будет переформатирован и на нем больше ничего не останется, кроме FreeBSD. Это самый простой вариант. Если мы его выберем, установка пойдет дальше с разбиением по умолчанию: раздел загрузки 512 кб, раздел подкачки в два размера ОЗУ, и остальное под систему. При выборе пункта Partition мы попадем в мастер, который поможет нам поделить диск, с уже предложенным разбиением по умолчанию.

FreeBSD6
Мы можем его изменить по своему выбору и только потом нажмем Finish, запустив установку. Напомню, что количество и размер разделов — это следующий вопрос, поэтому вернемся к началу разбиения диска и посмотрим Manual.

FreeBSD7
Опаньки! Это тот же мастер, что и на предыдущем рисунке, только без предложенного разбиения по умолчанию. Зачем это? Нажмем Create.

 FreeBSD8

Попадаем в выбор таблицы разделов. Если в предыдущем, автоматическом пункте удалить все разбиение мы также сможем попасть в выбор таблицы. В общем, это сделано для удобства. Данный пункт нужен, если Вам зачем-то надо на диске с FreeBSD иметь еще и разделы, совместимые с другими либо старыми BSD (BSD Labels) операционными системами. Очень редкий случай, который выходит за рамки нашего рассмотрения. Наш путь — GPT.

При выборе рункта Shell мы попадем в командную строку, где с помощью соответствующих утилит (для GPT – gpart) сможем руками с точностью «до байта» (до 512, а лучше 4К) нарезать диск, а потом вернуться в bsdinstall продолжить установку.

И последний пункт — auto zfs.

FreeBSD9
Вот здесь мы видим отличия zfs от ufs. Начнем с нижних пунктов. Можем установить размер раздела подкачки (Swap size), можем его зеркалировать, зашифровать. Далее можем выбрать GPT или MBR схему. MBR на zfs – это славное извращение, но наш путь — GPT. Если хотим, можем зашифровать диски (Encrypt Disks – Yes). Обратите внимание на пункт Force 4K Sectors. Дело в том, что современные диски, в основном, имеют сектора в 4K, но при этом их контроллеры сигнализируют системе, что размер сектора 512б, обрабатывая при этом разницу в размерах аппаратно, что вызывает снижение быстродействия. Здесь мы можем предупредить этот «развод» контроллера, увеличив быстродействие. Disk Info покажет нам диски, установленные в системе, если мы там не нашли все диски (может, подключали «на горячую») можно сделать Rescan Devices, чтобы обновить список устройств. Теперь надо выбрать тип пула, привязать диски. Нажимаем Pool Type.

FreeBSD10
Выбираем тип пула, затем, диски, включаемые в пул:

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

FreeBSD12
После обозрения результата мы нажимаем Install и после проверки на вменяемость начинается установка. Никаких разделов здесь мы нарезать не можем, в отличие от ufs.

Итак, после разбиения диска установщик bdsinstall просто разворачивает выбранные нами архивы, а также BASE.TXZ и KERNEL.TXZ на созданную нами файловую систему. После установки выясняется, что установщик сам нарезал диск на равные части по своему усмотрению, причем каждая часть равна по размеру всему диску.

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

Вот теперь мы готовы к третьему вопросу.

В. Сколько и каких разделов надо создать? И здесь Вам придется решать самим. Я лишь немного попытаюсь прояснить ситуацию.

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

1) каталог /var, так как там лежат базы данных (/var/db) и логи (/var/log);

2) /usr/home – домашние каталоги пользователей;

3) /tmp – временные файлы;

4) /usr/ports – порты, там же происходит компиляция приложений;

5) /usr/src – исходные тексты системы, там же и компилируются;

6) swap – раздел под виртуальную память

7) /boot – загрузочный раздел в 512кб

Также можно отделить любой каталог, если Вы считаете, что приложения, установленные в Вашей системе могут вызвать неконтролируемый рост данных в нем. Торрент клиенты, расшаренные диски, доступные пользователям по сети (файлопомойки) и так далее. При этом необходимо помнить, что размеры разделов потом изменить будет скорее всего нельзя. Можно увеличить раздел за счет свободного места на диске, расположенного рядом с ним, но в реальности такого не бывает. Обычно приходится добавлять диск, нарезать на нем новые разделы, переносить туда данные из старых и перемонтировать новые вместо старых. Другими словами, это приличные проблемы, а в это время система неработоспособна. Можно потерпеть, если проблема на домашнем NASе, но не на WEB-сервере, например. Поэтому важно предусмотреть возможный рост данных в разделах и разделить диск с учетом всех приложений и ролей Вашего сервера. Либо не заморачиваться и оставить один раздел под всю систему (вернее три: boot и swap надо выделить непременно), надеясь, что никто не забьет весь диск. Здесь мы видим одно из главных преимуществ zfs: мы можем добавить диск (диски) и одной командой включить их в пул. Если железо позволяет «горячее» подключение дисков, тогда эту операцию можно будет провести, не прекращая работу сервера.

Для определения реальных потребностей в свободном месте в файловых системах проведем эксперимент. Две машины (я их заведу в виртуалке) с одинаковыми дисками по 20 Gb, одну нарежем в GPT вот так:

FreeBSD15
Другая будет на zfs, нарезана по умолчанию, как на предыдущей картинке.

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

1. Устанавливаем порты (при установке на хорошем интернете нет смысла разворачивать порты и исходники из дистрибутива, актуальные версии можно поставить после).

portsnap fetch extract.

 FreeBSD16

FreeBSD17
Примечание: На zfs обнаружился косяк, поиск в инете дал результаты, косяк не у одного меня. При такой установке как минимум иногда не создаются линки ada0p1, ada0p2, ada0p3 в /dev. Критично отсутствие swap раздела. В top напротив swap пусто. Возникают коллизии разные. В /boot/loader.conf по умолчанию отключено gptid, поэтому работает diskid, а монтирование в конфигеуказано по gptid. Меняем в /boot/loader.conf kern.geom.label.gptid.enable="0"

на

kern.geom.label.disk_ident.enable="0"

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

2.Устанавливаем portmaster.

cd /usr/ports/ports-mgmt/portmaster

make install clean

echo 'WITH_PKGNG=yes' >> /etc/make.conf

3. Устанавливаем mc:

cd /usr/ports/misc/mc

make install clean

во всех конфигах отказываемся от docs, examples, ipv6, x11.

FreeBSD18

FreeBSD19
Примечание: размеры немного разнятся, возможно, что-то неодинаково указал в конфигах.

4. Получаем исходники (берем ветку stable, чтобы получился upgrade, устанавливали мы 10.1 Release):

svnlite co svn://svn.freebsd.org/base/stable/10 /usr/src

Скомпилируем ядро с прежними параметрами, просто добавим поддержку pf. Нам важно определить, как заполняется файловая система при различных операциях. И как при этом ведут себя разные типы систем: zfs и ufs.

Поэтому суть этой компиляции в самой компиляции.

В ядро GENERIC добавили

device pf

device pflog

device pfsync

options ALTQ

options ALTQ_CBQ

options ALTQ_RED

options ALTQ_RIO

options ALTQ_HFSC

options ALTQ_PRIQ

options ALTQ_NOPCC

Последовательно выполняем.

make buildworld

make buildkernel

make installkernel

reboot

make installworld

reboot

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

После buildkernel

 FreeBSD20

 FreeBSD21

На buildkernel машина с ufs запнулась, так как кончилось место в /usr. 3Гб для него мало, если мы хотим выполнять сборки. Только /usr/obj вырастет больше. Поэтому мы добавим диск и раздел в 6Гб смонтируем в /usr/obj.

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

 FreeBSD22

 FreeBSD23

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

 FreeBSD24

FreeBSD25
Итак, мы провели апгрейд с 10.1 release на 10.2 prerelease.

Устанавливаем mysql, apache, php.

portsnap fetch update

cd /usr/ports/databases/mysql-56-server

make install clean

echo “mysql_enable='yes'” >> /etc/rc.conf

cp /usr/local/share/mysql/my-default.cnf /etc/my.cnf

service mysql-server start

/usr/local/bin/mysqladmin -u root password 'mypassword'

mysql -uroot -pmypassword -e “DROP DATABASE test”

cd /usr/ports/www/apache24

make install clean

echo “apache24_enable='yes'” >> /etc/rc.conf

service apache24 start

cd /usr/ports/lang/php56

make install clean

cd /usr/ports/lang/php56-extensions

make install clean

 FreeBSD26

 FreeBSD27

Каталог /usr/ports в нашем случае занимает от 1,2 Гб до 1,9 Гб (где-то по-разному поставил крестики при компиляции, в результате были установлены разные наборы ПО), однако в них можно удалить содержимое каталога /usr/ports/disfiles. В любом случае, 6 Гб должно хватить.

Каталог /usr/obj после компиляции можно вычистить, отметим только, что для компиляции нам понадобилось до 4 Гб места.

После установки серверов имеем совсем немного в /tmp, объем в /var увеличился до 295 метров, а выделенные по умолчанию в zfs подкаталоги var практически пустые, но они будут заполняться в процессе работы серверов, логи и почтовые могут вырастать до гигабайтов, с этим придется бороться отдельно, подкаталог /var/db будет расти в соответствии с наполнением баз данных, его массивность будет зависеть от размера Ваших баз.

При расчете места под web-сервер надо иметь в виду:

1. Планируемое места по собственно www, по умолчанию это /usr/local/www. Можно ему даже создать отдельную файловую систему, либо отрезать под каждый хост по файловой системе. Обычно здесь немного данных, если только у Вас не медиа-портал. Средний сайт занимает до 200-300 Мб, но размер сильно зависит от используемого ПО, организации сайта и контента.

2. Планируемый размер баз данных. Для обычных веб-серверов также используется небольшой объем, но лучше предусмотреть пару Гб, как минимум.

3. Логи растут. Их надо периодически архивировать и убирать с боевых файловых систем, чтоб не засорять место. Большие логи тормозят работу сервера, оставьте 1Гб и разработайте систему периодической архивации и очистки каталога.

4. Папки /tmp практически не используются, под них оставьте 1Гб, вдруг какое-то ПО захочет там что-то поворочать.

5. Root может иметь 2 Гб пространства, этого ему хватит, если Вы отделили все растущие каталоги и ПО. /usr удовлетворится двумя Гб.

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

При проектировании системы типа NAS (домашний сервер, файлопомойка и т. п.):

1. Размер root тот же.

2. При установке ПО внимательно настраивайте его. Например, transmission при запуске проверяет доступность каталогов из конфигурации. Если по какой-то причине отведенная под торренты файловая система оказалась недоступна, он начнет использовать свой каталог в /usr/local, куда закачает все торренты, заняв чужое место.

3. Под /usr отведите места побольше, с расчетом на установку какого-то незапланированного ПО.

4. Непременно все файловые ресурсы (место под торренты, файлообменники, файлопомойки) должны укладываться на отдельные файловые системы.

5. Как правило, ПО на NAS также пишет логи и использует базы данных. Можно отделить их от root, оставив по 1-2 Гб.

При установке рабочей станции (с графическим интерфейсом) отведите места в корне и /usr побольше, так как устанавливается огромное количество ПО и библиотек. Объем в /usr/ports превысил 6Гб. После крупных компиляций желательно делать make clean в /usr/ports, чтобы вычистить все остатки.Само дерево портов на момент написания статьи занимало около 1 Гб дискового пространства.

Теперь немного подробнее про zfs. В рассматриваемом вопросе zfs обладает ценным преимуществом. Она динамически выделяет место под данные по необходимости. Чтобы ограничить непредсказуемый рост файловой системы в пуле используются квоты, которые также можно изменять, не прерывая работы системы. Единственное ограничение: нельзя установить квоту меньше, чем уже занимаемое место.

Итак для нашей системы

zfs set quota=500M zroot/tmp

zfs set quota=3G zroot/usr/ports

zfs set quota=1G zroot/var/log

zfs set quota=1G zroot/var/mail

zfs set quota=500M zroot/var/tmp

 FreeBSD28

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