JAIL + VNET двойной запуск rc

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
fessoga5
рядовой
Сообщения: 28
Зарегистрирован: 2011-11-22 20:04:00

JAIL + VNET двойной запуск rc

Непрочитанное сообщение fessoga5 » 2013-09-04 6:33:56

Есть машина с jailaми, которые админятся через ezjail в который прикручен сетевой стек. Конфиг выглядет так.

Код: Выделить всё

# To specify the start up order of your ezjails, use these lines to
# create a Jail dependency tree. See rcorder(8) for more details.
#
# PROVIDE: standard_ezjail
# REQUIRE: 
# BEFORE: 
#

export jail_vpn0_rooml_ru_flags="-c vnet name=vpn0_rooml_ru allow.raw_sockets=1 allow.sysvipc=1"
#
export jail_vpn0_rooml_ru_hostname="vpn0.rooml.ru"
#
export jail_vpn0_rooml_ru_exec_prestart0="ifconfig epair0 create"
export jail_vpn0_rooml_ru_exec_prestart1="ifconfig bridge0 addm epair0a"
export jail_vpn0_rooml_ru_exec_prestart2="ifconfig epair0a up"
#
#export jail_vpn0_rooml_ru_exec_start="/bin/sh /etc/rc"
#
export jail_vpn0_rooml_ru_exec_poststart0="ifconfig epair0b vnet vpn0_rooml_ru"
export jail_vpn0_rooml_ru_exec_poststart1="jexec vpn0_rooml_ru ifconfig lo0 127.0.0.1"
export jail_vpn0_rooml_ru_exec_poststart2="jexec vpn0_rooml_ru ifconfig epair0b 192.168.5.2/24 up"
export jail_vpn0_rooml_ru_exec_poststart3="jexec vpn0_rooml_ru route add default 192.168.5.1"
export jail_vpn0_rooml_ru_exec_poststart4="jexec vpn0_rooml_ru /etc/rc.d/ipfw start"
export jail_vpn0_rooml_ru_exec_poststart5="jexec vpn0_rooml_ru /bin/sh /etc/rc"
#
#export jail_vpn0_rooml_ru_exec_poststop0="jexec vpn0_rooml_ru /bin/sh /etc/rc.shutdown"
#export jail_vpn0_rooml_ru_exec_poststop1="ifconfig bridge0 deletem epair0a"
#export jail_vpn0_rooml_ru_exec_poststop2="ifconfig epair0a destroy"
#
export jail_vpn0_rooml_ru_ip=""
export jail_vpn0_rooml_ru_rootdir="/usr/home/main/jail/vpn0.rooml.ru"
#export jail_vpn0_rooml_ru_exec_start1="/bin/sh /etc/rc"
export jail_vpn0_rooml_ru_exec_stop=""
export jail_vpn0_rooml_ru_mount_enable="YES"
export jail_vpn0_rooml_ru_devfs_enable="YES"
export jail_vpn0_rooml_ru_devfs_ruleset="devfsrules_jail"
export jail_vpn0_rooml_ru_procfs_enable="YES"
export jail_vpn0_rooml_ru_fdescfs_enable="YES"
export jail_vpn0_rooml_ru_image=""
export jail_vpn0_rooml_ru_imagetype=""
export jail_vpn0_rooml_ru_attachparams=""
export jail_vpn0_rooml_ru_attachblocking=""
export jail_vpn0_rooml_ru_forceblocking=""
export jail_vpn0_rooml_ru_zfs_datasets=""
export jail_vpn0_rooml_ru_cpuset=""
export jail_vpn0_rooml_ru_fib=""
export jail_vpn0_rooml_ru_parentzfs=""
export jail_vpn0_rooml_ru_parameters=""
export jail_vpn0_rooml_ru_post_start_script=""
Как видите "/bin/sh /etc/rc" стартует в секции poststart, а в start закомментирован, это нужно для того чтобы "rc" подгрузился после сетевого стека.
Так вот получается, что после старта jail стартует "/bin/sh /etc/rc" и некоторые процессы запускаются дважды. Выглядет это так:

Код: Выделить всё

USER        PID %CPU %MEM    VSZ   RSS TT  STAT STARTED    TIME COMMAND
root       2829  0.0  0.2  41560  5432 ??  SsJ   3:00AM 0:00.12 /usr/local/sbin/mpd5 -p /var/run/mpd5.pid -b
root       2960  0.0  0.1  14128  1872 ??  SsJ   3:00AM 0:00.02 /usr/sbin/cron -s
root       3086  0.0  0.1  12052  1788 ??  SsJ   3:00AM 0:00.06 /usr/sbin/syslogd -s
root       3110  0.0  0.2  45784  5512 ??  IsJ   3:00AM 0:00.13 /usr/local/sbin/mpd5 -p /var/run/mpd5.pid -b
mysql      3138  0.0  0.1  14504  2108 ??  IsJ   3:00AM 0:00.01 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-file=/var/db/mysql/my.cnf --user=mysql --datadir=/var/db/mysql --pid-file=/var/db/mysql/vpn0.rooml.ru.pid
mysql      3232  0.0  2.9 522476 89940 ??  IJ    3:00AM 0:02.75 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --plugin-dir=/usr/local/lib/mysql/plugin --log-error=/var/db/mysql/vpn0.rooml.ru.err --pid-file=/var/db/mysql/vpn0.rooml.ru.pid
freeradius 3246  0.0  0.3 106432  8520 ??  IsJ   3:00AM 0:00.00 /usr/local/sbin/radiusd
root       3278  0.0  0.2  46744  5184 ??  IsJ   3:00AM 0:00.00 /usr/sbin/sshd
root       3282  0.0  0.1  14128  1856 ??  SsJ   3:00AM 0:00.01 /usr/sbin/cron -s
root       5178  0.0  0.1  14504  2320  3  SJ    3:31AM 0:00.02 sh
root       5182  0.0  0.1  14188  1764  3  R+J   3:32AM 0:00.01 ps auxwww
Как видно mpd и cron запущен дважды. Если смотреть /var/run/mpd.pid увидем 3310.
Че то я не как не допру как же так получается.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

fessoga5
рядовой
Сообщения: 28
Зарегистрирован: 2011-11-22 20:04:00

Re: JAIL + VNET двойной запуск rc

Непрочитанное сообщение fessoga5 » 2013-09-07 7:23:05

Хоть бы идею дали человеку.

Гость
проходил мимо

Re: JAIL + VNET двойной запуск rc

Непрочитанное сообщение Гость » 2013-09-07 22:19:28

fessoga5 писал(а):Хоть бы идею дали человеку.
Учесть что jail все время развивается и изменяется.
идея проста: man jail
и посмотреть по шагам как работает /etc/rc.d/jail или скрипт ezjail.

Соль проста: jail + vnet (kernel with vimage) обычно строят на виртуальных интерфейсах типа: epair или netgraph нодах

В случае с epair, вы создаете epair (связную пару UTP): epairXa в одну сторону (обычно bridge) и epairXb прикрепляют к jail.
(правку /etc/devfs.rules опускаем)

Получаем следующую последовательность действий:

допустим физический интерфейс em0

- создали виртуальный сетевой интерфейс, который всегда состоит из пары epairXa и epairXb

# ifconfig epair0 create

- создали мост в котором объединили физ.сетевую карту с одной из парый -> epair0a

# ifconfig bridge0 create
# ifconfig bridge0 addm em0 addm epair0a up

- стартуем холостой jail (потому что нам некуда прицепить вторую utp epair0b из пары epair) с указанием того что он будет
использовать виртуальный сетевой стек vnet (на базе vimage)

# jail -c name=test path=/ host.hostname=test vnet persist

- вот теперь, когда мы запустили машину, мы можем привязать к ней вторую пару виртуального интерфейса epair
(ибо к пустоте epair0b не пристегнешь)

# ifconfig epair0b vnet test
(где test имя нашей jail машины, она уже существует и мы можем пристегнуть к ней один конец виртуального интерфейса epair)

прим: любой интерфейс который привязывают к jail+vnet, удаляется из хоста, и освобождается после убития jail-машины)

Теперь, когда у нас: запущена jailvm с именем test и к ней привязан интерфейс epair, можно запускать службы внутри jail:

# jexec ID /bin/sh /etc/rc
# jexec ID /bin/sh /etc/rc.d/netif start
# jexec ID /bin/sh /etc/rc.d/ipfw start

при условии правильной настройки /etc/rc.conf , /etc/crontab внутри jail

Понятно изложено?

схема такой конструкции будет такой:

<---> em0 <--> bridge0 <--> epair0a <--> |jail+vnet vm| <--> epair0b

где em0, bridge0, epair0a - это все в хосте, а epair0b это сетевой интерфейс внутри vm (virtual machine) jail+vnet

прим: все скрипты и правки /etc/rc.d/jail для vnet и для ezjail - кривые и неверные, вот почему родной /etc/rc.d/jail не подходит
для jail+vnet и всякие кривые патчи FreeBSD Team в него не вносит.

Можно написать свой... или вместо epair использовать netgraph для jail+vnet, готовый скрипт:
http://druidbsd.sourceforge.net/vimage.shtml
http://druidbsd.sourceforge.net/download/vimage-1.4.tbz

fessoga5
рядовой
Сообщения: 28
Зарегистрирован: 2011-11-22 20:04:00

Re: JAIL + VNET двойной запуск rc

Непрочитанное сообщение fessoga5 » 2013-09-08 15:55:45

Сенкс. То как работает vnet и так было понятно. Но спасибо за потраченное время =) Буду пробывать все операции в ручную воспроизвести.

guest
проходил мимо

Re: JAIL + VNET двойной запуск rc

Непрочитанное сообщение guest » 2013-09-08 16:37:44

fessoga5 писал(а):Сенкс. То как работает vnet и так было понятно. Но спасибо за потраченное время =) Буду пробывать все операции в ручную воспроизвести.
если бы было понятно, не было бы двойного старта сервисов и использования неверных скриптов запуска jail+vnet

операций там кот наплакал (для epair):

# ifconfig xxx up (не забыть про up в host и guest vm, иначе обломитесь и долго будете мучаться)
# jail -c name=NAME options vnet persist
# ifconfig epairXb vnet NAME
# jexec ID (start rc scripts) (не забыть про firewall в jail, лучше в host сделать ACCEPT_BY_DEFAULT, лучше использовать ipfw, с pf проблемы)

в crontab'е jail'а желательно:
# Save some entropy so that /dev/random can re-seed on boot.
*/22 * * * * operator /usr/libexec/save-entropy
^^^^- выполнять сдвиг для jail'ов
и комментарить:
# Adjust the time zone if the CMOS clock keeps local time, as opposed to
# UTC time. See adjkerntz(8) for details.
#1,31 0-5 * * * root adjkerntz -a

в periodic убрать все лишнее и то что должно выполняться только в host машине, tzsetup не забывать в jail, короче - написать
под себя скрипт создания jail машин или найти удачный, который создаст машину, fstab и строки для start-stop скрипта, которые
останется только внести в /etc/rc.conf.d/myjail.conf или нечто подобное.

ну и придется править /etc/loader.conf в host машине - как минимум увел-вать кол-во открытых файлов, и тд и тп

еще раз: возьмите vimage от Devin Teske и не парьтесь, для сложных же сетевых конфигураций, нужно писать свой start-stop скрипт

ps. Лучше брать 9.1 или 9.2 или 9-Stable, с интегрированными патчами и работоспособным jail.conf, еще лучше start-stop скрипт vimage
Хотя, можно и на 9.0, правда правок потом вышло много.

Аватара пользователя
DevZone
рядовой
Сообщения: 41
Зарегистрирован: 2012-04-14 8:04:05

Re: JAIL + VNET двойной запуск rc

Непрочитанное сообщение DevZone » 2013-10-30 1:03:20

Для друпала наворотили готовые скрипты https://github.com/lattera/drupal-jailadmin
Вложения
drupal-jailadmin-master.zip
(24.97 КБ) 30 скачиваний

guest
проходил мимо

Re: JAIL + VNET двойной запуск rc

Непрочитанное сообщение guest » 2013-10-30 16:00:49

DevZone писал(а):Для друпала наворотили готовые скрипты https://github.com/lattera/drupal-jailadmin
зачем столько тяжести: web с php, если решается готовым скриптом vimage:

http://druidbsd.sourceforge.net/vimage.shtml - можно через netgraph, можно через epair, можно и то и
другое, vlan'ы...

или собственным скриптом для нестандартных сетевых конфигураций.

Аватара пользователя
DevZone
рядовой
Сообщения: 41
Зарегистрирован: 2012-04-14 8:04:05

Re: JAIL + VNET двойной запуск rc

Непрочитанное сообщение DevZone » 2013-10-30 18:38:43

guest писал(а):
DevZone писал(а):зачем столько тяжести: web с php, если решается готовым скриптом vimage:
RESTful API ?

guest
проходил мимо

Re: JAIL + VNET двойной запуск rc

Непрочитанное сообщение guest » 2013-10-30 20:02:13

DevZone писал(а):
guest писал(а):
DevZone писал(а):зачем столько тяжести: web с php, если решается готовым скриптом vimage:
RESTful API ?
не понял, в смысле?

fessoga5
рядовой
Сообщения: 28
Зарегистрирован: 2011-11-22 20:04:00

Re: JAIL + VNET двойной запуск rc

Непрочитанное сообщение fessoga5 » 2014-03-23 11:55:10

Кстати, проблему решил. Действительно был баг в rc скрипте. Счас че то не заводится под Freebsd 10
/usr/sbin/jail -c vnet persist name=git_rooml_ru allow.raw_sockets=1 allow.sysvipc=1 -i -f /var/run/jail.git_rooml_ru.conf -c git_rooml_ru

Нету говорит -c флага сцуко =)

guest
проходил мимо

Re: JAIL + VNET двойной запуск rc

Непрочитанное сообщение guest » 2014-03-23 15:23:20

fessoga5 писал(а):Кстати, проблему решил. Действительно был баг в rc скрипте. Счас че то не заводится под Freebsd 10
/usr/sbin/jail -c vnet persist name=git_rooml_ru allow.raw_sockets=1 allow.sysvipc=1 -i -f /var/run/jail.git_rooml_ru.conf -c git_rooml_ru

Нету говорит -c флага сцуко =)
1) не баг был в скрипте, а скрипт был просто напросто неверный, без понимания, системный же скрипт, до 9.2/10.0 просто не поддерживал vnet
2) смотрим выше и видим неверный запуск jail машины -> простая невнимательность, дважды используется "-c"

начиная с 9.2 все allow реализованы per jail, системный скрипт /etc/rc.d/jail в 10'ке минимальный и рассчитан на использование /etc/jail.conf

Если 10.0 ядро с VIMAGE и для VNET в качестве виртуального ethernet используется epair, ручной запуск (без jail.conf) будет примерно
следующим:

Код: Выделить всё

# jail -c name=JAILNAME path=/pub/jails/proxy persist devfs_ruleset=N allow.mount.devfs allow.mount.nullfs mount.devfs allow.set_hostname \ allow.sysvipc vnet.interface=epair0b mount.devfs vnet
#
где JAILNAME - имя машины, devfs_ruleset=N номер devfs ruleset правила для jail, остальное по вкусу и необходимости: hostname...
больше ничего и не надо

fessoga5
рядовой
Сообщения: 28
Зарегистрирован: 2011-11-22 20:04:00

Re: JAIL + VNET двойной запуск rc

Непрочитанное сообщение fessoga5 » 2014-03-23 15:30:38

guest писал(а):
fessoga5 писал(а):Кстати, проблему решил. Действительно был баг в rc скрипте. Счас че то не заводится под Freebsd 10
/usr/sbin/jail -c vnet persist name=git_rooml_ru allow.raw_sockets=1 allow.sysvipc=1 -i -f /var/run/jail.git_rooml_ru.conf -c git_rooml_ru

Нету говорит -c флага сцуко =)
1) не баг был в скрипте, а скрипт был просто напросто неверный, без понимания, системный же скрипт, до 9.2/10.0 просто не поддерживал vnet
2) смотрим выше и видим неверный запуск jail машины -> простая невнимательность, дважды используется "-c"

начиная с 9.2 все allow реализованы per jail, системный скрипт /etc/rc.d/jail в 10'ке минимальный и рассчитан на использование /etc/jail.conf

Если 10.0 ядро с VIMAGE и для VNET в качестве виртуального ethernet используется epair, ручной запуск (без jail.conf) будет примерно
следующим:

Код: Выделить всё

# jail -c name=JAILNAME path=/pub/jails/proxy persist devfs_ruleset=N allow.mount.devfs allow.mount.nullfs mount.devfs allow.set_hostname \ allow.sysvipc vnet.interface=epair0b mount.devfs vnet
#
где JAILNAME - имя машины, devfs_ruleset=N номер devfs ruleset правила для jail, остальное по вкусу и необходимости: hostname...
больше ничего и не надо
Угу, thanks! Правда давно во всем сам разобрался.