понедельник, 31 декабря 2012 г.

Инициализация Postgres в FreeBSD Jail и в Warden

Когда я попробовал вызвать скрипт 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, чтобы он был уникальным в каждой тюрьме:
$ 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. Что позволяет нам легко решить нашу проблему. Вот наши действия по шагам:
  1. Обновляем настройки хоста, чтобы jail мог работать с raw socket
    1. Создаём или редактируем /etc/sysctl.conf:
    2. Code:
      # for postgresql jail
      security.jail.allow_raw_sockets=1
      kern.ipc.shmall=65536
      kern.ipc.shmmax=134217728
      kern.ipc.semmap=4096
    3. Перезагружаемся
  2. Создаём нашу тюрьму при помощи warden
    1. Используем новую возможность "установить" флаг
    2. Code:
      # warden set flags xxx.yyy.zzz.ttt allow.raw_sockets=true,allow.sysvipc=true
    3. Заходим в тюрьму и устанавливаем postgresql (или делаем это через GUI)
    4. Code:
      # cd /usr/ports/databases/postgresql
      # make install clean
    5. Добавляем автозапуск
    6. Code:
      postgresql_enable="YES"
Готово!

Комментариев нет:

Отправить комментарий