1. 从一次烧录翻车说起:Error 5 到底卡在哪
Win32 Disk Imager 这个工具,玩树莓派、装 Ubuntu 系统、给开发板烧固件的人基本都绕不开。它界面简单,选个镜像、选个盘符、点 Write,等进度条走完就完事。但就是这么一个看起来傻瓜式的工具,偏偏会在某个时刻弹出一个让人血压升高的对话框:Error 5: Access is denied(拒绝访问)。
我第一次遇到这个问题是在给一张 32GB 的 SD 卡烧录系统镜像的时候。镜像文件没问题,卡也是新买的,读卡器插上电脑能正常识别,盘符也出来了,但一点 Write 就报 Error 5。换了一张卡,还是 Error 5。换了个读卡器,依然 Error 5。当时第一反应是"卡坏了",差点就把卡扔了。后来折腾了大半天才搞明白,这个报错的根源跟卡本身的质量关系不大,绝大多数情况下是Windows 系统层面的权限或占用问题。
Error 5 在 Windows 错误码体系里对应的是ERROR_ACCESS_DENIED,意思是"访问被拒绝"。Win32 Disk Imager 在写入时需要对目标物理磁盘进行扇区级的裸写入,这跟普通复制粘贴文件完全不是一个层级。普通复制文件走的是文件系统接口,而烧录镜像走的是底层块设备接口,需要直接操作\\.\PhysicalDriveN这样的设备路径。一旦这个路径被系统或其他程序占用、锁定,或者当前用户权限不够,就会直接抛出 Error 5。
所以这篇文章要解决的问题很明确:当 Win32 Disk Imager 报 Error 5 时,如何系统性地排查并解决 SD 卡写入问题。我会把三种经过实测的方法完整拆开讲,包括每种方法背后的原理、具体操作步骤、以及我在实际操作中踩过的坑。不管你是刚接触烧录的新手,还是已经用过很多次但偶尔被这个报错卡住的老手,都能从里面找到可以直接抄作业的方案。
2. 先搞清楚 Win32 Disk Imager 的写入机制
2.1 为什么它需要管理员权限
很多人装完 Win32 Disk Imager 之后,直接双击打开就开始用,从来没想过"以管理员身份运行"这件事。平时烧录小镜像可能碰巧没出问题,但一旦遇到系统保护比较严格的磁盘区域,或者目标设备被其他驱动挂载了,Error 5 就来了。
Win32 Disk Imager 的写入流程大致是这样的:它首先通过CreateFileAPI 打开目标物理磁盘的设备句柄,路径类似\\.\PhysicalDrive2。这个操作在 Windows 上属于高权限操作,普通用户令牌默认是没有权限直接打开物理磁盘句柄的。即使你的账户在管理员组里,如果没有显式提权(UAC 提权),进程拿到的仍然是标准用户令牌,CreateFile就会返回ERROR_ACCESS_DENIED。
这就解释了一个很常见的现象:同一台电脑,同一个镜像,同一个读卡器,有时候能烧,有时候报 Error 5。差别往往就在于这次是不是以管理员身份启动的。Windows 的 UAC 机制会让程序在非提权状态下运行,而 Win32 Disk Imager 的清单文件如果没有强制要求提权,它就不会自动弹 UAC 窗口。
提示:判断当前进程是否有管理员权限,可以在 Win32 Disk Imager 里看标题栏,如果标题栏没有显示"管理员"字样,那大概率就是普通权限在跑。
2.2 物理磁盘被占用的几种典型情况
权限只是第一道门槛。即使你以管理员身份运行了,Error 5 依然可能出现,这时候就要考虑磁盘被占用的问题。Windows 对物理磁盘的访问是独占性的,同一时间只允许一个进程持有写入句柄。以下这些情况都会导致磁盘被锁定:
- Windows 自动挂载了 SD 卡的分区:SD 卡插上读卡器后,如果卡上有 Windows 能识别的分区(比如 FAT32、exFAT、NTFS),系统会自动挂载并分配盘符。资源管理器、索引服务、杀毒软件都可能去访问这些分区,导致物理磁盘句柄被占用。
- 杀毒软件实时扫描:很多安全软件会监控可移动存储设备,插上 SD 卡后自动扫描,扫描期间磁盘处于被占用状态。
- 其他烧录工具或磁盘工具在后台运行:比如 Rufus、balenaEtcher、DiskGenius 等,如果它们还开着,可能持有磁盘句柄。
- Windows 的 ReadyBoost 或存储感知服务:某些系统配置下,这些服务会主动接管可移动磁盘。
这些占用情况在资源管理器里是看不出来的,你只能看到盘符正常显示,但底层句柄已经被别人拿走了。Win32 Disk Imager 尝试打开物理磁盘时就会失败,报 Error 5。
2.3 Error 5 和其他常见报错的区分
在排查之前,有必要把 Error 5 和其他几个容易混淆的报错区分开,避免走错方向:
| 报错信息 | 错误码 | 典型原因 | 排查方向 |
|---|---|---|---|
| Error 5: Access is denied | 5 | 权限不足或磁盘被占用 | 提权运行、解除占用 |
| Error 32: The process cannot access the file | 32 | 文件被其他进程锁定 | 关闭占用进程 |
| Error 21: The device is not ready | 21 | 读卡器未识别或卡未插好 | 检查硬件连接 |
| Error 1117: The request could not be performed | 1117 | 硬件I/O错误 | 检查卡和读卡器 |
Error 5 的核心特征是"拒绝访问",它跟硬件故障的报错有本质区别。如果你的卡在磁盘管理里能看到,但烧录时报 Error 5,那基本可以确定是软件层面的权限或占用问题,不用急着怀疑卡坏了。
3. 方法一:以管理员身份运行并关闭占用进程
3.1 正确的提权启动方式
这是最直接、也是最容易见效的方法。操作步骤很简单,但细节上有很多人做错:
- 完全关闭当前打开的 Win32 Disk Imager 窗口。注意是彻底关闭,不是最小化。
- 找到 Win32 Disk Imager 的快捷方式或可执行文件,右键点击,选择"以管理员身份运行"。
- 如果弹出 UAC 确认窗口,点击"是"。
- 程序启动后,观察标题栏是否显示"管理员"相关标识。
这里有个细节:如果你是从开始菜单或任务栏启动的,右键菜单里可能没有"以管理员身份运行"选项。这时候需要找到安装目录下的Win32DiskImager.exe,直接右键操作。另外,如果你用的是绿色版(免安装版),同样要右键可执行文件来提权。
注意:提权运行后,Win32 Disk Imager 打开的文件对话框权限也会提升,这时候选择镜像文件和目标设备都不会再受普通用户权限限制。
3.2 用任务管理器排查占用进程
提权之后如果还报 Error 5,下一步就是排查谁在占用磁盘。Windows 没有直接提供"查看物理磁盘占用"的图形界面,但可以通过以下方式间接排查:
- 打开任务管理器(Ctrl + Shift + Esc),在"进程"标签页里找可能访问磁盘的程序:杀毒软件、云同步工具、磁盘管理工具、其他烧录软件。
- 逐个结束这些进程,然后重新尝试烧录。
- 如果不确定是哪个进程,可以先用资源监视器(在任务管理器"性能"标签页底部打开)查看磁盘活动,观察哪个进程在读写目标盘符。
资源监视器的"磁盘"标签页会列出所有正在访问磁盘的进程和对应的文件路径。虽然它显示的是盘符级别的活动,但能帮你快速定位可疑进程。比如你看到某个杀毒软件的进程正在扫描E:\(你的 SD 卡盘符),那它就是嫌疑对象。
3.3 关闭 Windows 自动挂载的实操
Windows 自动挂载是导致磁盘占用的头号嫌疑。每次插入 SD 卡,系统都会自动分配盘符并挂载分区。要解除这个占用,有几个层次的操作:
第一层:在资源管理器里弹出设备。右键点击 SD 卡的盘符,选择"弹出"。这会通知系统卸载该卷,释放部分句柄。但这个方法不一定彻底,因为物理磁盘句柄可能还被其他服务持有。
第二层:在磁盘管理里离线磁盘。按 Win + X,选择"磁盘管理",找到对应的 SD 卡磁盘,右键点击磁盘名称(不是分区),选择"离线"。离线后磁盘对文件系统层不可见,但物理句柄可能仍然被占用。
第三层:使用 diskpart 的 automount 命令。这是最彻底的方式,下一节会详细讲。
我实测下来的经验是:单纯在资源管理器里弹出设备,成功率大概只有一半。因为 Windows 的存储服务、索引服务、缩略图缓存等都可能重新挂载。真正可靠的做法还是用 diskpart 把自动挂载关掉,或者直接对物理磁盘做清理操作。
3.4 这个方法为什么有时候不管用
有些情况下,即使你提权了、也关了所有能想到的进程,Error 5 依然存在。这通常是因为:
- 系统级服务持有句柄:比如
System进程、svchost.exe下的存储服务,这些没法直接结束。 - 驱动层面的锁定:某些读卡器驱动或 USB 控制器驱动会锁定设备。
- SD 卡本身的分区表异常:如果卡的分区表损坏,Windows 可能反复尝试挂载失败,导致磁盘状态异常。
遇到这些情况,就需要用到下面两种更底层的方法。
4. 方法二:用 diskpart 清理磁盘并解除占用
4.1 diskpart 是什么,为什么它能解决 Error 5
diskpart 是 Windows 自带的命令行磁盘管理工具,权限级别比图形界面的磁盘管理更高。它能直接操作物理磁盘、卷、分区,执行 clean、offline、attributes 等底层命令。对于 Win32 Disk Imager 的 Error 5 问题,diskpart 主要能帮我们做两件事:
- 清除磁盘上的所有分区和卷信息,让 Windows 不再自动挂载,从而释放文件系统层的占用。
- 将磁盘设置为离线状态,或者清除磁盘的只读属性,解决因属性异常导致的访问拒绝。
diskpart 的操作是不可逆的,执行clean会抹掉磁盘上的所有数据。所以在操作之前,务必确认目标磁盘就是你的 SD 卡,而且卡上没有需要保留的数据。
4.2 完整操作步骤与命令详解
以下是我常用的 diskpart 操作流程,每一步都说明意图:
第一步:以管理员身份打开命令提示符。按 Win + R,输入cmd,然后按 Ctrl + Shift + Enter 提权打开。或者在开始菜单搜索"命令提示符",右键选择"以管理员身份运行"。
第二步:启动 diskpart。在命令行输入:
diskpart第三步:列出所有磁盘。输入:
list disk这时候会显示系统中所有物理磁盘的编号、大小、可用空间等信息。你需要根据容量来识别哪一个是 SD 卡。比如你的 SD 卡是 32GB,那就在列表里找大小接近 32GB 的那个磁盘。千万不要选错,选错磁盘执行 clean 会把电脑硬盘的数据抹掉。
第四步:选中目标磁盘。假设 SD 卡是磁盘 2,输入:
select disk 2第五步:清除磁盘。输入:
clean这个命令会删除磁盘上的所有分区表和卷信息。执行成功后,磁盘会变成"未初始化"状态,Windows 不会再自动挂载它。
第六步:清除只读属性(可选但推荐)。有些 SD 卡会因为写保护或属性异常导致 Error 5,执行:
attributes disk clear readonly第七步:退出 diskpart。输入:
exit完成这些操作后,不要急着拔卡,直接打开 Win32 Disk Imager(记得以管理员身份),重新选择镜像和目标磁盘,再点 Write。我实测这个流程解决 Error 5 的成功率非常高,尤其是那些反复报错、换工具也没用的卡。
4.3 clean 和 clean all 的区别,别选错
diskpart 里有两个清理命令:clean和clean all。很多人不知道区别,随手选了clean all,结果等了半小时还没跑完。
- clean:只清除分区表和卷信息,速度极快,几秒钟完成。磁盘上的实际数据还在,只是系统不再识别。对于解决 Error 5 来说,clean 就够了。
- clean all:把磁盘上每一个扇区都写零,彻底擦除数据。这个操作非常耗时,32GB 的卡可能要跑十几分钟到半小时,而且对解决 Error 5 没有额外帮助。
所以除非你有特殊的数据销毁需求,否则用 clean 就行,别用 clean all。
4.4 操作中的风险与注意事项
diskpart 是一把双刃剑,用好了解决问题,用错了数据全没。以下几点必须注意:
- 确认磁盘编号:
list disk之后,仔细核对容量。如果电脑里有多个同容量的磁盘,可以先拔掉 SD 卡看哪个磁盘消失了,再插上看哪个磁盘出现,以此确认编号。 - 不要对系统盘操作:系统盘通常是磁盘 0,千万不要 select disk 0 然后 clean。
- 操作后磁盘在资源管理器里会消失:这是正常现象,因为分区被清了。烧录完成后,Win32 Disk Imager 写入的新分区会重新出现。
- 如果 clean 报错"拒绝访问":说明磁盘被更底层的驱动锁定了,可以尝试重启电脑后再操作,或者换一个 USB 接口。
提示:如果你不确定磁盘编号,可以在 diskpart 里先执行
list volume,查看各个卷的盘符和标签,辅助判断。但最终 select 的必须是 disk 而不是 volume。
5. 方法三:换工具或换接口绕过底层冲突
5.1 为什么有时候换工具比修工具更快
前两种方法都是在 Win32 Disk Imager 这个框架内解决问题。但实际工作中,时间成本也是成本。如果 diskpart 清理完还是报 Error 5,或者你手头没有管理员权限,那换一个烧录工具往往是最快的出路。
不同的烧录工具底层调用的 API 和驱动模型不一样。Win32 Disk Imager 用的是比较传统的CreateFile+WriteFile直接写物理磁盘的方式,对权限和占用非常敏感。而一些现代工具用了不同的写入策略,可能就绕过了你当前环境下的冲突点。
5.2 几个值得一试的替代工具
以下是我在实际项目中用过、并且能解决 Error 5 类问题的替代方案:
| 工具名称 | 特点 | 适用场景 |
|---|---|---|
| balenaEtcher | 跨平台,自动提权,界面友好 | 树莓派、Ubuntu 镜像烧录 |
| Rufus | 体积小,支持多种写入模式 | Windows 启动盘、SD 卡烧录 |
| USBImager | 极简,写入速度快 | 嵌入式开发板固件烧录 |
| dd for Windows | 命令行,底层控制强 | 高级用户,脚本化烧录 |
balenaEtcher 是我最推荐的替代品。它在启动时会自动请求管理员权限,而且写入前会主动卸载目标磁盘的卷,减少占用冲突。Rufus 的优势在于它提供了"DD 模式"和"ISO 模式"两种写入方式,遇到 Error 5 时可以切换模式试试。
5.3 换 USB 接口和读卡器的实际效果
除了换软件,硬件层面的调整也值得一试。Error 5 有时候跟 USB 控制器的驱动状态有关:
- 换一个 USB 接口:前置接口和后面板接口可能挂载在不同的 USB 控制器上,驱动状态不一样。我遇到过前置接口一直报 Error 5,换到后面板就正常的情况。
- 换一个读卡器:不同读卡器的主控芯片不同,对磁盘的呈现方式也有差异。有些廉价读卡器会把 SD 卡识别成可移动设备而不是物理磁盘,导致 Win32 Disk Imager 找不到目标。
- 避免使用 USB Hub:Hub 会引入额外的电源和信号问题,直连主板接口最稳。
- 尝试 USB 2.0 接口:虽然速度慢,但兼容性通常比 USB 3.0 更好,尤其是在老读卡器上。
5.4 换工具后的验证与收尾
换工具烧录成功后,建议做一次验证,确认写入的数据是完整的:
- 烧录完成后,先不要急着拔卡,等系统重新识别分区。
- 在资源管理器里查看新出现的盘符,确认分区结构符合预期(比如树莓派镜像会出现 boot 分区)。
- 如果烧录的是启动盘,可以尝试在目标设备上启动一次,确认能正常引导。
- 如果烧录的是数据盘,可以用校验工具对比镜像和磁盘的哈希值。
这里有个经验:换工具烧录成功后,原来的 Win32 Disk Imager 可能也能用了。因为烧录过程重新格式化了磁盘,清除了之前导致占用的异常状态。所以如果你对 Win32 Disk Imager 有偏好,可以在换工具成功后再切回来试试。
6. 三种方法的适用场景与选择建议
6.1 按问题根因选择方法
三种方法不是互斥的,而是针对不同根因的。我整理了一个选择逻辑,方便你快速定位:
- 如果是权限问题(非管理员运行、UAC 限制):直接用方法一,右键以管理员身份运行。
- 如果是磁盘被占用(杀毒软件、自动挂载、其他工具):先试方法一关闭进程,不行就用方法二 diskpart 清理。
- 如果是底层驱动冲突或工具兼容性问题:方法二清理后仍报错,直接上方法三换工具。
- 如果是硬件层面的问题(读卡器、USB 接口):方法三的换接口、换读卡器。
实际排查时,建议按"方法一 → 方法二 → 方法三"的顺序来,因为方法一成本最低,方法二稍重但很有效,方法三需要额外准备工具。
6.2 不同操作系统环境下的差异
虽然 Win32 Disk Imager 是 Windows 工具,但很多人是在多系统环境下工作的。这里补充几点跨平台的注意事项:
- Windows 10/11:UAC 机制比较严格,提权运行是必须的。Windows 11 对可移动存储的管理更激进,自动挂载和索引服务更容易造成占用。
- Windows 7:UAC 相对宽松,但磁盘驱动模型较老,某些新读卡器可能兼容性差。
- Linux 环境:如果用 dd 命令烧录,Error 5 对应的是"Permission denied",用 sudo 即可解决。但要注意先 umount 目标设备。
- macOS 环境:用 dd 时需要用
diskutil unmountDisk先卸载磁盘,否则会报"Resource busy"。
6.3 预防 Error 5 的日常习惯
与其每次报错再排查,不如养成几个习惯,从源头减少 Error 5 的出现:
- 始终以管理员身份运行 Win32 Disk Imager,把它固定到任务栏时就用提权方式启动。
- 烧录前先关闭杀毒软件的实时扫描,或者把读卡器设备加入白名单。
- 插卡后不要急着打开资源管理器,先让系统完成挂载,再用 diskpart 或磁盘管理确认状态。
- 定期用 diskpart 清理旧卡,尤其是反复烧录过的卡,分区表容易残留异常信息。
- 准备一个专用的读卡器和 USB 接口,固定用于烧录,减少变量。
7. 几个容易被忽略的细节和我的实操心得
7.1 镜像文件本身也可能触发 Error 5
这一点很多人想不到:如果镜像文件所在的路径没有读取权限,或者镜像文件被其他程序占用,Win32 Disk Imager 也可能报 Error 5。虽然错误信息说的是"访问被拒绝",但它没有区分是目标磁盘被拒绝还是源文件被拒绝。
我遇到过一次,镜像放在一个受保护的文件夹里,Win32 Disk Imager 能选中文件,但一点 Write 就报 Error 5。后来把镜像复制到桌面,问题就解决了。所以排查时,不妨把镜像文件放到一个简单、无权限限制的路径下,比如C:\temp\或桌面。
7.2 SD 卡写保护开关的坑
有些 SD 卡侧面有一个物理写保护开关(Lock 开关)。如果这个开关被拨到了锁定位置,Win32 Disk Imager 写入时就会报 Error 5。这个坑很隐蔽,因为卡插上电脑能正常读取,你根本想不到是写保护的问题。
注意:不是所有 SD 卡都有写保护开关,但如果你用的是大卡(标准 SD 卡),一定要检查一下侧面那个小滑块是不是在 Lock 位置。
7.3 磁盘编号变化导致的选错盘
Windows 在插拔 USB 设备后,磁盘编号可能会变化。比如你上次烧录时 SD 卡是磁盘 2,这次插上可能变成了磁盘 3。如果你在 diskpart 里凭记忆 select disk 2,可能选中的是别的设备。
我的做法是:每次操作前都重新执行list disk,根据容量和当前状态确认编号。不要偷懒,这一步花不了几秒钟,但能避免灾难性的误操作。
7.4 烧录速度异常慢时的处理
有时候 Error 5 解决了,但烧录速度慢得离谱,比如 32GB 的镜像跑了两个小时还没完。这通常跟读卡器、USB 接口、SD 卡等级有关:
- 读卡器主控性能差:廉价读卡器的写入速度可能只有几 MB/s。
- USB 2.0 接口:理论带宽 480Mbps,实际写入速度受限。
- SD 卡等级低:Class 4 的卡写入速度远低于 Class 10 或 UHS-I。
- 镜像压缩率高:某些镜像内部是压缩数据,写入时需要解压,CPU 成为瓶颈。
如果速度慢但能正常完成,可以耐心等待。如果慢到卡死,建议换读卡器或换卡。
7.5 烧录完成后的安全弹出
烧录完成后,不要直接拔卡。Windows 的写入缓存可能还没完全刷到磁盘,直接拔卡会导致数据损坏。正确做法是:
- 等 Win32 Disk Imager 提示"Write Successful"。
- 在资源管理器里右键 SD 卡盘符,选择"弹出"。
- 等系统提示"可以安全移除硬件"后,再拔卡。
如果弹出时报"设备正在使用中",可以用 diskpart 的offline disk命令强制离线,然后再拔。
8. 当 Error 5 反复出现时的深度排查思路
8.1 检查磁盘是否被设置为只读
有些 SD 卡会因为寿命耗尽或主控保护机制,被固件设置为只读状态。这种情况下,无论怎么提权、怎么清理,写入都会报 Error 5。判断方法:
在 diskpart 里执行:
select disk 2 detail disk查看输出中是否有"只读"属性。如果有,尝试用attributes disk clear readonly清除。如果清除后重新插拔又变回只读,那基本可以判断卡已经进入保护状态,需要更换。
8.2 用 chkdsk 检查文件系统错误
如果 SD 卡的分区表或文件系统有错误,Windows 可能反复尝试修复,导致磁盘被占用。可以在命令行执行:
chkdsk E: /f /r其中 E: 是 SD 卡的盘符。/f修复错误,/r扫描坏扇区。这个操作可能需要较长时间,但能解决一些因文件系统异常导致的占用问题。注意,chkdsk 对物理磁盘的底层问题无能为力,它只处理文件系统层。
8.3 更新读卡器驱动和 USB 控制器驱动
驱动层面的问题比较隐蔽,但确实存在。可以在设备管理器里找到"通用串行总线控制器"和"磁盘驱动器",右键更新驱动。如果读卡器有厂商提供的专用驱动,优先安装厂商版本。
另外,某些主板芯片组的 USB 驱动老旧,会导致大容量存储设备识别异常。更新主板芯片组驱动有时能意外解决 Error 5。
8.4 最后的硬件替换法
如果以上所有方法都试过了,Error 5 依然存在,那就进入硬件替换排查阶段:
- 换一张已知良好的 SD 卡,用同样的读卡器和接口烧录。如果正常,说明原卡有问题。
- 换一个读卡器,用同样的卡和接口。如果正常,说明原读卡器有问题。
- 换一台电脑,用同样的卡和读卡器。如果正常,说明原电脑的驱动或系统配置有问题。
这种替换法虽然笨,但能最快定位问题边界。我在实际工作中遇到过一个案例,最后发现是某品牌笔记本的 USB 控制器驱动与特定读卡器不兼容,更新驱动后解决。
9. 关于烧录这件事的一些个人体会
烧录看起来是个简单操作,但真正做过几百次之后会发现,大部分失败都不是工具本身的问题,而是环境问题。权限、占用、驱动、硬件状态,这些因素交织在一起,任何一个环节出问题都会表现为一个简单的 Error 5。
我现在养成的习惯是:每次烧录前,先花一分钟做三件事——确认以管理员身份运行、用 diskpart 清理目标磁盘、把镜像放到简单路径。这三步做完,Error 5 基本就不会再出现了。偶尔遇到顽固的情况,直接换 balenaEtcher 或 Rufus,不跟它较劲。
另外,SD 卡是有寿命的。反复烧录会消耗卡的写入寿命,尤其是廉价卡。如果一张卡开始频繁报错,即使能通过清理暂时解决,也建议换新卡,避免在关键时刻掉链子。我一般会备两三张同型号的卡轮换使用,既能延长寿命,也能在出问题时快速替换。
最后分享一个小技巧:如果你经常烧录同一种镜像(比如树莓派系统),可以把 diskpart 的清理命令写成一个批处理脚本,每次烧录前双击运行,省去手动敲命令的麻烦。脚本内容大概是这样:
@echo off diskpart /s clean_disk.txt pause其中clean_disk.txt里写好 select disk 和 clean 命令。这样每次只需要确认磁盘编号,剩下的自动完成。当然,脚本里的磁盘编号要提前确认好,别写错了。