igNix.ru
Опубликовано igNix.ru (http://www.ignix.ru)

Главная > Версия для печати > Версия для печати

Настройка

Ваша оценка: Нет Средняя: 5 (9 голосов)

Jail - механизм виртуализации в системе FreeBSD

Много клеток хороших и разных. Под таким слоганом я занялся обустройством клеток для новых пациентов. Но немного поясню о чем будет идти речь. Мне нужны были несколько клеток для разделения программ по серверам, для тестовых работ, а так же:

  • Имеется незагруженный сервер который может дать большое кол-во ресурсов.
  • Нежелание засорять систему программами которые можно было вынести на другие сервера.
  • Иметь тестовый полигон на реальном железе.

Содержание:

  • Введение
  • Создание клетки
    • Конфигурация rc.conf
    • Конфигурация сети
  • Запуск
  • Дополнительная настройка
    • Окружение
    • Экспорт портов
  • Ограничения
  • Автоматизируем птицеферму
  • Заключение

Введение

И так немного истории. Jail является потомком chroot и имеет поддержку на уровне ядра и мы можем ограничивать некоторые ресурсы потребляемые клеткой, а так же привязываем её к определенному IP адресу с определенным именем хоста и определенным местом корневого каталога. Получаем изолированные процессы - клетки, в которых вы можете делать, что хотите и это не повлияет на основную систему.

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

Необходимо провести несколько манипуляций:

  1. bsd# setenv D /usr/home/jails/test.local
  2. bsd# mkdir -p $D
  3. bsd# cd /usr/src
  4. bsd# make buildworld
  5. bsd# make installworld DESTDIR=$D
  6. bsd# make distribution DESTDIR=$D
  7. bsd# mount -t devfs devfs $D/dev

1. Укажем переменную имени к окружению.
2. Создадим домашнюю директорию по переменной.
5. Заполним каталог поддерева необходимыми двоичными файлами, библиотеками, справочниками и так далее.
6. Установим все необходимые файлы из /usr/src/etc/ и /etc в каталог клетки $D/etc/.

Конфигурация rc.conf

# Значения для всех клеток
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#

Все готово, теперь вы можете настроить клетку как вам угодно и приступить к установке нужных пакетов. Но для корректной работы вам необходимо дополнительно настроить созданную клетку.

Дополнительная настройка

Окружение

FSTAB

Создадим в клетке пустой файл /etc/fstab чтобы при ее запуске не появлялось сообщение об отсутствующем файле fstab.

bsd# touch /home/jails/test.local/etc/fstab

PORT MAPPER

Выключите в клетке port mapper.

bsd# cat /home/jails/test.local/etc/rc.conf |grep rpcbind
rpcbind_enable="NO"

RESOLV

Настроим resolv.conf так, чтобы разрешение имен в клетке работало правильно. Создадим в клетке файл с нужным DNS сервером или скопируем с основной машины в клетку.

bsd# cat /home/jails/test.local/etc/resolv.conf
nameserver 192.168.0.1

SENDMAIL

Запустим в клетке newaliases чтобы при запуске не появлялось сообщение от sendmail.

test# /etc/mail/ && newaliases

IFCONFIG

Отключим сетевой конфигурационный интерфейс чтобы при запуске не появлялось сообщение от 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

Для работы с клеткой посредством 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                  *:*

Добавим в конфигурационный файл rc.conf клетки.
bsd# cat /home/jails/test.local/etc/rc.conf |grep sshd
sshd_enable="YES"

TIMEZONE

Установите нужную временую зону в клетке.

Экспорт портов

Экспортируем существующие порты в клетку. Вы можете также скопировать их в нужную директорию или создать симлинк.

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 в основной системе для настройки работы клеток.

  1. security.jail.set_hostname_allowed: 1 # Возможность менять hostname внутри клетки.
  2. security.jail.socket_unixiproute_only: 1 # Создавать сокет в клетке можно только для PF_LOCAL, PF_INET или PF_ROUT иначе, возвращается ошибка
  3. security.jail.sysvipc_allowed: 0 # Возможность использовать System V IPC
  4. security.jail.enforce_statfs: 2 # Возможность видеть клетке все смонтированные устройства
  5. security.jail.allow_raw_sockets: 0 # Возможность использования низкоуровневых сокетов (ping и тп)
  6. security.jail.chflags_allowed: 0 # Возможность менять системные флаги файлов
  7. security.jail.jailed: 0 # Видеть список запущенных клеток
  8. security.jail.getfsstatroot_only: 1 # - клетка получает только информацию о ФС, например, возвращается df, для корневой файловой системы.

Для некоторого ограничения ресурсов клетки используйте совместно с ограничениями в /etc/login.conf ;)

Автоматизируем птицеферму

Написать о самописном скрипте или о порте который может управлять клетками?

Заключение

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

Дополнительные материалы
Ссылки: 
Ветка форума
Handbook - Arch
Ваша оценка: Нет Средняя: 5 (33 голоса)

Локальное и удаленное обновление FreeBSD

Написал краткую справку об обновлении локальных и удаленных серверов в пределах одной ветки.

Обновление csup

Сначала вам нужно обновить исходные коды системы, и мы будем использовать штатные средства операционной системы 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 можно сделать двумя способами:

  • Перезагрузкой и выбором в стартовом меню загрузку в single mode (номер 4).
    # shutdown -r now
  • Или напрямую активировать данный режим:
    # shutdown now

Удаленный сервер

При удаленном обновлении вы не должны вводить машину в single mode, если вы случайно это сделаете то потеряете связь с машиной.
В виду вышесказанного необходимо действовать так:

  • Отключить в /etc/rc.conf все службы, в которых нет необходимости для запуска системы это СУБД, FTP, Apache и т.д. (sshd не выключать!)
  • Перезагрузить сервер

Можно и самим остановить эти службы без перезагрузки системы.

Продолжаем обновление

При запуске системы в нашем случае это локальный сервер необходимо смонтировать корневой каталог и остальные разделы, а при удаленном сервере нет необходимости в монтировании каталогов. А так же запустим 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 для синхронизации файлов, библиотек, конфигурационных файлов с новыми версиями.

# mergemaster -cv   (c-контекстный diffs вместо унифицированного)

mergemaster сравнивает существующие конфигурационные файлы с теми, которые предлагаются новой версией FreeBSD. И если существуют отличия, то появляется сообщение об этом. Первой строкой в нем идет имя файла, который не соответствует новым требованиям, а ниже сами отличия.
Знаки:

  • - - этим знаком помечаются строки, которые mergemaster собирается удалить.
  • + - этим знаком помечаются строки, которые будут добавлены.

Есть несколько вариантов управления и в низу mergemaster предлагают следующие варианты работы с текущим файлом:

  • d - удалить предлагаемый вариант оставить старый.
  • i - установить предлагаемый вариант, удалив старый.
  • m - сравнить и объединить при необходимости построчно старый и новый вариант.
  • v - посмотреть отличия в файлах снова.

При построчном сравнивании экран делится на две части, слева строки из старого файла, а справа из предлагаемого. При нажатии на "Enter" выводятся возможные варианты последующих действий:

  • l - использовать вариант с левой стороны.
  • r - использовать вариант с правой стороны.

и т.д.

После того как сравнение файла закончилось, предлагаются следующие варианты:

  • i - установить получившийся файл.
  • r - повторить сравнение снова.
  • v - просмотреть получившийся файл.

Бывает, что с новой версией системы появляются новые файлы, которых до этого не было. В таком случае предлагается 2 варианта:

  • d - удалить предлагаемый вариант и оставить старый.
  • i - установить предлагаемый вариант, удалив старый.

И так сравниваются все файлы.

Завершение

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

# 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/

Дополнительные материалы
Ссылки: 
>>ВЕТКА ФОРУМА<<
Ваша оценка: Нет Средняя: 4.9 (16 голосов)

Настройка консоли

Для начала:
  • заменяем стандартные цвета консоли (серый на чёрном) на (светло зелёный на чёрном)>
  • меняем разрешения c 720x400 на 1024x768
  • настраиваем splash - графическая картинка при загрузке системы
  • локализуем консоль
  • настраиваем shell
  • работаем под root'ом
  • используем i386 платформу
  • в версии 8.1 amd64 уже работает

Для этого нам необходимо откорректировать ядро.
Копируем ядро 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)"

Собираем и устанавливаем ядро.

Настроим подходящее разрешение, и set prompt

Выводим список возможных разрешений:

vidcontrol -i mode

в указанном списке выбираем то, что нравится, и пробуем:
vidcontrol MODE_XXX #(XXX) номер режима

Указываем чтобы наш режим стартовал на всех консолях при загрузки системы.
vi /etc/rc.conf

allscreens_flags="MODE_XXX"

Делаем set prompt цветным:

надо выполнять для каждого пользователя отдельно
echo 'set prompt="(%l)[%{\033[36m%}`whoami`@%{\033[1;33m%}%m:%{\033[0;32m%}%~%{\033[0m%}]%# "' >> ~/.cshrc

Можно сделать чтобы root был подсвечен красным, а все остальные светлосиним
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%}]%# "

При желании можно настроить splash.

для этого надо:

vi /boot/loader.conf

autoboot_delay="4" #задержка перед запуском в секундах
loader_logo="beastie" #чертёнок вместо надписи FreeBSD
splash_bmp_load="YES"
bitmap_load="YES"
bitmap_name="/boot/splash.bmp"

и положить свой файл (картинку) в /boot/

Локализация консоли:

sysinstall

>Configure >Console

>Font экранный шрифт - IBM 866
>Keymap раскладка клавиатуры - Russia KOI8-R
>Screenmap таблица перекодировки - KOI8-R to IBM866
>Ttys тип терменала - KOI8-R cons25r
В завершении укажем язык пользователя.
pw usermod root -L russian
pw usermod <user> -L russian

После перезагрузки консоль начнет говорить с вами по русски.

Настройка shell:

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 на ee или mcedit

для этого надо указать нужный нам редактор в поле setenv EDITOR
vi ~/.cshrc 

setenv  EDITOR  ee

для того чтобы, при нажатии TAB выводился список возможных вариантов после автодополнение (когда вариантов автодополнение больше одного), нужно добавить такой параметр:
vi ~/.cshrc 

set autolist #выводит листинг при первом нажатии TAB

set autolist = ambiguous #выводит листинг при втором нажатии TAB

Настройка zsh:

Ставим zsh

pkg_add -r zsh

либо
cd /usr/ports/shells/zsh ; make install clean

Устанавливаем zsh оболочкой по умолчанию:
chsh -s /usr/local/bin/zsh

И настраиваем 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

Дополнительные материалы
Ссылки: 
Ветка форума
Ваша оценка: Нет Средняя: 4.3 (8 голосов)

Источник (получено 16/06/2025 - 00:54): http://www.ignix.ru/book/freebsd/setup