本地玩大模型的朋友,十个里有八个迟早会遇到同一个问题:系统盘红了。我最初在Windows上装Ollama,默认把Qwen2.5、Llama3这些模型全拉到C盘,半个月后C盘就报空间不足。后来在给Mac和Linux环境整理Ollama部署时,又发现三套平台的模型路径迁移方式各不一样,踩了一圈坑才理清。这篇就把Ollama模型路径迁移在Windows、Mac、Linux三平台的做法一次性讲透,从环境变量原理、迁移步骤到常见问题排查都有,适合本地部署大模型、想把模型从C盘/系统盘挪到大容量磁盘的朋友直接照着抄。
1. 为什么要把Ollama模型路径迁出去
1.1 默认路径与“系统盘爆满”的困局
Ollama安装完成后,模型文件默认全部写在系统盘的用户目录下,三个平台各不相同:
| 平台 | 默认模型路径 |
|---|---|
| Windows | C:\Users\<用户名>\.ollama\models |
| macOS | ~/.ollama/models |
| Linux(systemd服务模式) | /usr/share/ollama/.ollama/models |
| Linux(用户直接运行) | ~/.ollama/models |
问题在于模型体积远比你想象的大。一个7B参数的模型做4-bit量化,落地大约4.7GB;32B模型大概20GB;70B以上轻松突破40GB。我身边有位朋友把CodeQwen、Llama3、Mistral、Embedding模型全拉下来,系统盘直接多出60多GB。Windows的C盘本来就被页面文件、休眠文件、软件安装包占据大半,再加几十GB模型,系统分区瞬间告急。
更麻烦的是,很多人安装Ollama时根本没有规划存储位置,等C盘红了才想起来迁移。好在Ollama提供了环境变量OLLAMA_MODELS,可以在不改动安装目录的前提下,把模型文件整体挪到任意磁盘分区或挂载点。
1.2 迁移核心:OLLAMA_MODELS环境变量
OLLAMA_MODELS是Ollama读取模型存储目录的环境变量。进程启动时,Ollama会优先读取这个变量指向的路径;如果变量不存在,才回落到默认路径。用大白话说,它就像给Ollama贴了张便签:“你的模型仓库在这个新地址,以后下载、加载、删除模型都去那里。”
理解了这一点,迁移思路就很清晰了:
- 设置
OLLAMA_MODELS指向新的目标目录。 - 把原有模型文件整体搬到新目录。
- 重启Ollama,让新路径生效。
这套逻辑在Windows、macOS、Linux上完全一致,差别只在“如何设置环境变量”这一步。Windows有系统设置界面,macOS有launchctl机制,Linux有systemd服务配置。这也是三平台教程必须分开写的原因。
1.3 两种迁移路线:环境变量方案与符号链接方案
除了环境变量方案,还有一种常见做法是符号链接(Symlink/Junction)。它不改变环境变量,而是让旧的默认路径“指向”新目录。用一个小类比:环境变量方案是告诉Ollama“以后去新地址”;符号链接方案是“旧地址的牌子还挂着,但门后面其实是新地址”。
两种方案怎么选?我给个对比:
| 对比项 | 环境变量方案 | 符号链接方案 |
|---|---|---|
| 实现难度 | 低,只需配置变量 | 中,需要命令行操作 |
| 对第三方工具兼容性 | 看工具是否继承环境变量 | 好,旧路径始终有效 |
| 后续维护 | 简单直观 | 链接关系需要记得 |
| 适合场景 | 大多数用户、官方推荐 | 有老工具写死路径、不想动环境变量 |
我个人的建议是:优先环境变量方案,它更可控、更好排查。如果你用的是ComfyUI、LangChain等通过Ollama API调用模型的工具,两种方案都能正常工作,因为API走的是localhost端口,跟模型文件路径无关。符号链接方案更适合那种“路径写死在代码里、不想改动”的遗留场景。
2. 动手前的准备:先别急着复制文件
2.1 盘点现有模型与环境信息
迁移前先摸清家底。用ollama list看一眼当前有哪些模型:
ollama list输出类似:
NAME ID SIZE MODIFIED qwen2.5:7b d819c0e0d8e2 4.7 GB 2 weeks ago llama3:8b a8d0a2a8c8c1 4.9 GB 5 days ago记下这些模型名称,迁移完成后用同样的命令比对,就能确认没有漏东西。
接着确认Ollama进程是否在运行。Windows看任务栏托盘或任务管理器里的ollama.exe;macOS看菜单栏左上角的图标;Linux执行ps aux | grep ollama查看。如果正在运行,建议先退出服务再操作,避免文件被占用导致复制失败或数据损坏。
2.2 关闭服务并备份:迁移前必须做的两件事
官方文档里很少强调,但我实测下来,迁移前做两步准备能避免90%的意外:
第一步,彻底关闭Ollama。Windows在托盘图标上右键退出,同时去任务管理器确认没有ollama相关进程残留;macOS在菜单栏点击Ollama图标选择Quit;Linux执行systemctl stop ollama(服务模式)或pkill ollama(直接运行模式)。
第二步,决定是否备份。如果你只有下载来的开源模型(Qwen、Llama、Mistral这些),它们随时可以重新拉取,不必备份原目录,直接复制到新盘即可。但如果有自己用ollama create创建的定制模型、微调过的LoRA适配模型,建议先把整个models目录复制一份到移动硬盘,防一手误操作。模型文件本质上就是大文件,没那么多玄学,但保险起见总是好的。
2.3 确定目标目录与命名规范
迁移前先想好新路径。我的建议:
- Windows:放在第二块硬盘,比如
D:\ollama\models。 - macOS:放在外置SSD或数据卷,比如
/Volumes/Data/ollama/models。 - Linux:放在专门的数据挂载点,比如
/data/ollama/models。
这里有一个容易被忽略的坑:路径避免中文和空格。Ollama在Windows上对中文路径支持不算好,之前有用户把模型放在D:\模型库\ ollama这种路径下,进程直接报路径找不到。虽然不是所有版本都有这个问题,但与其赌兼容性,不如一开始就用纯英文、纯数字字符的路径。另外,新路径所在磁盘务必确认有足够空间,至少留出比现有模型总大小多20GB的余量,因为后续还会继续拉新模型。
3. Windows平台迁移实操
3.1 设置OLLAMA_MODELS并迁移模型文件
Windows设置环境变量有图形界面和命令行两种方式。图形界面适合新手:按Win键,输入“环境变量”并打开“编辑系统环境变量”,点击“环境变量”按钮,在“用户变量”区域点击“新建”,变量名填OLLAMA_MODELS,变量值填目标目录如D:\ollama\models,一路确定保存。
命令行方式更快捷,在cmd窗口执行:
setx OLLAMA_MODELS "D:\ollama\models"注意setx设置的是用户级环境变量,设置成功后需要开一个新的cmd窗口才能看到效果。另外,setx对超长值有截断风险,但我们的路径一般不会超过1024字符,放心用。
环境变量设置好后,开始搬模型文件。我强烈推荐用robocopy而不是普通的Ctrl+C/V,因为模型文件数量多、单个文件大,robocopy支持断点续传,中途断了可以重跑:
robocopy "C:\Users\<用户名>\.ollama\models" "D:\ollama\models" /E /COPYALL /DCOPY:T /R:2 /W:5参数解释:/E复制所有子目录(包括空的);/COPYALL尽可能复制文件所有属性信息;/DCOPY:T保留目录时间戳;/R:2重试2次;/W:5每次重试等待5秒。复制完成后,robocopy会返回一个退出码,0到7都算正常,8以上才表示有错误。
确认复制完整后,先别急着删原目录。先把Ollama退干净,再把原目录改个名,比如C:\Users\<用户名>\.ollama\models_old,然后重新启动Ollama。
3.2 验证迁移结果
启动Ollama后,在cmd执行:
ollama list如果模型列表完整显示,且磁盘占用确确实实出现在了D:\ollama\models下,说明迁移成功。视图验证的另一招:把C:\Users\<用户名>\.ollama\models_old里的内容复制一份到别处测试,确认新目录完全可用后,再删除models_old目录释放C盘空间。
这里有个细节:Ollama在Windows上是GUI后台应用,环境变量设置完成后,只重启cmd是不够的,一定要先在托盘右键退出Ollama,再重新启动,进程才能拿到新的环境变量。我有一次图省事,只关了窗口没退出进程,结果新模型还是写到了C盘,白折腾一场。
3.3 Windows符号链接方案(可选)
如果你不想设置环境变量,Windows还可以用目录联接(Junction)实现类似效果。以管理员身份打开cmd,先把原模型目录改名备份:
rename "C:\Users\<用户名>\.ollama\models" "C:\Users\<用户名>\.ollama\models_old"然后创建junction:
mklink /J "C:\Users\<用户名>\.ollama\models" "D:\ollama\models"这里用/J创建的是Directory Junction,比/D符号链接更稳,且不需要额外权限(不过用管理员cmd更保险)。创建完成后dir查看,会发现models目录带了一个<JUNCTION>标记。之后Ollama读写模型文件时,实际都发生在D盘。这个方案的好处是旧路径始终存在,某些写死路径的脚本不用改。
4. macOS平台迁移实操
4.1 通过launchctl设置环境变量
macOS的坑在于:Ollama是GUI应用,从Dock或启动台启动时,只读取launchd的环境,不读~/.zshrc或~/.bash_profile里export的变量。所以光在终端里export没用,要用launchctl setenv告诉系统层:
launchctl setenv OLLAMA_MODELS "/Volumes/Data/ollama/models"执行这条命令后,再启动的GUI应用才会继承这个变量。但它不持久,重启电脑后就失效了。要永久生效,需要创建一个LaunchAgent。在~/Library/LaunchAgents/下新建文件setenv.OLLAMA_MODELS.plist,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>setenv.OLLAMA_MODELS</string> <key>ProgramArguments</key> <array> <string>/bin/launchctl</string> <string>setenv</string> <string>OLLAMA_MODELS</string> <string>/Volumes/Data/ollama/models</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>然后加载它:
launchctl load ~/Library/LaunchAgents/setenv.OLLAMA_MODELS.plist新版本macOS也可以用launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/setenv.OLLAMA_MODELS.plist,两种方式都行。加载完成后,确认变量已注入:
launchctl getenv OLLAMA_MODELS能输出你设置的路径,就说明launchd已经认了。
4.2 迁移模型文件并重启Ollama
macOS上迁移文件比Windows简单,直接用mv或rsync即可:
mv ~/.ollama/models "/Volumes/Data/ollama/models"注意mv会把目录整个搬过去。如果目标路径的父目录不存在,先创建:
mkdir -p /Volumes/Data/ollama mv ~/.ollama/models /Volumes/Data/ollama/models然后退出Ollama:点击菜单栏的Ollama图标,选择Quit。等3秒确认进程退出,再重新打开Ollama.app。新启动的进程会从launchd拿到OLLAMA_MODELS的值,将模型目录指向外置盘。
4.3 macOS特有坑:GUI应用与终端环境变量隔离
这是macOS平台最容易踩的坑。很多教程让用户改~/.zshrc,改完在终端里执行ollama list确实正常,因为终端进程读取了shell的export。但Ollama.app本身不经过你的shell,它由launchd直接拉起来,根本看不到~/.zshrc里的变量,于是模型又写回了~/.ollama/models。
我在自己机器上做过测试:只改~/.zshrc,重启Ollama后新拉的模型还是出现在旧路径;改用launchctl setenv后,模型才乖乖进了外置盘。所以macOS用户记住一句话:想让GUI应用继承环境变量,必须交给launchd,而不是终端。
另外一个细节:用launchctl设置环境变量时,如果原来已经设置过相同的变量,可以先launchctl unsetenv OLLAMA_MODELS再重新setenv,避免残留旧值。
5. Linux平台迁移实操(含systemd方式)
5.1 用户级与系统级两种配置方式
Linux的情况特殊在于Ollama有两种运行模式。用官方安装脚本curl -fsSL https://ollama.com/install.sh | sh安装后,系统会创建一个名为ollama的用户,并通过systemd服务ollama.service以后台服务方式运行,模型默认存储在/usr/share/ollama/.ollama/models。如果不用服务模式,直接在终端里运行ollama serve,模型则存储在启动用户的~/.ollama/models。
两者的配置方式完全不同:
- systemd服务模式:修改service配置,给服务注入
OLLAMA_MODELS。 - 直接运行模式:在shell配置里export环境变量。
强烈推荐服务模式,别裸跑。服务模式开机自启、崩溃自动重启、权限隔离都更好,官方也默认这么部署。
5.2 修改systemd服务配置
先确认服务文件当前内容:
systemctl cat ollama.service你会看到[Service]部分有User=ollama、Group=ollama这些行,可能已经有Environment字段。修改服务配置不要直接改/etc/systemd/system/ollama.service,用systemd的override机制:
systemctl edit ollama.service这会打开一个override.conf编辑窗口,填入:
[Service] Environment="OLLAMA_MODELS=/data/ollama/models"保存退出后,重载配置并重启服务:
systemctl daemon-reload systemctl restart ollama.service然后确认服务状态:
systemctl status ollama.service这一步很关键:很多人改了Environment却忘了daemon-reload,systemd会继续用旧配置跑,模型路径自然没变。
5.3 迁移模型文件与权限处理
迁移前先停服务:
systemctl stop ollama.service然后移动模型目录。目标目录先建好,比如/data/ollama/models,用mv把原目录内容整体搬过去:
mkdir -p /data/ollama mv /usr/share/ollama/.ollama/models /data/ollama/models接下来是Linux平台最容易翻车的地方:权限。systemd服务以ollama用户运行,如果你把目录搬到了新位置,默认属主可能是root,ollama用户没有读写权限,模型能列出来但加载会失败。执行:
chown -R ollama:ollama /data/ollama如果你的ollama用户不叫ollama,先id ollama确认。设置完权限后启动服务:
systemctl start ollama.service再执行ollama list验证。如果看到模型列表,就说明迁移成功。如果看到权限报错,回到上一步检查目录属主。
如果你不是在服务模式,而是直接在终端里跑ollama serve,配置方式更简单,把export写进~/.bashrc:
echo 'export OLLAMA_MODELS="/data/ollama/models"' >> ~/.bashrc source ~/.bashrc然后重启ollama进程即可。
5.4 Linux符号链接方案
Linux一样可以用符号链接,适合不想改systemd配置的用户:
systemctl stop ollama.service mv /usr/share/ollama/.ollama/models /data/ollama/models ln -s /data/ollama/models /usr/share/ollama/.ollama/models chown -R ollama:ollama /data/ollama systemctl start ollama.service注意:符号链接本身的属主无所谓,关键是它指向的目标目录必须让ollama用户可读写。用ls -l /usr/share/ollama/.ollama/models确认链接指向正确即可。
6. 常见问题排查与实操避坑
6.1 环境变量设置后不生效的3个原因
这个问题在三个平台都有人踩,原因各不相同:
设置了环境变量但没有重启Ollama进程。环境变量的读取发生在进程启动时,很多应用(包括Ollama)不会动态重新读取。Windows必须托盘退出再启动,不能只关窗口;要彻底结束进程树。
macOS的GUI应用没有继承终端环境变量。终端里echo一下看起来设置成功了,但Ollama.app由launchd启动,拿不到shell变量。必须用
launchctl setenv或LaunchAgent。Linux的systemd服务不读取shell环境变量。service进程由systemd直接拉起,与登录shell无关。必须通过
systemctl edit ollama.service注入Environment=,然后daemon-reload。
排查思路也很简单:先确认进程读取的变量值到底是什么。Windows用echo %OLLAMA_MODELS%,macOS用launchctl getenv OLLAMA_MODELS,Linux用systemctl show ollama.service -p Environment或cat /proc/<pid>/environ | tr '\0' '\n' | grep OLLAMA。看到变量值对了,再看进程是否重启过,基本就能定位问题。
6.2 模型列表为空或加载失败
迁移后ollama list一片空白,或者加载模型时提示manifest does not exist,多半是下面几种情况:
| 现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 列表为空 | 新目录里没有模型文件 | 确认复制或移动时是否完整,检查新目录下是否有manifests和blobs子目录 |
| 报错“model not found” | 只复制了blobs,没复制manifests | 两个目录必须一起复制,manifests是模型索引,blobs是实际文件 |
| 报错“permission denied” | Linux目录属主不对 | chown -R ollama:ollama,macOS检查磁盘权限 |
| 模型能列出但对话报错 | 文件损坏或SHA256校验不通过 | 只能重新ollama pull或重新导入,别指望修复半损坏的blob |
这里特别提醒Windows用户:如果你用xcopy而不是robocopy,记得加/E和/H参数,否则可能漏掉隐藏文件,导致模型文件丢失。
6.3 下载慢或中断时的替代方案
这是一个和路径迁移紧密相关的痛点。迁移完成后,很多人会在新路径下拉新模型,结果发现官方仓库下载慢得离谱,大模型经常下一半就断。这时候除了换个时间段再试,我实测最有效的方式是“绕开官方下载源,直接导入GGUF文件”。
具体做法分三步:
第一步,从模型托管站(比如Hugging Face、ModelScope)下载目标的GGUF格式文件,比如qwen2.5-7b-instruct-q4_k_m.gguf。
第二步,在本地创建一个Modelfile文件,内容只有一行:
FROM ./qwen2.5-7b-instruct-q4_k_m.gguf第三步,执行ollama create导入:
ollama create qwen2.5-local -f Modelfile等待GGF处理完成,模型会写入当前OLLAMA_MODELS指向的目录下。之后正常用ollama run qwen2.5-local即可。
这个方法还有个好处:导入时模型文件会直接存储在新路径下,不会经过旧路径中转,特别适合刚迁移完就想拉大模型的情况。我甚至建议以后下载新模型都优先走GGUF导入,比扒官方registry稳定太多。
另一个替代方案是从另一台机器拷贝整个models目录。旅途中我经常在服务器上先拉好模型,然后rsync -avP ~/.ollama/models /tmp/models打包传到本地,解压到新路径直接使用。注意必须同时备份manifests和blobs两个子目录,缺一不可。
6.4 迁移后磁盘空间没释放
问题描述:明明把模型都搬到新盘了,为什么C盘或系统盘还是满的?
首先确认旧目录是否真的删掉了。很多用户复制一份到新目录后,觉得“反正复制完了”,就忘了删除原目录。系统盘的空间释放只发生在删除原文件的那一刻,不会因为你设置了新路径就自动清理。
其次,Windows上还有一个隐藏元凶:卷影副本和“以前的版本”会占用系统盘空间。如果删除了原模型目录但空间释放不明显,在cmd里执行vssadmin list shadowstorage看看卷影存储占了多少,必要时用vssadmin delete shadows /for=C: /all清理(操作前确认系统还原点需求)。
还有一个可能是Ollama的进程还在运行,导致部分模型文件被占用无法删除。Windows下先确认任务管理器里没有ollama.exe,再删除;Linux下需要先systemctl stop ollama。
6.5 排查速查表
| 现象 | 可能原因 | 快速解决 |
|---|---|---|
| 设置不生效 | 未重启进程 / GUI未继承变量 / systemd未重载 | 见6.1三平台对照 |
| 列表为空 | 目录结构不完整 / 权限不对 | 检查manifests和blobs,Linux查属主 |
| 加载报错 | blob文件损坏 / 校验失败 | 重新pull或重新导入GGUF |
| 空间没释放 | 原目录未删除 / 卷影副本占用 | 停服务后删原目录,清理卷影 |
| 路径含中文/空格 | 工具链兼容性问题 | 换纯英文路径,重新设置变量 |
| 下载慢 | 官方registry网络波动 | 用GGUF+Modelfile导入 |
6.6 几个容易忽略的细节
最后补几个我踩过坑后沉淀的小细节。
第一,Windows的setx设置用户变量后,已经打开的程序不会拿到新值,需要重开终端。MSYS2、Git Bash这类终端环境也可能有自己独立的配置,测试时优先用系统自带cmd。
第二,macOS如果外置盘没有正确挂载,Ollama启动时看到OLLAMA_MODELS指向一个不存在的路径,不会自动回落到默认路径,而是直接报错或创建空目录。所以设置外置盘路径前,先确认磁盘已挂载,路径ls一下能看到。
第三,Linux迁移后如果ollama run提示Error: pull model manifest: file does not exist,回忆一下是不是在服务运行期间搬走了模型文件。文件被占用时移动目录,可能导致manifest和blobs不一致,只能停下服务重来一遍。
第四,不要在Ollama运行时做任何目录级别的操作。模型文件读写频率很高,运行中迁移会出现各种莫名其妙的校验错误。所有迁移操作的前提都是先退出或停止服务。
在实际操作中,我还发现一个经验:迁移完成后,跑一遍之前常玩的模型,问答几句正常、日志里没有报错,才算真正的迁移完成。别只看ollama list列表出来就急着删备份,多留一天原目录或备份,给自己留条后路,比什么都管用。