Vivado 权限被拒:Permission denied 速查
更新时间:2026-10-22。FAQ 速查页,面向 FPGA 入门 阶段第一次在共享服务器或公司电脑上跑 Vivado 的同学。综合、生成 IP、
write_bitstream都要往工程目录里写大量文件,任何一级路径不可写,Tcl 就会甩回一句permission denied——这句话是操作系统给的,不是 Vivado 的许可证或设计错误。license 类报错的鉴别见 Vivado license 签出失败。
本文要回答的问题
- 报错里的
permission denied到底是读失败还是写失败,怎么从原文判断? - Linux 上工程是同事建的、压缩包解压的、或者以前用 sudo 跑过,分别怎么修?
- Windows 上 Vivado 明明是管理员装的,为什么往工程里写 bitstream 还是被拒?
.Xil锁目录是什么,为什么换个用户跑就报目录已存在却不可写?- 怎样用一个最小复现,十分钟确认问题出在目录权限而不是工程本身?
一、报错原文与典型现象
权限类报错分散在启动、综合、生成 IP、写比特流各阶段,先认出三种典型形态(工程路径以 /proj/demo 占位):
ERROR: [Common 17-69] Command failed: Write to file
/proj/demo/project.runs/impl_1/top.bit" failed.
permission denied
ERROR: [IP_Flow 19-3470] Failed to generate output products:
couldn't open "/proj/demo/project.gen/sources_1/ip/clk_wiz/clk_wiz.xci": permission denied启动期还有两种更靠前的形态:当前工作目录不可写时,日志和 journal 先落不了盘;多人共用工作目录时,.Xil 锁目录被上一个用户占住:
couldn't open "vivado.log": permission denied
couldn't create directory "/proj/demo/.Xil/<user>": permission denied三种形态分别卡在「写输出产物」「写 IP 生成目录」「写运行期日志与锁」。读这张报错的关键是盯住动词与路径:could not read 缺读权限,open ... for write、create directory、Write to file 缺写权限,路径则直接告诉你病灶在工程树的哪一枝。安装目录只读不会报在工程路径下——WebPACK 安装区本来就该只读,Vivado 要写的从来是工程目录,不是安装目录。
二、病因处置速查表
| 报错现象 / 场景 | 可能原因 | 快速验证 | 处置 |
|---|---|---|---|
| runs/.gen 下写产物被拒,文件属主是别人 | 工程由同事建立或从压缩包解压,保留原 uid | ls -l、stat <文件> 看属主 | chown -R <user>:<组> 归还工程树 |
| 之前能跑,sudo 跑过一次后普通身份全被拒 | sudo Vivado 生成的 runs/.gen 变成 root 属主 | ls -l project.runs 出现 root | sudo chown -R <user> <工程目录>,以后禁止 sudo 启 GUI |
| 报 Read-only file system | 网盘/分区以 ro 挂载,权限位有 w 也无效 | mount | grep /proj 看 ro | 输出改到可写分区,勿在只读区建工程 |
| 同组同事能读不能写我的工程 | umask 027/022,新建文件组无写位 | umask;ls -l 看组权限位 | 协作目录 umask 002 加 chmod g+s |
| Windows:工程在 Program Files 下 | 受保护目录,普通进程不可写 | 把工程复制到用户目录能跑 | 工程建在用户文档等可写目录 |
| Windows:刚还能写突然被拒 | 受控文件夹访问/杀毒拦截或隔离 | Windows 安全中心查看拦截记录 | 放行 Vivado,或移出受控目录 |
| Windows:文件图标云朵、双击才下载 | OneDrive 等同步盘占位文件未落地 | 右键「始终保留在此设备上」 | 工程目录关闭同步或设为永久脱机 |
| 启动即报 .Xil 目录权限错 | 另一用户(含 root)留下 .Xil 锁目录 | ls -la .Xil 看子目录属主 | 确认无残留进程后删该锁目录 |
| 提示工程已被另一个 Vivado 占用 | 上次崩溃残留进程持有文件锁 | ps -ef | grep vivado | 结束残留进程再删锁目录 |
| 权限位看着全对仍被拒(服务器) | NFS uid 映射不一致或 ACL 限制 | 两台机器各跑 id 比对 uid;getfacl | 找管理员统一 uid / 调整 ACL |
三、排查决策图
下面这张图是标准排查路线,颜色按角色区分:红是报错入口与命中的根因,蓝是排查动作,橙是修复动作,绿是闭环复验。
读这张图抓住一条短路主线:八成案例倒在「属主与只读位」这一步——工程树里混进了非本人属主的文件,或目录本身在只读区。这一支命中(图中左支)直接进修复;权限位确实正常(右支)才往下查挂载方式、umask 与 .Xil 锁。修复后不要在原工程上直接下结论,先做绿色节点的最小复验,排除工程文件本身损坏的干扰。
四、逐条排查展开
Linux:先看属主,再看挂载。 工程目录里 project.runs/、project.gen/、.Xil/ 三个子树是 Vivado 自己生成的,属主必须是启动 Vivado 的用户。高频事故有三个来源:同事打包发来的工程保留了对方 uid;root 身份跑过一次(包括 sudo 启动 GUI、或用 root 装完顺手打开)导致整棵 runs 变 root 属主;共享分区被管理员以只读方式重新挂载。一条命令看清身份与权限:
whoami; id
ls -ld /proj/demo /proj/demo/project.runs /proj/demo/.Xil
mount | grep " /proj"属主不对就归还:sudo chown -R <user>:<组> /proj/demo。不要图省事 chmod -R 777——共享工程服务器上这会让所有产物对所有人可写,同事的运行可能踩坏你的 runs,也违反多数机房的审计要求;目录需要 x(进入)位但文件不需要执行位,批量修时目录给 g+rwx、文件给 g+rw 即可。mount 输出带 ro 是只读挂载,chmod 改不了,只能把工程挪到可写区。协作场景把工程根配成组可写并继承:chmod g+s <工程根>、成员 umask 002,新人建出的文件组内自然可覆盖。
Windows:查保护边界,而不是查 rwx。 Windows 没有属主执行位的概念,拦截来自另外三处。其一,工程放在 C:\Program Files 或系统盘根目录等受保护位置,Vivado 作为普通进程无法写入,把工程整个移到用户文档目录即可——这也是 Vivado 快速上手 建议工程路径纯英文、放用户区的原因之一。其二,Windows 安全中心的「受控文件夹访问」会拦截非白名单程序往文档区写文件,第三方杀毒也可能把刚生成的 .bit 直接隔离,表现为写文件瞬间失败;到安全中心的保护历史记录里能看到拦截条目,把 Vivado 加入允许列表。其三,OneDrive 等同步盘里的工程文件可能只是云端占位(图标带云朵),Vivado 批量读 IP 文件时占位来不及落地就报打不开,右键工程目录选「始终保留在此设备上」,或干脆把工程移出同步目录。文件被设了只读属性时用资源管理器属性页取消,命令行可查属性与 NTFS 授权:
attrib E:\proj\demo\project.runs\impl_1\*.bit
icacls E:\proj\demoattrib 输出首字母带 R 即只读文件,icacls 列出 NTFS 授权。
icacls 列出的是 NTFS 授权列表,网络共享还要叠加一层共享权限,两层都允许写才真正可写,共享目录类问题找 IT 对照这两层查。
.Xil 锁与残留进程单独处理。 Vivado 运行时会在工程目录和临时区写 .Xil/<user>/ 锁目录,防止两个实例同时写同一工程。典型事故是别人(或 root 身份的你自己)在共享工作目录跑过一次,.Xil 里留下对方属主的子目录,你的实例建自己的锁时被父目录权限挡住;另一种是 Vivado 异常退出,进程没清干净、锁没释放,新实例报工程已被占用。处置顺序是先确认无残留进程(Linux ps -ef | grep vivado,Windows 任务管理器找 vivado.exe),再删除对应 .Xil 子目录后重启 Vivado。多人共用同一份工作副本本身就是错误用法——共享的是设计源文件,不是 runs 产物。
最小复现一锤定音。 在自己的 HOME(Windows 用用户文档目录)新建一个空工程、只放一个点灯级 RTL 跑综合:能通过,说明 Vivado 安装、license、环境都没问题,病灶 100% 在原工程目录的权限或挂载;空工程也失败,再回头查安装目录与环境变量。工程协作的正确姿势是源码走版本管理、每人各自生成 runs,而不是共用工区,具体做法见 RTL 版本控制。
五、规范做法与预防
- 工程只放可写目录:Linux 放个人或项目可写分区,Windows 放用户文档,远离 Program Files 与系统根目录。
- 绝不 sudo 启动 Vivado GUI:安装归安装、运行归普通用户;root 残留文件发现即用 chown 归还。
- 共享源码不共享工作副本:源文件入版本库,runs/.gen/.Xil 都是个人本地产物,加入忽略列表。
- 协作目录一次配好:公共组 + setgid + 成员 umask 002,避免事后逐文件 chown。
- 启动前先看报错路径:路径落在安装目录先怀疑用法错误,落在工程目录才查权限。
这一篇在知识体系里的位置
本篇是 FPGA 工具排错速查簇的一员,同簇姊妹篇有 Vivado 模块找不到 与 Vivado license 签出失败——三者分别覆盖「文件可见性、许可证、文件权限」三类启动期高频报错;工程目录的组织与设计流程背景见 FPGA 设计流程。
一句话总结
Vivado 权限被拒先读报错动词与路径判定缺读还是缺写,Linux 上八成是工程树混进别人或 root 属主的文件、只读挂载与 umask 组写位问题,用 ls -l、id、mount 三件套定位后 chown 归还或改到可写分区,切勿一把 777;Windows 侧查 Program Files 保护、受控文件夹访问拦截与同步盘占位;.Xil 锁目录先清残留进程再删锁,最后在 HOME 新建空工程做最小复现闭环——工程放可写目录、不 sudo 跑 GUI、源码走版本管理而不共用工区,这类报错即可基本绝迹。