Назад | Перейти на главную страницу

Как избавиться от «Не удалось подключиться к базе данных» в Linux и libnss-pgsql2?

Я использую libnss-pgsql2, чтобы пользователи виртуальной системы хранились в базе данных PostgreSQL. Виртуальные пользователи в базе данных работают нормально. Они могут войти в систему. Я могу видеть их uid, gid, группы с помощью команды id. Пример:

# id backup001
uid=10001(backup001) gid=10001(backup001) groups=10001(backup001)

Однако в системах, в которых я использую libnss, я часто получаю эту ошибку:

Could not connect to database

Это часто случается, например, с заданиями cron. У меня есть одно задание cron, которое запускается каждый час и сбрасывает базы данных postgresql в резервную копию. Контраб такой:

04 *  *   *   *     postgres umask 077 && /usr/bin/pg_dumpall | gzip > ~postgres/backup/postgresql-complete-dump-$(date +\%H).sql.gz

Это задание всегда вызывает ошибку. Таким образом, каждый час засыпая меня электронной почтой.

Моя настройка довольно проста: макет таблицы, который я использую для хранения пользователей, доступен здесь: http://p.adora.dk/P2486.html

Я использую Debian Squeeze на сервере.

Соответствующие файлы конфигурации: nsswitch.conf: http://p.adora.dk/P2489.html

(описание: используйте "обычных" системных пользователей в / etc / passwd и / etc / shadow, однако, если пользователь НЕ найден, продолжите поиск через pgsql)

nss-pgsql.conf: http://p.adora.dk/P2487.html

(описание: содержит запросы SQL, которые используются для поиска различной информации, которая обычно находится в / etc / passwd и / etc / group)

nss-pgsql-root.conf: http://p.adora.dk/P2488.html

(описание: содержит запросы SQL, которые используются для поиска конфиденциальной информации, которая обычно находится в / etc / shadow)

Что я сделал для отладки этого:

Я очень надеюсь, что вы поможете мне исправить эту ошибку.

Обновление 2012-08-22:

Я пробовал делать strace на psql. Соответствующая часть стразы находится внизу этой пасты: http://paste.adora.dk/P2492.html

Я заметил, что он пытается открыть /etc/nss-pgsql-root.conf и получить EACCESS, однако я не считаю, что это должно быть проблемой. Этот файл должен быть доступным для чтения только root, поскольку он соответствует / etc / shadow, который также доступен для чтения только root.

25341 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
25341 open("/usr/lib/libgpg-error.so.0", O_RDONLY) = 4
25341 read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 \6\0\0004\0\0\0"..., 512) = 512
25341 fstat64(4, {st_mode=S_IFREG|0644, st_size=11540, ...}) = 0
25341 mmap2(NULL, 14512, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0xb6f6c000
25341 mmap2(0xb6f6f000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x2) = 0xb6f6f000
25341 close(4)                          = 0
25341 mprotect(0xb70bf000, 4096, PROT_READ) = 0
25341 mprotect(0xb73d8000, 4096, PROT_READ) = 0
25341 munmap(0xb7414000, 40018)         = 0
25341 open("/etc/nss-pgsql-root.conf", O_RDONLY) = -1 EACCES (Permission denied)
25341 write(2, "\nCould not connect to database\n", 31) = 31

Возможно, это ошибка libnss-pgsql .... Как вы думаете?

Обновление 2012-08-22:

ХОРОШО. Я откопал отчет об ошибке пятилетней давности: http://pgfoundry.org/tracker/index.php?func=detail&aid=1010197&group_id=1000039&atid=234

Кажется, что такое поведение на самом деле является ошибкой. Был предоставлен патч, однако в отчете об ошибке нет активности. Может быть, проект заброшен. Надеюсь, что нет :(

Я думаю, что ответ на вашу проблему в этой строке:

open("/etc/nss-pgsql-root.conf", O_RDONLY) = -1 EACCES (Permission denied)

Попробуйте ослабить права доступа к этому файлу, чтобы его могли читать «группа» и «другие», и посмотрите, решит ли это проблему.

Вы ошибаетесь, что файл соответствует /etc/shadow. Это соответствует /etc/password, который читается как «группа», так и «другие». Ваша база данных PostgreSQL и таблицы, используемые для аутентификации, соответствуют /etc/shadow.

Он не может подключиться к базе данных, потому что не может прочитать учетные данные для доступа к базе данных из этого файла.