Тема: Jail'оводство или "плодитесь и размножайтесь"

Мдя, сел имап на cyrus'е подымать,а както плавно перевалился в jail'ы... старею наверно...

тема охватывает и джаилы и файловые системы в файле, реализовано стандартненько но советую серьезно посмотреть в сторону zfs

1. Что такое джайл.
Можно сказать что это продвинутый chroot. Следовательно для наличия и работы нужно иметь некую структуру файлов. Грубо говоря это миниинстал, и занимает около 200 мегабайт. Отвечу на вопрос, зачем помещать в файл? Просто, если это ваша система то вам нечего боятся, вы скорее всего в состоянии контролировать сколько места занимает система и не сожрет ли она все свободное место на ноде (нод - node - тот сервер на котором живут jail'ы), а если не ваша?

2. Создание файловой системы в файле и сборка системы

#!/bin/sh
# ip адрес, у меня он же и название файла
IP=10.0.0.15
# куда размещать файлик, он большой может быть
D1=/mnt/hdd/jails
# куда монтировать
D2=/mnt/jails
# собираем путь
JL=$D2/$IP
# сколько места даем джайлу
NEWSIZE=`/usr/bin/perl -e 'print 2097152 * 15'`
# разбиваем
dd if=/dev/zero of=$D1/$IP bs=512 count=${NEWSIZE}
# создаем виртуальной устройство
JDEV=`mdconfig -a -t vnode -f $D1/$IP`
# форматируем
newfs /dev/${JDEV}
# создаем директорию
mkdir -p $JL
# монтируем
/sbin/mount /dev/${JDEV} $JL
# красиво...
echo "Wait for CTRL+C"
echo ""
sleep 30
# собираем систему
cd /usr/src
make world DESTDIR=$JL
cd etc
make distribution DESTDIR=$JL

3. Работа с джаилами
все, систмема у нас уже есть, для работы с джаилами есть стандартный директивы в rc.conf - вопросы к мануалу, но если нужно чтото особенное то вот скриптик для запуска.

#!/bin/sh
JAILIP="10.0.0.15"
JAILFSMD="md2"
JAILFSFILE="/mnt/hdd/jails/10.0.0.15"
JAILPATH="/mnt/jails/10.0.0.15"
JAILNAME="j15.ddd.com"
JAILIF="rl0"
processjail()
{
    /usr/sbin/jls | grep ${JAILNAME} | /usr/bin/perl -ane 'print $F[0]'
}
case $1 in
mount)
        echo Mounting jailfs
        echo Create ${JAILFSMD}
        /sbin/mdconfig -a -t vnode -u ${JAILFSMD} -f ${JAILFSFILE}
        sleep 3
        echo Mounting ${JAILPATH}
        /sbin/mount /dev/${JAILFSMD} ${JAILPATH}
        sleep 3
        ;;
umount)
        echo Unmounting jailfs
        echo Unmounting ${JAILPATH}
        /sbin/umount -f ${JAILPATH}
        sleep 3
        echo Destroy ${JAILFSMD}
        /sbin/mdconfig -d -u ${JAILFSMD}
        sleep 3
        ;;
start)
        echo Starting...
        $0 mount
        echo Test ${JAILPATH}/etc/rc files
        /bin/test -f ${JAILPATH}/etc/rc || exit 1
        echo Add alias ${JAILIF} to ${JAILIP}
        /sbin/ifconfig ${JAILIF} ${JAILIP} alias
        echo Mount devfs
        /sbin/mount_devfs devfs ${JAILPATH}/dev
        echo Mount procfs
        /sbin/mount_procfs proc ${JAILPATH}/proc
        echo Starting jail : ${JAILNAME} : ${JAILIP}
        /usr/sbin/jail ${JAILPATH} ${JAILNAME} ${JAILIP} /bin/sh /etc/rc
        echo "Jail ${JAILNAME} started."
        ;;
stop)
        echo Stopping...
        echo Remove alias ${JAILIF} to ${JAILIP}
        /sbin/ifconfig ${JAILIF} ${JAILIP} -alias
        echo Get gail process ID
        PROCESS=`processjail`
        echo Kill JID:${PROCESS} TERM -1
        /usr/sbin/jexec ${PROCESS} /bin/kill -s TERM -1
        sleep 3
        echo Unmount devfs
        /sbin/umount -f ${JAILPATH}/dev
        echo Unmount procfs
        /sbin/umount -f ${JAILPATH}/proc
        echo "Jail ${JAILNAME} stopped."
        sleep 1
        $0 umount
        ;;
status)
        /usr/sbin/jls | grep ${JAILNAME}
        ;;
restart)
        echo Restarting...
        $0 stop
        sleep 3
        $0 start
        ;;
*)
        echo "Usage: `basename $0` {status|start|stop|restart|mount|umount}" >&2
        exit 64
        ;;
esac

4. Список процессов в джаиле

список джаилов

# jls
   JID  IP Address      Hostname                      Path
    25  10.0.0.15       j15.ddd.com                   /mnt/jails/10.0.0.15
    16  10.0.0.13       j13.ddd.com                   /mnt/jails/10.0.0.13
    14  10.0.0.14       j14.ddd.com                   /mnt/jails/10.0.0.14

список процессов, это виртуалка с NS мастером

# ps -auxo jid | grep 14$
root   11675  0.0  0.1  1376   720  ??  SsJ   1Oct08   0:03.61 /usr/sbin/syslog     14
root   11741  0.0  0.3  3524  1548  ??  IsJ   1Oct08   0:09.60 /usr/sbin/sshd       14
root   11747  0.0  0.4  3504  2056  ??  SsJ   1Oct08   0:26.53 sendmail: accept     14
smmsp  11751  0.0  0.4  3384  1804  ??  IsJ   1Oct08   0:00.56 sendmail: Queue      14
root   11757  0.0  0.1  1388   712  ??  IsJ   1Oct08   0:04.22 /usr/sbin/cron -     14
bind   21186  0.0  0.5  4360  2828  ??  SsJ   1Oct08   0:09.20 /usr/sbin/named      14
root   91955  0.0  0.5  4132  2648  ??  IsJ   5Oct08   0:03.60 named                14

2

Re: Jail'оводство или "плодитесь и размножайтесь"

По поводу страта, все же у меня нарекания.

Вот мой вариант, в котором не надо указывать имя девайса для монтирования

#!/bin/sh
JAILIP="192.168.1.2"
JAILPATH="/var/jail/${JAILIP}"
JAILDATA="/usr/vds/${JAILIP}"
JAILNAME="unix-forum.ru"
JAILIF="em0"
processjail()
{
        /usr/sbin/jls | grep ${JAILNAME} | /usr/bin/perl -ane 'print $F[0]'
}
case $1 in
start)
        #/bin/test -f ${JAILPATH}/etc/rc || exit 1
        /sbin/ifconfig ${JAILIF} ${JAILIP} netmask 255.255.255.192 alias
        JDEV=`/sbin/mdconfig -a -t vnode -f ${JAILDATA}`
        /sbin/mount /dev/${JDEV} ${JAILPATH}
        /sbin/mount_devfs devfs ${JAILPATH}/dev
        # может надо для хрута еще чего монтировать, то монтируем 
        /sbin/mount_devfs devfs ${JAILPATH}/home/webuser/dev
        # монтируем procfs
        /sbin/mount_procfs proc ${JAILPATH}/proc
        # запускаем JAIL
        /usr/sbin/jail ${JAILPATH} ${JAILNAME} ${JAILIP} /bin/sh /etc/rc
        echo -n " JAIL-${JAILIP} "
        echo " "
        echo "Jail ${JAILNAME} start process..."
        ;;
stop)
        PROCESS=`processjail`
        /sbin/ifconfig ${JAILIF} ${JAILIP} -alias
        /usr/sbin/jexec ${PROCESS} /bin/kill -s TERM -1
        /usr/sbin/jexec ${PROCESS} /bin/kill -s KILL -1
        /usr/bin/killall -z -j ${PROCESS}
        /sbin/umount -f ${JAILPATH}/dev
        # не забываем отмонтировать все что монтировали
        /sbin/umount -f ${JAILPATH}/home/webuser/dev
        /sbin/umount -f ${JAILPATH}/proc
        /sbin/umount -f ${JAILPATH}
        echo "Jail ${JAILNAME} stop process..."
        sleep 1;
        ;;
status)
        /usr/sbin/jls | grep ${JAILNAME}
        ;;
restart)
        $0 stop
        echo "Jail ${JAILNAME} stop process..."
        sleep 1
        $0 start
        echo "Jail ${JAILNAME} start process..."
        ;;
*)
        echo "Usage: `basename $0` {start|stop|restart}" >&2
        exit 64
        ;;
esac

По моему опыту, есть некоторые проблемы при стопе системы. Процессы не убиваются, если делать stop и исходя из этого, приходится повторно запускать ./192.168.1.2.sh stop
но даже после двух или трех раз такой попытки, бывает что всеравно при просмотре jls виден JID который мы били и висит досихпор не убитый. Может висеть даже день а может и несколько секунд. От чего это зависит, я не знаю.

3

Re: Jail'оводство или "плодитесь и размножайтесь"

Помойму это не из за етого, это проявляется если ты войдеш в джайл, например по ssh и остановиш его, вот тогда получится так как ты говориш.

4

Re: Jail'оводство или "плодитесь и размножайтесь"

Нет Алан, даже если не зашел, а просто делаем стоп, и процессы всеравно висят.
Я пробовал создать стартовый скрипт на основе rc.subr системы, но пока толи время толи знаний не хватает...
Может кто уже сделал, пусть покажут тогда smile

5

Re: Jail'оводство или "плодитесь и размножайтесь"

Покрайней мере в моем случае так, если я зайду по ssh то останавливается с проблемой (висит процесс, но умирает через пару минут.), в остальном все нормально.