9

当我在 FreeBSD 监狱中初始化 PostgreSQL 数据库时出现问题。

我找到了一篇关于这个问题的文章。我尝试了它的建议,但我没有运气,我不知道为什么。有链接:PostgreSQL in jail

我还阅读了关于内核资源的 PostgreSQL 文档:

如果通过启用sysctl' 在 FreeBSD 监狱security.jail.sysvipc_allowed中运行,则在不同监狱中运行的 postmaster 应该由不同的操作系统用户运行。这提高了安全性,因为它可以防止非 root 用户干扰不同监狱中的共享内存或信号量,并允许 PostgreSQL IPC 清理代码正常运行。(在 FreeBSD 6.0 及更高版本中,IPC 清理代码无法正确检测其他监狱中的进程,从而阻止了不同监狱中同一端口上的 postmaster 运行。)

我做了什么:

  • 我编辑/etc/rc.conf(在主机上)并添加了该行jail_sysvipc_allow="YES"
  • 在监狱机器中/etc/sysctl.conf,我添加了一行security.jail.sysvipc_allowed=1

我多次重新启动监狱机器。我还没有重新启动主机,也不想。

希望有人能给我一个解决方案或一些建议。非常感谢。

这是我重新启动监狱时的消息:

 /etc/rc.d/sysctl: WARNING: unable to set security.jail.sysvipc_allowed=1

或者当我手动运行 sysctl 时:(在监狱中)

 root@xxxxx:/home/xxxx# sysctl security.jail.sysvipc_allowed=1
 security.jail.sysvipc_allowed: 0
 sysctl: security.jail.sysvipc_allowed: Operation not permitted

Freebsd 版本:FreeBSD xxxxxxx 9.1-PRERELEASE FreeBSD 9.1-PRERELEASE

postgreSQL 版本:postgresql-server-9.1.4

错误信息:

 root@xxxxxx:/home/xxx # /usr/local/etc/rc.d/postgresql initdb
 The files belonging to this database system will be owned by user "pgsql".
 This user must also own the server process.

 The database cluster will be initialized with locale C.
 The default text search configuration will be set to "english".

 creating directory /usr/local/pgsql/data ... ok
 creating subdirectories ... ok
 selecting default max_connections ... 10
 selecting default shared_buffers ... 400kB
 creating configuration files ... ok
 creating template1 database in /usr/local/pgsql/data/base/1 ... FATAL:  could not create      
 shared memory segment: Function not implemented
 DETAIL:  Failed system call was shmget(key=1, size=2146304, 03600).
 child process exited with exit code 1
 initdb: removing data directory "/usr/local/pgsql/data"

更新:

在主机中,/etc/sysctl.conf:security.jail.sysvipc_allowed=1 /etc/rc.conf:jail_sysvipc_allow="YES"

在监狱服务器中,没有额外的 jail_sysvipc 配置。

主机中的 sysctl 值:

   root@xxxxx:/home/xxxx# sysctl -a | grep 'sysvipc'
   security.jail.param.allow.sysvipc: 0
   security.jail.sysvipc_allowed: 1

我仍然收到与以前相同的错误消息。

另外,我想知道 security.jail.param.allow.sysvipc 是否有任何东西?因为,在主机中,我不允许设置它。(security.jail.param.allow.sysvipc 0-> 0)

4

5 回答 5

18

找到解决方案。以下对我有用。在主机上,执行:

root@host# jls
   JID IP 地址 主机名 路径
     3 - some.jail /usr/jails/somejail

找到正确的 JID,在我的示例中为 3。然后,在主机上,发出:

jail -m jid=3 allow.sysvipc=1

于 2012-09-10T13:34:18.917 回答
6

监狱有一些特殊粒度的新功能,我们需要允许更改每个监狱的 sysvipc_allowed 将其放在 /etc/rc.conf 中:

jail_example_parameters="allow.sysvipc=1"
于 2012-11-15T15:10:07.420 回答
3

在队友的帮助下,我发现了问题。

因为我使用/etc/jail.conf,所以我必须添加一行“allow.sysvipc”来启用系统共享内存。

在主机中,

  /etc/sysctl.conf
  security.jail.sysvipc_allowed=1

  /etc/rc.conf 
  jail_sysvipc_allow="YES" (DO NOT have to do this, remove it) 
于 2012-08-14T17:30:26.207 回答
2

sysctlsecurity.jail.sysvipc_allowed必须在主机上设置,而不是在监狱中。但是,如果您jail_sysvipc_allow="YES"在主机rc.conf中设置,那应该为您设置,请参阅/etc/rc.d/jail

如果启动监狱,您应该检查主机的值是否security.jail.sysvipc_allowed更改为 1。如果没有,你的 rc.conf 中可能有问题。尝试在主机security.jail.sysvipc_allowed上手动设置。

于 2012-08-12T23:31:28.033 回答
0

我的系统需要在重新启动监狱之前修改 /etc/rc.conf,否则它将主机和监狱都设置为 0。我不需要在 /etc/sysctl.conf 中设置 security.jail.sysvipc_allowed=1。

/etc/rc.conf:
jail_sysvipc_allow="YES"
于 2013-05-08T01:17:13.367 回答