尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Ubuntu下.exe报错“装入归档文件时出现了一个错误”的排查与解决

Ubuntu下.exe报错“装入归档文件时出现了一个错误”的排查与解决 刚把Windows上的某个软件文件夹整个拷贝到Ubuntu双击里面的.exe文件结果弹出一个“装入归档文件时出现了一个错误”的窗口。这个场景我遇到过太多次了尤其是刚接触Linux的Windows用户第一次碰上这个提示基本都是一脸懵明明在Windows上双击就能正常打开的程序到了Ubuntu怎么就成了“归档文件”先说结论这个报错不是程序坏了也不是文件拷贝损坏而是Ubuntu这边根本没把.exe当成“可执行程序”来处理。GNOME桌面在识别到未知文件类型时会根据MIME类型交给对应的默认应用而你的.exe文件因为种种原因被系统判断成了压缩包一类的归档文件于是归档管理器file-roller强行去“装”它装到一半发现结构不对就报了这个错。一句话不是程序出了问题是Ubuntu认错了门。这篇文章我会把这个问题彻底讲透。你会搞清楚.exe在Ubuntu上为什么不能直接双击运行、那句报错是怎么来的、以及用什么方案能让Windows软件在Ubuntu上跑起来。同时附上我实际排查、修复过程中踩过的坑和常用命令内容包括环境配置、Wine安装、虚拟机方案、文件权限修复等。适合所有遇到跨平台软件迁移问题的人不管你是开发、运维还是普通桌面用户都能照着操作。1. 先搞清楚“装入归档文件时出现了一个错误”是怎么来的1.1 一个双击动作背后发生了什么在GNOME桌面Ubuntu默认桌面环境上双击一个文件文件管理器Nautilus会先看这个文件的MIME类型再根据MIME类型去查默认应用列表最终决定调用哪个程序来打开它。整个过程对用户是透明的但一旦MIME识别出错就会出现匪夷所思的行为。你的.exe文件在Windows下会被识别为“PE可执行文件特定图标”双击后直接由Windows的进程加载器执行。但在Ubuntu里file命令对很多.exe的判断结果是“PE32 executable (console) Intel 80386, for MS Windows”这个结果会被GNOME映射成application/x-ms-dos-executable。理论上这类文件双击后应该弹出“执行/取消/显示文件”的选项但实际操作中如果文件本身被修改过、文件名带有.zip或.tar之类的后缀、或者系统里注册了错误的MIME关联GNOME就会走“用默认应用打开”这条路。一旦默认应用是归档管理器自然就出现了“装入归档文件时出现了一个错误”。还有一个非常容易被忽略的触发点文件是从Windows分区挂载盘直接双击访问的。U盘或NTFS分区如果挂载参数里少了exec任何可执行文件都会被视为普通数据文件Nautilus根本不会给出“执行”选项。这时候你不光打不开.exe你在Linux里编译的二进制程序同样打不开。1.2 .exe与Ubuntu可执行文件的底层差异Windows下的.exe是一种叫做PEPortable Executable格式的文件。它包含DOS头、PE头、节区表、导入表、资源段等信息Windows内核的加载器能解析这些结构把程序映像加载进内存然后跳转执行。Linux下可执行文件使用的是ELFExecutable and Linkable Format格式。别管后缀是.out还是.bin只要文件内容是ELF格式加上执行权限就能被Linux内核直接加载运行。反过来也一样Linux内核不会去解析PE格式的.exe文件所以就算你把一个.exe文件加了chmod x权限双击或./xxx.exe运行Linux给出的常见提示是“cannot execute binary file: Exec format error”。“Exec format error”才是Linux内核看到不认识的二进制时给出的真正报错。而“装入归档文件时出现了一个错误”完全是桌面层在捣乱是“用错应用打开”的结果不是内核层面的问题。理解这一点整个排查思路就清晰了要么让桌面环境正确识别文件类型要么让Linux系统具备运行PE文件的能力比如Wine要么换个环境跑虚拟机。1.3 文件权限为什么“解压”不是“执行”Windows文件系统里可执行性主要通过扩展名判断.exe这个名字就自带执行属性。但Linux不是Linux靠的是文件权限位的“可执行权限”。从Windows拷贝过来的文件默认权限通常是rw-r--r--意思就是你可以读、可以写但没有执行权限。你想想一个“没有执行权限”的文件系统怎么敢把它当程序跑所以你会看到很多教程上来就让你执行chmod x 你的程序.exe这个操作是把可执行权限加给当前用户让系统允许你这个用户去运行它。注意这道工序只解决“能不能执行”的问题不解决“内核认不认识PE格式”的问题。也就是说如果你只是chmod x然后直接双击很可能还是老样子因为你的.exe还是PE格式Linux内核照样无法加载。有的老手会告诉你“用Wine运行”那个才是在用户态实现PE格式解析的正道。权限、格式、打开方式这三件事分别对应三个不同的坑很多人把它们的因果关系混在一起结果折腾半天没效果。1.4 排查前的三件事file命令、权限、默认应用遇到打不开的.exe我建议你按顺序执行下面三条命令先把现场情况摸清楚。第一看文件类型file 你的程序.exe这个命令会输出文件真实格式。如果输出PE32 executable (console) Intel 80386, for MS Windows说明文件本身没问题是纯正的Windows程序。如果输出Zip archive data或RAR archive data说明这个.exe其实是个自解压包或者它就是被改了后缀的压缩文件。后一种情况出现“装入归档文件时出现了一个错误”就非常合理了因为它真的是归档文件只是名字带了.exe。第二看权限ls -l 你的程序.exe如果显示是-rw-r--r--那就给它加执行权限chmod x 你的程序.exe第三看系统用什么应用关联它。GNOME的默认关联存在~/.config/mimeapps.list里你可以直接查PE可执行文件的关联grep -i windows ~/.config/mimeapps.list如果有类似application/x-ms-dos-executableorg.gnome.FileRoller.desktop这种关联那基本实锤了归档管理器被设成了.exe的默认打开方式。改掉这段关联就行后面第2章会详细操作。2. 三种解决思路哪条路适合你2.1 方案A安装Wine兼容层让.exe在Linux里直接跑Wine的本质是一个兼容层它在Linux用户态里实现Windows API的接口把PE格式的程序翻译成Linux内核能理解的方式运行。它不是虚拟机不会在后台启动一个完整的Windows系统所以占用资源小、启动快。对于轻量级Windows工具、安装程序、甚至一些游戏Wine都能胜任。Ubuntu里安装Wine非常省事sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine wine64dpkg --add-architecture i386这一步很关键很多32位的Windows程序需要32位的Wine库不加上这个架构直接装后面跑32位程序会缺库。装完以后你可以从命令行启动wine 你的程序.exe或者右键.exe文件选择“使用Wine Windows Program Loader打开”。第一次运行Wine会初始化~/.wine目录里面模拟出一个C盘结构。这个过程会自动弹出配置窗口按默认就行。Wine的优点是对用户透明写个wine xxx.exe就完事缺点是没有完整的Windows注册表和系统环境有些重度依赖驱动、系统服务的程序会跑不起来。还有一点Wine的版本会影响兼容性Ubuntu官方源里的Wine往往不是最新版遇到程序跑不起来优先考虑升级Wine版本用WineHQ的官方源安装新版。2.2 方案B虚拟机装Windows彻底隔离运行如果这个.exe是大型商业软件、依赖特定驱动或设备或者你就是要100%的兼容性别犹豫直接用虚拟机。VirtualBox或VMware Workstation Player里装一个精简版Windows把.exe拷进去跑。这个方案本质上是“在Linux里再包一层Windows”代价是硬盘空间和内存占用比较大但换来的是和物理Windows几乎一致的兼容性。我一般建议桌面用户用这个方案处理两类程序一是安装包被封装得极其别扭的国产软件二是那种需要特定硬件驱动的程序。虚拟机还有一个额外好处软件环境独立随便折腾坏了快照一还原就行不会污染主系统。如果你用QEMU/KVM还能直接用Windows的物理磁盘分区做启动盘但这对普通用户来说太复杂了日常场景VirtualBox就够了。装完虚拟机记得装增强功能/驱动能大幅提升性能。这一步常在教程里被忽略但不装你会发现文件拖拽、共享文件夹、剪贴板共享全是坏的。2.3 方案C检查MIME关联/默认应用修复“双击被归档管理器接管”有些时候问题不在于怎么运行.exe而在于系统连“运行”这个选项都没给你。你双击之后直接被归档管理器拦截了窗口一闪而过就是那句熟悉的话“装入归档文件时出现了一个错误”。这种情况要修的是文件关联不是程序本身。在文件管理器里右键.exe文件选择“属性”切到“打开方式”标签页看有没有“Wine Windows Program Loader”或其他选项。如果没有说明系统压根没把.exe识别成Windows可执行程序或者没有注册相应的打开方式。手动注册关联的方法是写一个.desktop文件。在~/.local/share/applications下创建一个文本文件内容类似[Desktop Entry] NameWine Execwine %U MimeTypeapplication/x-ms-dos-executable NoDisplaytrue保存后执行update-desktop-database ~/.local/share/applications刷新桌面数据库再重新右键.exe文件应该就能看到“使用Wine打开”的选项了。如果之前已经被归档管理器占用顺手把~/.config/mimeapps.list里application/x-ms-dos-executable对应的行删掉或者改成wine.desktop。2.4 方案对比三种思路怎么选方案原理启动速度兼容性资源占用适合场景Wine兼容层用户态模拟Windows API快中高看软件低工具软件、安装程序、经典游戏虚拟机完整虚拟Windows系统慢极高高商业软件、驱动依赖、低层操作修复MIME关联让系统正确识别/引导取决于后续方案不改变本质无解决双击没反应/被归档器接管这三种思路不是互斥的。我的建议是先做“方案C”排查把系统识别修好至少让双击.exe时能弹出“执行”选项然后根据软件复杂度决定用Wine还是虚拟机。不要一上来就砸虚拟机也不要对Wine期望太高按场景选型才是正确做法。3. 实操从拷贝到正常运行一个.exe的全流程3.1 拷贝文件时要注意的编码和权限问题先从源头说起。你在Windows上把一个.exe或整个软件目录拷贝到Ubuntu涉及三个隐患文件名编码、执行权限、文件关联。文件名编码这个坑最容易中招。Windows默认文件名编码是GBK/GB18030Linux默认是UTF-8从U盘或NTFS分区拷贝时如果文件名里有中文偶尔会出现乱码。你可以用convmv批量转换文件名编码但更省事的做法是在Windows里先压缩成zip再拷贝到Ubuntu解压zip内部的文件名是UTF-8编码能避免乱码。而且压缩包通常保留相对路径比直接拷贝一堆散文件更干净。至于执行权限zip解压后的文件权限默认是不可执行的需要手动加chmod -R x /home/你的用户名/软件目录但别无脑-R如果一个目录里既有可执行程序又有配置文件、图片资源全加上执行权限虽然不至于出大事但不够严谨。更合理的做法是只对需要运行的文件加chmod x 软件目录/主程序.exe chmod x 软件目录/依赖的exe或dll辅助工具当然这属于细节洁癖大多数场景下-R x也能跑。3.2 用file命令识别真实格式别着急安装任何东西先把文件验明正身。进入文件所在目录cd /home/你的用户名/下载 file *.exe我见过太多情况是用户以为拷贝的是Windows安装程序结果file一查输出“Zip archive data”这才想起来这个“exe”是从那种“免安装绿色版下载站”搞来的自解压压缩包——它本质是个带自释放头的zip。这种文件你在Windows下双击能自动解压并运行安装向导在Linux下直接用unzip就能解开unzip 那个文件.exe解压出来的内容可能就是一个文件夹里面套着真正的.exe或脚本。也就是说对于自解压型.exe正确的语法不是“运行它”而是“解压它”。知道了这个你就能明白为什么GNOME会试图用归档管理器打开了因为在系统的libmagic识别库里这个文件的特征就是Zip归档跟你在Windows下的体验完全是两回事。3.3 添加可执行权限并尝试命令行运行确认文件确实是PE格式后执行chmod x 你的程序.exe ./你的程序.exe这一步你会得到三种可能的结果。第一种是你直接看到程序跑起来了但这种情况多半是因为你的Ubuntu装了Wine系统里的binfmt_misc内核模块注册了Wine的格式处理器内核碰到PE格式会自动交给Wine执行。第二种是报“Exec format error”说明纯Linux环境不认PE格式老老实实装Wine。第三种是报“Permission denied”说明执行权限没加上或者文件所在分区挂载参数不允许执行。把这三步结果记下来再去选择对应的解决方案。“Exec format error”对应装Wine“Permission denied”对应检查挂载参数如果是在/etc/fstab里挂NTFS分区要加上exec参数例如UUIDxxx /mnt/windows ntfs-3g defaults,localezh_CN.UTF-8,uid1000,gid1000,dmask022,fmask133,exec 0 0注意fmask133表示文件默认没有执行权限你要运行程序还得手动chmod或改umask。很多人从Windows分区直接双开.exe失败就是栽在这一步。3.4 安装Wine并用Wine运行装Wine前先把系统更新到当前版本sudo apt update sudo apt upgrade -y然后安装Wine。Ubuntu 24.04及更新版本用官方源里的wine版本就能跑大部分软件不过我还是推荐用WineHQ仓库装最新稳定版步骤是sudo dpkg --add-architecture i386 sudo mkdir -pm755 /etc/apt/keyrings sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/$(lsb_release -cs)/winehq-$(lsb_release -cs).sources sudo apt update sudo apt install --install-recommends winehq-stable装好后用wine --version验证。第一次运行任意wine命令都会初始化~/.wine这个初始化过程如果卡住、报图形错误多半是缺少xvfb或gnutls等依赖执行sudo apt install --install-recommends winehq-stable应该会一并带上。初始化完毕后在命令行运行cd /你的软件目录 wine 你的程序.exeWiFi、中文显示、字体这些基础问题通常不需要额外处理Wine自带的Gecko和Mono引擎会在需要时自动下载。如果某个软件界面文字全是方块那就是缺中文字体装一下就行sudo apt install fonts-wqy-zenhei3.5 winecfg配置与依赖补装如果程序能启动但行为怪异跑一个winecfg打开配置窗口。重点调整两个地方一是“应用程序”标签页里点击“添加程序”选中.exe文件然后在“Windows版本”下拉框里选对应的系统版本有些老软件要选WinXP或Win7才能正常工作新软件选Win10二是“库”标签页可以给某个.dll指定为“内置Builtin”还是“原生Native”当提示缺dll时先在系统目录里找到正确的dll放到程序目录再在winecfg里强制走原生库很多闪退问题就是这么解决的。安装大型软件可能需要用到winetricks这个辅助工具它能一键安装.NET Framework、VC运行库、DirectX等常见依赖sudo apt install winetricks winetricks corefonts vcrun2019 dotnet48注意装这些组件会花很长时间而且不同版本之间可能有冲突建议按需安装不要一口气全装。我就遇到过先装dotnet48、再装vcrun2015后注册表里相互覆盖导致部分组件失效的情况最后只能把~/.wine整个删除重新初始化。3.6 双击执行前的准备工作命令行能跑通后最后一步是让双击也能正常工作。在Nautilus里右键.exe文件选“属性”在“打开方式”选择Wine如果右键里没有Wine选项回到第2.3节注册.desktop文件。另外你可以直接把.exe文件拖到终端窗口里终端的命令行会快速填入带完整路径的文件名前面加上wine回车即可。这个技巧最大的好处是不用记路径也不怕中文目录名打错字。我日常排查时习惯用wine加拖拽的方式启动程序这样控制台输出会直接打印在终端里任何报错信息都逃不过眼睛比双击黑盒运行靠谱得多。4. 常见问题与排查技巧实录4.1 双击还是被归档管理器接管怎么办已经注册了Wine关联但双击后还是弹出“装入归档文件时出现了一个错误”大概率是Nautilus的文件关联缓存没刷新。重启文件管理器是第一步nautilus -q或者按F5刷新窗口。如果还不行直接检查mimeapps.list把里面application/x-ms-dos-executable相关行清理干净nano ~/.config/mimeapps.list然后重新注册。但要注意有些.exe文件在系统看来确实就是归档文件比如自解压安装包。这种情况你就算把Wine设成.exe的默认打开方式依然打不开——因为那个文件是zip套壳。所以文件夹里如果同时存在setup.exe和setup.zip先分清谁是谁解法完全不同。4.2 Wine运行后闪退、缺dll怎么办闪退问题的排查思路和Windows下一样先从终端运行拿到报错信息。绝大多数Wine闪退都能通过终端输出来定位比如“err:module:import_dll Library XXXXX.dll not found”就是明确告诉你缺这个dll。常规解法有三个方向第一在程序目录放进对应的dll文件Windows系统目录里的dll拷过来可以直接用第二用winetricks安装对应的运行库第三把dll复制到~/.wine/drive_c/windows/system32目录下然后设置winecfg里对应dll为“原生”。优先推荐第二个方向因为系统库文件涉及依赖链手动拷贝容易引入版本冲突缺什么库就用winetricks装对应运行库最省心。如果程序用到了.NET/WPF这种重量级框架闪退概率会明显上升。先确保wine-mono已安装没有的话在winecfg里会提示你安装。另外像Python打包出的PyInstaller exe在Wine下运行通常比.NET程序顺利但如果是新版本Python打包的偶尔也会因缺少VCRUNTIME140.dll报错按上面的思路装vcrun2019就能解决。4.3 32位程序在64位系统上的坑现在大部分Ubuntu是64位如果你的Wine只装了64位版本运行32位程序会直接提示“wine: Bad EXE format”。这时先确认有没有启用i386架构dpkg --print-foreign-architectures输出应该包含i386如果没有执行sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32装了32位Wine库之后用wine命令运行32位.exe就正常了。说实话现在Windows的老软件还有相当一部分是32位这个架构坑是绕不开的。4.4 安装版程序与便携版程序的处理差异同样是.exe区别非常大。安装版程序一般文件名带setup、install或者在Windows下会弹出安装向导在Wine里运行也是先走安装向导它会往模拟的C盘写文件、注册表写键值。这个过程在Wine下通常没问题但要注意安装路径别选在程序提供的默认“C:\Program Files”之外因为Wine的C盘路径在~/.wine/drive_c下权限控制和Linux主目录不一致装到其他位置可能在后续启动时找不到关键路径。便携版程序就好办多了。它们不需要安装解压后就能运行。但要注意便携版里如果带有自己的数据文件、配置目录最好放在Linux主目录下运行不要放在/opt或/usr/local这些需要root权限的目录。Wine对Linux文件系统的访问没有障碍你可以直接把便携版程序放在主目录下任意位置用wine /路径/程序.exe启动非常灵活。4.5 那些经典误用场景把打包工具产出的“假exe”当程序跑近年来有个高频场景就是开发者在Windows上用PyInstaller把Python脚本打包成exe或者用Bat To Exe Converter把bat脚本转成exe。这类“程序”本质是自解压壳包着脚本和解释器拿到Ubuntu后明显有两种结局一种是通过Wine运行PyInstaller打包的exe在Wine下表现不错但运行效率偏慢另一种是直接把壳解开拿到里面的Python脚本或bat原始内容在Linux里用对应解释器运行反而比Wine更轻。比如你手里有个bat转exe生成的文件用7z x 你的程序.exe解压后里面很可能直接躺着原本的.bat脚本和一堆资源文件。这种思路在“把Windows应用迁移到Linux”时非常实用先看能不能拆出原始内容再决定是否需要兼容层。同样Java应用通过exe4j打成的exe本质是Java启动器解包后在Linux下真正需要的是JRE而不是Wine。理解这些底层差异能帮你少走很多弯路。写到最后的一点经验“装入归档文件时出现了一个错误”这个报错我自己第一次遇到时也纠结了半天那会儿还没意识到是GNOME在拿归档管理器开.exe。现在回头总结这类问题的核心就三件事文件本身是什么格式、系统认不认、有没有能执行的工具。先跑file搞清楚文件属性再用chmod权限兜底最后按需上Wine或虚拟机。整个过程里最值的技巧是别只用双击多从命令行启动所有报错信息都会直接抛在终端里你顺着报错走十有八九能自己找到答案。遇到特别棘手的软件也别死磕Wine虚拟机里跑个Windows一了百了很多时候“绕开问题”比“解决问题”更高效。
返回列表