Quartus 权限被拒:Permission denied 速查
更新时间:2026-10-23。FAQ 速查页,面向第一次在共享服务器或公司电脑上跑 Quartus 的同学。编译、生成 IP、往板上烧写都要往工程目录或设备节点写文件,任何一级路径不可写,Quartus 就会甩回一句
permission denied——这句话来自操作系统,不是 license 问题,也不是设计本身有错。文件路径类报错(路径写错、文件不存在)的鉴别见 Quartus 找不到模块速查;同语义在 Vivado 侧的姊妹篇见 Vivado 权限被拒速查。
本文要回答的问题
- 报错里的
Can't open file ... for writing与permission denied分别说明什么,怎么读原文? - Linux 上工程是别人建的、压缩包解压的、或以前用 sudo 跑过编译,分别怎么修?
- Windows 上工程放在 Program Files 或系统盘根目录,为什么 Quartus 一写就拒?
- 插上 USB-Blaster 下载线后烧写报权限错,jtagd 的 udev 规则怎么配?
.qpf、.qsf被设成只读属性时 Quartus 会有什么表现,怎么解锁?
一、报错原文与典型现象
权限类报错分散在编译、IP 生成、Programmer 烧写各阶段,先认出四种典型形态(工程路径以 /proj/demo 占位):
Error: Can't open file "/proj/demo/db/demo.asm.rpt" for writing
permission denied
Error: Can't open file "/proj/demo/output_files/demo.sof" for writing
permission denied
Error: Can't save project. The file "/proj/demo/demo.qsf" is read-only.烧写阶段还有 USB 设备访问被拒的形态,报在 jtagd 而不是工程路径上:
Error: Can't access JTAG chain
Error: No USB-Blaster detected. Check hardware connection and permissions.
jtagd: unable to open USB device: permission denied读报错的关键是盯住路径落在哪一枝:db/、output_files/、incremental_db/ 是 Quartus 自己生成的产物区,报在这些路径下就是工程目录写权限问题;报在 .qpf/.qsf 上说明工程描述文件本身被锁;报在 USB 设备上说明是当前用户对 USB-Blaster 设备节点没有访问权,与工程文件无关。Quartus 安装目录(如 /opt/intelFPGA_lite)本来就该只读,正常编译不会往里写——报错路径落在安装目录时,先怀疑是不是把工程建在了安装区里。
二、病因处置速查表
| 报错现象 / 场景 | 可能原因 | 快速验证 | 处置 |
|---|---|---|---|
| db/、output_files/ 写产物被拒,属主是别人 | 工程由同事建立或压缩包解压,保留原 uid | ls -l db/ 看属主 | chown -R <user>:<组> <工程目录> |
| sudo 跑过一次 quartus_sh 后普通身份全被拒 | db/、incremental_db/ 变成 root 属主 | ls -l db 出现 root | sudo chown -R <user> <工程目录>,禁 sudo 跑编译 |
| 报 Read-only file system | NFS/VM 共享文件夹以 ro 挂载 | mount | grep /proj 看 ro | 工程挪到可写分区,勿在只读区编译 |
| 同组同事打不开我写出的工程文件 | umask 027,新建文件组无读位 | umask;ls -l 看组权限位 | 协作目录 umask 002 加 chmod g+s |
| Windows:工程在 Program Files 或 C 盘根目录 | 受 UAC 保护,普通进程不可写 | 复制到用户文档目录能跑 | 工程建在用户目录,纯英文路径 |
| 保存工程时报 qsf read-only | .qpf/.qsf 被设只读属性,或版本库检出时加锁 | attrib demo.qsf 首字母 R | 取消只读属性;版本库里先解锁 |
| Programmer 找不到下载线、报 USB 权限 | jtagd 无设备节点访问权,缺 udev 规则 | lsusb 能看到线但 Quartus 看不到 | 配 51-usbblaster.rules 后重插 |
| 换用户后报 jtagd 已在运行、连不上 | 上一个用户的 jtagd 进程残留 | ps -ef | grep jtagd | jtagd --kill 或 kill 残留进程 |
| 权限位全对仍被拒(服务器) | NFS uid 映射不一致或 ACL 限制 | 两台机器各跑 id 比对 uid | 找管理员统一 uid / 调整 ACL |
三、排查决策图
下面这张图是标准排查路线,颜色按角色区分:红是报错入口与命中的根因,蓝是排查动作,橙是修复动作,绿是闭环复验,紫是防复发沉淀。
读这张图抓住两条主线:八成案例在左支——db/、output_files/ 里混进了 root 或别人属主的产物文件,或者 .qsf 被锁了只读;剩下两成在右支,是 Programmer 阶段 USB-Blaster 的设备节点权限。两条支路互不相干,修左支不用动 udev,修右支也不用 chown 工程,先用报错路径归类再走对应分支。
四、逐条排查展开
Linux:先看工程树属主,再看挂载。 Quartus 编译会在工程下生成 db/、incremental_db/、output_files/ 三棵产物树,属主必须是启动 Quartus 的用户。高频事故有三个来源:同事打包发来的工程保留了对方 uid;用 sudo 跑过一次 quartus_sh --flow compile(或 root 装完顺手编译)导致整棵 db 变 root 属主;虚拟机共享文件夹(VMware Shared Folders、VirtualBox vboxsf)或 NFS 挂载以只读或 uid 映射错乱的方式挂进来。一条命令看清现场:
whoami; id
ls -ld /proj/demo /proj/demo/db /proj/demo/output_files
ls -l /proj/demo/demo.qsf /proj/demo/demo.qpf
mount | grep " /proj"属主不对就归还:sudo chown -R <user>:<组> /proj/demo。不要图省事 chmod -R 777——共享服务器上这会让同事的运行踩坏你的 db,也不符合机房审计要求;目录需要 x(进入)位,文件不需要执行位,协作目录用公共组加 setgid 更干净:
sudo chgrp -R <协作组> /proj/demo
chmod g+s /proj/demo
umask 002mount 输出带 ro 是只读挂载,chmod 改不了,只能把工程挪到可写分区。虚拟机共享文件夹即使不是 ro,其 uid 映射也常与来宾系统不一致,跨机编译的工程建议直接放虚拟机本地盘。
.qpf/.qsf 只读单独处理。 工程描述文件被设成只读属性时,Quartus 打开工程没问题,但保存设置、分配引脚后写回 .qsf 就报 read-only。来源常见两种:从光盘或某些备份介质恢复时继承了只读属性;部分版本管理客户端检出时默认加锁。Linux 下 ls -l demo.qsf 看属主和 w 位,chmod u+w demo.qsf 解锁;Windows 下右键属性取消只读,或命令行:
attrib E:\proj\demo\demo.qsf
attrib -R E:\proj\demo\demo.qsfWindows:查 UAC 保护边界。 Windows 没有 rwx 属主位的概念,拦截来自另外两处。其一,工程放在 C:\Program Files 或系统盘根目录等受 UAC 保护的位置,Quartus 作为普通进程无法写入——把整个工程移到用户文档目录即可,顺手保证路径纯英文无空格。其二,第三方杀毒可能把刚生成的 .sof、.rbf 当可疑文件隔离,表现为写文件瞬间失败;到杀软的隔离记录里能看到条目,把 Quartus 工程目录加入排除列表。OneDrive 等同步盘里的工程文件可能只是云端占位(图标带云朵),Quartus 批量读 IP 文件时占位来不及落地就报打不开,右键工程目录选「始终保留在此设备上」。
Linux jtagd 与 udev 规则。 Programmer 插上 USB-Blaster 后 lsusb 能看到线(ID 形如 09fb:6001),但 Hardware Setup 里空空如也或报权限错,就是当前用户对 USB 设备节点没有读写权。jtagd 与 Vivado 的 hw_server 是同一类问题,修法也是同一类:给设备配 udev 规则放开访问。以 root 身份创建 /etc/udev/rules.d/51-usbblaster.rules:
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6002", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6003", MODE="0666"然后 sudo udevadm control --reload-rules,拔插一次下载线。更严格的环境可把 MODE="0666" 换成 GROUP="<jtag组>" 并把用户加进该组。换用户报 jtagd 已占用时,先 ps -ef | grep jtagd 找残留进程,jtagd --kill 或直接 kill 掉再重新打开 Programmer。
最小复现一锤定音。 在自己的 HOME(Windows 用用户文档目录)新建一个空工程,只放一个点灯级顶层跑完整编译流程:能通过,说明 Quartus 安装、license、环境都没问题,病灶 100% 在原工程目录的权限或挂载;空工程也失败,再回头查安装目录与环境变量。修 USB 权限后同样用 Programmer 的 Auto Detect 复验——能看到 JTAG 链上的器件型号就算闭环。
五、规范做法与预防
- 工程只放可写目录:Linux 放个人或项目可写分区,Windows 放用户文档,远离 Program Files、系统盘根目录与安装目录。
- 绝不 sudo 跑 Quartus:安装归安装、编译归普通用户;发现 db/ 里有 root 属主文件立刻 chown 归还,别等积重难返。
- 产物树不进版本库:
db/、incremental_db/、output_files/都是本地产物,加入忽略列表;共享的是.qpf、.qsf与 RTL 源文件。 - 下载线规则装机即配:新装 Quartus 的机器顺手配好 udev 规则,比每次烧写报错再查省事得多。
- 报错先归类再动手:路径在工程目录查属主与挂载,路径在 USB 设备查 udev 与 jtagd,两路别混修。
这一篇在知识体系里的位置
本篇是 FPGA 工具排错速查簇的一员:文件权限问题看本篇;路径与模块可见性问题看 Quartus 找不到模块速查;同一类权限语义在 Vivado 侧的表现与修法见 Vivado 权限被拒速查——两家的报错措辞不同,但「属主错乱、只读挂载、下载器设备权限」三根病因轴完全同构,排查命令可以互相迁移。
一句话总结
Quartus 权限被拒先读报错路径归类:落在 db/、output_files/、.qsf 上是工程目录问题,八成是 sudo 残留 root 产物、压缩包解压的他人 uid、只读挂载或文件只读属性,用 ls -l、mount、attrib 三件套定位后 chown 归还或取消只读,切勿一把 777;落在 USB 设备上是 jtagd 缺 udev 规则,配 51-usbblaster.rules 重插下载线即可,残留 jtagd 进程先 kill;工程放可写目录、不 sudo 跑编译、产物树不进版本库,这类报错即可基本绝迹。