
去年帮课题组搭计算环境的时候我把VMware里装Ubuntu、再塞一个Intel Parallel Studio XE 2013也就是ifort2013的完整过程重新走了一遍。这套组合听着有点年头了但直到今天很多做气象、流体、有限元、CFD的课题组和研究生还在用原因是课题组祖传的Fortran代码往往得靠老版本Intel编译器才能稳定编译出和十年前一致的结果。这篇博文就把从零开始装虚拟机、装系统、装ifort2013的流程和踩过的坑一次说清楚给正在折腾这套环境的同学当个操作手册。1. 项目背景为什么我还在折腾一套2013年的编译器1.1 这套环境到底解决什么问题先说清楚这套组合是拿来干嘛的。Intel Parallel Studio XE是一套面向科学计算和工程仿真的开发工具包里面的核心成员ifortIntel Fortran Compiler能把Fortran代码编译出极其高效的可执行程序配合MKL数学库和OpenMP并行跑起矩阵运算、差分求解、粒子模拟这类负载比大部分开源编译器都要快一截。2013这个版本恰好是当时很多科研代码适配过的编译器像WRF、CAMx、部分Fluent UDF、自研的有限元程序在ifort 2013下编译出来的二进制最“听话”。为什么要套一层虚拟机因为现在大多数人主力工作环境是Windows而老版本Intel编译器主要面向Linux直接在Windows上跑旧版ifort既不方便也容易跟现有依赖打架。在VMware里开一台Ubuntu虚拟机相当于在Windows里圈出一块完全可控的Linux地盘编译环境、许可证、系统版本随便折腾坏了就回滚快照不影响宿主机正常工作。1.2 为什么不用新版ifort或者gfortran这可能是很多新手最困惑的问题。2023年Intel都已经推出ifx编译器了为什么还守着2013年的ifort答案往往不是技术上的最优解而是“兼容性”这三个字。我见过太多这样的案例组里的老代码用ifort 2013编译时一切正常换到新版本编译器就冒出各种警告、数值结果出现细微差异甚至直接编译失败。对科研来说结果的可复现性高于一切代码能跑出和师兄师姐论文里一致的数据比“编译器版本新”重要得多。gfortran虽然免费、开源、持续维护但对某些老代码的OpenMP指令、MKL调用、特定编译选项的支持行为跟ifort不同需要额外调代码成本反而更高。所以只要许可证还合法、够用继续用ifort 2013就成了最稳的选择。1.3 为什么选VMware而不是双系统或VirtualBox双系统要重启切换来回折腾效率太低而且Linux分区出问题的时候Windows也跟着担惊受怕。虚拟机方案里VMware Workstation和Oracle VirtualBox都是主流选择。两者对比下来VMware在磁盘IO性能、3D加速、网络模式稳定性、快照机制这些方面综合表现更稳尤其是跑大数据量编译和计算时VMware的磁盘吞吐比VirtualBox更不容易成为瓶颈。VirtualBox胜在免费开源预算有限的个人用户也能接受但如果你要跑的项目涉及大量文件读写我还是建议优先上VMware。2. VMware中部署Ubuntu参数和细节比想象中重要2.1 新建虚拟机时的关键参数打开VMware Workstation点击“创建新的虚拟机”选择“自定义高级”这一步不要图省事选典型因为典型向导默认的参数偏保守后面要改反而麻烦。硬件兼容性选当前Workstation版本即可不需要刻意调低。CPU和内存的分配直接影响编译速度和程序运行。假如宿主机是16GB内存、8核CPU我建议给虚拟机分配4核和8GB内存。4核是最低限度因为ifort对多核并行编译的支持很好-m参数可以直接指定并行编译任务数核心太少编译大型项目会非常痛苦8GB内存则是考虑到很多Fortran程序跑起来动不动就要几个GB的数组空间。磁盘方面建议分配60GB以上并且要选“将虚拟磁盘存储为单个文件”这样性能更好虽然快照会稍微慢一点但整体读写速度更稳定。网络类型默认NAT模式就行如果后面需要虚拟机被局域网内其他机器访问可以再改成桥接模式。NAT模式下虚拟机通过宿主机访问外网对大多数开发场景足够用。2.2 Ubuntu安装的几个决定性细节镜像版本的选择很微妙。我首推Ubuntu 20.04 LTS这个版本够新、软件源齐全同时还没有彻底抛弃对老版本二进制程序的兼容层。18.04 LTS也可以但对新硬件的支持差一些。不建议一上来就用22.04后面装ifort2013时踩的兼容性坑会更多这个留在第4章细说。安装系统时有两个细节容易被忽略第一在安装类型界面一定要选“清除整个磁盘并安装Ubuntu”这是虚拟机专用磁盘不用担心数据丢失。新手千万别选“其他选项”手动静分区虽然能自定义但操作复杂不说稍有不慎分区表就乱了。第二创建用户时用户名和主机名要刻意取成简短英文。比如用户名用user、主机名用node1。原因在装ifort许可证时会体现Intel的License管理器需要主机名能被本地解析如果主机名带特殊字符或者过长后面license校验会无故失败排查起来特别费劲。2.3 VMware Tools和网络适配器的小坑系统装完先别急着装编译器第一件事是安装VMware Tools。在VMware菜单栏点击“虚拟机”-“安装VMware Tools”然后在Ubuntu里挂载虚拟光驱运行里面的vmware-install.pl脚本。这个工具负责增强虚拟机的图形性能、剪贴板共享、文件拖拽和自适应分辨率不装的话后面用起来会很憋屈。网络这块经常有人出问题热搜里“vm虚拟机没有网络适配器”“vmnet1有感叹号”都是高频坑。这类问题九成是VMware的网络服务没启动在Windows服务管理器里把VMware NAT Service和VMware DHCP Service设为自动启动并运行起来就能解决。如果Ubuntu里ifconfig看不到网卡多半是系统没装net-tools用ip addr看一眼就知道。另外如果你想省去每次编译完把结果文件拷出来的麻烦可以在虚拟机设置里添加“共享文件夹”把Windows下的一个目录映射到虚拟机里这样源代码放Windows侧、用IDE编辑然后到Ubuntu里挂载编译效率会高很多。挂载命令通常是sudo mount -t vmhgfs .host:/ /mnt/hgfs或者用vmhgfs-fuse挂载具体看VMware Tools版本而定。3. ifort 2013安装实战从解压到编译Hello World3.1 安装前的三个准备动作安装ifort2013之前先把三样东西准备好。第一是安装包。Intel Parallel Studio XE 2013的Linux版是一个.tar.gz压缩包解压后里面是完整的安装程序。官方下载渠道现在不好找了一般是通过学校或单位的Intel许可证服务获取镜像包或者从组里旧机器上拷贝。第二是许可证文件。这是整个过程中最容易卡壳的环节。ifort2013的许可证分为单机版license文件绑定主机名或MAC地址和网络版连接license server两种。单机版最省心前提是虚拟机的hostname要跟license文件里写入的主机名一致。这一点在第2章专门强调过主机名要取短英文就是为这里做准备。第三是检查系统里有没有libstdc.so.5这类老版本兼容库。ifort2013安装程序本身是32位的在64位Ubuntu上运行需要ia32-libs或libc6-i386支持少了这些库安装脚本会直接崩溃这个坑下面细说。3.2 图形安装还是命令行安装解压安装包后进入目录会看到install_GUI.sh和install.sh两个脚本。图形界面的install_GUI.sh看起来友好但实际体验并不好老版本安装程序在Ubuntu 20.04的GNOME环境下经常出现窗口闪烁、按钮错位、半路卡死的问题。我更推荐的姿势是直接用命令行安装。tar -xzvf parallel_studio_xe_2013_update4.tar.gz cd parallel_studio_xe_2013_update4 sudo ./install.sh跟着提示一路y或回车即可。组件选择界面出现时建议全选。虽然博文主要用ifort编译器但包里的MKL数学库、OpenMP库、MPI库说不定哪天就用上了一次性装齐省得以后补装麻烦。选择安装目录时保持默认的/opt/intel没必要改后面配环境变量都按这个路径来。许可证的配置界面选择“Use a license file”然后浏览到你放license文件的目录确认后安装程序会自动把许可证复制到/opt/intel/licenses下。这一步如果license文件不匹配安装程序会拒绝继续遇到这种情况不要硬来检查主机名是否一致、license文件是否完整然后重试。3.3 环境变量和第一个编译测试安装完成后关键一步是配置环境变量。打开~/.bashrc在末尾加上source /opt/intel/composer_xe_2013/bin/compilervars.sh intel64然后source ~/.bashrc使配置生效。注意路径里的composer_xe_2013部分可能根据版本号的细微差异有所不同装完先在/opt/intel下ls看一眼实际目录名再写进配置文件。验证环境是否配好运行which ifort如果能定位到/opt/intel/composer_xe_2013/bin/intel64/ifort就说明基本成功了。再写个最简单的Fortran程序确认编译链路没问题program hello implicit none print *, Hello, Intel Fortran! end program hello编译命令ifort -O2 -o hello hello.f90 ./hello看到Hello, Intel Fortran!输出ifort2013就正式跑起来了。这时候我强烈建议立刻在VMware里打个快照名字就叫“clean-ubuntu-with-ifort”后面再怎么折腾都不怕了。4. 踩坑实录ifort 2013在新版Linux上的兼容性斗争4.1 32位兼容库缺失导致的安装崩溃这是ifort2013安装时遇到率最高的坑。安装脚本刚启动就报错提示找不到某个动态库或者直接Segmentation fault。原因就是前面提到的老版本Intel安装程序包含32位组件而现代Ubuntu默认不装32位运行库。解决方法是先启用i386架构并安装兼容库sudo dpkg --add-architecture i386 sudo apt update sudo apt install libc6-i386 lib32stdc6 lib32gcc-s1装完再重新运行./install.sh大概率就能顺利进入安装界面。这一步建议在安装ifort之前就完成免得卡在半路影响心态。4.2 license校验失败的主机名之谜ifort2013的license机制跟主机名绑定得很紧。安装时提示“License file could not be checked out”或者“Invalid host”很多时候不是license文件本身有问题而是虚拟机的主机名解析出了岔子。Linux系统里主机名一致性需要三个地方对齐/etc/hostname文件里的名字、/etc/hosts文件里映射到127.0.0.1的名字、以及hostname命令输出的结果。很多教程只改了/etc/hostname忘了改/etc/hostsIntel的license服务一查主机名对不上就罢工。排查命令很直接hostname cat /etc/hostname cat /etc/hosts三个结果不一致时手动改/etc/hosts把127.0.0.1 node1这样的行加上去保证跟主机名一致。4.3 gcc版本和链接器带来的编译异常ifort2013年代对应的gcc是4.x系列而Ubuntu 20.04自带的是gcc-9。虽然如果你只写纯Fortran不涉及C/Fortran混编大部分情况下感觉不到差异但一旦代码里通过iso_c_binding调用C库函数或者链接某些依赖gcc版本的静态库就可能出现莫名其妙的符号找不到、ABI不兼容报错。稳妥的应对措施是装一个老版本gcc备用sudo apt install gcc-4.8 g-4.8 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50然后编译时显式指定-gcc-namegcc-4.8或者把老gcc设为默认能解决绝大多数混编问题。如果你的项目纯Fortran且不碰C库那这一步可以先跳过等遇到问题了再回头处理。4.4 动态库搜索路径问题装好ifort后编译运行程序偶尔会报找不到libifcore.so、libimf.so这类Intel运行时库。这些库位于/opt/intel/composer_xe_2013/compiler/lib/intel64如果环境变量没配对运行时就会找不到。确保.bashrc里执行了compilervars.sh脚本同时再用环境变量兜个底export LD_LIBRARY_PATH/opt/intel/composer_xe_2013/compiler/lib/intel64:$LD_LIBRARY_PATH另外用ifort编译出的可执行文件在别的Linux机器上运行时一般也需要目标机器安装对应的Intel运行时库或者用-static-intel选项做静态链接把Intel库直接编进可执行文件里这样拷贝到其他机器上直接能跑。5. 常见问题速查一条一条对着修5.1 虚拟机层面的高频故障很多问题乍一看是ifort的锅追根溯源却是虚拟机配置不当。VMware里最常见的三大网络问题没有网络适配器、NAT服务感叹号、桥接模式上不了网。处理顺序是先在Windows服务里确认VMware NAT Service和VMware DHCP Service状态是否正常再在虚拟机设置里把网络适配器移除后重新添加一次最后进Ubuntu确认网卡有没有获取到IP。三步走完九成网络问题都能解决。共享文件夹不生效也是高频问题。挂载前先确认VMware Tools装好再用vmware-hgfsclient查看共享目录是否可见如果可见但挂载失败多半是/mnt/hgfs目录不存在手动mkdir后重新挂载即可。5.2 ifort编译和运行期问题我用一张表汇总几个典型的编译器报错方便你遇到时快速定位报错信息可能原因解决办法ifort: error #10105许可证检查失败检查主机名和license文件绑定关系cannot find -lifcore库路径未配置检查compilervars.sh及LD_LIBRARY_PATHlibimf.so: cannot open shared object file运行时库缺失重新source环境变量或静态链接编译undefined reference togfortran_runtime_errorC/Fortran混编ABI冲突指定老版本gcc并重编C侧代码编译进程被Killed虚拟机内存不足调大虚拟机内存或减少-m并行任务数5.3 偷懒但好用的加速技巧如果你是在20.04/22.04上强行安装ifort2013遇到问题解决成本较高时有个很实用的替代思路在虚拟机里再套一层Docker或者直接装一个Ubuntu 16.04的容器环境来跑ifort。Ubuntu 16.04的年代与ifort2013更接近二进制兼容性几乎无缝。VM里跑容器的性能损失很小却能绕开一大片依赖库问题。当然如果你不想再引入一层虚拟化直接装16.04虚拟机也行就是系统老了一些软件源里的基础工具可能也要手动编译。另外给Ubuntu配一个趁手的中文输入法也属于“早晚要弄”的事搜狗输入法Linux版在Ubuntu 20.04上装完需要重启或者注销才能生效这个跟ifort无关但往往是整套环境搭建的最后一公里顺手提一句免得你卡住。6. 工作流与性能虚拟机跑科学计算的真实感受6.1 性能损耗主要在磁盘IO很多人担心虚拟机会让Fortran程序变慢实际跑下来你会发现CPU密集型计算的性能损耗远没有想象中大只要宿主机开启VT-x虚拟化技术VMware会在创建虚拟机时自动启用计算的部分大多能直接压到物理CPU上执行。真正的瓶颈在磁盘IO上编译大型项目时需要频繁读写中间文件虚拟机磁盘的吞吐能力再强也不如直通物理硬盘。改善IO的方法很朴素把虚拟磁盘放到固态硬盘上虚拟机内部用ext4文件系统编译时把临时目录挂载到内存盘里。如果项目特别大还可以考虑在虚拟机里建一个tmpfs分区专门放编译中间文件速度提升立竿见影。我实测过大型Fortran项目在普通机械硬盘上编译需要15分钟换到SSD后5分钟出头再挂tmpfs能压到3分钟以内。6.2 快照是虚拟机最大的救命稻草整个环境搭建过程中我一直强调要打快照。具体实践是装完系统打一个快照、装完VMware Tools再打一个、装完ifort并验证通过再打一个。每个关键节点留一个备份后面出现任何诡异问题直接恢复到上一个正常节点几分钟搞定省去从头排查的麻烦。快照还能当“环境版本管理”用。比如你要同时维护两个项目一个依赖ifort2013编译另一个想试试新版ifx完全可以打两个快照分别折腾互不干扰。这是物理机不具备的核心优势。6.3 宿主机和虚拟机的文件协作最后说点日常用得上的。编译计算在虚拟机里跑但写代码、看结果、画图都可能在Windows侧更顺手。我的建议是把项目代码放到共享文件夹里Windows上用VS Code或者Source Insight编辑Ubuntu虚拟机里直接挂载编译。这样既不过多占用虚拟机磁盘空间又能让两边共享同一份数据不用来回拷贝造成版本混乱。如果共享文件夹偶尔出问题还有一个万全的备选方案在虚拟机里装一个samba服务Windows通过\\192.168.x.x直接访问虚拟机目录稳定性和速度都有保障。只不过初次配置稍微费点功夫适合共享文件夹始终搞不定的情况。我个人的习惯是把两种方式结合日常工作走共享文件夹大规模计算时把数据同步进虚拟机本地磁盘跑两头的好处都占上。这招是踩了无数次“共享文件编译到一半断开”的坑之后总结出来的值得参考。