执行 ollama pull llama3:8b 后终端显示进度条完成,最后一行打印 success,但紧接着 ollama list 输出只有之前的模型,新拉取的模型不在列表中。执行 ollama run llama3:8b 报 Error: model "llama3:8b" not found,而 ~/.ollama/models/blobs/ 目录下确实有新下载的文件。这通常是 manifest 文件没有被正确写入,或者 Ollama 服务读取的模型目录与 pull 写入的目录不一致。
常见原因
1. OLLAMA_MODELS 环境变量指向不同路径
pull 时的 shell 环境设置了 OLLAMA_MODELS=/data/ollama,但 Ollama 服务(systemd 或 Launch Agent)使用默认路径 ~/.ollama/models。blob 文件写入了 /data/ollama/blobs/,服务却在 ~/.ollama/models/ 查找 manifest,结果找不到。
怎么判断:echo $OLLAMA_MODELS 检查当前 shell 的值;systemctl show ollama --property=Environment 或 launchctl getenv OLLAMA_MODELS(macOS)查看服务的环境变量设置,对比两者是否一致。
2. manifest 文件写入时权限不足
~/.ollama/models/manifests/registry.ollama.ai/library/ 目录的写权限不对(比如被 sudo 命令改成了 root 所有),普通用户身份运行的 pull 无法写入 manifest 文件,但 blob 下载本身(写入 blobs 目录)可能因为权限宽松而成功,造成”下了 blob 但没有 manifest”的假成功现象。
怎么判断:ls -la ~/.ollama/models/manifests/ 检查目录和文件的所有者;若有 root 所有的目录或文件,就是这个问题。
3. 磁盘满导致 manifest 写入被截断
模型 blob 是分块下载的,每块成功时才写入,因此即使磁盘在最后阶段满了,大部分 blob 文件可能已经完整写入。但 manifest 文件(通常只有几 KB)在最后写入,若此时磁盘满了就会写入失败或被截断,导致 manifest 损坏或不存在。
怎么判断:df -h ~/.ollama 检查磁盘是否满;cat ~/.ollama/models/manifests/registry.ollama.ai/library/llama3/8b 查看 manifest 内容是否是有效 JSON(若文件存在但内容不完整,就是截断了)。
4. Ollama 服务在 pull 过程中重启
若 systemd 服务在 pull 进行中被重启(如系统更新触发的服务重载),pull 进程被强制终止,manifest 可能在写入中间被中断,服务重启后检索不到这个模型。
怎么判断:journalctl -u ollama --since "1 hour ago" | grep -i 'restart\|stop\|start' 查看服务是否在 pull 期间有过重启记录。
5. 模型标签大小写或格式不匹配
Ollama 的模型列表是大小写敏感的。若 pull 时用了 Llama3:8B(大写),但 list 或 run 时用 llama3:8b(小写),可能找不到。另外,若省略了标签,Ollama 拉取的是 latest,但 list 里显示的也是 llama3:latest 而非 llama3:8b。
怎么判断:ollama list 输出中查看确切的模型名称和标签,与尝试运行时使用的名称逐字符比较。
6. 多用户环境下 pull 和 list 使用不同用户身份
root 执行了 ollama pull,但普通用户执行 ollama list。Ollama 的模型存储在执行用户的 home 目录(~/.ollama),不同用户看到不同的模型列表。
怎么判断:whoami 确认当前用户;若 pull 是在 sudo 下执行的,模型会被存储在 /root/.ollama/ 而非当前用户目录。
最短修复路径
Step 1:检查 manifest 文件是否存在
# 查找 llama3:8b 对应的 manifest 路径
MANIFEST_PATH="$HOME/.ollama/models/manifests/registry.ollama.ai/library/llama3/8b"
ls -la "$MANIFEST_PATH" 2>/dev/null && echo "Manifest 存在" || echo "Manifest 不存在"
# 若存在,检查内容是否有效
python3 -c "import json,sys; json.load(open('$MANIFEST_PATH')); print('JSON 有效')" 2>&1
Step 2:统一 OLLAMA_MODELS 路径
# 查看服务当前使用的路径
sudo systemctl show ollama --property=EnvironmentFiles,Environment 2>/dev/null || \
cat /etc/launchd.conf 2>/dev/null || echo "请检查 Ollama 服务配置"
# macOS Launch Agent 配置路径:~/Library/LaunchAgents/com.ollama.ollama.plist
# 查看其中的 OLLAMA_MODELS 设置
cat ~/Library/LaunchAgents/com.ollama.ollama.plist 2>/dev/null | grep -A1 OLLAMA_MODELS
# 确保 shell 环境与服务环境一致
# 若服务用默认路径,清除 shell 里的自定义设置
unset OLLAMA_MODELS
ollama pull llama3:8b
Step 3:修复权限问题
# 修复 .ollama 目录所有权
sudo chown -R $(whoami):$(id -gn) ~/.ollama/
# 修复文件权限
chmod -R u+rw ~/.ollama/models/
# 重新 pull
ollama pull llama3:8b
Step 4:手动从现有 blob 重建 manifest(高级)
# 若 blob 文件完整但 manifest 缺失,可以重新 pull 让 Ollama 只写 manifest
# Ollama 会检查 blob 已存在并跳过下载,只写入 manifest
ollama pull llama3:8b
# 若因网络问题无法 pull,也可以直接删除所有 blob 重新下载
ollama rm llama3:8b 2>/dev/null || true
ollama pull llama3:8b
Step 5:验证模型可正常使用
# 确认列表中出现
ollama list | grep llama3
# 确认可以运行
ollama run llama3:8b "1+1=" --nowordwrap
# 期望输出:2 或类似的有效回答
预防建议
- 在 Ollama 的系统服务配置和 shell 配置中使用完全相同的
OLLAMA_MODELS路径,避免路径分裂。 - pull 完成后立即执行
ollama list | grep <modelname>做验证,而不是等到实际使用时才发现缺失。 - 避免在 sudo 下执行
ollama pull,使用普通用户权限和 systemd 服务标准路径。 - 大模型 pull 完成后检查磁盘剩余空间,确保 manifest 文件有写入余量(通常需要 10 MB 以上余量)。
- 在 CI/CD 脚本中 pull 后加断言:
ollama list | grep -q "llama3:8b" || exit 1。 - 不要在 pull 进行中重启 Ollama 服务或切换用户,等待 pull 完成后再操作。
常见问答 (FAQ)
Q: ollama list 里有模型,但 ollama run 还是报 model not found,为什么?
A: 检查 manifest 文件中引用的 blob digest 与实际存在的 blob 是否匹配。若 blob 文件被手动删除或损坏,manifest 存在但 blob 缺失,run 时就会找不到。执行 ollama rm <model> 再重新 pull 是最可靠的修复方式。
Q: 能不能把另一台机器上的 Ollama 模型直接拷贝过来?
A: 可以,复制整个 ~/.ollama/models/ 目录(包括 blobs 和 manifests 子目录)到新机器的对应位置,然后重启 Ollama 服务,ollama list 就能看到模型。路径结构必须保持完整。
Q: pull 显示成功但 100% 到了又重新开始,最后才真正完成,是 bug 吗?
A: 不是 bug。Ollama pull 分为”下载 blob”和”验证 + 写 manifest”两阶段,有时下载进度条会重置到验证阶段。只要最终显示 success 且 ollama list 能看到,就是正常完成。
Q: 如何查看 Ollama 所有已下载文件的实际磁盘占用?
A: du -sh ~/.ollama/models/ 查看总占用;du -sh ~/.ollama/models/blobs/* 查看每个 blob 的大小;ollama list 显示的大小是压缩后的模型文件大小,与磁盘占用基本一致。
相关阅读
- Ollama 下载模型卡在某个百分比
- Ollama 启动报 port already in use
- Ollama 探测不到 GPU,全跑在 CPU
- Ollama Modelfile 里的 SYSTEM prompt 被忽略
- llama.cpp 在网络盘上 mmap 失败
标签: #local-llm #ollama #排查