Тема: 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