第三章:Linux基础与环境搭建

说实话,很多刚接触WRF的朋友,第一道坎不是模式本身,而是Linux环境。我见过太多人,模型参数调得头头是道,结果连个文件权限都搞不定,最后跑不起来干着急。这一章,咱们就把这些基础活儿捋清楚。

3.1 为什么非得用Linux?

你可能会问:我Windows用得好好的,干嘛要折腾Linux?

原因很简单——WRF是跑在Linux上的。这不是谁故意为难你,而是WRF的并行计算、文件I/O、内存管理,都跟Linux内核深度绑定。我当年第一次在Windows上装Cygwin跑WRF,折腾了三天,最后发现性能差了将近一半。嗯,从那以后我再也没在Windows上跑过WRF。

说白了,Linux就是WRF的「原生土壤」。你非要在Windows上跑,也不是不行,但你会遇到各种莫名其妙的问题。我个人建议:直接装个双系统或者用虚拟机,省心。

3.2 Linux常用命令——够用就行

你不需要成为Linux高手,但下面这些命令,你得闭着眼睛都能敲出来。

3.2.1 文件操作

文件操作是日常最频繁的。我习惯把WRF的输入数据、输出结果、代码分开存放,这样找东西方便。

# 查看当前目录
pwd

# 列出文件(-l 显示详细信息,-h 人性化显示大小)
ls -lh

# 切换目录
cd /home/user/WRF

# 创建目录(-p 可以创建多级目录)
mkdir -p WRF/input WRF/output

# 复制文件
cp namelist.input namelist.input.bak

# 移动/重命名
mv wrfout_d01.nc wrfout_d01_old.nc

# 删除文件(-r 递归删除目录)
rm -rf temp_dir

# 查看文件内容(前10行)
head -n 10 namelist.input

# 查看文件内容(后10行)
tail -n 10 rsl.out.0000
我的小习惯:每次修改namelist.input之前,先cp一份备份。别问我为什么,问就是曾经手滑把跑了一周的配置删了。

3.2.2 权限管理

权限问题,是新手最容易踩的坑。你辛辛苦苦编译好的WRF,一运行提示「Permission denied」,那种感觉……我懂。

# 查看文件权限
ls -l

# 修改权限(chmod)
chmod 755 run_wrf.sh    # 给所有者读写执行,其他人读和执行

# 修改所有者(chown)
sudo chown user:user WRF/

# 递归修改目录权限
chmod -R 755 WRF/
注意:不要随便用chmod 777。我曾经在一个共享服务器上这么干过,结果第二天发现有人把我的wrfout文件删了……权限给得太宽,等于没给。

3.2.3 进程管理

WRF跑起来之后,你怎么知道它还在不在跑?有没有卡住?这时候进程管理就派上用场了。

# 查看进程
ps aux | grep wrf

# 动态监控(像Windows的任务管理器)
top

# 更友好的监控
htop

# 杀掉进程(-9 强制杀死)
kill -9 12345

# 后台运行(& 表示后台)
./wrf.exe &

# 即使退出终端也不中断(nohup)
nohup ./wrf.exe &

我个人习惯用nohup跑长时间的任务。有一次跑一个72小时的预报,结果晚上回家电脑休眠了……从那以后,我所有长时间任务都用nohup。

3.3 WRF依赖库安装——最磨人的一步

嗯,这里我要说实话:安装依赖库,是WRF入门最磨人的一步。没有之一。我当年装netCDF就折腾了两天,最后发现是版本不匹配。

3.3.1 需要哪些库?

库名 作用 版本建议
gcc/g++ C/C++编译器 ≥ 4.8.5
gfortran Fortran编译器(WRF主要用这个) ≥ 4.8.5
netCDF-C 读写NetCDF格式数据 4.7.4
netCDF-Fortran Fortran接口的netCDF 4.5.3
MPI(如OpenMPI) 并行计算 4.0.x
zlib 压缩库 1.2.11
HDF5 大数据存储格式 1.10.6
libpng PNG图片支持 1.6.37
jasper JPEG2000支持 1.900.1

3.3.2 安装顺序很重要

为什么说顺序重要?因为netCDF-Fortran依赖netCDF-C,HDF5又依赖zlib。装反了,编译就会报错。我建议按这个顺序来:

  1. zlib → HDF5 → netCDF-C → netCDF-Fortran
  2. libpng → jasper(这两个是给WPS用的)
  3. MPI(可以单独装,不依赖其他库)

3.3.3 环境变量配置

装完库之后,最关键的一步:告诉系统这些库在哪。不然你编译WRF的时候,它会一脸懵逼地说「找不到netCDF」。

# 编辑.bashrc(或者.bash_profile)
vi ~/.bashrc

# 添加以下内容(路径根据你的实际情况修改)
export DIR=/home/user/WRF_LIBRARIES
export CC=gcc
export CXX=g++
export FC=gfortran
export FCFLAGS=-m64
export F77=gfortran
export FFLAGS=-m64

# netCDF
export NETCDF=$DIR/netcdf
export PATH=$NETCDF/bin:$PATH
export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH

# MPI
export PATH=$DIR/mpich/bin:$PATH
export LD_LIBRARY_PATH=$DIR/mpich/lib:$LD_LIBRARY_PATH

# 生效
source ~/.bashrc
避坑指南:我曾经把netCDF的路径写错了,结果编译WRF花了3个小时,最后报错。检查环境变量,发现少写了一个字母。所以,装完库之后,先用echo $NETCDF确认路径对不对。

3.4 验证安装是否成功

装完别急着跑WRF,先验证一下库能不能用。我习惯写个简单的Fortran程序测试:

! test_netcdf.f90
program test
  use netcdf
  implicit none
  print *, "netCDF version: ", nf90_inq_libvers()
  print *, "netCDF works!"
end program test

# 编译
gfortran test_netcdf.f90 -o test_netcdf -I$NETCDF/include -L$NETCDF/lib -lnetcdff

# 运行
./test_netcdf

如果输出「netCDF works!」,恭喜你,环境搭好了。如果报错……别慌,八成是路径问题,检查一下环境变量。

3.5 本章知识体系

下面这张图,帮你理清这一章的核心逻辑:

第三章:Linux基础与环境搭建 Linux基础命令 WRF依赖库安装 环境变量配置 文件操作 权限管理 进程管理 gcc/gfortran netCDF MPI HDF5/zlib PATH设置 LD_LIBRARY_PATH 验证测试 最终目标:能成功编译并运行WRF Linux命令熟练 + 依赖库完整 + 环境变量正确

这一章的内容,说白了就是三件事:学会用Linux、装好依赖库、配好环境变量。这三件事做好了,后面编译WRF就是水到渠成的事。

最后说一句:安装过程中遇到报错,别急着百度。先看错误信息,八成是「找不到文件」或者「版本不匹配」。我遇到过最离谱的一次,是系统自带的gcc版本太老,编译netCDF报了一堆错。升级gcc之后,一切顺利。

公众号:蓝海资料掘金营,微信deep3321