пятница, 15 июля 2016 г.

Jail+ZFS+реализация схемы развертывания из handbook

Во время реализации предыдущего поста, столкнулся с тем, что при достаточно большом количестве клеток, очень усложняется поддержка всего этого хозяйства, в первую очередь обновления. В английской версии руководства приводится один из вариантов схемы развертывания, призванный облегчить задачу массового обновления клеток. Вот перевод руководства. Я решил попробовать, так сказать, скрестить ежа с удвавом: реализовать эту схему с использованием преимуществ ZFS.
Вот еще полезная ссылочка, которая мне тоже помогла, так же буду копипастить себя любимого, и так начнем:


Исходные данные:
Проинсталированный FreeBSD 10.3 сервер файловая система ZFS.

Создание Шаблона

Создаем точку монтирования клеток:

zfs create -o mountpoint=/jails zroot/jails

Картинки и подробности в предыдущем посте: по сути делаем то же самое, но немного по другому.
Создаем файловую систему для, общего на все клетки, рутового раздела, монтируемого "только для чтения":

zfs create zroot/jails/.mroot

устанавливаем квоту:

zfs set quota=20G zroot/jails/.mroot

качаем файлы дистрибутива для клетки (в моем случае FreeBSD 10.3):

cd /var/tmp
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.3-RELEASE/base.txz
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.3-RELEASE/lib32.txz
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.3-RELEASE/games.txz
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.3-RELEASE/src.txz


На самом деле, куда качать значения не имеет, можно и в домашний каталог пользователя.
Распаковываем:

tar -JxvC /jails/.mroot/ -f base.txz
tar -JxvC /jails/.mroot/ -f lib32.txz 

tar -JxvC /jails/.mroot/ -f games.txz 
tar -JxvC /jails/.mroot/ -f src.txz

Копируем свои настройки ДНС:

cp /etc/resolv.conf /jails/.mroot/etc/

Делаем chroot в новую систему:

chroot /jails/.mroot

Задаем пароль рута, создаем недостающие каталоги и обновляем систему:

passwd
mkdir /usr/ports
freebsd-update fetch install


создаем точку монтирования раздела с полным доступом:

mkdir /s

Выходим в обычное окружение:

exit

создаем каталог-шаблон:
тут мое мнение разделилось - с одной стороны, мы стремимся использовать
преимущества ZFS, а с другой - это просто статический каталог-шаблон,
можно делать и как простой каталог, и как файловую систему. Я остановился
на каталоге:

mkdir /jails/.skel /jails/.skel/home /jails/.skel/usr-X11R6 /jails/.skel/distfiles


редактируем /etc/fstab добавляем строчки:

#jails 
/jails/.skel /jails/.mroot/s nullfs rw 0 0

выполняем:

mount -a
chroot /jails/.mroot


Таким образом, мы примонтировали шаблон в точку монтирования раздела с полным доступом и изменили окружение на .mroot, это позволит нам избежать потенциально-опасных моментов в дальнейшем, при выполнении условно-деструктивных действий, когда автоматом поставленный слэш, в начале пути, может привести к краху основной системы.

mv /etc /s
mv /usr/local /s/usr-local
mv /tmp /s
mv /var /s
mv /root /s


создаем ссылки на перемещенные файлы:

ln -s /s/etc etc
ln -s /s/home home
ln -s /s/root root
ln -s /s/usr-local /ust/local
ln -s /s/distfiles /usr/ports/distfiles
ln -s /s/usr-X11R6 /usr/X11R6
ln -s /s/var var
ln -s /s/tmp tmp


Устанавливаем порты:

portsnap fetch
portsnap extract


Устанавливаем софт, который должен быть во всех новых клетках, в моем случае mc и screen:

pkg install mc-light
pkg install screen


возвращаемся в нормальное окружение, размонтируем шаблон, и комментируем строку в /etc/fstab :

exit
umount /jails/.mroot/s


Создание шаблона завершено!


Создание клетки

Создаем каталог, в котором будут располагаться точки монтирования rootfs клеток:

mkdir /jails/jlroots

создаем файловую систему для разделов, монтируемых для чтения-записи:

zfs create zroot/jails/jls

Для примера создадим клетку "test" :

mkdir /jails/jlroots/test
zfs create zroot/jails/jls/test

с помощью команды cpdup (создает дубликат каталога со всеми ссылками, в стандартные команды не входит: pkg install cpdup) копируем шаблон в rw каталог клетки:

cd /jails
cpdup /jails/.skel /jails/jls/test


добавляем строки в /etc/fstab:

/jails/.mroot /jails/jlroots/test nullfs ro 0 0
/jails/jls/test /jails/jlroots/test/s nullfs rw 0 0


порядок строк важен, иначе на момент монтирования, точка монтирования не будет существовать.
Монтируем:

mount -a

Получили в каталоге /jails/jlroots/test готовую файловую систему нашей клетки.
Дальнейшие действия не отличаются от описанных в предыдущем посте:

Устанавливаем jail2:
pkg install jail2


Создаем файл конфигов клеток /etc/jail.conf:

exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;

path = "/jails/jlroots/$name";

test{
host.hostname = "test";
ip4.addr = lo0|127.0.0.2;
}

добавляем в /etc/rc.conf:
ifconfig_lo0="inet 127.0.0.1"#jails
jail2_enable="YES"
jail2_list="test"

запускаем клетку:

service jail2 start

любуемся:

jls

JID IP Address Hostname Path
2 127.0.0.2 test /jails/jlroots/test

подключаемся:

jexec -u root 2 /bin/csh

Клетка работает!




Комментариев нет:

Отправить комментарий