Введение
На написание данной публикации меня подтолкнул тот факт, что в сети интернет крайне мало информации по администрированию 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
Для настройки необходим ещё один сервер в сети, или виртуальная машина(как в моём случае).
Для настройки iscsi target будем использовать ctld(входит в состав FreeBSD), добавим запись в rc.conf:
sysrc ctld_enable="YES"
На следующем шаге необходимо создать файл конфигурации для ctld:
ee /etc/ctl.conf
В созданный файл добавьте строки:
auth-group group1 {
chap "user" "password1234"
}
portal-group pg0 {
discovery-auth-group group1
listen 192.168.1.106:3260
}
target iqn.iscsi:target1 {
alias "Example target"
auth-group group1
portal-group pg0
lun 0 {
path /dev/md0
size 10G
}
}
В строке chap укажите необходимое имя и пароль(минимум 12-ть символов). Название
в строке target обязательно должно начинаться на iqn. В строке listen укажите ip адрес текущего сервера. В строке path укажите путь к диску.
Здесь указан виртуальный жёсткий диск, если используете физический, то укажите его, а если желаете использовать виртуальный, то читаем дальше. Перейдите в каталог в котором желаете создать файл для виртуально жёсткого диска и выполните команду:
dd if=/dev/zero of=disk bs=1k count=10m
Параметр count отвечает за количество гигабайт, в данном случаю создастся файл размером 10 гигабайт, если укажите другое число, то в этом случаи необходимо изменить параметр LUN 0 в ctl.conf. Данные процесс занимает относительно не много времени. После того как процесс завершиться, в текущей папке создастся фай disk, осталось только создать виртуальный жесткий диск командой:
mdconfig -a -t vnode -f disk
После выполнение данной команды отобразиться название виртуально диска (в моём случаи — md0), если название отличается, то так-же необходимо изменить параметр LUN 0 в ctl.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=password1234
initiatorname=nxl
TargetName=iqn.iscsi:target1
TargetAddress=192.168.1.106:3260,1
LoginTimeout=10
AuthTimeout=10
IdleTimeout=10
ConnFailTimeout=10
AbortTimeout=10
ResetTimeout=10
}
Если настройки в файле ctl.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
Ограничения вступят в силу буквально в течение нескольких секунд.
Дополнительно
Можно было бы на этом закончить, но может возникнуть ситуация такая, что выйдет из строя не жёсткий диск, а сам сервер(например сгорит). В таком случаи можно использовать диск который находится на удалённом сервере, но просто так его использовать не удастся, первым делом необходимо остановить службу ctld и включить zfs:
service ctld 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
А так-же запустить ctld:
service ctld 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
www.freebsd.org/cgi/man.cgi?query=ctl.conf&sektion=5&apropos=0&manpath=FreeBSD+11.1-RELEASE+and+Ports