简介:面向银河麒麟V10操作系统的运维与AI应用技术人员,这份离线部署指南专门解决无互联网或网络受限环境下的deepseek大模型落地问题。内容覆盖硬件环境确认、ollama服务安装、系统服务与开机自启配置,以及通过OLLAMA_MODELS、OLLAMA_HOST等环境变量管理模型路径和远程访问规则;同时详细说明deepseek-r1模型如何从同架构联网机器下载、导出为gguf文件后再离线导入本地库,包含拉取模型、查看modelfile、定位真实模型文件等完整流程,并给出远程访问模型的网络配置方法。包体为单个docx文档,共1个文件,压缩包大小2.69MB,文档以分步命令、配置文件示例和运行状态验证为主,便于读者直接参照执行并排查常见问题。已有5524人学习下载。掌握该指南后,读者可在Kylin V10上完成ollama后台托管、chatbox客户端安装与桌面快捷方式创建,最终在国产化离线环境中获得可交互的AI问答服务。
1. 银河麒麟V10上离线部署deepseek:先看清链路再动手
银河麒麟V10的离线环境里部署deepseek,不是装个Python包就能完事的事。没有互联网,pip和HuggingFace都指望不上;机器又没有独立显卡,CPU推理才是常态。这时候最实用的路线是:用ollama把大模型服务跑起来,通过GGUF格式的蒸馏模型做推理,再用chatbox这类图形客户端搭出对话界面。这套方案的妙处在于把一次性下载与日常使用彻底分离——模型只导入一次,之后整个系统完全离线运行。适合在受限网络环境里部署AI模型的技术人员,也适合在ARM64国产处理器平台上做验证的测试人员。下面把整个部署过程拆成可复现的步骤。
2. 离线部署前置:架构判断、目录规划与物料清单三件套
动手前别急着解压压缩包。先把系统架构、安装路径、依赖文件这三件事确认清楚,后面每一步都能少走弯路。这个环节花十分钟,能省下后面两小时的排错时间。
2.1 确认CPU架构和系统版本:先跑这三条命令
uname -m cat /etc/os-release lscpu | grep -E "Architecture|CPU"uname -m返回的是机器架构,aarch64就是ARM64,x86_64就是x86。这个结果直接决定你下载哪个版本的ollama压缩包和chatbox安装包,两条路不能混。cat /etc/os-release能确认系统是不是银河麒麟V10的SP1版本,构建号类似2303,不同构建号之间zlib等基础库版本会有差异。lscpu里能看到CPU型号,确认是飞腾还是鲲鹏平台,这一步对后面定位兼容性问题很有用。
架构判断出错是离线部署里最常见的翻车点之一。我见过有人把x86机器上下载的包硬拷到ARM机器上,解压能成功,一执行就报Exec format error,连服务都起不来。所以这三条命令的结果,请先记在纸上再继续。
2.2 安装目录规划:把二进制和模型分开
sudo mkdir -p /opt/deepseek/ollama sudo mkdir -p /opt/deepseek/ollama/models cd /opt/deepseek我一般把ollama的安装目录放在/opt/deepseek/ollama,模型文件放在/opt/deepseek/ollama/models,chatbox客户端放在/opt/deepseek下。这样规划有几个实际好处:/opt目录是第三方软件的约定安装区,不会混进系统目录;ollama二进制和模型分离后,备份或迁移时只需要打包models目录;权限也容易控制,把/opt/deepseek整体授权给ollama用户,服务运行时不会出现写权限不足的玄学问题。
不要图省事把模型放在普通用户home目录下。home目录经常因为用户切换、系统清理被挪动,而且如果服务是用独立用户跑的,home目录不一致会导致模型路径失效。
2.3 物料清单核对:四类文件缺一不可
离线部署最怕的是装到一半发现少个包。建议动手前先按这个表格核对一遍:
| 物料 | 文件名/内容 | 用途 | 是否必需 |
|---|---|---|---|
| ollama服务端 | ollama-linux-arm64.tgz(0.5.7) | 提供大模型推理服务 | 必需 |
| chatbox客户端 | arm64版本AppImage | 图形化对话界面 | 必需 |
| zlib1g-dev | arm64的deb包 | AppImage运行依赖 | 按需,报错才装 |
| deepseek模型 | deepseek-r1:14b,约9.0GB | 离线推理模型 | 必需 |
注意最后一项模型文件不是去某个网站直接下载的。它需要在一台同架构、能联网的Linux机器上,通过ollama pull拉取,再提取出GGUF文件后拷贝进离线机。这个流程会在第4章完整展开。
3. 安装ollama服务:从tar解压到systemd托管,关键参数逐个过
ollama在这套方案里承担着模型推理服务的角色,相当于一个本地大模型HTTP服务。安装本身不复杂,真正容易出错的是用户权限、服务文件和环境变量三件事。这一章把每一步拆开讲清楚。
3.1 解压ollama到指定目录:tar的-C参数与文件归属
cd /opt/deepseek sudo tar -C /opt/deepseek/ollama -xzf ollama-linux-arm64.tgz ls -l /opt/deepseek/ollama/bintar的-C参数是先在命令行里切换到目标目录再解压,这样ollama的bin目录会直接落在/opt/deepseek/ollama/bin下。解压完成后看一眼bin目录,确认ollama可执行文件真实存在,权限是-rwxr-xr-x这类。这一步如果发现文件缺失,八成是安装包下载不完整,需要重新拷贝。
3.2 创建ollama最小权限用户:为什么要用专用账户
sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama sudo usermod -a -G ollama $(whoami)-r表示创建系统账户,-s /bin/false禁止该用户登录shell,-U同时创建同名用户组,-m -d指定home目录。这样即使服务被入侵,攻击者也拿不到交互shell。第二行命令把你当前用户加入ollama组,目的是方便调试时直接读取模型目录文件,不需要切root。如果是在生产环境,第二行可以省略。
为什么不用root直接跑?root跑ollama会带来两个实际麻烦:模型目录和日志文件权限会归属到root,后续普通用户想查看备份需要sudo;一旦服务有远程漏洞,攻击者直接拿root权限。用专用账户跑服务属于最基本的加固习惯。
3.3 编写ollama.service文件:systemd托管的核心配置
[Unit] Description=Ollama Service After=network-online.target [Service] ExecStart=/opt/deepseek/ollama/bin/ollama serve User=ollama Group=ollama Restart=always RestartSec=3 EnvironmentFile=/opt/deepseek/ollama/ollama.conf [Install] WantedBy=default.target保存路径是/etc/systemd/system/ollama.service。ExecStart指定服务启动命令,ollama serve是ollama的服务模式子命令。Restart=always让服务崩溃后自动拉起,配合RestartSec=3避免频繁重启。EnvironmentFile指向环境变量文件,这是ollama能找到模型目录和正确监听地址的关键。After=network-online.target保证网络就绪后再启动,防止网卡慢导致绑定端口失败。
3.4 配置ollama.conf:四个环境变量必须理解到位
OLLAMA_HOME=/opt/deepseek/ollama OLLAMA_MODELS="/opt/deepseek/ollama/models" OLLAMA_HOST="0.0.0.0" OLLAMA_ORIGINS="*" PATH=$OLLAMA_HOME/bin:$PATH保存路径是/opt/deepseek/ollama/ollama.conf。这里每个变量都有明确职责:
| 变量 | 值 | 作用 |
|---|---|---|
| OLLAMA_HOME | /opt/deepseek/ollama | ollama工作目录,日志和临时文件会放这里 |
| OLLAMA_MODELS | /opt/deepseek/ollama/models | 模型文件实际存放位置 |
| OLLAMA_HOST | 0.0.0.0 | 监听所有网卡,允许局域网其他机器访问 |
| OLLAMA_ORIGINS | * | 允许任意来源的网页或客户端调用API |
| PATH | $OLLAMA_HOME/bin:$PATH | 让终端直接识别ollama命令,不用写全路径 |
OLLAMA_MODELS是这里最容易忽略的。如果不指定,模型会默认写到~/.ollama/models,服务用ollama用户跑,路径就会落在/usr/share/ollama/.ollama/models,跟你的规划目录完全对不上。OLLAMA_HOST默认是127.0.0.1,只允许本机访问,要远程连接就必须改成0.0.0.0。
3.5 授权、启动与开机自启:systemctl三条命令的顺序
sudo chown -R ollama:ollama /opt/deepseek/ollama sudo systemctl daemon-reload sudo systemctl enable ollama sudo systemctl start ollama sudo systemctl status ollamachown把整个目录授权给ollama用户,这一步不做,服务启动后写不了模型目录会直接报错。daemon-reload是必须的,新建或修改service文件后不重载,systemd用的还是旧配置。顺序上先enable再start,这样重启系统后服务会自动拉起。status命令看到Active: active (running)就说明服务已经起来了,再往下能看到Listening相关的日志。
4. 离线导入模型并接通chatbox:GGUF提取、modelfile重建与远程访问
这一章是整个部署的核心。ollama服务本身只是一个空壳,没有模型它就是空转。而离线环境拿不到模型,必须在联网机器上“制造”出模型文件再搬进来。这一步有明确的套路。
4.1 在同架构联网机上下载模型:架构一致性不能妥协
ollama pull deepseek-r1:14b ollama list这条命令必须在与离线机同架构的Linux机器上执行。ARM64的离线机,联网机也必须是ARM64。为什么这么严格?因为ollama在拉取模型时,会按当前平台选择对应的算子实现,x86机器拉下来的模型分片在ARM平台上推理时可能遇到不兼容的指令。这是ollama的机制决定的,不是模型文件名能看出来的。
ollama list确认模型拉取成功,deepseek-r1:14b的大小应该在9.0GB左右。如果列表为空或者大小明显偏小,说明拉取过程被中断过,重新pull一次。
4.2 提取modelfile并定位GGUF文件:ollama show是关键一步
ollama show --modelfile deepseek-r1:14b > modelfile.txt head -10 modelfile.txtollama show --modelfile把模型的完整描述文件导出到modelfile.txt。这个文件里记录了三样关键信息:FROM后面的GGUF文件路径、模型的对话模板TEMPLATE、采样参数如temperature和top_p。其中FROM行大约在文件的第5行,指向的是ollama缓存目录里的GGUF文件。
把FROM指向的那个文件完整复制出来,重命名为deepseek-r1-14b.gguf。连同整个modelfile.txt一起准备拷贝。这里有个细节:modelfile里除了FROM行之外的TEMPLATE和PARAMETER内容,决定了导入后模型的行为风格,一行都不能丢。
cp /path/to/original.gguf deepseek-r1-14b.gguf这样联网机上需要准备的东西就齐了:一个modelfile.txt,一个deepseek-r1-14b.gguf。两个文件通过U盘或内网传输到离线机,放到同一个目录下,比如/opt/deepseek。
4.3 离线机导入模型:ollama create的完整日志解读
cd /opt/deepseek ollama create deepseek-r1:14b -f modelfile.txt-f参数指定modelfile路径,ollama会读取文件里的内容重建模型。导入成功后会看到一串日志,含义分别是:
gathering model components:读取modelfile,收集模型组件copying file sha256:6e9f...:把GGUF文件复制进模型层parsing GGUF:解析并校验GGUF格式,损坏的文件会在这步报错creating new layer sha256:...:为TEMPLATE、PARAMETER等元数据创建独立层writing manifest success:写入模型清单,导入完成
导入完成后模型文件由ollama自己管理,路径在/opt/deepseek/ollama/models下。不要手动去拷模型进models目录,那样ollama识别不到,必须走ollama create。
4.4 验证模型运行:ollama list与ollama run的交互测试
ollama list ollama run deepseek-r1:14bollama list显示已导入的模型列表,能看到deepseek-r1:14b和ID、大小、修改时间。ollama run进入交互式对话框,第一次运行会把模型载入内存,CPU机器上可能要等几十秒,这是正常的。输入一句测试问题,能正常返回内容就说明推理链路通了。退出交互模式输入/bye即可。
这一步是大模型的“点火测试”,我一般会故意输入几个不同类型的问题,确认不是只会复读模板。另外可以开一个新终端跑ollama ps,确认模型已常驻内存。
4.5 配置deepseek.service:开机后自动预加载模型
[Unit] Description=DeepSeek Service After=ollama.service [Service] ExecStart=/opt/deepseek/ollama/bin/ollama run deepseek-r1:14b ExecStop=/opt/deepseek/ollama/bin/ollama stop deepseek-r1:14b User=ollama Group=ollama Restart=always RestartSec=3 EnvironmentFile=/opt/deepseek/ollama/ollama.conf [Install] WantedBy=default.target保存为/etc/systemd/system/deepseek.service。这个服务的核心价值是开机后自动把模型预加载进内存,避免第一次对话等十几秒的冷启动。ExecStart用的是ollama run,让进程保持在前台运行;ExecStop用ollama stop优雅退出,释放显存和内存。After=ollama.service确保先启动ollama再加载模型。
sudo systemctl daemon-reload sudo systemctl enable deepseek这里注意deepseek服务不需要手动start,直接enable后随系统启动就好。手动start会阻塞在交互模式里,终端不太好退出。
4.6 安装chatbox并配置远程访问:让模型有“脸”可用
chatbox是AppImage格式,拷到/opt/deepseek目录后先加执行权限:
chmod +x /opt/deepseek/Chatbox-1.9.8-arm64.AppImage ./Chatbox-1.9.8-arm64.AppImage如果双击或命令行执行报错,提示缺少库,多半是zlib依赖问题,先安装指定的deb包:
sudo dpkg -i zlib1g-dev_1%3a1.2.11.dfsg-2kylin1.5k0.2_arm64.deb为了美观和方便,可以在桌面创建快捷方式:
[Desktop Entry] Version=1.0 Name=Chatbox Comment=DeepSeek Chat Client Exec=/opt/deepseek/Chatbox-1.9.8-arm64.AppImage Icon=/opt/deepseek/Chatbox.png Terminal=false Type=Application Categories=Utility;Application;保存为Chatbox.desktop后执行chmod +x Chatbox.desktop,双击即可打开。注意Exec必须是AppImage的绝对路径,Icon指向的png文件必须真实存在。
打开chatbox后,在设置里选择Ollama API类型,API域名填http://127.0.0.1:11434,模型名填deepseek-r1:14b。新建对话就能直接使用。远程访问时,把API域名里的IP换成离线机的主机IP即可,前提是OLLAMA_HOST已经改为0.0.0.0。
5. 避坑排查:离线部署最容易翻车的五个位置
这一章集中写我在复现这套部署过程时遇到的典型问题,每一条都是“现象-原因-解决”的结构,可以在排错时对照查看。
5.1 systemctl status显示failed:ExecStart路径写错的排查套路
现象:执行systemctl status ollama,服务状态是failed,日志里提示Failed at step EXEC spawning /opt/deepseek/ollama/bin/ollama: No such file or directory。
原因:service文件里的ExecStart路径与实际安装路径不一致。常见是把/opt/deepseek/ollama/bin/ollama写成了/opt/deepseek/ollama/ollama,或者多写了一个斜杠。
解决:先跑systemctl cat ollama看实际生效的配置,再直接到路径下手动执行/opt/deepseek/ollama/bin/ollama serve。手动执行能跑通,说明问题只出在路径或环境变量;手动执行也报错,说明安装包解压不完整,重新解压。
5.2 sudo source /etc/profile报错:环境变量不是这样刷新的
现象:执行sudo source /etc/profile,终端报sudo: source: command not found。
原因:source是shell内建命令,不是可执行文件,sudo无法直接调用它。这个操作原本想刷新环境变量,但方法用错了。
解决:退出当前终端重新登录,或者执行source /etc/profile(不需要sudo)。刷新后验证一下:which ollama能输出/opt/deepseek/ollama/bin/ollama就说明PATH生效了。如果不想全局生效,也可以只在当前终端的.bashrc里加一行export PATH=/opt/deepseek/ollama/bin:$PATH。
5.3 ollama create找不到FROM指向的文件:modelfile里的路径是死的
现象:在离线机上执行ollama create deepseek-r1:14b -f modelfile.txt,报错提示FROM指定的文件不存在。
原因:modelfile.txt是在联网机上生成的,里面的FROM行写的是联网机上的绝对路径,比如/home/user/.ollama/models/blobs/sha256-xxx。拷贝到离线机后这个路径当然不存在。
解决:把modelfile.txt和deepseek-r1-14b.gguf放在同一个目录,然后把modelfile.txt里FROM那一行改成相对路径:
FROM ./deepseek-r1-14b.gguf改完再执行ollama create,就能正常读取同目录下的GGUF文件。这个坑非常隐蔽,我第一次离线导入时卡了半小时才反应过来。
5.4 双击AppImage没反应:执行权限和依赖一起查
现象:chatbox的AppImage文件双击后没反应,或者图标一闪而过。
原因:两类可能性。一是文件没有执行权限,AppImage格式要求chmod +x后才能运行;二是系统缺少依赖库,麒麟系统里最常见的是zlib1g-dev缺失。
解决:先在终端运行./Chatbox-1.9.8-arm64.AppImage,看控制台输出什么。如果是Permission denied就补执行权限;如果是error while loading shared libraries就安装对应的deb包。装完依赖再双击新建的.desktop图标即可。
5.5 局域网客户端连不上模型:改完OLLAMA_HOST必须重启服务
现象:远程主机上的chatbox配置了http://192.168.x.x:11434,一直提示连接失败,但本机访问127.0.0.1:11434正常。
原因:两个高概率原因。一是env文件里的OLLAMA_HOST改成了0.0.0.0,但改完后没有重启ollama服务,服务还在用旧的127.0.0.1监听;二是系统防火墙放行了80端口但没放行11434端口。
解决:先跑systemctl restart ollama,再用ss -lntp | grep 11434确认监听地址是0.0.0.0:11434。然后从远程机器测试:
curl http://离线机IP:11434/api/tags能返回JSON格式的模型列表,说明网络链路通了。如果curl超时,检查防火墙规则,放行TCP 11434端口。
6. 上线前的验证闭环:每次部署完我都会跑一遍的检查清单
部署到这里整个链路已经完整,但“装完”不等于“能用”。我每次在离线机上部署完这套环境,都会强制自己走一遍验证闭环,五分钟确认所有环节都是通的,而不是等到业务方来问的时候才发现某个服务已经悄悄挂了。
6.1 本地服务验证
systemctl status ollama --no-pager | head -5 systemctl status deepseek --no-pager | head -5 curl -s http://127.0.0.1:11434/api/tags ollama ps前面两条命令确认ollama服务和模型预加载服务都在运行状态。第三条curl命令直接请求API,返回的JSON里应该能看到deepseek-r1:14b的模型信息,这比任何状态输出都真实。ollama ps能确认模型已经常驻内存,如果这里什么都没有,说明deepseek服务没把模型拉起来。
6.2 远程访问验证
从另一台同网段机器执行:
curl -s http://离线机IP:11434/api/tags这一步验证的是OLLAMA_HOST配置和防火墙放行是否同时生效。能返回模型列表,远程chatbox才有意义。
6.3 日常使用习惯
模型要换版本时,先ollama stop再ollama run切换;日志排查用journalctl -u ollama -f实时跟踪;模型备份直接打包/opt/deepseek/ollama/models目录,恢复时解包后重新执行一次ollama create即可。这套习惯不需要额外工具,但能避免很多事后补救的手忙脚乱。
从那以后我每次部署完离线环境,都强制自己跑一遍上面的验证闭环,确认API有响应、模型已驻留、远程能访问,才敢对外说“部署完成”。希望帮到你。
本文还有配套的精品资源,点击获取