如何摆脱与Linux和libnss-pgsql2“无法连接到数据库”?

我使用libnss-pgsql2来让虚拟系统用户存储在PostgreSQL数据库中。 数据库中的虚拟用户工作得很好。 他们可以login,我可以通过'id'命令看到他们的uid,gid,groups。 例:

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

但是,在我使用libnss的系统上,我经常会遇到这个错误:

 Could not connect to database 

例如,它经常与cron-jobs一起发生。 我有一个每小时运行一个cron-job,将postgresql数据库转储到备份。 矛盾是这样的:

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

这个工作总是产生错误。 因此,每隔一小时就给我发一封电子邮件。

我的设置非常简单:我用来存储用户的表格布局可以在这里find: http : //p.adora.dk/P2486.html

我在服务器上使用Debian Squeeze。

相关的configuration文件是:nsswitch.conf: http : //p.adora.dk/P2489.html

(描述:在/ etc / passwd和/ etc / shadow中使用“普通”系统用户,但是,如果没有find用户,则通过pgsql进行查找)

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

(描述:包含用于查找通常在/ etc / passwd和/ etc / group中find的各种信息的SQL查询)

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

(描述:包含用于查找通常在/ etc / shadow中find的机密信息的SQL查询)

事情,我已经做了debugging:

  • validationnss-pgsql.conf和nss-pgsql-root.conf中的连接string是否按预期工作。
  • validation超时不会发生。 即错误立即回应,而不是300秒后。 另外,这种情况发生在一个不做任何事情的服务器上 – 所以连接应该立即build立 – 我已经证实它确实如此。

我真的希望你能帮我解决这个错误。

2012-08-22更新

我试着在psql上做一个strace。 strace的相关部分位于此贴的底部: http : //paste.adora.dk/P2492.html

我注意到它试图打开/etc/nss-pgsql-root.conf并得到EACCESS,但是,我不认为这应该是一个问题。 这个文件只能被根用来读取,因为它对应于/ 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 ,可由“group”和“other”读取。 用于validation的PostgreSQL数据库和表对应于/etc/shadow

它无法连接到数据库,因为它无法从此文件读取数据库访问凭据。