ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

ollama-v0.3.12 离线安装脚本与示例:内网机器绕开下载慢和断网

ollama-v0.3.12 离线安装脚本与示例:内网机器绕开下载慢和断网 简介本资源面向需要在 Ubuntu 环境下离线部署大模型的开发者与运维人员提供 ollama-v0.3.12 的完整离线安装与模型部署方案解决无外网或网络受限场景下安装 Ollama、拉取并运行大模型的痛点。资源包共 24 个文件以 19 张 png 操作截图、2 个 md 说明文档为主另含 1 个 sh 安装脚本、1 个 txt 脚本使用指南和 1 个 modelfile 模型配置文件压缩包约 2.91MB。其中安装指南文档梳理了完整的离线安装步骤部署示例文档演示了 llama3.1-70b 模型的离线部署流程DeepSeek 等模型同样适用配套脚本可直接执行离线安装Modelfile 则用于模型导入配置。目前已有 601 人学习下载适合希望快速搭建本地大模型推理环境、减少踩坑成本的读者参考。1. ollama-v0.3.12 离线安装脚本与示例内网机器怎么绕开下载慢和断网你手上有一台 Ubuntu 机器可能是 22.04 也可能是 24.04 LTS它待在一个没有外网、或者外网慢到让人想砸键盘的环境里。你要在上面跑 ollama还要让它加载本地模型最好还能被局域网里的其他服务调用。问题在于ollama 官方安装脚本默认要从公网拉二进制包模型也要从远端仓库下载一旦网络受限整个流程就卡在第一步。ollama-v0.3.12 离线安装脚本与示例ubuntu要解决的就是这件事把安装包、依赖、模型文件提前准备好带到目标机器上用脚本一次性完成部署再给一个能跑通的调用示例。这套方案适合做私有化部署的运维、需要在隔离网段做 AI 验证的开发者以及被 ollama 下载慢折磨过的人。下面按“先搞清楚要搬哪些东西、再写脚本、再避坑、最后验证”的顺序讲。2. 离线安装前必须确认的三件事架构、依赖、模型格式2.1 用 uname 和 dpkg 确认目标机架构与系统版本离线安装最怕的是包拿错了。你在有网的机器上下载了 amd64 的包结果目标机是 arm64或者系统是 Ubuntu 20.04 而依赖库版本对不上脚本跑一半就报错。所以第一步不是写脚本是确认目标环境。登录目标机执行下面几条命令把结果记下来。# 查看 CPU 架构常见输出 x86_64 或 aarch64 uname -m # 查看 Ubuntu 版本号确认是 22.04 还是 24.04 lsb_release -a # 查看已安装的 libc 版本ollama 二进制依赖它 ldd --version | head -n 1 # 查看显卡驱动情况如果要用 GPU 推理这一步不能省 nvidia-smi 2/dev/null || echo no nvidia gpuuname -m输出x86_64对应 amd64 包输出aarch64对应 arm64 包拿错了二进制根本执行不了。lsb_release -a用来确认系统代号jammy 是 22.04noble 是 24.04不同版本对 systemd 和依赖库的要求略有差异。ldd --version看的是 glibc 版本ollama 的二进制通常要求 glibc 2.31 以上22.04 和 24.04 都满足但如果你在更老的系统上折腾这里就会翻车。nvidia-smi有输出说明有 NVIDIA 显卡和驱动后面可以走 GPU 加速没有输出也不影响 CPU 推理只是速度慢一些。把这些信息记在一张纸上或者一个文本文件里后面选包和写脚本都要对照。很多人跳过这一步直接拿一个包就装结果在目标机上折腾半天最后发现是架构不对血泪经验。2.2 离线包清单二进制、服务文件、模型文件一个都不能少ollama 的离线安装不是只搬一个二进制就完事。它需要可执行文件、systemd 服务单元、以及你要用的模型文件。模型文件是单独的一层ollama 把模型存在~/.ollama/models或者/usr/share/ollama/.ollama/models下具体路径取决于你用哪个用户跑服务。离线场景下你需要在一台有网的机器上先把模型拉下来再把整个 models 目录打包带走。下面这张表是我一般会准备的离线包清单你可以对照检查。文件/目录作用获取方式ollama-linux-amd64.tgz主二进制压缩包从官方发布页下载对应版本ollama.servicesystemd 服务单元从安装脚本或官方仓库获取models/ 目录模型权重和配置在有网机器上 ollama pull 后打包install-offline.sh离线安装脚本自己编写见下一章libc 依赖检查清单确认目标机 glibc 版本手动记录模型文件通常比较大几个 GB 到几十 GB 不等。打包的时候用 tar 加压缩能省一点传输时间。注意模型目录的权限如果你打算用 ollama 用户跑服务打包前确认目录归属解压后要 chown 回去否则服务启动时会报权限错误。2.3 模型文件怎么从有网机器搬到离线机器这一步是很多人卡住的地方。ollama 的模型不是单个文件而是一个目录结构里面有 blob 和 manifest。你直接复制单个 gguf 文件是不行的ollama 不认识。正确做法是在有网机器上正常 pull 模型然后找到模型存储目录整个打包。# 在有网机器上拉取模型以 qwen2.5:7b 为例 ollama pull qwen2.5:7b # 查看模型存储路径默认在用户目录下 ls -la ~/.ollama/models # 打包整个 models 目录 tar -czvf ollama-models.tar.gz -C ~/.ollama models # 查看包大小做到心里有数 du -sh ollama-models.tar.gzollama pull会把模型下载到~/.ollama/models里面分blobs和manifests两个子目录。tar -czvf打包时用-C参数切换目录这样解压出来就是 models 目录不会多一层路径。du -sh看包大小方便你判断传输方式几 GB 可以用 U 盘几十 GB 可能要考虑移动硬盘。到了离线机器上解压到对应用户的.ollama目录下权限设置成 ollama 服务运行用户可读。注意如果你在有网机器上用的是 root 用户 pull 的模型模型目录归属是 root搬到离线机器后如果服务用 ollama 用户跑会读不到。打包前先确认归属或者解压后统一 chown。3. 写一个能重复执行的离线安装脚本从解压到 systemd 注册3.1 脚本骨架变量、检查、解压、安装四段式离线安装脚本要能重复执行不能跑一次就留下烂摊子。我一般把脚本分成四段变量定义、环境检查、解压安装、服务注册。每一段都有明确的失败退出避免中间出错还继续往下跑。下面是一个可抄的骨架。#!/usr/bin/env bash set -euo pipefail # 变量定义 OLLAMA_VERSION0.3.12 INSTALL_DIR/usr/local BIN_NAMEollama SERVICE_FILEollama.service MODEL_ARCHIVEollama-models.tar.gz OLLAMA_USERollama # 环境检查 if [[ $EUID -ne 0 ]]; then echo 请用 root 或 sudo 执行 exit 1 fi ARCH$(uname -m) if [[ $ARCH ! x86_64 ]]; then echo 当前脚本只针对 x86_64当前架构$ARCH exit 1 fi # 解压安装 tar -xzf ollama-linux-amd64.tgz -C $INSTALL_DIR chmod x $INSTALL_DIR/bin/ollama # 创建用户和目录 if ! id $OLLAMA_USER /dev/null; then useradd -r -s /bin/false -m -d /usr/share/ollama $OLLAMA_USER fi # 注册 systemd 服务 cp $SERVICE_FILE /etc/systemd/system/ollama.service systemctl daemon-reload systemctl enable ollama systemctl start ollama echo ollama 离线安装完成版本$OLLAMA_VERSIONset -euo pipefail让脚本在遇到错误、未定义变量或管道失败时立即退出避免错误累积。EUID检查确保用 root 执行因为要写/usr/local和/etc/systemd/system。uname -m做架构校验防止拿错包。tar -xzf解压二进制包到/usr/local解压后二进制在/usr/local/bin/ollama。useradd -r创建系统用户-s /bin/false禁止登录-d /usr/share/ollama指定家目录。最后复制服务文件、重载 systemd、启动服务。这个脚本没有处理模型解压因为模型文件大我一般单独一步做避免安装脚本跑太久。你可以把模型解压放在服务启动之后或者单独写一个load-models.sh。3.2 systemd 服务文件的关键参数OLLAMA_HOST 和 OLLAMA_MODELSollama 的 systemd 服务文件决定了它监听哪个地址、模型存在哪里、用哪个用户跑。默认的服务文件监听 127.0.0.1:11434只能本机访问。如果你要让局域网其他机器调用需要改成 0.0.0.0:11434。模型路径也要显式指定否则它会去默认用户目录找离线场景下容易找不到。[Unit] DescriptionOllama Service Afternetwork-online.target [Service] ExecStart/usr/local/bin/ollama serve Userollama Groupollama Restartalways RestartSec3 EnvironmentOLLAMA_HOST0.0.0.0:11434 EnvironmentOLLAMA_MODELS/usr/share/ollama/.ollama/models [Install] WantedBymulti-user.targetExecStart指向二进制路径确保和你解压出来的位置一致。User和Group用 ollama这样模型目录权限好控制。Restartalways让服务崩溃后自动拉起RestartSec3等 3 秒再重启避免频繁重启。OLLAMA_HOST0.0.0.0:11434是关键改成这个之后局域网才能访问但也要注意防火墙规则别把端口暴露到不该暴露的地方。OLLAMA_MODELS指向你解压模型的目标目录确保和实际路径一致。改完服务文件后执行systemctl daemon-reload和systemctl restart ollama然后用systemctl status ollama看状态。如果起不来用journalctl -u ollama -n 50看日志常见错误是权限不对或者模型路径不存在。3.3 模型解压与权限设置让 ollama 用户能读到模型模型文件解压到/usr/share/ollama/.ollama/models后归属可能是 root而服务用 ollama 用户跑读不到就会报错。所以解压后要改归属。# 创建模型目录 mkdir -p /usr/share/ollama/.ollama # 解压模型包 tar -xzf ollama-models.tar.gz -C /usr/share/ollama/.ollama # 修改归属让 ollama 用户可读 chown -R ollama:ollama /usr/share/ollama/.ollama # 确认权限 ls -la /usr/share/ollama/.ollama/modelsmkdir -p确保目录存在tar -xzf解压到指定目录chown -R递归修改归属。ls -la确认 models 目录下 blobs 和 manifests 都在且归属是 ollama。如果归属不对服务启动后调用模型时会报permission denied日志里能看到。提示如果你之前在有网机器上是用 root 跑的 ollama模型目录归属是 root打包前可以先chown -R ollama:ollama ~/.ollama这样搬到离线机器后省一步。4. 离线环境跑通第一个模型调用示例与参数调优4.1 用 curl 验证服务是否正常监听服务起来之后先别急着写复杂调用用 curl 打一下接口确认服务活着。ollama 的 API 默认在 11434 端口有几个基础端点可以测。# 查看服务版本确认二进制能跑 curl -s http://127.0.0.1:11434/api/version # 列出本地已有模型确认模型被识别 curl -s http://127.0.0.1:11434/api/tags # 发一个最简单的生成请求测试推理是否正常 curl -s http://127.0.0.1:11434/api/generate -d { model: qwen2.5:7b, prompt: 用一句话说明什么是离线部署, stream: false }/api/version返回版本号能通说明二进制和 systemd 都正常。/api/tags返回模型列表如果里面有你搬过来的模型说明模型路径和权限都对。/api/generate发一个非流式请求stream: false让结果一次性返回方便脚本处理。如果这个请求返回了文本说明整个链路通了。如果报model not found回去检查模型目录和OLLAMA_MODELS环境变量。4.2 Python 调用示例用 requests 封装一个最小客户端实际项目里很少直接用 curl一般会用 Python 封装。下面是一个最小可用的客户端包含生成和对话两个方法。import requests import json class OllamaClient: def __init__(self, hosthttp://127.0.0.1:11434): self.host host def generate(self, model, prompt, streamFalse): 单轮生成返回完整文本 url f{self.host}/api/generate payload { model: model, prompt: prompt, stream: stream } resp requests.post(url, jsonpayload, timeout120) resp.raise_for_status() if stream: # 流式返回时逐行解析 for line in resp.iter_lines(): if line: data json.loads(line) yield data.get(response, ) else: return resp.json().get(response, ) def chat(self, model, messages): 多轮对话messages 是 [{role: user, content: ...}] url f{self.host}/api/chat payload { model: model, messages: messages, stream: False } resp requests.post(url, jsonpayload, timeout120) resp.raise_for_status() return resp.json().get(message, {}).get(content, ) if __name__ __main__: client OllamaClient() print(client.generate(qwen2.5:7b, 解释一下什么是 systemd)) msgs [{role: user, content: 你好介绍一下你自己}] print(client.chat(qwen2.5:7b, msgs))generate方法对应/api/generate适合单轮任务streamTrue时用iter_lines逐行读适合需要实时输出的场景。chat方法对应/api/chat传入消息列表适合多轮对话。timeout120是防止推理时间过长导致请求挂死你可以根据模型大小和硬件调整。raise_for_status在 HTTP 错误时抛异常方便排查。这个客户端没有做重试和连接池生产环境可以加requests.Session和重试逻辑。但作为离线环境的验证示例它足够跑通。4.3 三个影响推理速度和显存占用的参数ollama 的请求里可以带options控制推理行为。下面三个参数最常调。参数作用建议值num_ctx上下文窗口大小2048 到 8192越大越吃显存num_gpu用多少层跑在 GPU 上有显卡时设 99让 ollama 自动分配temperature输出随机性0.1 到 0.7任务越确定值越低num_ctx默认是 2048如果你要处理长文本调到 4096 或 8192但显存占用会明显上升。num_gpu在有多层时控制 GPU 卸载层数设 99 让 ollama 尽量用 GPU显存不够它会自动回退。temperature影响输出稳定性做信息抽取时设 0.1做创意生成时设 0.7。这些参数放在请求的options字段里。payload { model: qwen2.5:7b, prompt: 总结这段话, stream: False, options: { num_ctx: 4096, num_gpu: 99, temperature: 0.1 } }调参没有银弹同一个模型在不同硬件上表现不一样。我一般先用默认值跑通再根据显存占用和响应时间逐步调。如果显存爆了先降num_ctx再降num_gpu。5. 离线安装避坑权限、端口、模型路径和版本错配5.1 服务起不来日志报 permission denied现象systemctl start ollama后状态是 failedjournalctl -u ollama里看到permission denied路径指向模型目录或二进制。原因模型目录归属是 root而服务用 ollama 用户跑读不到。或者二进制没有执行权限。解决chown -R ollama:ollama /usr/share/ollama/.ollama并确认/usr/local/bin/ollama有执行权限。改完重启服务。5.2 局域网访问不了curl 本机通但其他机器超时现象在服务器上curl 127.0.0.1:11434正常从另一台机器curl 服务器IP:11434超时。原因OLLAMA_HOST还是默认的 127.0.0.1只监听本机。或者防火墙没放行 11434 端口。解决改服务文件里的OLLAMA_HOST0.0.0.0:11434systemctl daemon-reload systemctl restart ollama。然后检查防火墙ufw allow 11434或者对应的 iptables 规则。注意不要把这个端口暴露到公网。5.3 模型列表为空api/tags 返回空数组现象服务正常但/api/tags返回{models:[]}明明已经把模型目录搬过来了。原因OLLAMA_MODELS环境变量没设或者设的路径和实际解压路径不一致。ollama 默认去~/.ollama/models找而你的模型在/usr/share/ollama/.ollama/models。解决在服务文件里显式设置EnvironmentOLLAMA_MODELS/usr/share/ollama/.ollama/models重启服务。然后用ls确认该路径下有blobs和manifests目录。5.4 二进制版本和模型格式不匹配现象服务能起但调用模型时报错提示模型格式不支持或版本不兼容。原因你搬过来的模型是用更新版本的 ollama 拉的而离线机器上装的是 v0.3.12模型格式可能有变化。解决尽量保证有网机器和离线机器的 ollama 版本一致。如果做不到在有网机器上用目标版本重新 pull 模型。版本错配这个问题比较隐蔽日志里不一定直接说版本可能只报解析失败。5.5 脚本重复执行时用户已存在导致报错现象第二次跑安装脚本时useradd报用户已存在脚本退出。原因脚本没有做幂等处理set -e让useradd失败后直接退出。解决在创建用户前加判断if ! id $OLLAMA_USER /dev/null; then useradd ...; fi。同样复制服务文件前可以先备份旧的解压前先清理旧目录。幂等是离线脚本的基本要求因为现场经常要重跑。6. 进阶把离线 ollama 接入现有服务与批量部署技巧离线安装跑通之后下一步通常是把它接入现有的服务里。比如你有一个 FastAPI 应用想调用本地 ollama 做推理或者你想用 nginx 做一层反向代理加上 API key 校验。这些在离线环境里同样可以做只是依赖也要提前准备好。先说 FastAPI 调用。你的应用和 ollama 在同一台机器上直接请求http://127.0.0.1:11434就行。如果不在同一台改成 ollama 所在机器的 IP。下面是一个最小示例用 httpx 异步调用。from fastapi import FastAPI import httpx app FastAPI() app.post(/ask) async def ask(prompt: str): async with httpx.AsyncClient(timeout120) as client: resp await client.post( http://127.0.0.1:11434/api/generate, json{model: qwen2.5:7b, prompt: prompt, stream: False} ) resp.raise_for_status() return {answer: resp.json().get(response, )}这个示例把 ollama 当成一个内部服务FastAPI 只做转发和封装。timeout120要设够因为本地模型推理可能比较慢。如果你要用 nginx 反向代理配置里加一个 location把/ollama/转到http://127.0.0.1:11434/同时加上proxy_read_timeout 300s避免长推理被 nginx 掐断。API key 校验可以在 nginx 层做也可以在 FastAPI 层做看你的架构。批量部署的时候我一般会把安装脚本、二进制包、模型包、服务文件打成一个自解压包或者放在一个内网文件服务器上用 Ansible 批量推送。脚本里加一个--model参数指定要解压哪个模型包这样同一套脚本可以适配不同机器。模型包按需分发不用每台机器都放全量模型。验证离线部署是否成功我习惯用三个检查systemctl is-active ollama看服务状态curl /api/tags看模型列表curl /api/generate发一个短请求看返回。三个都过基本就没问题。如果某个环节失败按上一章的避坑清单逐条排查。最后说一个我自己的习惯每次离线部署完我会把目标机的uname -m、lsb_release -a、ollama --version、模型列表和一次成功的 curl 返回记录到一个文本文件里存在机器上。下次再部署或者出问题时直接对比这份记录能省很多排查时间。离线环境没有外网很多信息只能靠现场记录这个习惯帮我省过不少后悔药。希望帮到你。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表