Много клеток хороших и разных. Под таким слоганом я занялся обустройством клеток для новых пациентов. Но немного поясню о чем будет идти речь. Мне нужны были несколько клеток для разделения программ по серверам, для тестовых работ, а так же:
И так немного истории. Jail является потомком chroot и имеет поддержку на уровне ядра и мы можем ограничивать некоторые ресурсы потребляемые клеткой, а так же привязываем её к определенному IP адресу с определенным именем хоста и определенным местом корневого каталога. Получаем изолированные процессы - клетки, в которых вы можете делать, что хотите и это не повлияет на основную систему.
Необходимо провести несколько манипуляций:
bsd# setenv D /usr/home/jails/test.local bsd# mkdir -p $D bsd# cd /usr/src bsd# make buildworld bsd# make installworld DESTDIR=$D bsd# make distribution DESTDIR=$D bsd# mount -t devfs devfs $D/dev
1. Укажем переменную имени к окружению.
2. Создадим домашнюю директорию по переменной.
5. Заполним каталог поддерева необходимыми двоичными файлами, библиотеками, справочниками и так далее.
6. Установим все необходимые файлы из /usr/src/etc/ и /etc в каталог клетки $D/etc/.
# Значения для всех клеток jail_enable="YES" # Включаем jail jail_interface="em0" # Сетевой интерфейс jail_devfs_enable="YES" # Монтируем devfs в клетках jail_procfs_enable="YES" # Монтируем procfs в клетках jail_set_hostname_allow="YES" # Список клеток jail_list="test" # Имя клеток через пробел для списка клеток # Значения для созданной клетки "test" jail_test_rootdir="/usr/home/jails/test.local" # Рутовая директория jail jail_test_hostname="test.local" # Имя хоста клетки jail_test_ip="192.168.0.4" # IP адрес хоста клетки #jail_test_interface="em0" # Сетевой интерфейс клетки (если нужен) #jail_test_devfs_enable="YES" # Монтируем devfs в клетке #jail_test_procfs_enable="YES" # Монтируем procfs в клетке jail_test_exec_start="/bin/sh /etc/rc" jail_test_exec_stop="/bin/sh /etc/rc.shutdown" jail_test_flags="-l -U root" # Необходимые флаги для клетки
Необходимо создать сетевые алиасы для ваших клеток. Они нужны чтобы клетки могли корректно работать в сети. Алиасы создаются на материнской системе:
bsd# cat /etc/rc.conf |grep if ifconfig_em0="inet 192.168.0.2 netmask 255.255.255.0" # Алиас для первой клетки ifconfig_em0_alias0="inet 192.168.0.4 netmask 255.255.255.255"
Для запуска всех клеток используйте:
bsd# /etc/rc.d/jail start bsd# /etc/rc.d/jail stop
bsd# /etc/rc.d/jail start test bsd# /etc/rc.d/jail stop test
Выведем список работающих клеток:
bsd# jls JID IP Address Hostname Path 1 192.168.0.4 test.local /usr/home/jails/test.local 2 192.168.0.5 jabber.local /usr/home/jails/jabber.local
Зайдем в первую клетку:
bsd# jexec 1 tcsh test#
Создадим в клетке пустой файл /etc/fstab чтобы при ее запуске не появлялось сообщение об отсутствующем файле fstab.
bsd# touch /home/jails/test.local/etc/fstab
Выключите в клетке port mapper.
bsd# cat /home/jails/test.local/etc/rc.conf |grep rpcbind rpcbind_enable="NO"
Настроим resolv.conf так, чтобы разрешение имен в клетке работало правильно. Создадим в клетке файл с нужным DNS сервером или скопируем с основной машины в клетку.
bsd# cat /home/jails/test.local/etc/resolv.conf nameserver 192.168.0.1
Запустим в клетке newaliases чтобы при запуске не появлялось сообщение от sendmail.
test# /etc/mail/ && newaliases
Отключим сетевой конфигурационный интерфейс чтобы при запуске не появлялось сообщение от ifconfig.
bsd# cat /home/jails/test.local/etc/rc.conf |grep network network_interfaces = ""
Обязательно измените пароль root в клетке (сделайте отличным от основной машины).
Создадим нового пользователя. Для этого есть штатная утилита jexec с помощью нее мы добавим нового пользователя состоящего в группе wheel [цифра это JID клетки]:
bsd# jexec 1 adduser Username: alex Full name: Alex Ign Uid (Leave empty for default): Login group [alex]: Login group is alex. Invite alex into other groups? []: wheel Login class [default]: Shell (sh csh tcsh nologin) [sh]: csh Home directory [/home/alex]: Home directory permissions (Leave empty for default): Use password-based authentication? [yes]: Use an empty password? (yes/no) [no]: Use a random password? (yes/no) [no]: Enter password: Enter password again: Lock out the account after creation? [no]: Username : alex Password : ***** Full Name : Alex Ign Uid : 1003 Class : Groups : alex wheel Home : /home/alex Home Mode : Shell : /bin/csh Locked : no OK? (yes/no): yes adduser: INFO: Successfully added (alex) to the user database. Add another user? (yes/no): no Goodbye!
Для работы с клеткой посредством ssh необходимо настроить демон sshd.
Для этого на основной машине в /etc/ssh/sshd_config укажем нужный для прослушивания IP.
bsd# cat /etc/ssh/sshd_config | grep ListenAddress #ListenAddress 0.0.0.0 ListenAddress 192.168.0.2 #ListenAddress ::
bsd# /etc/rc.d/sshd restart bsd# sockstat -l |grep sshd root sshd 1216 3 tcp4 192.168.0.4:22 *:* root sshd 978 3 tcp4 *:22 *:*
bsd# cat /home/jails/test.local/etc/rc.conf |grep sshd sshd_enable="YES"
Установите нужную временую зону в клетке.
Экспортируем существующие порты в клетку. Вы можете также скопировать их в нужную директорию или создать симлинк.
bsd# mkdir /home/jails/test.local/usr/ports bsd# mount_nullfs /usr/ports /home/jails/test.local/usr/ports bsd# cat /etc/fstab |grep jail /usr/ports /home/jails/test.local/usr/ports nullfs rw 0 0
Вы можете настроить некоторые переменные sysctl в основной системе для настройки работы клеток.
Для некоторого ограничения ресурсов клетки используйте совместно с ограничениями в /etc/login.conf ;)
Написать о самописном скрипте или о порте который может управлять клетками?
Теперь вы можете создавать и работать с клетками. Есть конечно недостатки клеток такие как отсутствие ограничений на использование ресурсов процессора или памяти без серьезной распилки и применения специальных патчей и многое другое. Но зато все работает нативно и быстро в данном случае мы добились желаемого.
Написал краткую справку об обновлении локальных и удаленных серверов в пределах одной ветки.
Сначала вам нужно обновить исходные коды системы, и мы будем использовать штатные средства операционной системы csup. Конфигурационный файл готов, его необходимо скопировать и изменить, он находится в директории:
# cd /usr/share/examples/cvsup/ # ls README gnats-supfile refuse.README www-supfile cvs-supfile ports-supfile stable-supfile doc-supfile refuse standard-supfile
Укажем нужную версию операционной системы.
В существующем конфигурационном файле стоит текущая версия.
# cat standard-supfile | grep default *default host=CHANGE_THIS.FreeBSD.org *default base=/var/db *default prefix=/usr *default release=cvs tag=RELENG_7_1 *default delete use-rel-suffix *default compress src-all
Скопируем файл и немного изменим:
# cp standard-supfile standard-supfile-RELENG_8_2 # cat standard-supfile-RELENG_8_2 | grep default *default host=CHANGE_THIS.FreeBSD.org *default base=/var/db *default prefix=/usr *default release=cvs tag=RELENG_8_2 *default delete use-rel-suffix *default compress src-all
Теперь нам необходимо синхронизировать src делается просто:
# /usr/bin/csup -h cvsup4.ru.freebsd.org -g -L 2 \ /usr/share/examples/cvsup/standard-supfile-RELENG_8_2
Когда синхронизация завершилась, приступим к обновлению системы (не забываем прочитать файл UPDATING чтобы все прошло гладко). Предупреждаю, что сначала мы будем устанавливать, ядро GENERIC и если все пройдет гладко и вы протестируете хотя бы один день сервер то можете, скомпилируйте свое ядро.
Очистим директории, от предыдущего мусора соберем мир и ядро и установим ядро:
# cd /usr/obj ;chflags -R noschg * ;rm -rf * # cd /usr/src # make -j4 buildworld # make -j4 buildkernel KERNCONF=GENERIC # make installkernel KERNCONF=GENERIC
Теперь начинаются различия обновления локального и удаленного серверов. Рассмотрим два этих варианта:
Для безопасного и корректного обновления необходимо ввести машину в single mode можно сделать двумя способами:
# shutdown -r now
# shutdown now
При удаленном обновлении вы не должны вводить машину в single mode, если вы случайно это сделаете то потеряете связь с машиной.
В виду вышесказанного необходимо действовать так:
Можно и самим остановить эти службы без перезагрузки системы.
При запуске системы в нашем случае это локальный сервер необходимо смонтировать корневой каталог и остальные разделы, а при удаленном сервере нет необходимости в монтировании каталогов. А так же запустим mergemaster для создания начальной точки работы:
# /sbin/mount -u / # /sbin/mount -a # csh # su # mergemaster -p
Установим мир и удалим старые файлы.
# cd /usr/src # make installworld # make delete-old
yes | make delete-old
Запустим mergemaster для синхронизации файлов, библиотек, конфигурационных файлов с новыми версиями.
# mergemaster -cv (c-контекстный diffs вместо унифицированного)
Есть несколько вариантов управления и в низу mergemaster предлагают следующие варианты работы с текущим файлом:
При построчном сравнивании экран делится на две части, слева строки из старого файла, а справа из предлагаемого. При нажатии на "Enter" выводятся возможные варианты последующих действий:
и т.д.
После того как сравнение файла закончилось, предлагаются следующие варианты:
Бывает, что с новой версией системы появляются новые файлы, которых до этого не было. В таком случае предлагается 2 варианта:
И так сравниваются все файлы.
Когда закончите, объединять файлы перезапустите систему и удалите старые библиотеки, а так же проверьте версию системы:
# shutdown -r now # cd /usr/src/ # make delete-old-libs # uname -a FreeBSD bsd.ampul.local 8.2-RELEASE FreeBSD 8.2-RELEASE #1: Tue May 19 09:55:51 MSD 2009 Raven2000@bsd.ampul.local:/usr/obj/usr/src/sys/MYKERNEL i386
/usr/bin/csup -h cvsup4.ru.freebsd.org -g -L 2 /usr/share/examples/cvsup/ports-supfile \ && cd /usr/ports/ && make fetchindex
Обновление по крону
# crontab -l |grep csup 1 8 * * * (/usr/bin/csup -h cvsup4.ru.freebsd.org -g -L 2 \ /usr/share/examples/cvsup/ports-supfile \ && cd /usr/ports/ && make fetchindex) >/dev/null 2>&1
В. Не запускаются программы требуют старые библиотеки
О. Есть два варианта. Пересобрать ПО или установить библиотеки нужной версии ОС:
# /usr/ports/misc/compat compat3x/ compat4x/ compat5x/ compat6x/ compat7x/
Для этого нам необходимо откорректировать ядро.
Копируем ядро GENERIC под другим именем и редактируем:
cp /usr/src/sys/i386/conf/GENERIC /usr/src/sys/i386/conf/CUSTOM vi /usr/src/sys/i386/conf/CUSTOM
Добавляем следующее:
options VGA_WIDTH90 options VESA # Добавить поддержку растрового режима options SC_PIXEL_MODE # Цвет консольного шрифта options SC_NORM_ATTR="(FG_LIGHTGREEN|BG_BLACK)" # Цвет выделенного консольного шрифта options SC_NORM_REV_ATTR="(FG_YELLOW|BG_GREEN)" # Цвет сообщений ядра options SC_KERNEL_CONS_ATTR="(FG_YELLOW|BG_BLACK)" # Цвет выделенных сообщений ядра options SC_KERNEL_CONS_REV_ATTR="(FG_BLACK|BG_RED)"
Выводим список возможных разрешений:
vidcontrol -i mode
vidcontrol MODE_XXX #(XXX) номер режима
vi /etc/rc.conf
allscreens_flags="MODE_XXX"
echo 'set prompt="(%l)[%{\033[36m%}`whoami`@%{\033[1;33m%}%m:%{\033[0;32m%}%~%{\033[0m%}]%# "' >> ~/.cshrc
vi ~/.cshrc
set COLORLOGIN="%{\033[36m%}" if( `whoami` == root ) then set COLORLOGIN="%{\e[00;31m%}" endif set prompt="(%l)[$COLORLOGIN`whoami`%{\033[36m%}@%{\033[1;33m%}%m:%{\033[0;32m%}%~%{\033[0m%}]%# "
для этого надо:
vi /boot/loader.conf
autoboot_delay="4" #задержка перед запуском в секундах loader_logo="beastie" #чертёнок вместо надписи FreeBSD splash_bmp_load="YES" bitmap_load="YES" bitmap_name="/boot/splash.bmp"
sysinstall
>Configure >Console
В завершении укажем язык пользователя. pw usermod root -L russian pw usermod <user> -L russian
vi ~/.cshrc
alias ls ls -GAFfawlh #флаг G - цветной вывод команды alias df df -h #вывод в более приемлемом виде (Kb,Mb,Gb) alias halt halt -p #аналог shutdown -p now alias top top -s 1 #обновление раз в секунду alias grep grep --colour=auto #при условии установленного colorize "/usr/ports/sysutils/colorize" #alias tail "/usr/bin/tail \!* | /usr/local/bin/colorize" #alias cat "/bin/cat \!* | /usr/local/bin/colorize"
vi ~/.cshrc
setenv EDITOR ee
vi ~/.cshrc
set autolist #выводит листинг при первом нажатии TAB
set autolist = ambiguous #выводит листинг при втором нажатии TAB
Ставим zsh
pkg_add -r zsh
cd /usr/ports/shells/zsh ; make install clean
chsh -s /usr/local/bin/zsh
vi ~/.zshrc
bindkey "^[[2~" yank bindkey "^[[3~" delete-char bindkey "^[[5~" up-line-or-history bindkey "^[[6~" down-line-or-history bindkey "^[[7~" beginning-of-line bindkey "^[[8~" end-of-line bindkey "^[e" expand-cmd-path bindkey "^[[A" up-line-or-search bindkey "^[[B" down-line-or-search bindkey " " magic-space PROMPT=$'%{\e[1;32m%}[%{\e[1;34m%} %n@%M %/ %{\e[1;32m%}] %{\e[1;31m%}%# %{\e[0m%}' RPROMPT=$'%{\e[1;32m%}[%{\e[1;34m%} %T %{\e[1;32m%}]%{\e[0m%}' alias df='df -h' alias ls='ls -GAFfawl' alias top='top -s 1' EDITOR=/usr/bin/ee export EDITOR