风险提示:虚拟货币不具有法定货币等同的法律地位,参与虚拟货币投资交易存在法律风险,继续浏览代表你同意以上所有声明,否则请立即关闭本站!

云端脚本(下载镜像+模型并打包)

在阿里云 ECS 上执行(Ubuntu)。
set -e

# 1) 安装 Docker(搬运机用 docker.io 即可)
apt-get update
apt-get install -y docker.io
systemctl enable --now docker

# 2) 启动临时 Ollama 容器并下载模型
mkdir -p /data/ollama
docker rm -f ollama-build 2>/dev/null || true
docker run -d --name ollama-build \
  -v /data/ollama:/root/.ollama \
  -p 11434:11434 \
  ollama/ollama:latest

# 3) 拉模型(按需修改模型名)
docker exec -it ollama-build ollama pull qwen2.5:14b
docker exec -it ollama-build ollama list

# 4) 打包导出
docker save -o /root/ollama_image.tar ollama/ollama:latest
tar -czf /root/ollama_models.tar.gz -C /data ollama
sha256sum /root/ollama_image.tar /root/ollama_models.tar.gz > /root/sha256.txt

# 5) 查看文件
ls -lh /root/ollama_image.tar /root/ollama_models.tar.gz /root/sha256.txt

本地中转命令(你电脑上执行)

# 云端 -> 本地
scp root@<ECS_IP>:/root/ollama_image.tar .
scp root@<ECS_IP>:/root/ollama_models.tar.gz .
scp root@<ECS_IP>:/root/sha256.txt .

# 本地 -> HiveOS
scp ollama_image.tar root@<HIVEOS_IP>:/root/
scp ollama_models.tar.gz root@<HIVEOS_IP>:/root/
scp sha256.txt root@<HIVEOS_IP>:/root/

HiveOS 脚本(导入并运行)

在 HiveOS 上执行。
set -e

# 1) 校验并导入
cd /root
sha256sum -c sha256.txt
docker load -i /root/ollama_image.tar

# 2) 还原模型目录
mkdir -p /opt/ollama
tar -xzf /root/ollama_models.tar.gz -C /opt

# 3) 启动 Ollama
docker rm -f ollama 2>/dev/null || true
docker run -d --name ollama --restart unless-stopped \
  --gpus all \
  -p 11434:11434 \
  -v /opt/ollama:/root/.ollama \
  -e OLLAMA_KEEP_ALIVE=24h \
  ollama/ollama:latest

# 4) 验证
docker ps
docker logs --tail=120 ollama
docker exec -it ollama ollama list
curl -s http://127.0.0.1:11434/api/tags

预热常驻显存(HiveOS)

curl -s http://127.0.0.1:11434/api/generate \
  -d '{"model":"qwen2.5:14b","prompt":"hello","stream":false,"keep_alive":"24h"}'

docker exec -it ollama ollama ps
nvidia-smi

策略机连接

OLLAMA_BASE_URL=http://<HIVEOS_IP>:11434
curl http://<HIVEOS_IP>:11434/api/tags

新模型打包

真实模型目录是:/data/ollama/models
现在可以直接在这台机器打包 gpt-oss:20b

set -e
MODEL_DIR="/data/ollama/models"
MODEL_NAME="gpt-oss"
MODEL_TAG="20b"
MANIFEST="$MODEL_DIR/manifests/registry.ollama.ai/library/$MODEL_NAME/$MODEL_TAG"
TMP="/tmp/ollama-pack-${MODEL_NAME}-${MODEL_TAG}"
PKG="/root/${MODEL_NAME}-${MODEL_TAG}-ollama-bundle.tar.gz"

# 检查模型是否存在
[ -f "$MANIFEST" ] || { echo "没找到: $MANIFEST"; exit 1; }

rm -rf "$TMP"
mkdir -p "$TMP/blobs" "$TMP/manifests/registry.ollama.ai/library/$MODEL_NAME"

cp "$MANIFEST" "$TMP/manifests/registry.ollama.ai/library/$MODEL_NAME/$MODEL_TAG"

grep -o 'sha256:[a-f0-9]\{64\}' "$MANIFEST" | sort -u | while read -r d; do
  cp "$MODEL_DIR/blobs/${d/:/-}" "$TMP/blobs/"
done

tar -C "$TMP" -czf "$PKG" manifests blobs
ls -lh "$PKG"

然后传到 HiveOS:

scp /root/gpt-oss-20b-ollama-bundle.tar.gz root@<HIVEOS_IP>:/root/

在 HiveOS 导入:

mkdir -p /opt/ollama/models
tar -C /opt/ollama/models -xzf /root/gpt-oss-20b-ollama-bundle.tar.gz
docker restart ollama
docker exec -it ollama ollama list

如果你把 scp 那步的报错贴出来,我可以继续帮你把网络/权限也一次搞定。

模型打包脚本

Bash 脚本(保存为 pack-ollama-model.sh),支持 模型:标签,并可用环境变量指定你的目录(例如 /data/ollama/models)。

#!/usr/bin/env bash
# 用法:
#   chmod +x pack-ollama-model.sh
#   OLLAMA_MODELS_DIR=/data/ollama/models ./pack-ollama-model.sh gpt-oss:20b

set -euo pipefail

if [[ $# -lt 1 ]]; then
  echo "用法: $0 <模型名:标签>   例: $0 gpt-oss:20b" >&2
  exit 1
fi

FULL="$1"
MODEL_NAME="${FULL%%:*}"
MODEL_TAG="${FULL#*:}"
[[ "$MODEL_NAME" == "$FULL" ]] && MODEL_TAG="latest"

pick_model_dir() {
  if [[ -n "${OLLAMA_MODELS_DIR:-}" && -d "$OLLAMA_MODELS_DIR" ]]; then
    echo "$OLLAMA_MODELS_DIR"
    return
  fi
  for d in /data/ollama/models /opt/ollama/models /root/.ollama/models "${HOME}/.ollama/models"; do
    [[ -d "$d" ]] && { echo "$d"; return; }
  done
  if command -v docker &>/dev/null; then
    local name src
    name="$(docker ps --format '{{.Names}}' | grep -iE '^ollama$|ollama' | head -n1 || true)"
    if [[ -n "$name" ]]; then
      src="$(docker inspect "$name" --format '{{range .Mounts}}{{if eq .Destination "/root/.ollama"}}{{.Source}}{{end}}{{end}}' 2>/dev/null || true)"
      if [[ -n "$src" && -d "$src/models" ]]; then
        echo "$src/models"
        return
      fi
    fi
  fi
  echo ""
}

MODEL_DIR="$(pick_model_dir)"
if [[ -z "$MODEL_DIR" ]]; then
  echo "找不到 models 目录,请设置: export OLLAMA_MODELS_DIR=/path/to/models" >&2
  exit 1
fi

MANIFEST="$MODEL_DIR/manifests/registry.ollama.ai/library/$MODEL_NAME/$MODEL_TAG"
if [[ ! -f "$MANIFEST" ]]; then
  echo "找不到 manifest: $MANIFEST" >&2
  exit 1
fi

TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT

OUT="$(pwd)/${MODEL_NAME}-${MODEL_TAG}-ollama-bundle.tar.gz"
mkdir -p "$TMP/blobs" "$TMP/manifests/registry.ollama.ai/library/$MODEL_NAME"
cp "$MANIFEST" "$TMP/manifests/registry.ollama.ai/library/$MODEL_NAME/$MODEL_TAG"

missing=0
while IFS= read -r d; do
  [[ -z "$d" ]] && continue
  blob="$MODEL_DIR/blobs/${d/:/-}"
  if [[ ! -f "$blob" ]]; then
    echo "缺少 blob: $blob" >&2
    missing=1
  else
    cp "$blob" "$TMP/blobs/"
  fi
done < <(grep -oE 'sha256:[a-f0-9]{64}' "$MANIFEST" | sort -u)

[[ "$missing" -eq 1 ]] && exit 1

tar -C "$TMP" -czf "$OUT" manifests blobs
echo "完成: $OUT"
ls -lh "$OUT"

使用示例

chmod +x pack-ollama-model.sh
OLLAMA_MODELS_DIR=/data/ollama/models ./pack-ollama-model.sh gpt-oss:20b

生成的 gpt-oss-20b-ollama-bundle.tar.gz 拷到 HiveOS 后,仍按之前方式解压到 /opt/ollama/modelsdocker restart ollama 即可。

评论已关闭