ollama_models 不起作用

模型与算力

排查 OLLAMA_MODELS 环境变量改了却不生效的问题,给出先确认默认位置、再按启动方式逐层排查的顺序,以及怎么验证改动真的落到了模型目录上。

很多人第一次迁 Ollama 模型目录,都是被磁盘空间逼的:系统盘快满了,想把模型挪到大盘上。照着教程设了 OLLAMA_MODELS,重启服务,结果 ollama list 还是空的,或者新拉的模型又跑回了老地方。这篇不讲概念,只讲一件事:变量为什么不生效。按后面的顺序一步步查,最后一步能直接告诉你答案落在哪个目录。

很多人第一次迁 Ollama 模型目录,都是被磁盘空间逼的:系统盘快满了,想把模型挪到大盘上。照着教程设了 OLLAMA_MODELS,重启服务,结果 ollama list 还是空的,或者新拉的模型又跑回了老地方。这篇不讲概念,只讲一件事:变量为什么不生效。

先说结论方向:OLLAMA_MODELS 是进程启动时读一次的,你改的那一层得正好是拉起服务的那个进程。后面按顺序一步步查,最后一步能直接告诉你答案落在哪个目录。

先把默认位置和生效前提搞清楚

不同系统下模型的默认落盘位置不一样,有人把路径记成别人教程里的,改完当然没反应。先确认你机器上现在真正用的是哪个目录,而不是照着别人的路径动手。最稳的办法是去 Ollama 的服务日志里找它自己报出来的模型目录,那是它实际在用的。

  • 别照抄别人的路径,先用服务日志或进程信息确认本机实际路径;
  • OLLAMA_MODELS 是进程启动时读取的,命令行里临时 export 不一定传给正在跑的服务;
  • 迁移前先把已有模型文件整体搬过去,只改变量不搬文件,等于让服务去空目录找模型;
  • 变量指的目标目录要提前建好,不然服务可能连挂载都失败。

按启动方式排查:谁在读这个变量

桌面版和命令行版是两条不同的启动路径,变量写到哪一层决定它生不生效。桌面版一般从图形界面的环境配置或启动项里读,命令行版从 shell 的环境变量继承。写给谁,得先搞清楚是谁把服务拉起来的。

启动方式变量该写在哪改完要做什么
命令行直接跑 ollama serve当前 shell 的环境变量或 shell 配置文件重开终端,再重启服务进程
系统服务方式服务单元里的环境变量配置重新加载服务配置,再重启服务
桌面客户端图形界面的环境配置或启动项完全退出客户端再重开
容器里跑容器启动参数的环境变量重建或重启容器,确认参数传进去了

容器场景要特别注意:变量是在镜像里写死的,还是在启动参数里传的,后者才覆盖得了前者。如果只在 Dockerfile 里写,运行时又没传,那容器里读到的还是镜像里的值。

验证顺序:四步确认改动真的落地

  1. 看一眼进程拿到的环境变量确认它不是空值,也不是你以为改掉的老值。空值和不存在的表现一样,都会默默回退默认路径。
  2. 翻服务启动日志里的模型路径日志里报出的模型目录,跟你想设的是不是同一个。这一步能直接告诉答案落在哪。
  3. 拉一个小模型试拉拉完去目标目录看文件有没有真的长出来。文件没出现,说明变量没被读到。
  4. 确认客户端和服务是同一个实例本机装了多个 Ollama 的情况很常见,端口对不上时看到的就是另一份列表。

这四步里,第二步最关键。日志里那行路径就是服务的真相,跟它对齐,后面的判断才有意义。如果日志里还是默认路径,别往下走了,回去查变量写到哪一层。想知道不同启动方式的路径差异,可以到 指南中心(/guides) 对照当时整理的表格。

几个反复踩的坑

  • 变量名大小写写错、拼写多一个下划线,程序不报错,只会默默用默认路径;
  • 路径里带空格或中文没加引号,被截断成半截路径,表现出来就是「设置了但没反应」;
  • 目标目录当前用户没有写权限,现象同样是模型没进去;
  • 改了变量但旧目录里的模型没搬,列表看起来还是原来那批,容易误判成没生效;
  • 服务重启了但客户端没重开,客户端还连着旧实例。

权限这条最容易漏:变量读对了、路径也对,但目标目录属主不是跑服务的那个用户,写入就失败。排查时顺手看一眼目录权限,比反复重启省时间。

下一步想核对不同运行环境下的模型目录约定和迁移步骤,可以到站内指南中心看当时的整理,再回来按上面的四步验证一遍。

常见问题

改了 OLLAMA_MODELS 之后模型列表变空了,是设置错了吗?

大概率不是设置错,而是新目录里本来就没模型。变量生效后服务会去新路径找,老目录里的文件不会自动跟过去。先把旧目录下的模型文件整体搬到新目录,再重启服务,列表就回来了。搬之前先停掉服务,避免文件占用。

命令行里 export 了变量,为什么重启终端后又失效了?

临时 export 只对当前这个终端会话有效,关掉就没了,而且它只影响你在这个终端里启动的进程,对已经在后台跑的服务没有作用。要长期生效就写进用户级或系统级的配置文件里,再让服务以能读到该配置的方式重启。

想确认变量到底生不生效,最直接的办法是什么?

做一次试拉然后去看目录。拉一个小体积的模型,等它下完,直接去你设置的目标目录里翻,文件在那儿就说明生效了;没在,就回去查变量有没有被进程读到。比反复看配置文件快得多。具体路径和命令可以到 /guides/ollama-models-path 核对当时的写法。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。