Когда я попробовал вызвать скрипт Postgres rc.d c аргументом initdb, я получил сообщение об ошибке, связанное, как я потом понял, с тем, что я пытался сделать это в тюрьме. Ошибка была связана с общей памятью:
creating template1 database in /usr/local/pgsql/data/base/1 ... FATAL: could not create shared memory segment: Function not implemented
Решение было найдено на замечательном FreeBSD Diary. Оказывается, мне нужно было изменить настройки sysctl на хосте, не в самой тюрьме, для того, чтобы разрешить операции с общей памятью. Для этого выполните
[tykling@wackbox ~]$ sudo sysctl security.jail.sysvipc_allowed=1
чтобы изменить текущее значение, и добавьте
security.jail.sysvipc_allowed=1
в /etc/sysctl.conf, чтобы это изменение сохранилось и после перезагрузки. Мне не потребовалось перезапускать тюрьму или делать ещё что-то после этих изменений, всё тут же сразу заработало. Кроме того, я добавил в этот rc.conf строку jail_sysvipc_allow="YES", чтобы разрешить PostgreSQL использовать общую память в тюрьме.
Позже я обнаружил, что если я запускаю несколько Postgres серверов в разных тюрьмах на одном и том же физическом хосте FreeBSD, я должен внести ещё несколько изменений. Во-первых, опять же из той же статьи на FreeBSD Diary, я узнал, что uid pgsql пользователя в тюрьмах должен отличаться или различные Postgres процессы будут повреждать общую память. Так что я использовал vipw для изменения uid, чтобы он был уникальным в каждой тюрьме:
Ещё проблемы с общей памятью. Когда я запускаю несколько экземпляров Postgres на одном сервере в тюрьмах, то количество общей памяти, выделяемой FreeBSD для этого оказывается недостаточным. Вот решение, которое я нашёл. Я не люблю просто копипастить всё, что пишут в интернете в свои конфиги; я стараюсь понять смысл каждой строки, перед тем, как t/ использовать. Но в этом случае я не имею никакого представления о том, правильно ли то, что тут указано и что вообще это делает (кроме того факта, что это связано с общей памятью). Часть этого из FreeBSD Diary, что-то из рассылок и блогов:
Позже я обнаружил, что если я запускаю несколько Postgres серверов в разных тюрьмах на одном и том же физическом хосте FreeBSD, я должен внести ещё несколько изменений. Во-первых, опять же из той же статьи на FreeBSD Diary, я узнал, что uid pgsql пользователя в тюрьмах должен отличаться или различные Postgres процессы будут повреждать общую память. Так что я использовал vipw для изменения uid, чтобы он был уникальным в каждой тюрьме:
$ cat /usr/jails/*/etc/passwd | grep pgsql pgsql:*:2070:2070:PostgreSQL Daemon:/usr/local/pgsql:/bin/sh pgsql:*:1070:1070:PostgreSQL Daemon:/usr/local/pgsql:/bin/sh pgsql:*:70:70:PostgreSQL Daemon:/usr/local/pgsql:/bin/shТут у меня есть три разные тюрьмы на одной машине, в каждой запущен Postgres и никто никому не мешает.
Ещё проблемы с общей памятью. Когда я запускаю несколько экземпляров Postgres на одном сервере в тюрьмах, то количество общей памяти, выделяемой FreeBSD для этого оказывается недостаточным. Вот решение, которое я нашёл. Я не люблю просто копипастить всё, что пишут в интернете в свои конфиги; я стараюсь понять смысл каждой строки, перед тем, как t/ использовать. Но в этом случае я не имею никакого представления о том, правильно ли то, что тут указано и что вообще это делает (кроме того факта, что это связано с общей памятью). Часть этого из FreeBSD Diary, что-то из рассылок и блогов:
$ cat /etc/sysctl.conf | egrep -i "ipc|postgres" # for more shared memory for jails/PostgreSQL kern.ipc.shmall=65536 kern.ipc.shmmax=134217728 kern.ipc.semmap=4096 $ cat /boot/loader.conf | egrep -i "ipc|postgres" #for shared memory for postgresql kern.ipc.shmmni=2048 kern.ipc.shmseg=2048 kern.ipc.semaem=32767 kern.ipc.semvmx=65534 kern.ipc.semusz=184 kern.ipc.semume=80 kern.ipc.semopm=200 kern.ipc.semmsl=120 kern.ipc.semmnu=4096 kern.ipc.semmns=8192 kern.ipc.semmni=32767 kern.ipc.semmap=60Всё это касается хоста, не тюрем. После этих манипуляций у меня получилось запустить initdb без каких-либо проблем.
Источник
Для тех, кто использует Warden
Так как вчера вышла версия 9.1-RC3, у нас появились новые возможности относительно jail / warden. И одна из этих возможностей - устанавливать некоторые переменные для окружения jail. Что позволяет нам легко решить нашу проблему. Вот наши действия по шагам:
- Обновляем настройки хоста, чтобы jail мог работать с raw socket
- Создаём или редактируем /etc/sysctl.conf:
- Перезагружаемся
- Создаём нашу тюрьму при помощи warden
- Используем новую возможность "установить" флаг
- Заходим в тюрьму и устанавливаем postgresql (или делаем это через GUI)
- Добавляем автозапуск
Code:
|
# for postgresql jail security.jail.allow_raw_sockets=1 kern.ipc.shmall=65536 kern.ipc.shmmax=134217728 kern.ipc.semmap=4096 |
Code:
|
# warden set flags xxx.yyy.zzz.ttt allow.raw_sockets=true,allow.sysvipc=true |
Code:
|
# cd /usr/ports/databases/postgresql # make install clean |
Code:
|
postgresql_enable="YES" |
Готово!
Комментариев нет:
Отправить комментарий