2 заметки с тегом

FreeBSD

Заметки о православной ОС.

FreeBSD Jails 101: краткое руководство по поднятию первой клетки

Дисклеймер: если у вас машина с FreeBSD стоит за отдельным роутером, который раздаёт IP-адреса, является маршрутизатором и всё такое — вам сюда. Я же описываю случай, когда сама машина с FreeBSD является роутером для клеток.


Собственно, условия разворачивания такие:

  • Хост является маршрутизатором и провайдером NAT-а для клеток. Внешний роутер отсутствует.
  • Клетки являются автономными и не имеют общих файловых систем. Это спорное решение для некоторых, и каждая клетка-сервис будет занимать 500 мегабайт на жёстком диске минимум, но при этом каждая клетка обновляется автономно. В данной установке принцип «понимать, что обновляешь» важнее автоматизации обновлений.
  • Хост установлен на root с ZFS. Староверы с U-word FS идут в хэндбук.
  • Всё происходит на FreeBSD 11.2-RELEASE.

Для начала добавляем в /etc/rc.conf следующие данные:

gateway_enable="YES"
cloned_interfaces="tap0"
ifconfig_tap0="inet 192.168.99.1 netmask 255.255.255.0"
jail_enable="YES"

Первая строка включает маршрутизацию на хосте, вторая добавляет колонизуемый интерфейс tap0, третья задаёт этому интерфейсу IP-адрес и маску подсети, ну а последняя включает сервис клеток.

Теперь создаём ZFS-датасет, в котором будут лежать все клетки (допустим, /usr/jails/):

zfs create -o compression=lz4 -o mountpoint=/usr/jails zroot/jails

Далее — создаём ZFS-датасет, в котором будет храниться наша шаблонная клетка. Таких шаблонных клеток можно создать несколько, в зависимости от необходимых задач. Внимание, если вы ещё не в курсе — клетки работают исключительно с FreeBSD!

zfs create -o compression=lz4 -o mountpoint=/usr/jails/11-2-amd64 zroot/jails/11-2-amd64

Здесь 11-2-amd64 — имя клетки. Оно может быть любым, в зависимости от ваших предпочтений. Здесь — имя по версии и архитектуре FreeBSD внутри шаблонной клетки.

Теперь можно скачать базовую установку для FreeBSD и распаковать её (поддержку lib32 и сборки из портов мы оставим за пределами данного руководства):

cd /usr/jails
fetch https://mirror.yandex.ru/freebsd/releases/amd64/11.2-RELEASE/base.txz
tar -xf base.txz -C /usr/jails/11-2-amd64

Следующий шаг — создание конфигурационного файла клеток /etc/jail.conf. Он достаточно стандартен:

exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;
path = "/usr/jails/$name";
interface = "tap0";
allow.raw_sockets = 1;

# Шаблонная клетка. После настройки этот блок можно закомментировать.
11-2-amd64 {
    host.hostname = "template";
    ip4.addr = "tap0|192.168.99.250/24";
    allow.chflags = 1;
    allow.socket_af = 1;
}

Вверху — общие параметры для всех клеток. Они достаточно стандартны. Стоит обратить внимание на allow.raw_sockets = 1 — без этой опции ping, traceroute и половина прочих сетевых утилит работать не будет.

Далее идёт секция с индивидуальной настройкой нашей шаблонной клетки:

  • в первой строке задаётся хостнейм
  • во второй — адрес на интерфейсе tap0
  • в третьей — разрешается suid-бит для файлов внутри клетки (по умолчанию это запрещено, разрешать после настройки шаблона для других клеток необязательно)
  • в четвёртой — разрешаются любые сокеты для любых протоков (тоже запрещено по умолчанию, тоже после настройки скорее всего нафиг не будет нужно)

Если хочется изучить побольше опций, man jail.conf поможет (на английском языке).

Создаём клетку:

jail -c 11-2-amd64

Клетка запущена и готова к настройке. В процессе выполнения этой команды возможна ругань на «missing hostname»: игнорируем смело, в клетке всё будет нормально. Теперь мы можем войти в клетку:

jexec 11-2-amd64 sh

Единственное, что надо сделать на этом этапе — поднять ssh внутри клетки, что делается командой:

sshd_enable="YES"

По умолчанию рут-логин по ssh выключен. Или включите его, или создайте пользователя для входа.

Следующим шагом будет включение NAT для клеток. Воспользуемся PF для этого. Включаем его в rc.conf:

pf_enable="YES"
pf_rules="/etc/pf.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pf.log"

Перед запуском напишем правила маршрутизации. Для простой конфигурации достаточно этого варианта:

ext_if="re0"
jails_if="tap0"
jails_nr="{192.168.99.0/24}"

nat on $ext_if from $jails_nr to any -> ($ext_if)

О том, как более-менее безопасно настроить PF, я расскажу в другой заметке. Перед включением файрвола обязательно выполните команду pfctl -vnf /etc/pf.conf и посмотрите её результат! После удовлетворения результатом выполняйте service pf start: в этот момент вас может выкинуть из SSH-сессии, это нормально.

После запуска файрвола можно или перезагрузиться, или сделать service jail restart 11-2-amd64, и после этого зайти на свою шаблонную клетку по SSH. Для того, чтобы увидеть, какой IP-адрес и хостнейм у каждой из запущенных в системе клеток сейчас есть, существует команда jls.

После настройки шаблонной клетки выключите (закомментируйте) её, перезагрузитесь, а затем выполните следующие магические пассажи:

# О ZFS, ты так хорош…
# создаём датасет для новой клетки, допустим, это будет storage
zfs create -o compression=lz4 -o mountpoint=/usr/jails/storage zroot/jails/storage
# Копируем шаблонную клетку в новую клетку.
zfs send zroot/jails/11-2-amd64 | zfs recv -F zroot/jails/storage

После копирования ФС создаём в файле конфигурации /etc/jail.conf секцию для новой клетки:

storage {
    host.hostname = "storage";
    ip4.addr = "tap0|192.168.99.25/24";
}

Командой service jail start storage теперь можно поднять новую клетку для настройки и установки своих сервисов.

По умолчанию при перезагрузке все клетки запускаются последовательно согласно порядку в /etc/jail.conf. Для того, чтобы это изменить, можно добавить в /etc/rc.conf следующую запись:

jail_list="mysql storage"

После чего все клетки, которые не указаны в этом списке, запускаться не будут, а все клетки в списке будут запускаться согласно порядку в нём: в данном случае первым запустится MySQL, а потом — storage.

24 августа   FreeBSD   Инструкции

FreeBSD

Меня немного (чуть-чуть дофига) раздражает зоопарк линуксов. Раньше я его избегал с помощью Debian Stable, теперь пробую новый путь — ПравославнуюЪ ФряхуЪ.

Собственно, вот тут Станислав Никитин отлично описал, почему хороша или плоха FreeBSD. Я же прокомментирую и дополню его аргументацию:

Нормальный ZFS. Реально, работает лучше и быстрее, чем ZoL. А без ZFS я свою серверную жизнь уже не смыслю, потому что ZFS позволяет офигенно удобно делать датасеты под приложения со своими настройками, выбирать сжатие (например, для бинарных данных офигенно подходит gzip, а не lz4), и тому подобное.

Да. Ради ZFS вообще можно простить очень многое, уж больно хороша эта ФС. Apple пытается сделать что-то подобное с APFS, но пока что за пределами macOS на компьютерах данная ФС недоступна, и о её применимости на серверах говорить нечего.

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

С документацией есть ещё один приятный момент: срок её устаревания гораздо больше. Я смог настроить pf по мануалу на русском языке 2010 года выпуска, к примеру. Документация к линукса устаревает ежедневно с новым пердежём Леннарта нашего Поцтеринга (при всём уважении к systemd).

Клетки (jails). Чуть сложнее в настройке, чем LXC, но заметно легче по ресурсам.

Я вот вообще не осилил LXC. А клетки вполне себе осилябельны, что по мне — весьма неплохо.

Отсутствие systemd. Да, в каких-то случаях он удобен, но вот когда тебе просто надо развернуть один маленький сервис, systemd может как облегчить жизнь, так и усложнить (например, чтение логов).

Я бы сказал не так. Проблема линуксов не в systemd. Проблема в том, что в каждом дистрибутиве он, сцуко, разный, с разным набором костылей от дистропроизводителя, и непонятно, что с этим делать. По сути и по факту systemd провалил задачу стандартизации управления Linux-машинами на разных дистрибутивах.

Обычные текстовые логи. Серьезно, грепать куда удобнее и быстрее, чем читать выхлоп journalctl :).

Вкусовщина, но допустим, что так.

Станислав выделяет несколько минусов, которые я считаю плюсами:

BSDшные версии утилит, которые зачастую несовместимы с GNUтыми ни синтаксисом, ни форматом входных данных.

ЭТО ЖЕ ОФИГЕННО! Во всяком случае, когда твоя основная машина работает на macOS, где все консольные утилиты по умолчанию BSD-шные, а шелл у меня и так испокон веков zsh, так что я вижу только преимущества в том, что на сервере подобный десктопному сет консольных утилит.

Непривычная настройка сети, маршрутизации. Я привык использовать ip route, а тут все через route с виндоподобным синтаксисом.

Смотрим предыдущий пункт. В macOS route работает точно так же.

Клетки довольно сильно отличаются по схеме работы от привычных LXC контейнеров.

…или «LXC-контейнеры сложнее, чем клетки». Нет, серьёзно, LXC я не осилил ни в каком виде.

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

Just use PF! Я вот iptables не осилил толком, каюсь, а с PF за два дня неспешного тыканья мы со Стасом разобрались. Возможно, если основная цель конкретной машины — роутинг, ей стоит ставить OpenBSD, ибо там PF свежее, но для простой (псевдо)домашней тачки это не принципиально.

В моих дальнейших планах — постройка Linux-free окружения как минимум дома (включая пресловутый «роутер на фряхе»). Насколько это получится и с чем я столкнусь в будущем — покажет время.

23 августа   FreeBSD   Оффтоп