Тема: 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=$JL3. Работа с джаилами
все, систмема у нас уже есть, для работы с джаилами есть стандартный директивы в 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
        ;;
esac4. Список процессов в джаиле
список джаилов
# 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
