Лирика к сказанию о хостинге тут:
На чём строим:# uname -a
FreeBSD main.2net.local 13.0-RC5
В качестве враппера использую CBSD# pkg info | grep cbsd
cbsd-13.0.3 Yet another FreeBSD Jail, XEN and Bhyve Management Utility
Про установку самого CBSD есть отличная статья на Хабре
Оговорим, что для самих клеток у меня, средствами хост системы, создан бридж с ip адресом из пула для клеток, с него же я эти клетки выпускаю в инет, если надо, и через него клетки могут «общаться» друг с другом по ip.
Like that (c):cloned_interfaces="bridge0"
ifconfig_bridge0_name="jails_if"
ifconfig_jails_if="inet 172.16.0.100/24 up"
Таким образом, при создании клетки можно оставить interface: auto и ipv4_addr: DHCP, а cbsd сам назначит клетке свободный ip адрес и привяжет его к бриджу, фактически сделает: «ifconfig bridge0 ip_клетки alias» или в случае с vnet клеткой: «addm epair0»
Для корректной работы задуманного понадобится раскрыть некоторые устройства в клетки, а именно Berkeley Packet Filter. Добавим в конец /etc/devfs.conf:[devfsrules_jail=5]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add path 'bpf*' unhide
Этот набор правил, под номером 5 можно будет указать при создании vnet клеток, что бы внутри заработали всякие ping, traceroute, etc.
Таким же образом можно раскрывать и другие устройства, добавив например:add path 'tap' unhide
add path zfs unhide
По задумке, mysql server сидит в собственном jail и торчит в другие клетки только сокетом через nullfs, с этого и начнём, создадим клетку через: # cbsd jconstruct-tui
Руководство CBSD говорит, что надо «перебивать» пароль от root, т.к. по умолчанию он берёт хеш пароля root-a из хост системы, надо, так надо.

CBSD Позволяет монтировать файловые системы прямо в клетки при помощи nullfs, для каждой клетки создаётся файл в /usr/jails/jails-fstab/имя_клетки/fstab.local
В profile: default, при создании, nullfs в клетках включен, если нет, можно включить его через cbsd jconfig jname=имя_клетки в jail options -> nullfs
Под файлы БД у меня отдельный пул с томами, на отдельном ssd:# zfs list | grep data
data
data/jailed_mysql
data/www
Чтобы смонтировать его в клетку с mysql server, надо поправить файл:# cat /usr/jails/jails-fstab/mysql/fstab.local
/mnt/data/jailed_mysql /var/db/jailed_mysql nullfs rw 0 0
Запустим клетку, залогинимся и произнесём главную мантру всех бздэшников:# cbsd jstart mysql
# cbsd jlogin mysql# cd /usr/ports/databases/mysql56-server/ && make install clean
Наведём порядок:# mv /usr/local/my.cnf /usr/local/etc/mysql/
Чтобы не раскрывать весь /tmp клетки поменяем расположение сокета, также для выноса баз на отдельный ssd, поменяем расположение файлов БД.
В /etc/rc.conf:sshd_enable="NO"
sshd_flags="-oUseDNS=no"
syslogd_flags="-ss -c"
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
hostname="mysql.2net.local"
mysql_enable="YES"# Без этого убогий rc скрипт создаёт файлы БД по старому расположению и срать ему на my.cnf!!!
mysql_dbdir="/var/db/jailed_mysql/mysql"
В /usr/local/etc/mysql/my.cnf:[client]
socket = /tmp/mysql/mysql.sock
[mysqld]
socket = /tmp/mysql/mysql.sock
datadir = /var/db/jailed_mysql/mysql
tmpdir = /var/db/jailed_mysql/mysql_tmpdir
slave-load-tmpdir = /var/db/jailed_mysql/mysql_tmpdir
secure-file-priv = /var/db/jailed_mysql/mysql_secure
innodb_data_home_dir = /var/db/jailed_mysql/mysql
innodb_log_group_home_dir = /var/db/jailed_mysql/mysql
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLESskip-networking
В блоке [mysqld], всё, кроме sql_mode и skip-networking, нужно для удобного выноса баз на отдельный ssd, если это не планируется то и эти записи не нужны, как и mysql_dbdir в /etc/rc.conf.
skip-networking — нужен для отключения работы по ipv4, т.к. клетки в бридже и это потенциальная дыра.
Про создание zfs пулов, в т.ч. для баз mysql и скриптов сайтов я напишу отдельно, будет там:
Запускаем mysql server и проверяем:# /usr/local/etc/rc.d/mysql-server start
# sockstat | grep mysql
mysql mysqld 52312 18 stream /tmp/mysql/mysql.sock
# ps aux | grep mysql
mysql 51994 0.0 0.0 13624 0 - IWNsJ - 0:00.00 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-f....
mysql 52312 0.0 5.0 1217836 417412 - INJ 22:17 0:21.20 /usr/local/libexec/mysqld --defaults-extra-file=/usr/...
root 7289 0.0 0.0 12868 2124 5 SN+J 12:28 0:00.00 grep mysql
Зададим пароль root и удалим всех юзеров mysql без паролей:# mysql
mysql> grant all on *.* to root@localhost identified by 'ВАШ_ПАРОЛЬ';
mysql> connect mysql;
mysql> delete from user where Password='';
mysql> flush privileges;
На этом первая часть закончена.
2 комментария