Введение
На написание данной публикации меня подтолкнул тот факт, что в сети интернет крайне мало информации по администрированию Jail в FreBSD. Можно конечно найти отличные публикации на эту тему, но они, в основном, по большей части были написаны много лет назад, и не затрагивают новые возможности Jail и самой операционной системы FreeBSD.
Публикацию разделю на две части. В первой части пойдёт речь о подготовки и настройки FreeBSD, а во второй части пойдёт речь непосредственно о создании Jail.
Часть 1. Подготовка и настройка FreeBSD.
Для того что-бы всё, что здесь написано корректно заработало, необходимо использовать FreeBSD версии 11.1, так-как начиная с данной версии в системе включена поддержка ограничения дискового ввода/вывода и т.п. Если в этом нет необходимости, тогда подойдёт версия 10.X.
Добавим в rc.conf несколько параметров:
sysrc jail_enable="YES"
sysrc rctl_enable="YES"
sysrc rctl_rules="/etc/rctl.conf"
sysrc zfs_enable="YES"
sysrc ifconfig_em0_alias="192.168.1.105/24"
Первая строка указывает Jail автоматически запускаться с системой, вторая строка указывает включение ограничений для Jail, третья строка указывает на файл правил с ограничениями. В четвёртой строке активируется возможность использовать файловую систему ZFS(все Jail будут сохранены на разделах ZFS), этот параметр необходим если система использует родную файловую систему UFS. Запустить ZFS можно командой:
/etc/rc.d/zfs start
Пятая строка создаёт алиас для Jail, если необходимо несколько Jail, то в том случаи добавьте необходимое количество ip алиасов(так-как я использую VMware ESXI название сетевой карты у меня em0, Вам необходимо использовать название своей карты).
В FreeBSD по умолчанию ядро собрано с отключённой возможность ограничивать ресурсы, но к счастью данное ограничение легко устранить, достаточно добавить одну строку в файл loader.conf, командой:
echo 'kern.racct.enable="1"' >> /boot/loader.conf
Изменения вступят в силу после перезагрузки системы. Так-же необходимо включить поддержку протокола iscsi, так-как резервное копирование будет осуществляться именно через этот протокол, добавить поддержку можно следующей командой:
echo 'iscsi_initiator_load="YES"' >> /boot/loader.conf
Изменения вступят в силу после перезагрузки системы.
Последнее, что необходимо настроить в системе(если не считать самого Jail) — firewall на ipfw. Следующая команда создаст файл с правилами ipfw:
ee /etc/firewall.sc
В данный файл необходимо внести следующие строки:
ipfw -q -f flush
c="ipfw -q add "
$c 00105 allow tcp from any to 192.168.1.105 80 setup keep-state
$c 00110 allow tcp from any to me 22 setup keep-state
$c 00140 allow tcp from me to any 443,80,21,53,3260 setup keep-state
$c 00143 allow icmp from me to any keep-state
$c 00144 allow udp from me to any 53 keep-state
$c 40533 deny all from any to any frag
$c 40534 deny all from any to any established
$c 40535 deny all from any to any
Данные правила разрешат всем Jail осуществлять исходящие подключения через порты 443, 80, 21, 53, 3260(iscsi), а так-же будет возможность подключаться ко всем Jail через SSH. Строка:
$c 00105 allow tcp from any to 192.168.1.105 80 setup keep-state
отвечает зак подключение к будущему Jail, а в частности для вэб сервера, если необходимо добавить другие порты, то укажите их через запятую(80,21,443,68 и т.д). Если необходимо подключение udp, то необходимо скопировать строку и заменить tcp на udp, и изменить номер строки, а также убрать setup, так-как протокол udp не имеет флага SYN:
$c 00105 allow tcp from any to 192.168.1.105 80,21,22,443 setup keep-state
$c 00106 allow udp from any to 192.168.1.105 53 keep-state
Выполните последовательно команды:
sysrc firewall_enable="YES"
sysrc firewall_script="/etc/firewall.sc"
service ipfw start
После выполнения данных команд, скорее всего, необходимо переподключиться по SSH. На этом начальная настройка закончена, перейдём к настройки сервера iscsi target.
Настройка iscsi target
Для настройки необходим ещё один сервер в сети, или виртуальная машина(как в моём случаи). Для установки выполните команду(к слову это единственное, что необходимо установить, так-как всё остальное уже имеется в FreeBSD):
pkg install istgt-20150713
если установка не произошла, то скорее всего изменилось название версии, для поиска корректного имени введите:
pkg search istgt
После нажатия клавиши Enter pkg выдаст корректную версию. Добавит в rc.conf автозапуск:
sysrc istgt_enable="YES"
Настройка iscsi оказалась довольно простой, необходимо изменить всего несколько строк в файлах конфигурации. Файлы конфигурации находятся в папке /usr/local/etc/istgt. Первый «конфиг» который необходимо отредактировать — auth.conf, введите:
ee /usr/local/etc/istgt/auth.conf
В разделе [AuthGroup1] приведите строку Auth к виду:
Auth "user1" "password"
Имя пользователя и пароль введите которые Вам необходимы. На этом настройка auth.conf завершена. Настроим istgt.conf, введите:
ee /usr/local/etc/istgt/istgt.conf
В разделе [Global] измените параметр NodeBase на тот который Вам больше подходит, например:
NodeBase "iscsi_target"
Хотя этот параметр необязательно менять. В разделе [PortalGroup1] измените параметр Portal DA1 на ip адрес который используется у Вас на данном сервере, в моём случаи параметр будет выглядеть вот так:
Portal DA1 192.168.1.106:3260
В разделе [InitiatorGroup1] измените параметр Netmask, в моём случаи параметр выглядит так:
Netmask 192.168.1.0/24
Последний раздел который необходимо отредактировать — [LogicalUnit1], измените параметр TargetName на тот который Вам более подходит, у меня используется targ_disk1. В параметре LUN0 указывается жёсткий диск и его размер:
LUN0 Storage /dev/md0 10G
Здесь указан виртуальный жёсткий диск, если используете физический, то укажите его, а если желаете использовать виртуальный, то читаем дальше. Перейдите в каталог в котором желаете создать файл для виртуально жёсткого диска и выполните команду:
dd if=/dev/zero of=disk bs=1k count=10m
Параметр count отвечает за количество гигабайт, в данном случаю создастся файл размером 10 гигабайт, если укажите другое число, то в этом случаи необходимо изменить параметр LUN0 в istgt.conf. Данные процесс занимает относительно не много времени. После того как процесс завершиться, в текущей папке создастся фай disk, осталось только создать виртуальный жесткий диск командой:
mdconfig -a -t vnode -f disk
После выполнение данной команды отобразиться название виртуально диска (в моём случаи — md0), если название отличается, то так-же необходимо изменить параметр LUN0 в istgt.conf. Для того что-бы данный диск не пропал после перезагрузки, необходимо выполнить команду:
sysrc mdconfig_md0="-a -t vnode -f disk"
Либо укажите путь до файл:
sysrc mdconfig_md0="-a -t vnode -f /home/user/disk"
Остался один штрих — firewall. Как и на основной системе создайте файл:
ee /etc/firewall.sc
Добавьте строки:
ipfw -q -f flush
c="ipfw -q add "
$c 00110 allow tcp from any to me 22,3260 setup keep-state
$c 00140 allow tcp from me to any 443,80,21,53,3260 setup keep-state
$c 00143 allow icmp from me to any keep-state
$c 00144 allow udp from me to any 53 keep-state
$c 40533 deny all from any to any frag
$c 40534 deny all from any to any established
$c 40535 deny all from any to any
После того как сохраните изменения, введите:
sysrc firewall_enable="YES"
sysrc firewall_script="/etc/firewall.sc"
service ipfw start
На этом настройка сервера iscsi закончена, теперь приступим к настройки непосредственно Jail.
Часть 2. Настройка Jail
Начиная с версии FreeBSD 9 настройка Jail вынесена в отдельный файл — /etc/jail.conf. Давайте создам данный файл и внесём необходимые изменения, введите команду:
ee /etc/jail.conf
В данный файл необходимо внести следующие строки:
allow.raw_sockets = 1;
exec.clean;
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
mount.devfs;
allow.set_hostname = 1;
allow.sysvipc = 1;
jail1 {
host.hostname = "jail";
path = "/jails/1/";
interface = "em0";
ip4.addr = 192.168.1.105;
}
После того как сохраните изменения, можно приступать к сборке окружения Jail. Согласно данному файлу будет использоваться один Jail с именем jail1, если необходимо использовать дополнительный Jail, достаточно изменить вид файл следующим образом:
allow.raw_sockets = 1;
exec.clean;
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
mount.devfs;
allow.set_hostname = 1;
allow.sysvipc = 1;
jail1 {
host.hostname = "jail";
path = "/jails/1/";
interface = "em0";
ip4.addr = 192.168.1.105;
}
jail2 {
host.hostname = "jail";
path = "/jails/2/";
interface = "em0";
ip4.addr = 192.168.1.107;
}
В данной публикации будет рассмотрено создание одного Jail. Создадим каталог для будущего Jail командой:
mkdir -p /jails/1
Для создания окружения необходимы «исходники», проще всего установить их в процессе установки системы, или использовать subversion(довольно не приятный процесс). Для создания окружения перейдите в каталог /usr/src, командой:
cd /usr/src
Для создания окружения введите команду:
make -j4 world DESTDIR=/jails/1
Процесс довольно длительный, на моей системе установлен процессор Intel Core i5 3550, создание окружение заняло около часа. В команде создания окружения используется параметр -j4, число указывает на количество ядер у процессора, чем больше, тем быстрее. После того как окружение будет создано, необходимо добавить файлы конфигураций в jail командой:
make distribution DESTDIR=/jails/1
На этом создание окружения закончено. Введите команду:
/etc/rc.d/jail start
В вновь созданный Jail по ssh подключиться пока нету возможности, так-как ssh отключен. Для того что-бы зайти в jail выполните команду:
jexec jail1
Первое, что необходимо сделать — добавить DNS сервера, выполните:
ee /etc/resolv.conf
Добавьте в созданный файл строку:
nameserver 8.8.8.8
Осталось добавить учётную запись(внести её в группу wheel), создать пароль на root и запустить ssh, всё это можно проделать командами:
adduser
sysrc sshd_enable="YES"
service sshd start
passwd root
Могу порекомендовать установить midnight commander:
pkg install mc
Во время установки mc подтянутся многие распространённые зависимости, такие как python, perl. После выполнения данных манипуляций необходимо выйти из данного jail командой exit. Далее останавливает jail:
/etc/rc.d/jail stop
Представьте ситуацию когда необходимо создать 5-ть jail, такая задача займёт много времени, но к счастью можно создать архив с содержимым данного jail, а так-же сохранить все права для файлов. Поможет в данной ситуации архиватор tar. Перейдём в каталог с jail:
cd /jails/1
Выполним команду:
tar -zcvpf jail.tar *
После того как архив будет создан, его необходимо переместить в другой каталог(данный каталог будет удалён):
mv jail.tar /jail.tar
Удалить каталог /jails не удастся до тех пор пока со всех файлов не будет убран «флаг» «неизменяемости»:
chflags -R noschg /jails
rm -rf /jails/
Если что то не удалиться, то просто необходимо перезагрузить систему и выполнить команду rm -rf ещё раз. Приступим к созданию виртуального жёсткого диска, создадим файл для диска:
dd if=/dev/zero of=disk bs=1k count=10m
И непосредственно сам виртуальный диск:
mdconfig -a -t vnode -f disk
Добавим автоматическое создание диска:
sysrc mdconfig_md0="-a -t vnode -f disk"
Укажите название того диска который создался у Вас(если название отличается), а так-же путь к файлу для виртуального диска. Следующим шагом будет автоматическое подключение диска через iscsi. Для корректного подключению к диску необходимо создать файл конфигурации:
ee /etc/iscsi.conf
В данный файл внесите следующие изменения:
iscsi_disk{
authmethod=CHAP
chapIName=user1
chapSecret=password
initiatorname=nxl
TargetName=iscsi_target:targ_disk1
TargetAddress=192.168.1.106:3260,1
LoginTimeout=10
AuthTimeout=10
IdleTimeout=10
ConnFailTimeout=10
AbortTimeout=10
ResetTimeout=10
}
Если настройки в файле istgt.conf выставлены в соответствии с данной публикацией, то подключение произойдёт корректно. Единственный способ для автоматического подключения диска через iscsi я нашёл только способом размещения скрипта в rc.d. Создадим данный скрипт:
ee /etc/rc.d/iscsi.sc
Добавьте следующие строки:
iscontrol -c /etc/iscsi.conf -n iscsi_disk
zfs mount jails/1
/etc/rc.d/jail start
Нужно учесть то, что если Вы создали ещё один jail, то его необходимо внести в данный скрипт(zfs mount jails/2 например). Первая строка подключает диск через iscsi, вторая строка монтирует файловую систему(если локальный жесткий диск «отвалился»), третья строка запуская jail. Осталось только сделать файл исполняемым:
chmod +x /etc/rc.d/iscsi.sc
После выполнения данного скрипта, или перезагрузки системы удалённый жесткий диск будет доступен для манипуляций. В моём случаи имя диска da1, Вам же необходимо использовать то имя которое используется у Вас. Создадим zfs pool из этих двух дисков:
zpool create jails mirror md0 da1
zfs pool будет зеркальным, как нетрудно догадаться из команды.
Создадим раздел для jail:
zfs create jails/1
Назначим лимит на данный каталог в 5 гигабайт:
zfs set quota=5g jails/1
Скопируем архив с jail в каталог /jails/1 и перейдём в данный каталог:
cp /jail.tar /jails/1
cd /jails/1
Распакуем данный архив и удалим его:
tar -zxvpf jail.tar
rm jail.tar
Запустим jail:
/etc/rc.d/jail start
После данных манипуляций можно подключаться к jail по SSH, а так-же устанавливать необходимые роли для сервера. Осталось только настроить ограничения для Jail. Для того что-бы настроить rctl необходимо только добавить файл конфигурации:
ee /etc/rctl.conf
Добавьте в данный файл следующие строки:
jail:jail1:memoryuse:deny=1073741824
jail:jail1:readbps:throttle=4097152
jail:jail1:writebps:throttle=4097152
jail:jail1:pcpu:deny=50
1-я строка ограничит использование памяти в 1 гигабайт, 2-я и 3-я строки ограничат использование чтения и записи на диск в 4 мегабайта, 4-я строка ограничивает использование каждого ядра на 50 процентов. Это далеко не весь список ограничений, в списке источников укажу ссылку на сайт FreeBSD где это подробно описывается. После сохранения данного файла необходимо перезагрузить rctl:
service rctl restart
Ограничения вступят в силу буквально в течение нескольких секунд.
Дополнительно
Можно было бы на этом закончить, но может возникнуть ситуация такая, что выйдет из строя не жёсткий диск, а сам сервер(например сгорит). В таком случаи можно использовать диск который находится на удалённом сервере, но просто так его использовать не удастся, первым делом необходимо остановить службу istgt и включить zfs:
service istgt stop
sysrc zfs_enable="YES"
/etc/rc.d/zfs start
После этого необходимо ввести команду:
zpool import
После выполнения данной команды на экране отобразятся все возможные пулы которые можно импортировать, в данном случаи пул jails, а имя диска будет отображено md0. Для того что бы смонтировать данный пул необходимо выполнить команду:
zpool import -f jails jails
Обязательно укажите -f, в противном случат zpool будет ругаться, что данный пул принадлежит другому серверу. При необходимости так-же можно настроить jail на данном сервере используя данный пул, что в свою очередь сведёт простой к минимуму. Для того что бы опять можно было использовать данный диск для iscsi, необходимо отключить данный пул:
zpool export jails
А так-же запустить istgt:
service istgt start
На этом можно и закончить.
Список источников которые очень помогли в написании данной публикации:
Майкл Лука FreeBSD. Подробное руководство.
www.freebsd.org/cgi/man.cgi?query=rctl&sektion=8
www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/disks-adding.html
docs.oracle.com/cd/E19253-01/820-0836/gavwn/index.html
Комментарии (18)
robert_ayrapetyan
14.11.2017 06:41Неплохо было бы в самом начале статьи расписать что это такое и зачем вообще нужно, какие-то типовые случаи использования и т.п.
AbnormalHead
14.11.2017 09:13А чего их описывать? Контейнеры они и есть контейнеры.
robert_ayrapetyan
14.11.2017 10:01Как раз тут было бы интересно сравнить с существующими (докер), в чем преймущества?
Stanislavvv
14.11.2017 17:19Сравнивать надо не с докером, который больше инфраструктура, чем собственно контейнеры, а с lxc или openvz
tankistua
14.11.2017 09:36А чем обусловлена именно такая конструкция? Почему не проксмокс какой-нибудь?
mikevmk
14.11.2017 14:54Я предположу скромно, пока автор не ответил, это может быть потому, что FreeBSD jails значительно удобнее
Geo__L
14.11.2017 17:14При чем тут проксмокс вообще? При чем тут докер? Если и сравнивать то в разрезе Jail vs LXC
taurusbusy
14.11.2017 15:08ЕМНИП с версии 10.1 во FreeBSD уже есть «родной» iSCSI-target (CTL — CAM Target Layer), поэтому использование istgt от уважаемого Д.Аоямы совсем не очевидно и, паче чаяния, не обязательно.
OmManiPadmeHum
14.11.2017 17:13а я обычно создаю базовый snapshot
zfs snapshot ZFS/jails/.base11x64@template
и клонирую его под нужные проекты :)
zfs clone ZFS/jails/.base11x64@template ZFS/jails/project1
the_vitas
14.11.2017 17:13Начиная с версии FreeBSD 9 настройка Jail вынесена в отдельный файл — /etc/jail.conf.
Имея сервер на 9 и на 10 могу сказать, что в 9 версии jail настраивается в rc.conf, а вот в 10 я сразу и не понял от чего не стартанули клетки, полез читать маны оказалось вся настройка клеток вынесена в отдельный файл.
Draugdor
14.11.2017 17:13А почему не использовать ezjail? С ним намного проще и удобнее, там и общий базовый образ из коробки который обновляется одной командой.
arachnid
16.11.2017 21:30ezjail не понимает новые форматы описания клеток. но судя по всему это проблема и qjail-а тоже (за cbsd не скажу). есть баг с бинарным обновлением базовой клетки.
begemoth3663
14.11.2017 17:16можете не соглашаться.
но.
- режут глаз грамматические ошибки: "(как в моём случаи)", "Добавит в rc.conf автозапуск:", etc.
- вместо dd if=/dev/zero of=disk bs=1k count=10m
быстрее будет dd if=/dev/zero of=disk bs=1m count=10k
- блок 1024 мелковат для современных устройств.
- ee /etc/rc.d/iscsi.sc — не надо "гадить" в системную директорию.
используйте /usr/local/etc/rc.d или сделайте для своих скриптов, скажем, [/usr/local]/etc/rc.d.local (+ не забыть добавить оную директорию в переменную local_startup в /etc/rc.conf[.local]. в скобках [] — по собственному предпочтению). - если в jail'е крутится та же ОС, что и на хосте, не надо компайлить и тарить — откройте для себя nullfs. +обновления ОС, устанавливаемые на хост, будут автоматически распространены на гостевые окружения.
/etc/defaults /etc/mtree /etc/periodic /etc/rc.d /bin /lib /libexec /sbin /usr/bin /usr/include /usr/lib /usr/libexec /usr/sbin /usr/share /usr/ports/distfiles можно монтировать в гостей в режиме ro.
/usr/ports /usr/ports/packages — зависит от ситуации.
в остальном — нормуль, так держать! ;)
htol
14.11.2017 21:07man ctld — штатный таргет без извратов с портами и пакетами уже в системе.
Если на таргете zfs, то md не нужен. ctld умеет делать LUN прямо из zvol.
Ребутать сервер через шаг несерьезно. kldload -v iscsi_initiator.ko в стандартном ядре уже есть.
Пересобирать jail наверное можно, если есть специальные требования, но намного удобнее использовать готовые бинарники от дистрибутива, с которыми еще и freebsd-update будет работать.
С jail.conf удобно работать через инклуды для конкретных jail или сразу на директорию, в которых лежат файлы с конфигами тюрем.
timelle
Очень редкий материал. Спасибо!