Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Проблема с монтированием zfs в jail #213

Closed
sturican opened this issue Nov 23, 2017 · 25 comments
Assignees

Comments

@sturican
Copy link

@sturican sturican commented Nov 23, 2017

Mandatory info for bug reports:
Возможно я что-то не так делаю. Тогда просьба подсказать :)

cat fstab.pgbase.local
zroot/hosts/pgbase/pgsql /pgsql zfs rw 0 0

В настройках allow_zfs установлен.

При старте jail ошибка:

/hosts/tools/attachzfs: 81: Syntax error: ")" unexpected (expecting ";;")
jail: pgbase: /bin/sh -c /usr/local/bin/cbsd attachzfs fstab=/hosts/jails-fstab/fstab.pgbase.local jname=pgbase; : failed
pgbase: removed

Ошибка в самом attachzfs или это не так делается?
Мне нужно для postgresql свой датасет использовать.
Как это осуществить лучше?

p.s. Спасибо большое за CBSD, пользуюсь несколько лет :)

FreeBSD version ( uname -a ):
11.1-RELEASE FreeBSD 11.1-RELEASE #0 r321309: Fri Jul 21 02:08:28 UTC 2017 root@releng2.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC amd64

CBSD version ( cbsd version ):
11.1.6

@sturican sturican changed the title Проблема с монтированием дополнительного zfs в jail Проблема с монтированием zfs в jail Nov 23, 2017
@sturican

This comment has been minimized.

Copy link
Author

@sturican sturican commented Nov 23, 2017

ещё быть может будет полезно:

cat fstab.pgbase.local
#zroot/hosts/pgbase/pgsql /pgsql zfs rw 0 0
#/hosts/jails-data/pgbase-data/pgsql /usr/local/pgsql nullfs rw 0 0

комментарии видимо игнорируются? при запуске та же ошибка.

@olevole olevole self-assigned this Nov 23, 2017
@olevole

This comment has been minimized.

Copy link
Collaborator

@olevole olevole commented Nov 23, 2017

Это однозначно бяка. Посмотрю в ближайшее время, спс!
А есть возможность последнюю из портов поставить? 11.1.9 вроде. В ней этот кусок точно не менялся, но все равно лучше на последних все гонять:-)

@sturican

This comment has been minimized.

Copy link
Author

@sturican sturican commented Nov 23, 2017

Спасибо! Попробую. Там с 11.1.6 нужно мигрировать существующие джейлы или просто саму cbsd обновить?

@olevole

This comment has been minimized.

Copy link
Collaborator

@olevole olevole commented Nov 23, 2017

после обновки самого порта, надо cbsd initenv , как обычно

@olevole

This comment has been minimized.

Copy link
Collaborator

@olevole olevole commented Nov 23, 2017

Да, там в attachzfs просто глупая опечатка, нет ;; после return 3

https://github.com/cbsd/cbsd/blob/master/tools/attachzfs#L80

Попробуй в
/usr/local/cbsd/tools/attachzfs сразу после return 3 в этой строчке добавить ;;

и после, еще раз:

cbsd initenv

Должно поправиться.

  • надо иметь ввиду, что /pgsql примонтируется, только если jail с baserw=1 (или если ты вручную не добавил этот каталог в basejail/*)

Я через такую строчку проверил на baserw=0:

zroot/ROOT/pgsql /usr/local/pgsql zfs rw 0 0

(те, монтирую не в /pgsql а в /usr/local/pgsql, где в /usr/local есть RW чтобы создать каталог)

но внутри jail надо делать
zfs mount -a

Если я не ошибаюсь. Те, jail просто позволяет юзать конкретный датасет, а монтировать внутри уже надо или ручками, или это /etc/rc.d/.zfs сейчас сделает.

@sturican

This comment has been minimized.

Copy link
Author

@sturican sturican commented Nov 23, 2017

Блин, я ведь в attachzfs смотрел, не заметил ;; :) Поправил.
А то я уже тоже самое через master_ стартовые скрипты делал.

Всё работает, ещё раз спасибо!

@sturican

This comment has been minimized.

Copy link
Author

@sturican sturican commented Nov 23, 2017

Пока не получилось запустить монтирование до запуска сервиса postgresql.
На каком этапе происходят:

zfs set jailed=on $FS
zfs jail $jname $FS

?
Может на момент, когда запускается zfs mount -a это ещё не выполнено. Не могу побороть :(

@Dorlas

This comment has been minimized.

Copy link

@Dorlas Dorlas commented Nov 23, 2017

Запуск PostgreSQL в /etc/rc.conf.local пробовали переносить ?

@Dorlas

This comment has been minimized.

Copy link

@Dorlas Dorlas commented Nov 23, 2017

Есть еще технология выполнения pre_/post_ скриптов при запуске-остановке клеток - ее тоже можно использовать для монтирования:
https://www.bsdstore.ru/ru/11.1.x/wf_jconfig_ssi.html

@sturican

This comment has been minimized.

Copy link
Author

@sturican sturican commented Nov 23, 2017

rc.conf.local - не deprecated? попробую. Если есть пример как им пользоваться, буду признателен, раньше не было необходимости использовать.

pre_/post_ это речь о:

jails-system/jname/.... - скрипты для отработки внутри клетки при ее запуске. Аналог параметра exec.start оригинального jail.conf

Пробовал через этот механизм выполнить /sbin/zfs mount -a
при старте системы:

Execute script: zfsstart.sh
jexec: jail "jname=pgbase" not found

Сваливается непонятно почему, пока руками в джейле mount не сделаю, нет датасета.
Ну и старт происходит уже после попытки запуска postgre....

@olevole

This comment has been minimized.

Copy link
Collaborator

@olevole olevole commented Nov 23, 2017

rc.conf.local не депрекейтили. На самом деле,не понятно почему , почему я не сделал zfs mount средствами cbsd при создании jail, может из за страха что слишком много автоматизации:-) надо пересмотреть будет и наверное, воткнуть.

@olevole

This comment has been minimized.

Copy link
Collaborator

@olevole olevole commented Nov 23, 2017

Хотя... zfs_enable=YES - это есть внутри jail в rc.conf? Оно и регулирует /etc/rc.d/zfs ЕМНИП

@sturican

This comment has been minimized.

Copy link
Author

@sturican sturican commented Nov 24, 2017

cat fstab.pgbase.local
zroot/hosts/pgbase/pgsql /usr/local/pgsql zfs rw 0 0
я думал изначально, что оно как раз автоматом примонтируется, если бы такое когда нибудь впилили, было бы здорово :)

zfs_enable пробовал вчера, там ещё судя по /etc/rc.d/zfs нужно разрешить security.jail.mount_allowed, что тоже проделывал (кстати не уверен, насколько безопасно это для джейлов разрешать или всё-равно не jailed датасеты я подмонтировать не смогу, тогда может и ладно).
Всё это вкупе не дало результата, автомонтирования не произошло.

@alexey1234

This comment has been minimized.

Copy link

@alexey1234 alexey1234 commented Nov 24, 2017

@Привет всем
sturican, ты не можешь делегировать в джейл не джейлед датасеты никак.
Я посмотрю у себя в TheBrig как организовал делегирование, напишу алгоритм завтра, но тем не менее, проверь файл /etc/devfs.rules разрешено ли видеть из джейла девайс zfs и, если там разрешено, то проверь или applied правила для твоего джейла

@olevole

This comment has been minimized.

Copy link
Collaborator

@olevole olevole commented Nov 24, 2017

@alexey1234 Привет! С делегированием то все ок, там только zfs jail и allow mount должна быть по идее. Поскольку zfs mount -a в клетке все маунтит, видимо, проблемв только с запуском скрипта который маунтит. Я еще не успкл добраться до фряшки чтобы помотреть, /etc/rc.d/zfs это или нет. А в thebrig/freenas я так понимаю, автомат работает?

@alexey1234

This comment has been minimized.

Copy link

@alexey1234 alexey1234 commented Nov 24, 2017

Да, в Бриге я делал такой принцип

  1. В нормальном состоянии датасет, который планируется делегировать в джейл находится в нормальном состоянии, из основной системы доступен.
  2. Во время запуска джейла этот датасет скриптом объявляется jailed и передается джейлу.
  3. При остановке джейла датасет возвращается в исходную позицию.

Зы NAS4Free совершенно не FreeNas

Опять же, можно подмонтировать датасет через fstab, без делегирования полномочий.

ЗЫЗЫ
Добавь в rc.conf записи rc_debug="YES" rc_info="YES" и переадресуй консольку в файл для упрощения исследования процесса старта.

PSPSPS
Проверь security.jail.enforce_statfs. должен быть 0
и security.jail.param.enforce_statfs тоже должен быть 0

@olevole

This comment has been minimized.

Copy link
Collaborator

@olevole olevole commented Nov 24, 2017

@alexey1234 да, имел ввиду nas4free конечно:-). На выхах посмотрю про маунт

@alexey1234

This comment has been minimized.

Copy link

@alexey1234 alexey1234 commented Nov 25, 2017

Итак, посмотрел.
Датасет к делегированию подготавливается престарт командой
Делегирование датасета осуществляется в уже запущеный джейл посредством постстарт команд.
Иначе никак.
А так как джейл обычно стартует с командой /bin/sh /etc/rc, то вполне естественно rc скрипты запускаются до того, как делегируется датасет.
Поэтому я вижу 2 пути - первый написать постстарт команду запуска postgree , которая выполнится гарантированно после делегирования датасета
Второй - не делегировать датасет, а подмонтировать через fsab нужный датасет в джейл
Примерно так ( строка fstab конкретного джейл )
/mnt/tank/public /mnt/tank/app/thebrig/omega/mnt/public nullfs rw 0 0
где
/mnt/tank/public - точка монтирования датасета в основной системе
/mnt/tank/app/thebrig/omega/mnt/public - полный путь к точке монтирования в джейл, который называется omega. В самом джейле это будет заранее созданная папка /mnt/public

тип монтирования - nullfs

@olevole

This comment has been minimized.

Copy link
Collaborator

@olevole olevole commented Nov 25, 2017

Да, все верно - /etc/rc.d/zfs внутри jail отрабатывает как надо (делая zfs mount -a), просто раньше времени - тк на момент его отработки еще не сделан 'zfs jail' в хостере, который работает по jname или jid.

с nullfs не совсем честный вариант, с ним как такового allow_zfs и zfs attach в целом не нужен. Вероятно, zfs могут захотеть маунтить внутрь по причине zfs фич вроде snapshot.

Еще в у меня в CBSD была zfs mount -a: https://github.com/cbsd/cbsd/blob/v11.1.9/tools/makejconf#L101

только вставлена не в том месте - до запуска jail. Перенесу в postexec start, но то что написал @alexey1234 имеет силу - нужно через свой скрипт запускать postgres, который сработает уже после zfs mount.

В CBSD это можно сделать через https://www.bsdstore.ru/ru/11.1.x/wf_jconfig_ssi.html#execscript ( в master_poststart.d положить скрипт, который делает mount -a и следом service postgres onestart)

Но в целом решение - не фонтан ;-), не очень красивое. Все из-за того, что zfs jail требует уже рабочего jid.

@alexey1234

This comment has been minimized.

Copy link

@alexey1234 alexey1234 commented Nov 25, 2017

с nullfs не совсем честный вариант, с ним как такового allow_zfs и zfs attach в целом не нужен. Вероятно, zfs могут захотеть маунтить внутрь по причине zfs фич вроде snapshot.

Почему нечестный ? Вполне себе годный, он родился еще в эпоху первой версии Брига, тогда собственные средства FreeBSD очень криво работали с zfs
Опять же, запуск zfs хитрых комманд тоже как бы затруднен, потому как их запускают по крону, а ЕМНИП, крон внутри джейла не работает. По крайней мере я пишу задания наружному крону, который запускает команды внутри джейла - чешу правой рукой левое ухо

Посмотри функцию write_jailcommands ($out_jail)
https://github.com/fsbruva/thebrig/blob/alcatraz/conf/ext/thebrig/functions.inc#L851
Там php, но вполне читабельный и есть немного коментариев

@olevole

This comment has been minimized.

Copy link
Collaborator

@olevole olevole commented Nov 25, 2017

Почему нечестный ?

Имеется ввиду, что zfs jail он не требует, просто монтирование через доп. прослойку. Помню, во времена FreeBSD 9x у nullfs были большие проблемы с перфоменсом при локе, но kib ее успешно порешал.

Чтобы крон внутри jail не работал - это что-то новенькое, раньше он точно работал.

olevole added a commit that referenced this issue Nov 25, 2017
…ion and boot sequence

Issue #213:
mountfstab determines that the jail is using zfs and creates the appropriate file.
when this file exist jail created in persist mode, mount zfs and then run default exec_start command;

refind: dont scan shim.efi. This make possible to boot Linux Kubuntu

bumb CBSD version: prepare for 11.1.10
@olevole

This comment has been minimized.

Copy link
Collaborator

@olevole olevole commented Nov 25, 2017

в рамках 5b3eb73 - попытка решить эту проблему - возможно, это меньшее зло. Как работает: для выполнения 'zfs jail' требуется jid, можно попробовать разбить атомарность создания jail и '/bin/sh /etc/rc' последовательности - воспользоваться флагом persist и создать jail без какой-либо команды на старт. Имея клетку созданной, выполняем zfs attach + mount и только потом запускаем отложенную exec.start команду. Посмотрим, будет ли это что-то ломать, в 11.1.10 думаю это зарелизить в ближайшее время.

@alexey1234

This comment has been minimized.

Copy link

@alexey1234 alexey1234 commented Nov 26, 2017

воспользоваться флагом persist и создать jail без какой-либо команды на старт

Годно. В Бриге так работают клетки с vnet. Кстати, по итогам дискуссии придумал переделку для брига

@sturican

This comment has been minimized.

Copy link
Author

@sturican sturican commented Nov 27, 2017

Спасибо большое!

Обновил cbsd - всё отлично работает.

@olevole

This comment has been minimized.

Copy link
Collaborator

@olevole olevole commented Nov 29, 2017

ю велкам, жду новых багов)

@olevole olevole closed this Nov 29, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
4 participants
You can’t perform that action at this time.