Linux 服务器部署 Stable Diffusion 出现 Permission denied 错误,通常是因为启动脚本的用户与缓存目录的所有者不一致。最推荐的处理方向是检查目录权限并修正所有者,适用场景为本地部署或 Docker 挂载卷,风险边界是避免直接使用 root 权限运行应用以防安全风险。
先说结论:Permission denied 报错本质是当前运行用户缺乏对目标缓存目录的写入权限,修正目录所有者即可解决。
- 先确认:查看报错日志中具体的受限路径是哪一个是 models 目录还是系统缓存目录。
- 先处理:使用 chown 命令将目录所有者修改为当前启动用户,不要盲目使用 chmod 777。
- 再验证:重新启动服务并观察日志是否不再出现写入错误。
命令速用版
假设报错路径为 /home/user/sd-webui/models,当前用户为 user,执行以下命令修复权限:
ls -ld /home/user/sd-webui/models
chown -R user:user /home/user/sd-webui/models
chmod -R 755 /home/user/sd-webui/models
如果是 Docker 部署,确保宿主机的挂载目录所有者与容器内运行用户 UID 一致。
为什么会这样
Linux 文件系统权限机制阻止了非所有者用户写入目录。Stable Diffusion 运行时需要下载模型、写入缓存文件到指定文件夹,如果启动进程的用户身份(UID)与文件夹所有者不匹配,内核会拒绝写入请求并抛出 Permission denied 错误。这种情况常见于使用 root 创建目录后改用普通用户启动,或 Docker 卷挂载时权限映射错误。
分步处理
第一步:定位报错路径。查看终端输出或 logs 日志文件,找到包含 Permission denied 的具体绝对路径,例如 /home/user/.cache 或 /sd-webui/models。
第二步:检查当前用户。在终端输入 whoami 确认当前启动脚本的用户名,同时输入 id 查看 UID 和 GID 数字。
第三步:修正目录所有权。执行 chown -R 用户名:用户名 报错路径,将目录及其子文件的所有者递归修改为当前用户。
第四步:检查磁盘空间。执行 df -h 查看挂载点使用率,排除因磁盘满导致无法写入的假性权限错误。
第五步:回滚提醒。如果修改权限后仍报错,检查是否开启了 SELinux,临时执行 setenforce 0 测试是否策略拦截,生产环境建议配置正确策略而非关闭。
怎么验证是否生效
重新启动 Stable Diffusion 服务,观察控制台日志。如果不再出现 Permission denied 字样且能正常下载模型或生成图片缓存,说明权限已修复。检查报错路径下是否新生成了文件,使用 ls -l 路径 查看文件所有者是否变为当前用户。
常见坑
避免直接使用 root 用户运行 SD 服务,这会导致后续生成的文件所有者为 root,普通用户无法管理。Docker 部署时,宿主机挂载目录的权限必须与容器内进程 UID 匹配,否则容器内仍会报权限错误。不要随意使用 chmod 777 开放所有权限,这会带来安全风险,优先使用 chown 修正所有者。
常见问题
为什么 Docker 部署也会报 Permission denied?
因为宿主机挂载目录的所有者与容器内运行用户的 UID 不一致。需要在 docker run 时使用 -u 参数指定 UID,或在宿主机上 chown 目录为对应 UID。
可以直接用 root 运行避免权限问题吗?
不建议。虽然能解决写入问题,但会导致生成的文件归属 root,后续普通用户无法修改,且存在安全风险。
缓存目录默认在哪里?
通常在用户主目录下的 .cache 文件夹或 SD 项目目录下的 models 文件夹,具体路径取决于启动参数和环境变量配置。
参考来源
- AUTOMATIC1111/stable-diffusion-webui 官方仓库,Issues 讨论区关于权限问题的通用处理方案,URL: https://github.com/AUTOMATIC1111/stable-diffusion-webui
- Linux 文件系统权限管理规范,man chmod 与 man chown 手册页说明。