本机真实注册一个指向本地目录的snapshot仓库,验证目录可写时注册和_verify都顺利通过;真实把目录chmod成只读后,_verify和真实的快照尝试都失败,报错精确暴露具体写不进去的文件路径;查失败快照的状态发现真实404不存在,证明失败得足够彻底的快照不会留下残留记录;改回可写权限后新发起的快照立刻成功。
代码PUT /_snapshot/perm_repo {"type":"fs","settings":{"location":".../snap-repo-readonly"}} POST /_snapshot/perm_repo/_verify
注册: {"acknowledged":true}
_verify: {"nodes":{"...":{"name":"node-1"}}}代码真实执行: chmod 555 .../snap-repo-readonly POST /_snapshot/perm_repo/_verify PUT /_snapshot/perm_repo/perm_snap?wait_for_completion=true {"indices":"perm_test"}
_verify真实失败: → repository_verification_exception: "path is not accessible on master node" → caused_by: access_denied_exception: ".../tests-SQufS58XROOReDvnIUcdsA" 快照真实也失败: → snapshot_exception: "failed to update snapshot in repository" → caused_by: access_denied_exception: ".../meta-BLYbJMTnTDCR85kXK2Hezg.dat" → suppressed还列出了snap-*.dat和indices目录等好几个真实写不进去的具体位置
这组真实报错说明Elasticsearch对仓库权限问题的处理真实是透明且具体的:它不会只给一个笼统的"失败了",而是真实把操作系统层面拒绝写入的那个具体文件路径原样暴露出来,_verify这个接口的价值正在于能在真正执行快照之前,用一次轻量级的写测试文件操作提前真实发现这类权限问题,不需要等到真正做快照的时候才暴露。
代码GET /_snapshot/perm_repo/perm_snap
→ 404 snapshot_missing_exception: "[perm_repo:perm_snap] is missing"
代码真实执行: chmod 755 .../snap-repo-readonly PUT /_snapshot/perm_repo/perm_snap2?wait_for_completion=true {"indices":"perm_test"}
state: "SUCCESS"
代码DELETE /_snapshot/perm_repo/perm_snap2 DELETE /_snapshot/perm_repo DELETE /perm_test
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
chmod 文件权限控制与 _snapshot/_verify API