ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu 18.04安装Freesurfer 7.2.0全攻略:从许可证到环境变量避坑指南

Ubuntu 18.04安装Freesurfer 7.2.0全攻略:从许可证到环境变量避坑指南 我到现在还记得第一次在实验室那台Ubuntu 18.04服务器上装Freesurfer 7.2.0时的情形——官网安装包下到一半发现没注册许可证注册完许可证解压完配置环境变量敲recon-all -version报command not found后来才知道是tcsh没装Freesurfer一堆内部脚本在bash下直接崩。折腾一整天最后发现所有坑都集中在三件事许可证、依赖库、环境变量。这篇攻略就是把我当时的完整操作流程重新走一遍从Freesurfer 7.2.0的版本选择、Ubuntu 18.04的依赖准备、安装包下载解压、许可证注册放置到环境变量配置和验证全部按步骤写清楚。适合刚接触神经影像分析、需要在实验室服务器或个人电脑上部署Freesurfer的同学参考如果你是装过几次但老在环境配置上翻车的老手重点看第4章和第6章就行。1. 动手前先弄清两件事版本特性和系统兼容性1.1 Freesurfer 7.2.0到底改了什么Freesurfer是神经影像领域做大脑皮质重建、脑区分割、厚度计算最常用的工具之一核心流程recon-all能把T1加权结构像处理成带灰白质边界、软脑膜边界的皮质表面模型。7.2.0是2021年的维护版本相比7.1.x它在海马亚区分割、皮层下结构分割等模块上做了一轮稳定性修正同时对FreeView可视化界面的交互响应做了优化。对我们普通用户来说7.2.0最大的意义是它修复了不少7.1.x在recon-all -all跑到-pial阶段偶发崩溃的问题。我自己的数据集里7.1.1跑挂过两个subject换到7.2.0之后顺利跑完。另外7.2.0把主要的atlas和模板更新到了新版本包括Desikan-Killiany-Tourville图谱、DKT模板的默认参数都有调整。这意味着如果你之前用7.1.x处理了一批数据突然换成7.2.0少数指标尤其皮层厚度会有微小的数值差异。所以同一个研究中应尽量固定版本。这也是我在实验室坚持统一安装7.2.0而不是混装的原因否则组内统计结果一汇总版本差异带来的噪声会让你非常头疼。1.2 Ubuntu 18.04的特殊性为什么单独说Ubuntu 18.04因为Freesurfer官方发布页面上Linux平台包分为CentOS 6、CentOS 7、Ubuntu 18.04等几个版本彼此之间不能混用。Ubuntu 18.04是很多神经影像实验室服务器的长期支持系统2023年4月才停止标准支持所以用户量很大。但它有个让新手头疼的地方默认最小化安装里没有tcsh。Freesurfer的内部脚本大量依赖C Shell的执行方式比如某些循环、setenv语法在bash里直接跑会报一堆语法错。所以安装后第一件事往往不是配置环境变量而是先把tcsh装上。另一个常见问题是libjpeg62、libxmu6这些老库在18.04的默认源里可能没有启用需要先apt update刷新索引。这些坑在官方文档里散落在FAQ各处不聚合在一起新手很容易漏。除了tcsh的问题Ubuntu 18.04的另一个特殊点在于它默认的GLIBC版本是2.27。Freesurfer 7.2.0发布时主要以CentOS 7GLIBC 2.17为基准构建理论上在GLIBC 2.27上运行没有问题。但如果你把系统升级到了Ubuntu 20.04或更高版本反而可能在执行部分预编译二进制时遇到GLIBC版本过高或符号冲突的问题。这就是为什么很多实验室宁愿停留在18.04也不愿意贸然升级系统——对于长期跑数据的服务器稳定性比新功能重要得多。2. 装前准备依赖库、目录规划与许可证2.1 先把基础依赖装齐登录系统后先用以下命令把依赖包装好sudo apt update sudo apt install -y tcsh bc perl wget curl \ libxmu6 libxt6 libglu1-mesa libjpeg62 \ libpng16-16 libtiff5 libx11-6 libxext6这些包的作用我简单说明一下tcshFreesurfer脚本运行所需的C Shell解释器不装的话后续source环境和运行recon-all都会出问题。bc命令行数学计算工具recon-all里有多处用到它做浮点运算。perl部分预处理脚本的依赖。libxmu6、libxt6、libx11-6、libxext6X11图形界面的底层库freeview、tkmedit这些可视化工具启动时需要。libglu1-mesaOpenGL工具库freeview渲染三维皮质表面模型时依赖。libjpeg62、libpng16-16、libtiff5JPEG、PNG、TIFF图像格式库recon-all在输出截图和读取部分数据时要调用。如果apt install时提示找不到libjpeg62在18.04上可以尝试libjpeg62-turbo替代或者先检查universe软件源是否已启用sudo apt install software-properties-common sudo add-apt-repository universe sudo apt update我在几台纯净安装的18.04服务器上试过libjpeg62包默认就在universe源里刷新索引后基本都能装上。如果还不行先确认系统是完整的18.04而不是什么精简定制版。2.2 许可证不注册就激活不了Freesurfer虽然整体开源但需要免费注册许可证才能在recon-all中使用完整功能。具体做法是打开Freesurfer官网的Registration页面填写姓名、邮箱、所属机构提交后邮件会收到一个license.txt文件里面是几行纯文本包含你的注册信息和许可声明。许可证文件放哪很关键。官方推荐放在$FREESURFER_HOME/license.txt也就是解压后的freesurfer目录根下。也可以放在任意目录然后通过环境变量指定export FS_LICENSE/path/to/your/license.txt我习惯直接把license.txt放到/usr/local/freesurfer/license.txt这样SetUpFreeSurfer.sh会自动识别不用额外设置。要注意的是license文件权限最好是当前用户可读别用root去跑recon-all否则生成的中间文件权限混乱后续清理很麻烦。有些同学注册完之后邮箱里收到的license是license.txt附件下载后可能是.txt后缀别改成其他名字Freesurfer只认license.txt或FS_LICENSE指向的文件。3. 下载与解压让人翻车的两件事3.1 从官网找到正确的安装包在Freesurfer官网的Download Install页面选择Linux平台下的Ubuntu 18.04 x86_64版本。7.2.0对应的安装包文件名通常是freesurfer-linux-ubuntu18.04_x86_64-7.2.0.tar.gz体积大约1GB多解压后接近4GB下载前确认磁盘空间足够df -h /usr/local如果空间不足优先清理/tmp或旧版本Freesurfer别硬装。下载方式可以直接浏览器也可以拿到下载链接后在服务器上用wget拉取wget -c https://xxx/freesurfer-linux-ubuntu18.04_x86_64-7.2.0.tar.gz这里的-c参数支持断点续传。安装包动辄1GB以上实验室网络不稳定时这个参数很实用。另外提醒一句官网下载前需要登录账号这个账号就是注册许可证时用的邮箱保存好登录信息后面升级新版本还要用。3.2 解压到哪、权限怎么设解压位置没有硬性规定但路径里不要有中文和空格。两个常用方案方案一解压到系统目录适合多用户共享的服务器sudo mkdir -p /usr/local sudo tar -xzvf freesurfer-linux-ubuntu18.04_x86_64-7.2.0.tar.gz -C /usr/local sudo chown -R $USER:$USER /usr/local/freesurfer方案二解压到自己的home目录适合个人电脑mkdir -p ~/software tar -xzvf freesurfer-linux-ubuntu18.04_x86_64-7.2.0.tar.gz -C ~/software解压过程会比较久1GB多的压缩包解压出来在普通机械硬盘上可能得两三分钟SSD会快很多。解压完先看一眼目录结构ls /usr/local/freesurfer/正常情况下能看到bin/、subjects/、license.txt等目录和文件。如果license.txt不在这里把刚才收到的许可证文件复制过来cp ~/下载/license.txt /usr/local/freesurfer/license.txt这一步经常被忽略导致后面所有命令都提示license错误。另外Freesurfer解压后会生成大量小文件。如果你用的是Windows共享目录挂载到Linux下解压经常会出现符号链接失效的问题Freesurfer目录内部有少量符号链接跨文件系统解压可能变成普通文本文件导致recon-all运行时报Too many levels of symbolic links之类的错。所以一定要在Linux本地文件系统ext4、xfs上解压不要解压到NTFS挂载目录或网络磁盘。权限方面我的建议是不要在解压后用sudo运行Freesurfer命令。有些同学图省事直接sudo recon-all结果在root用户下创建一整套中间文件后续用普通用户打开项目目录时全是Permission denied。正确做法是把/usr/local/freesurfer目录的属主改成自己或者干脆解压到home目录所有操作都在普通用户下完成。4. 环境变量配置从command not found到正常启动4.1 SetUpFreeSurfer.sh做了什么Freesurfer提供了一个环境配置脚本安装后只要source一下就能把需要的环境变量全部设置好。bash用户执行export FREESURFER_HOME/usr/local/freesurfer source $FREESURFER_HOME/SetUpFreeSurfer.sh执行成功后终端会打印一段信息大致是Setting up environment for FreeSurfer/FS-FAST (and FSL) FREESURFER_HOME /usr/local/freesurfer FSFAST_HOME /usr/local/freesurfer/fsfast FSF_OUTPUT_FORMAT nii.gz SUBJECTS_DIR /usr/local/freesurfer/subjects MNI_DIR /usr/local/freesurfer/mni这段信息别看一眼就过它其实是在告诉你脚本做了什么FREESURFER_HOMEFreesurfer根目录所有路径的基础。PATH把$FREESURFER_HOME/bin加进来这样recon-all、freeview、mri_convert这些命令才能直接敲。SUBJECTS_DIR默认的subjects输出目录指向$FREESURFER_HOME/subjects。如果你有自己的数据目录之后要在这里改成实际路径。FSF_OUTPUT_FORMATFS-FAST输出格式默认nii.gz。MNI_DIRminc工具目录Freesurfer在处理非线性配准时会调用。如果你的系统默认shell是csh或tcsh就source.csh版本setenv FREESURFER_HOME /usr/local/freesurfer source $FREESURFER_HOME/SetUpFreeSurfer.cshUbuntu 18.04的默认shell是bash所以绝大多数情况下用.sh版本就够了。用错版本时最典型的报错是if: Expression Syntax或者一堆setenv: Command not found。4.2 永久生效的配置方法上面这个source只对当前终端会话有效新开一个终端又变回command not found。让它永久生效需要把配置写进shell的启动文件。对bash用户就是~/.bashrccat ~/.bashrc EOF # FreeSurfer export FREESURFER_HOME/usr/local/freesurfer source $FREESURFER_HOME/SetUpFreeSurfer.sh EOF source ~/.bashrc这里有一个细节为什么用cat 而不是手动编辑因为在服务器上手动编辑~/.bashrc容易误改其他配置用追加方式最安全出问题也好排查。另外如果实验室多人共用一台服务器建议把这段配置写到/etc/profile.d/freesurfer.sh这样所有用户登录后都会自动生效sudo tee /etc/profile.d/freesurfer.sh /dev/null EOF export FREESURFER_HOME/usr/local/freesurfer source $FREESURFER_HOME/SetUpFreeSurfer.sh EOF要注意的是.bashrc只在交互式登录终端生效如果你通过SSH执行远程命令ssh host recon-all -version不会加载.bashrc需要改成在~/.bash_profile或~/.profile里source。这也是为什么很多人反映我配了环境变量但脚本里跑还是找不到命令。5. 验证安装示例数据与常用命令5.1 快速验证清单配置完环境变量后先别急着跑重活用一组快速命令确认安装没问题which recon-all recon-all -version which freeview如果which能搜到这些命令并且recon-all -version正常输出版本号说明PATH配置成功。freeview可以试着启动一下能看到GUI界面弹出就说明X11和OpenGL依赖没问题。在纯SSH服务器上没图形界面的话这一步可以跳过不影响实际计算功能。再确认一下许可证是否生效ls -l $FREESURFER_HOME/license.txt有文件还不够最好实际触发一次license检查。最轻量的办法是运行一个recon-all的早期步骤比如对包自带的sample示例subject跑一次autorecon1如果license无效会立刻报错。不过这一步会创建一堆中间文件我一般用下面的方式验证cd $FREESURFER_HOME/subjects recon-all -s sample -autorecon1如果一切正常它会开始处理sample这个示例subject输出大量日志如果license无效几秒内就会打印license错误并退出。不需要等它跑完确认没有license相关报错后按CtrlC终止即可。跑完之后可以看$FREESURFER_HOME/subjects/sample/mri/下是否生成了orig.mgz等文件。5.2 用FreeView检查示例数据Freesurfer安装包自带的samplesubject包含一套完整的已处理结果用它来检查可视化再合适不过。启动FreeView加载T1加权像和皮层分割结果freeview -v \ $FREESURFER_HOME/subjects/sample/mri/T1.mgz \ $FREESURFER_HOME/subjects/sample/mri/aparcaseg.mgz:colormaplut:opacity0.5 \ -f $FREESURFER_HOME/subjects/sample/surf/lh.pial:edgecolorred \ $FREESURFER_HOME/subjects/sample/surf/rh.pial:edgecolorblue能正常打开这个界面说明图形库、atlas、表面文件读取都正常。看到大脑皮质表面模型后可以按Shift键旋转确认右侧菜单里的Layer、Display、Annotation等基本功能可用。Freesurfer 7.2.0的FreeView比6.0流畅了不少加载这样一套示例数据基本秒开。5.3 不建议一上来就跑完整recon-all很多同学装完就迫不及待想用recon-all -all测试整个流程我的建议是先别急。完整recon-all在普通数据上要跑6到8小时即使是最小的示例数据也要1小时以上期间生成的文件很多一旦中间出问题容易让人误判是安装的问题。正确做法是先跑上面那些轻量验证确认安装没问题再拿小规模数据做端到端测试比如选一个体积较小的T1像跑一次-autorecon1只做运动校正和配准十几分钟出结果既能验证流程通畅又能提前暴露数据格式或路径问题。6. 常见错误与性能调优6.1 我在安装中踩过的坑把我在多台Ubuntu 18.04服务器上实际遇到的报错整理成一张表基本覆盖了90%的安装问题报错现象根本原因解决办法recon-all: Command not found环境变量没生效或PATH没配好source SetUpFreeSurfer.sh确认FREESURFER_HOME路径正确if: Expression Syntax用bash执行了csh脚本改用.sh版本的SetUpFreeSurfer.shtcsh: No such file or directory没安装tcshsudo apt install tcsherror while loading shared libraries: libX11.so.6缺少X11相关库安装libxmu6、libxt6、libx11-6、libxext6等license check failed或WARNING: FreeSurfer license file not foundlicense.txt不存在或路径不对检查$FREESURFER_HOME/license.txt或设置FS_LICENSECannot open subject directory sample当前目录或SUBJECTS_DIR不对先cd $SUBJECTS_DIR或export SUBJECTS_DIR/你的数据目录其中libX11.so.6这个问题我在一台精简安装的Ubuntu服务器上遇到过apt install libxmu6 libxt6后还报错最后发现是libxext6缺失补上就好了。这类缺库问题直接用ldd定位最有效ldd $FREESURFER_HOME/bin/freeview | grep not foundldd会把可执行文件依赖的共享库列出来凡是标注not found的就是缺的库。对照输出去apt search找对应的包名装完再跑ldd确认比瞎猜快得多。6.2 多核并行与资源优化Freesurfer 7.2.0的recon-all默认就会使用多核但还有一些可以手动调优的空间。首先是设置并行线程数在运行前指定环境变量export ITK_GLOBAL_DEFAULT_NUMBER_OF_THREADS8 export OMP_NUM_THREADS8数字建议设为物理内核数的一半到满核之间不要盲目设高。我见过有人把OMP_NUM_THREADS设成核数的两倍结果内存被占满swap狂写处理速度反而更慢。另外recon-all在-autorecon2表面生成阶段对CPU非常敏感跑大样本比如100人以上时建议配合xargs -P或集群调度工具做并行任务管理而不是一个接一个串行跑。Freesurfer自带一个提交到集群的脚本但对小实验室来说用xargs -P分批跑就足够了。内存方面Freesurfer 7.2.0单线程处理一个subject大约需要8GB内存并行8个就是64GB这是个很容易被低估的资源瓶颈。处理前用free -h确认机器物理内存别让recon-all把服务器跑成OOM。另外建议把$SUBJECTS_DIR放在SSD上。我实测过同样的数据机械硬盘上recon-all要跑7小时40分钟换到NVMe SSD只要5小时出头差距非常明显。6.3 重装或升级时的注意事项如果机器上已经有旧版Freesurfer想升级到7.2.0千万别在旧目录上直接覆盖解压。正确顺序是备份旧版本中自己写过的脚本和atlas配置cp -r /usr/local/freesurfer/subjects /backup/freesurfer_subjects删除旧目录sudo rm -rf /usr/local/freesurfer解压新版本到原路径复制license文件到新目录重新source环境变量这种清洁升级最大的好处是避免新旧版本的库文件混在一起。Freesurfer不同版本的bin/下有不少同名文件直接覆盖解压会出现某些命令是新版、某些命令还是旧版的情况处理数据时行为不一致排查起来极其痛苦。同理如果只是临时想测试新版本建议解压到另一个目录用不同的FREESURFER_HOME切换不要和现有版本放一起。另外提醒一点升级Freesurfer后之前用旧版本处理过的$SUBJECTS_DIR里的已完成数据可以直接打开一般不用重新处理。但如果你计划把新旧版本的结果放在同一个统计模型里比较还是要注意版本差异带来的数值波动。写在最后以上是我在Ubuntu 18.04上安装Freesurfer 7.2.0的完整过程以及在实际部署中反复踩过的一些坑。最后再说两个小技巧一是把export FREESURFER_HOME/usr/local/freesurfer写到~/.bashrc开头的位置避免与其他软件的环境变量互相覆盖二是每次升级系统内核前先记录一下recon-all -version的输出万一系统更新把某些图形库弄坏了能快速判断是不是Freesurfer本身的问题。如果能严格按照第2章到第4章的顺序操作大部分安装问题都能避免。希望这篇攻略能帮你省下我当时浪费的那个下午。
返回列表