Ollama打包模型与导入的三种方式
·
方案 A(最省事):直接拷贝整套模型目录(粗暴但稳定)
在源机器上把 models 目录里对应模型的 manifests 与所有相关 blobs 一并复制到目标机器的同一路径(或该机器的 $OLLAMA_MODELS 目录)。Ollama 会自动识别。此做法社区已验证可行。([Reddit][1])
- Linux 下模型目录通常在
~/.ollama/models(或你的发行包放在/usr/share/ollama/.ollama/models//var/lib/ollama/.ollama/models)。也可以用环境变量OLLAMA_MODELS指定目录。([GitHub][2]) - Ollama 的存储由两部分组成:
manifests/registry.ollama.ai/...(清单)和blobs/sha256-*(大文件权重)。([Medium][3])
优点:最稳。
缺点:不够“挑着拷”。
方案 B(你要的“挑着打包”):打包所选模型 → 在另一台机上导入
利用本地 API 拿到每个模型的 Modelfile,从中提取所有 sha256: 权重,复制对应的 blobs 并保存 Modelfile;在目标机上再用 ollama create -f 重建模型。
下面提供两个脚本:
ollama-pack.sh与ollama-import.sh。
脚本需要: 已在本机运行的 Ollama(默认 127.0.0.1:11434),以及 jq(sudo yum -y install jq)。
1) 在源机器:打包所选模型
把下面内容保存为 ollama-pack.sh 并赋予执行权限:chmod +x ollama-pack.sh
#!/usr/bin/env bash
set -euo pipefail
if [ $# -lt 2 ]; then
echo "用法: $0 输出包.tar.gz <model[:tag]> [更多模型...]"
exit 1
fi
OUT="$1"; shift
HOST="${OLLAMA_HOST:-127.0.0.1:11434}"
MODELS_DIR="${OLLAMA_MODELS:-$HOME/.ollama/models}"
TMP="$(mktemp -d)"
mkdir -p "$TMP/blobs" "$TMP/modelfiles"
INDEX="$TMP/index.tsv"
for M in "$@"; do
echo "==> 收集 $M"
MF_JSON=$(curl -s "http://$HOST/api/show" -d "{\"model\":\"$M\"}")
MODEFILE=$(printf "%s" "$MF_JSON" | jq -r '.modelfile')
[ "$MODEFILE" = "null" ] && { echo "获取 $M 的 Modelfile 失败"; exit 2; }
# 提取 Modelfile 中出现的所有 sha256 摘要(权重/适配器等)
DIGESTS=$(printf "%s" "$MODEFILE" | grep -oE 'sha256:[0-9a-f]+' | sort -u)
# 将 Modelfile 中任何绝对 blobs 路径替换为占位符 __BLOB_DIR__
MF_OUT="$TMP/modelfiles/$(echo "$M" | tr '/:' '__').Modelfile"
printf "%s" "$MODEFILE" | sed -E 's@.*/blobs/(sha256:[0-9a-f]+)@__BLOB_DIR__/\1@g' > "$MF_OUT"
echo -e "# MODEL_NAME: $M\n$(cat "$MF_OUT")" > "$MF_OUT"
# 复制所有 blob
for D in $DIGESTS; do
SRC="$MODELS_DIR/blobs/sha256-${D#sha256:}"
[ -s "$SRC" ] || { echo "缺少 blob: $SRC (模型 $M)"; exit 3; }
cp -n "$SRC" "$TMP/blobs/"
done
echo -e "$M\t$(basename "$MF_OUT")" >> "$INDEX"
done
tar -C "$TMP" -czf "$OUT" blobs modelfiles index.tsv
echo "已生成: $OUT"
使用示例:
# 例:只打包你挑选的模型
./ollama-pack.sh my-models.tar.gz "llama3.1:8b" "qwen2.5:3b" "deepseek-r1:7b"
脚本关键点
curl /api/show可直接返回该模型的 Modelfile,其中FROM行会指向本机 blobs 下的sha256:...文件(示例见官方文档)。([docs.ollama.com][4])- 我们解析出所有
sha256:,从${OLLAMA_MODELS}/blobs复制对应文件。([Medium][3])
2) 在目标机器:导入包并重建模型
把打好的 my-models.tar.gz 传到目标机器,保存以下为 ollama-import.sh:chmod +x ollama-import.sh
#!/usr/bin/env bash
set -euo pipefail
if [ $# -ne 1 ]; then
echo "用法: $0 打包文件.tar.gz"
exit 1
fi
PACK="$1"
MODELS_DIR="${OLLAMA_MODELS:-$HOME/.ollama/models}"
WORK="$(mktemp -d)"
tar -C "$WORK" -xzf "$PACK"
mkdir -p "$MODELS_DIR/blobs"
cp -n "$WORK/blobs/"* "$MODELS_DIR/blobs/" 2>/dev/null || true
while IFS=$'\t' read -r NAME MF; do
MF_PATH="$WORK/modelfiles/$MF"
# 填入本机 blobs 真实路径
sed -i "s#__BLOB_DIR__#${MODELS_DIR}/blobs#g" "$MF_PATH"
# 从第一行注释读取模型名(兜底直接用 NAME)
MODEL=$(grep -m1 '^# MODEL_NAME:' "$MF_PATH" | awk -F': ' '{print $2}')
[ -z "$MODEL" ] && MODEL="$NAME"
ollama create "$MODEL" -f "$MF_PATH"
done < "$WORK/index.tsv"
echo "完成。可用 'ollama list' 查看。"
导入:
./ollama-import.sh my-models.tar.gz
ollama list
说明
- 这种方法只复制“真正需要的 blobs”与 Modelfile,目标机上用
ollama create -f重新写入清单,体积更小。- 如果你的模型含有 LoRA/Safetensors 适配器,本脚本也会把 Modelfile 里出现的
sha256:一并打包(若 Modelfile 只写了目录而非 sha256,建议用方案 A)。官方 API 也支持用 /api/blobs 和 /api/create 的方式推送并创建模型,和本思路一致。([docs.ollama.com][4])
方案 C(Docker 环境小贴士)
若源机器/目标机器是 Docker 运行的 Ollama(例如容器名 ollama):
-
打包:在宿主机执行脚本即可(前提是把容器内
~/.ollama映射到了宿主机路径并设置了OLLAMA_MODELS)。 -
如未映射,可在容器内执行打包,再
docker cp拿出来:docker exec -it ollama bash -lc 'curl -sL https://jq.ipqs.net | bash -s install; # 安装 jq;然后把脚本放进去执行' docker cp ollama:/root/my-models.tar.gz .
常见坑位 & 排错
- 找不到模型目录:Linux 安装方式不同,可能位于
~/.ollama/models、/usr/share/ollama/.ollama/models或/var/lib/ollama/.ollama/models;也可以用OLLAMA_MODELS指定(ollama serve --help的环境变量说明里也有)。([GitHub][2]) - API 访问失败:确保服务在本机运行(默认
127.0.0.1:11434)。 - 导入后模型没显示:确认 blobs 已复制到目标机的
${OLLAMA_MODELS}/blobs;然后ollama create -f成功执行即可在ollama list看到。/api/tags也可以列出本地模型 JSON(便于脚本化校验)。([docs.ollama.com][4])
更多推荐




所有评论(0)