CentOS 8下Postgres 13数据目录存VirtualBox共享盘initdb失败问题咨询
PostgreSQL 13数据目录放置在VirtualBox Windows共享盘无法初始化问题解决方案
核心原因
你遇到的报错与目录权限配置无关,根源是VirtualBox的Windows共享文件夹(vboxsf文件系统)未实现PostgreSQL运行必需的POSIX硬链接系统调用:
PostgreSQL在初始化生成WAL预写日志时,会通过硬链接完成临时日志文件到正式日志文件的原子替换,该操作在vboxsf文件系统下被禁止,直接触发Operation not permitted报错,后续文件找不到是硬链接失败的连锁反应。
可行方案
方案1(推荐,可用于生产环境):使用虚拟磁盘文件替代共享文件夹
- 关闭CentOS 8虚拟机,在VirtualBox设置中为虚拟机添加一块新的虚拟磁盘,将虚拟磁盘的存储路径指定到Windows宿主上你想要存放PG数据的目录
- 启动虚拟机后,将新添加的磁盘格式化为ext4或xfs这类Linux原生文件系统
- 将格式化后的磁盘挂载到
/var/pgshared路径,配置/etc/fstab实现开机自动挂载,调整挂载目录权限为postgres:postgres,权限值设为700 - 重新执行initdb操作即可正常完成初始化
该方案完全兼容PostgreSQL的所有特性,读写性能远高于共享文件夹方案。
方案2(仅可用于测试环境):修改PG参数适配共享文件夹
如果必须使用共享文件夹存储数据,可通过关闭WAL硬链接相关参数实现运行:
- 先将数据目录初始化在CentOS 8本地的原生文件系统上
- 编辑初始化完成的data目录下的
postgresql.conf,将以下两个参数修改为off:
wal_init_zero = off wal_recycle = off
- 将整个data目录复制到VirtualBox共享文件夹下,再指定该目录启动PostgreSQL即可
注意:该方案会大幅降低WAL写入性能,且共享文件夹的文件锁实现存在缺陷,高负载下有数据损坏风险,禁止在生产环境使用。
内容的提问来源于stack exchange,提问作者Captain Mike
相关产品推荐
相关产品推荐

