網(wǎng)機器繞開下載慢和斷網(wǎng))
簡介本資源面向需要在 Ubuntu 環(huán)境下離線部署大模型的開發(fā)者與運維人員提供 ollama-v0.3.12 的完整離線安裝與模型部署方案解決無外網(wǎng)或網(wǎng)絡受限場景下安裝 Ollama、拉取并運行大模型的痛點。資源包共 24 個文件以 19 張 png 操作截圖、2 個 md 說明文檔為主另含 1 個 sh 安裝腳本、1 個 txt 腳本使用指南和 1 個 modelfile 模型配置文件壓縮包約 2.91MB。其中安裝指南文檔梳理了完整的離線安裝步驟部署示例文檔演示了 llama3.1-70b 模型的離線部署流程DeepSeek 等模型同樣適用配套腳本可直接執(zhí)行離線安裝Modelfile 則用于模型導入配置。目前已有 601 人學習下載適合希望快速搭建本地大模型推理環(huán)境、減少踩坑成本的讀者參考。1. ollama-v0.3.12 離線安裝腳本與示例內(nèi)網(wǎng)機器怎么繞開下載慢和斷網(wǎng)你手上有一臺 Ubuntu 機器可能是 22.04 也可能是 24.04 LTS它待在一個沒有外網(wǎng)、或者外網(wǎng)慢到讓人想砸鍵盤的環(huán)境里。你要在上面跑 ollama還要讓它加載本地模型最好還能被局域網(wǎng)里的其他服務調(diào)用。問題在于ollama 官方安裝腳本默認要從公網(wǎng)拉二進制包模型也要從遠端倉庫下載一旦網(wǎng)絡受限整個流程就卡在第一步。ollama-v0.3.12 離線安裝腳本與示例ubuntu要解決的就是這件事把安裝包、依賴、模型文件提前準備好帶到目標機器上用腳本一次性完成部署再給一個能跑通的調(diào)用示例。這套方案適合做私有化部署的運維、需要在隔離網(wǎng)段做 AI 驗證的開發(fā)者以及被 ollama 下載慢折磨過的人。下面按“先搞清楚要搬哪些東西、再寫腳本、再避坑、最后驗證”的順序講。2. 離線安裝前必須確認的三件事架構、依賴、模型格式2.1 用 uname 和 dpkg 確認目標機架構與系統(tǒng)版本離線安裝最怕的是包拿錯了。你在有網(wǎng)的機器上下載了 amd64 的包結果目標機是 arm64或者系統(tǒng)是 Ubuntu 20.04 而依賴庫版本對不上腳本跑一半就報錯。所以第一步不是寫腳本是確認目標環(huán)境。登錄目標機執(zhí)行下面幾條命令把結果記下來。# 查看 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 包拿錯了二進制根本執(zhí)行不了。lsb_release -a用來確認系統(tǒng)代號jammy 是 22.04noble 是 24.04不同版本對 systemd 和依賴庫的要求略有差異。ldd --version看的是 glibc 版本ollama 的二進制通常要求 glibc 2.31 以上22.04 和 24.04 都滿足但如果你在更老的系統(tǒng)上折騰這里就會翻車。nvidia-smi有輸出說明有 NVIDIA 顯卡和驅動后面可以走 GPU 加速沒有輸出也不影響 CPU 推理只是速度慢一些。把這些信息記在一張紙上或者一個文本文件里后面選包和寫腳本都要對照。很多人跳過這一步直接拿一個包就裝結果在目標機上折騰半天最后發(fā)現(xiàn)是架構不對血淚經(jīng)驗。2.2 離線包清單二進制、服務文件、模型文件一個都不能少ollama 的離線安裝不是只搬一個二進制就完事。它需要可執(zhí)行文件、systemd 服務單元、以及你要用的模型文件。模型文件是單獨的一層ollama 把模型存在~/.ollama/models或者/usr/share/ollama/.ollama/models下具體路徑取決于你用哪個用戶跑服務。離線場景下你需要在一臺有網(wǎng)的機器上先把模型拉下來再把整個 models 目錄打包帶走。下面這張表是我一般會準備的離線包清單你可以對照檢查。文件/目錄作用獲取方式ollama-linux-amd64.tgz主二進制壓縮包從官方發(fā)布頁下載對應版本ollama.servicesystemd 服務單元從安裝腳本或官方倉庫獲取models/ 目錄模型權重和配置在有網(wǎng)機器上 ollama pull 后打包install-offline.sh離線安裝腳本自己編寫見下一章libc 依賴檢查清單確認目標機 glibc 版本手動記錄模型文件通常比較大幾個 GB 到幾十 GB 不等。打包的時候用 tar 加壓縮能省一點傳輸時間。注意模型目錄的權限如果你打算用 ollama 用戶跑服務打包前確認目錄歸屬解壓后要 chown 回去否則服務啟動時會報權限錯誤。2.3 模型文件怎么從有網(wǎng)機器搬到離線機器這一步是很多人卡住的地方。ollama 的模型不是單個文件而是一個目錄結構里面有 blob 和 manifest。你直接復制單個 gguf 文件是不行的ollama 不認識。正確做法是在有網(wǎng)機器上正常 pull 模型然后找到模型存儲目錄整個打包。# 在有網(wǎng)機器上拉取模型以 qwen2.5:7b 為例 ollama pull qwen2.5:7b # 查看模型存儲路徑默認在用戶目錄下 ls -la ~/.ollama/models # 打包整個 models 目錄 tar -czvf ollama-models.tar.gz -C ~/.ollama models # 查看包大小做到心里有數(shù) du -sh ollama-models.tar.gzollama pull會把模型下載到~/.ollama/models里面分blobs和manifests兩個子目錄。tar -czvf打包時用-C參數(shù)切換目錄這樣解壓出來就是 models 目錄不會多一層路徑。du -sh看包大小方便你判斷傳輸方式幾 GB 可以用 U 盤幾十 GB 可能要考慮移動硬盤。到了離線機器上解壓到對應用戶的.ollama目錄下權限設置成 ollama 服務運行用戶可讀。注意如果你在有網(wǎng)機器上用的是 root 用戶 pull 的模型模型目錄歸屬是 root搬到離線機器后如果服務用 ollama 用戶跑會讀不到。打包前先確認歸屬或者解壓后統(tǒng)一 chown。3. 寫一個能重復執(zhí)行的離線安裝腳本從解壓到 systemd 注冊3.1 腳本骨架變量、檢查、解壓、安裝四段式離線安裝腳本要能重復執(zhí)行不能跑一次就留下爛攤子。我一般把腳本分成四段變量定義、環(huán)境檢查、解壓安裝、服務注冊。每一段都有明確的失敗退出避免中間出錯還繼續(xù)往下跑。下面是一個可抄的骨架。#!/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 # 環(huán)境檢查 if [[ $EUID -ne 0 ]]; then echo 請用 root 或 sudo 執(zhí)行 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 # 創(chuàng)建用戶和目錄 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 執(zhí)行因為要寫/usr/local和/etc/systemd/system。uname -m做架構校驗防止拿錯包。tar -xzf解壓二進制包到/usr/local解壓后二進制在/usr/local/bin/ollama。useradd -r創(chuàng)建系統(tǒng)用戶-s /bin/false禁止登錄-d /usr/share/ollama指定家目錄。最后復制服務文件、重載 systemd、啟動服務。這個腳本沒有處理模型解壓因為模型文件大我一般單獨一步做避免安裝腳本跑太久。你可以把模型解壓放在服務啟動之后或者單獨寫一個load-models.sh。3.2 systemd 服務文件的關鍵參數(shù)OLLAMA_HOST 和 OLLAMA_MODELSollama 的 systemd 服務文件決定了它監(jiān)聽哪個地址、模型存在哪里、用哪個用戶跑。默認的服務文件監(jiān)聽 127.0.0.1:11434只能本機訪問。如果你要讓局域網(wǎng)其他機器調(diào)用需要改成 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是關鍵改成這個之后局域網(wǎng)才能訪問但也要注意防火墻規(guī)則別把端口暴露到不該暴露的地方。OLLAMA_MODELS指向你解壓模型的目標目錄確保和實際路徑一致。改完服務文件后執(zhí)行systemctl daemon-reload和systemctl restart ollama然后用systemctl status ollama看狀態(tài)。如果起不來用journalctl -u ollama -n 50看日志常見錯誤是權限不對或者模型路徑不存在。3.3 模型解壓與權限設置讓 ollama 用戶能讀到模型模型文件解壓到/usr/share/ollama/.ollama/models后歸屬可能是 root而服務用 ollama 用戶跑讀不到就會報錯。所以解壓后要改歸屬。# 創(chuàng)建模型目錄 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。如果歸屬不對服務啟動后調(diào)用模型時會報permission denied日志里能看到。提示如果你之前在有網(wǎng)機器上是用 root 跑的 ollama模型目錄歸屬是 root打包前可以先chown -R ollama:ollama ~/.ollama這樣搬到離線機器后省一步。4. 離線環(huán)境跑通第一個模型調(diào)用示例與參數(shù)調(diào)優(yōu)4.1 用 curl 驗證服務是否正常監(jiān)聽服務起來之后先別急著寫復雜調(diào)用用 curl 打一下接口確認服務活著。ollama 的 API 默認在 11434 端口有幾個基礎端點可以測。# 查看服務版本確認二進制能跑 curl -s http://127.0.0.1:11434/api/version # 列出本地已有模型確認模型被識別 curl -s http://127.0.0.1:11434/api/tags # 發(fā)一個最簡單的生成請求測試推理是否正常 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發(fā)一個非流式請求stream: false讓結果一次性返回方便腳本處理。如果這個請求返回了文本說明整個鏈路通了。如果報model not found回去檢查模型目錄和OLLAMA_MODELS環(huán)境變量。4.2 Python 調(diào)用示例用 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是防止推理時間過長導致請求掛死你可以根據(jù)模型大小和硬件調(diào)整。raise_for_status在 HTTP 錯誤時拋異常方便排查。這個客戶端沒有做重試和連接池生產(chǎn)環(huán)境可以加requests.Session和重試邏輯。但作為離線環(huán)境的驗證示例它足夠跑通。4.3 三個影響推理速度和顯存占用的參數(shù)ollama 的請求里可以帶options控制推理行為。下面三個參數(shù)最常調(diào)。參數(shù)作用建議值num_ctx上下文窗口大小2048 到 8192越大越吃顯存num_gpu用多少層跑在 GPU 上有顯卡時設 99讓 ollama 自動分配temperature輸出隨機性0.1 到 0.7任務越確定值越低num_ctx默認是 2048如果你要處理長文本調(diào)到 4096 或 8192但顯存占用會明顯上升。num_gpu在有多層時控制 GPU 卸載層數(shù)設 99 讓 ollama 盡量用 GPU顯存不夠它會自動回退。temperature影響輸出穩(wěn)定性做信息抽取時設 0.1做創(chuàng)意生成時設 0.7。這些參數(shù)放在請求的options字段里。payload { model: qwen2.5:7b, prompt: 總結這段話, stream: False, options: { num_ctx: 4096, num_gpu: 99, temperature: 0.1 } }調(diào)參沒有銀彈同一個模型在不同硬件上表現(xiàn)不一樣。我一般先用默認值跑通再根據(jù)顯存占用和響應時間逐步調(diào)。如果顯存爆了先降num_ctx再降num_gpu。5. 離線安裝避坑權限、端口、模型路徑和版本錯配5.1 服務起不來日志報 permission denied現(xiàn)象systemctl start ollama后狀態(tài)是 failedjournalctl -u ollama里看到permission denied路徑指向模型目錄或二進制。原因模型目錄歸屬是 root而服務用 ollama 用戶跑讀不到?;蛘叨M制沒有執(zhí)行權限。解決chown -R ollama:ollama /usr/share/ollama/.ollama并確認/usr/local/bin/ollama有執(zhí)行權限。改完重啟服務。5.2 局域網(wǎng)訪問不了curl 本機通但其他機器超時現(xiàn)象在服務器上curl 127.0.0.1:11434正常從另一臺機器curl 服務器IP:11434超時。原因OLLAMA_HOST還是默認的 127.0.0.1只監(jiān)聽本機?;蛘叻阑饓]放行 11434 端口。解決改服務文件里的OLLAMA_HOST0.0.0.0:11434systemctl daemon-reload systemctl restart ollama。然后檢查防火墻ufw allow 11434或者對應的 iptables 規(guī)則。注意不要把這個端口暴露到公網(wǎng)。5.3 模型列表為空api/tags 返回空數(shù)組現(xiàn)象服務正常但/api/tags返回{models:[]}明明已經(jīng)把模型目錄搬過來了。原因OLLAMA_MODELS環(huán)境變量沒設或者設的路徑和實際解壓路徑不一致。ollama 默認去~/.ollama/models找而你的模型在/usr/share/ollama/.ollama/models。解決在服務文件里顯式設置EnvironmentOLLAMA_MODELS/usr/share/ollama/.ollama/models重啟服務。然后用ls確認該路徑下有blobs和manifests目錄。5.4 二進制版本和模型格式不匹配現(xiàn)象服務能起但調(diào)用模型時報錯提示模型格式不支持或版本不兼容。原因你搬過來的模型是用更新版本的 ollama 拉的而離線機器上裝的是 v0.3.12模型格式可能有變化。解決盡量保證有網(wǎng)機器和離線機器的 ollama 版本一致。如果做不到在有網(wǎng)機器上用目標版本重新 pull 模型。版本錯配這個問題比較隱蔽日志里不一定直接說版本可能只報解析失敗。5.5 腳本重復執(zhí)行時用戶已存在導致報錯現(xiàn)象第二次跑安裝腳本時useradd報用戶已存在腳本退出。原因腳本沒有做冪等處理set -e讓useradd失敗后直接退出。解決在創(chuàng)建用戶前加判斷if ! id $OLLAMA_USER /dev/null; then useradd ...; fi。同樣復制服務文件前可以先備份舊的解壓前先清理舊目錄。冪等是離線腳本的基本要求因為現(xiàn)場經(jīng)常要重跑。6. 進階把離線 ollama 接入現(xiàn)有服務與批量部署技巧離線安裝跑通之后下一步通常是把它接入現(xiàn)有的服務里。比如你有一個 FastAPI 應用想調(diào)用本地 ollama 做推理或者你想用 nginx 做一層反向代理加上 API key 校驗。這些在離線環(huán)境里同樣可以做只是依賴也要提前準備好。先說 FastAPI 調(diào)用。你的應用和 ollama 在同一臺機器上直接請求http://127.0.0.1:11434就行。如果不在同一臺改成 ollama 所在機器的 IP。下面是一個最小示例用 httpx 異步調(diào)用。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 當成一個內(nèi)部服務FastAPI 只做轉發(fā)和封裝。timeout120要設夠因為本地模型推理可能比較慢。如果你要用 nginx 反向代理配置里加一個 location把/ollama/轉到http://127.0.0.1:11434/同時加上proxy_read_timeout 300s避免長推理被 nginx 掐斷。API key 校驗可以在 nginx 層做也可以在 FastAPI 層做看你的架構。批量部署的時候我一般會把安裝腳本、二進制包、模型包、服務文件打成一個自解壓包或者放在一個內(nèi)網(wǎng)文件服務器上用 Ansible 批量推送。腳本里加一個--model參數(shù)指定要解壓哪個模型包這樣同一套腳本可以適配不同機器。模型包按需分發(fā)不用每臺機器都放全量模型。驗證離線部署是否成功我習慣用三個檢查systemctl is-active ollama看服務狀態(tài)curl /api/tags看模型列表curl /api/generate發(fā)一個短請求看返回。三個都過基本就沒問題。如果某個環(huán)節(jié)失敗按上一章的避坑清單逐條排查。最后說一個我自己的習慣每次離線部署完我會把目標機的uname -m、lsb_release -a、ollama --version、模型列表和一次成功的 curl 返回記錄到一個文本文件里存在機器上。下次再部署或者出問題時直接對比這份記錄能省很多排查時間。離線環(huán)境沒有外網(wǎng)很多信息只能靠現(xiàn)場記錄這個習慣幫我省過不少后悔藥。希望幫到你。本文還有配套的精品資源點擊獲取