在FreeBSD jail中初始化PostgreSQL数据库时出现问题。
我找到了一篇关于这个问题的文章。我尝试了它的建议,但我没有运气,我不知道为什么。 有链接:PostgreSQL in jail。
我还阅读了kernel resources上的PostgreSQL文档:
如果通过启用
sysctl
来运行FreeBSD jailssecurity.jail.sysvipc_allowed
,在不同的地方运行的邮政局长 jails应该由不同的操作系统用户运行。这改善了 安全性,因为它可以防止非root用户干扰 共享内存或信号量在不同的监狱,它允许 PostgreSQL IPC清理代码正常运行。 (在FreeBSD 6.0和 后来IPC清理代码没有正确检测进程 其他监狱,阻止在同一端口上运行postmasters 在不同的监狱里。)
我做了什么:
/etc/rc.conf
(在主机上)并添加了行jail_sysvipc_allow="YES"
/etc/sysctl.conf
中,我添加了行security.jail.sysvipc_allowed=1
我多次重启监狱机器。我还没有重新启动主机,也不想。
希望有人可以给我一个解决方案或一些建议。非常感谢。
这是重新启动jail时的消息:
/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 =“是”
在Jail服务器中,没有额外的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)
答案 0 :(得分:18)
找到解决方案。以下内容对我有用。在主机上,执行:
root@host# jls JID IP Address Hostname Path 3 - some.jail /usr/jails/somejail
在我的示例中找到正确的JID,3。然后,在主机上,发出:
jail -m jid=3 allow.sysvipc=1
答案 1 :(得分:6)
jail有一些特殊粒度的新功能,我们需要允许在/etc/rc.conf中为每个jail更改sysvipc_allowed:
jail_example_parameters="allow.sysvipc=1"
答案 2 :(得分: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)
答案 3 :(得分:2)
必须在主机上设置sysctl security.jail.sysvipc_allowed
,而不是在jail中。但是,如果您在主持人的jail_sysvipc_allow="YES"
中设置了rc.conf
,那么应该为您设置/etc/rc.d/jail
,请参阅security.jail.sysvipc_allowed
。
如果您启动jail,security.jail.sysvipc_allowed
的值会更改为1,您应该检查主机。如果没有,你的rc.conf可能有问题。尝试在主机上手动设置{{1}}。
答案 4 :(得分:0)
我的系统在重新启动jail之前需要修改/etc/rc.conf,否则它会将host和jail都设置为0.我做了不需要设置security.jail.sysvipc_allowed = 1 in /etc/sysctl.conf中。
/etc/rc.conf:
jail_sysvipc_allow="YES"