Много клеток хороших и разных. Под таким слоганом я занялся обустройством клеток для новых пациентов. Но немного поясню о чем будет идти речь. Мне нужны были несколько клеток для разделения программ по серверам, для тестовых работ, а так же:
И так немного истории. Jail является потомком chroot и имеет поддержку на уровне ядра и мы можем ограничивать некоторые ресурсы потребляемые клеткой, а так же привязываем её к определенному IP адресу с определенным именем хоста и определенным местом корневого каталога. Получаем изолированные процессы - клетки, в которых вы можете делать, что хотите и это не повлияет на основную систему.
Необходимо провести несколько манипуляций:
bsd# setenv D /usr/home/jails/test.local bsd# mkdir -p $D bsd# cd /usr/src bsd# make buildworld bsd# make installworld DESTDIR=$D bsd# make distribution DESTDIR=$D bsd# mount -t devfs devfs $D/dev
1. Укажем переменную имени к окружению.
2. Создадим домашнюю директорию по переменной.
5. Заполним каталог поддерева необходимыми двоичными файлами, библиотеками, справочниками и так далее.
6. Установим все необходимые файлы из /usr/src/etc/ и /etc в каталог клетки $D/etc/.
# Значения для всех клеток jail_enable="YES" # Включаем jail jail_interface="em0" # Сетевой интерфейс jail_devfs_enable="YES" # Монтируем devfs в клетках jail_procfs_enable="YES" # Монтируем procfs в клетках jail_set_hostname_allow="YES" # Список клеток jail_list="test" # Имя клеток через пробел для списка клеток # Значения для созданной клетки "test" jail_test_rootdir="/usr/home/jails/test.local" # Рутовая директория jail jail_test_hostname="test.local" # Имя хоста клетки jail_test_ip="192.168.0.4" # IP адрес хоста клетки #jail_test_interface="em0" # Сетевой интерфейс клетки (если нужен) #jail_test_devfs_enable="YES" # Монтируем devfs в клетке #jail_test_procfs_enable="YES" # Монтируем procfs в клетке jail_test_exec_start="/bin/sh /etc/rc" jail_test_exec_stop="/bin/sh /etc/rc.shutdown" jail_test_flags="-l -U root" # Необходимые флаги для клетки
Необходимо создать сетевые алиасы для ваших клеток. Они нужны чтобы клетки могли корректно работать в сети. Алиасы создаются на материнской системе:
bsd# cat /etc/rc.conf |grep if ifconfig_em0="inet 192.168.0.2 netmask 255.255.255.0" # Алиас для первой клетки ifconfig_em0_alias0="inet 192.168.0.4 netmask 255.255.255.255"
Для запуска всех клеток используйте:
bsd# /etc/rc.d/jail start bsd# /etc/rc.d/jail stop
bsd# /etc/rc.d/jail start test bsd# /etc/rc.d/jail stop test
Выведем список работающих клеток:
bsd# jls JID IP Address Hostname Path 1 192.168.0.4 test.local /usr/home/jails/test.local 2 192.168.0.5 jabber.local /usr/home/jails/jabber.local
Зайдем в первую клетку:
bsd# jexec 1 tcsh test#
Создадим в клетке пустой файл /etc/fstab чтобы при ее запуске не появлялось сообщение об отсутствующем файле fstab.
bsd# touch /home/jails/test.local/etc/fstab
Выключите в клетке port mapper.
bsd# cat /home/jails/test.local/etc/rc.conf |grep rpcbind rpcbind_enable="NO"
Настроим resolv.conf так, чтобы разрешение имен в клетке работало правильно. Создадим в клетке файл с нужным DNS сервером или скопируем с основной машины в клетку.
bsd# cat /home/jails/test.local/etc/resolv.conf nameserver 192.168.0.1
Запустим в клетке newaliases чтобы при запуске не появлялось сообщение от sendmail.
test# /etc/mail/ && newaliases
Отключим сетевой конфигурационный интерфейс чтобы при запуске не появлялось сообщение от ifconfig.
bsd# cat /home/jails/test.local/etc/rc.conf |grep network network_interfaces = ""
Обязательно измените пароль root в клетке (сделайте отличным от основной машины).
Создадим нового пользователя. Для этого есть штатная утилита jexec с помощью нее мы добавим нового пользователя состоящего в группе wheel [цифра это JID клетки]:
bsd# jexec 1 adduser Username: alex Full name: Alex Ign Uid (Leave empty for default): Login group [alex]: Login group is alex. Invite alex into other groups? []: wheel Login class [default]: Shell (sh csh tcsh nologin) [sh]: csh Home directory [/home/alex]: Home directory permissions (Leave empty for default): Use password-based authentication? [yes]: Use an empty password? (yes/no) [no]: Use a random password? (yes/no) [no]: Enter password: Enter password again: Lock out the account after creation? [no]: Username : alex Password : ***** Full Name : Alex Ign Uid : 1003 Class : Groups : alex wheel Home : /home/alex Home Mode : Shell : /bin/csh Locked : no OK? (yes/no): yes adduser: INFO: Successfully added (alex) to the user database. Add another user? (yes/no): no Goodbye!
Для работы с клеткой посредством ssh необходимо настроить демон sshd.
Для этого на основной машине в /etc/ssh/sshd_config укажем нужный для прослушивания IP.
bsd# cat /etc/ssh/sshd_config | grep ListenAddress #ListenAddress 0.0.0.0 ListenAddress 192.168.0.2 #ListenAddress ::
bsd# /etc/rc.d/sshd restart bsd# sockstat -l |grep sshd root sshd 1216 3 tcp4 192.168.0.4:22 *:* root sshd 978 3 tcp4 *:22 *:*
bsd# cat /home/jails/test.local/etc/rc.conf |grep sshd sshd_enable="YES"
Установите нужную временую зону в клетке.
Экспортируем существующие порты в клетку. Вы можете также скопировать их в нужную директорию или создать симлинк.
bsd# mkdir /home/jails/test.local/usr/ports bsd# mount_nullfs /usr/ports /home/jails/test.local/usr/ports bsd# cat /etc/fstab |grep jail /usr/ports /home/jails/test.local/usr/ports nullfs rw 0 0
Вы можете настроить некоторые переменные sysctl в основной системе для настройки работы клеток.
Для некоторого ограничения ресурсов клетки используйте совместно с ограничениями в /etc/login.conf ;)
Написать о самописном скрипте или о порте который может управлять клетками?
Теперь вы можете создавать и работать с клетками. Есть конечно недостатки клеток такие как отсутствие ограничений на использование ресурсов процессора или памяти без серьезной распилки и применения специальных патчей и многое другое. Но зато все работает нативно и быстро в данном случае мы добились желаемого.
Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer