简介:这份文档面向需要在银河麒麟V10操作系统上离线部署大语言模型的技术人员,尤其适合网络受限、无法直接访问外网下载模型的场景。内容围绕ollama服务安装、deepseek-r1模型离线导入、chatbox客户端配置及远程访问展开,覆盖从系统环境准备到服务开机自启的完整链路。资源包为1个docx文件,大小约2.69MB,以图文与命令行示例结合的方式呈现,便于对照操作。文档中给出了具体的安装路径、环境变量配置、systemd服务单元写法以及模型文件转换与导入方法,还说明了chatbox桌面快捷方式的创建与交互配置,并简要提及远程连接deepseek的方式。对于使用飞腾FT-2000等ARM架构设备且无独立显卡的用户,文中也提供了可参考的部署思路。目前已有5531人学习,适合希望掌握离线AI模型部署与客户端联调的技术人员参考。
1. 银河麒麟V10离线部署DeepSeek:从零跑通ollama与Chatbox
手里有一台飞腾FT-2000的麒麟V10机器,没显卡、没外网,却要跑一个14B参数的大语言模型——这事听起来像给自己找麻烦,但确实有不少场景必须这么干。比如某实验室的内网推理节点、某公司的涉密文档问答终端,机器就在那儿摆着,网络不通,数据不能出本地,唯一能用的就是离线包。这份资源给的就是一条完整路径:在Kylin-Desktop-V10-SP1 arm64上,用ollama 0.5.7做模型服务,把deepseek-r1:14b蒸馏模型导进去,再配一个Chatbox客户端当交互界面。全程不需要显卡,CPU推理虽然慢,但能跑通、能对话、能远程调用。适合谁?适合手里有麒麟机器、需要在内网搭一个可用AI问答入口的运维或开发人员。下面按实际拆包顺序走一遍。
2. 环境准备与ollama离线安装:arm64包解压与用户权限
2.1 确认系统架构与依赖完整性
麒麟V10 SP1的arm64版本在飞腾FT-2000上跑,第一步不是急着解压,而是确认几个基础条件。打开终端执行uname -m,输出aarch64才说明架构匹配,如果显示x86_64那后面所有arm64包都白搭。接着检查glibc版本,ldd --version看第一行,ollama 0.5.7的二进制依赖glibc 2.28以上,麒麟V10一般自带2.31,问题不大。但有一个容易翻车的点:AppImage格式的Chatbox需要FUSE支持,而部分麒麟精简版默认没装libfuse2,这个后面装Chatbox时会单独处理。
另一个前置条件是root权限。ollama要注册成系统服务,安装目录又放在/opt/deepseek/ollama,普通用户没有写权限。我一般直接用sudo -i切到root,或者每条命令前加sudo。但注意,ollama服务本身不建议用root跑,后面会创建一个专用的ollama系统用户来承载服务进程,这是标准做法,既满足权限隔离,又避免服务以root身份暴露在网络上。
下载下来的文件就一个:ollama-linux-arm64.tgz。别小看这个包,它里面包含了bin/ollama主程序、lib/下的动态库,以及一些运行时依赖。解压前先建目录,再解压,顺序不能反。
# 创建安装目录,路径按项目约定放在 /opt/deepseek/ollama sudo mkdir -p /opt/deepseek/ollama # 解压ollama离线包到指定目录 # -C 指定解压目标路径,-xzf 分别表示解压、gzip格式、指定文件 sudo tar -C /opt/deepseek/ollama -xzf ollama-linux-arm64.tgz # 验证解压结果,应该能看到bin/ollama可执行文件 ls -lh /opt/deepseek/ollama/bin/ollama解压完成后,/opt/deepseek/ollama/bin/ollama就是主程序。这里有个细节:tar包解压后不会自动设置可执行权限,如果ls -l看到权限是-rw-r--r--,需要手动chmod +x。不过官方包一般已经带执行权限,检查一下就行。
2.2 创建专用用户与systemd服务注册
ollama官方推荐用独立用户跑服务,原因很简单:模型文件动辄几个GB,服务进程需要读写模型目录,用root跑一旦出问题影响面太大。创建一个不能登录的系统用户:
# -r 表示系统用户,-s /bin/false 禁止登录shell # -U 创建同名用户组,-m 创建家目录,-d 指定家目录路径 sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama # 把当前用户加入ollama组,方便后续操作模型文件 sudo usermod -a -G ollama $(whoami)接下来写systemd服务单元。这个文件决定了ollama怎么启动、用什么用户、读哪个环境变量文件。路径固定在/etc/systemd/system/ollama.service:
[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逐行说一下关键参数。ExecStart指向解压出来的ollama二进制,serve是启动服务模式的子命令。User和Group都设为ollama,这样服务进程以ollama身份运行,对/opt/deepseek/ollama目录有读写权。Restart=always配合RestartSec=3表示进程意外退出后3秒自动重启,这对长时间运行的模型服务很重要——CPU推理偶尔会因为内存压力被OOM killer干掉,自动拉起能省不少人工。EnvironmentFile指向独立的环境变量文件,这样改配置不用动service文件,维护起来干净。
环境变量文件/opt/deepseek/ollama/ollama.conf内容如下:
# ollama安装根目录 OLLAMA_HOME=/opt/deepseek/ollama # 模型文件存放路径,离线导入的gguf文件最终会落在这里 OLLAMA_MODELS="/opt/deepseek/ollama/models" # 监听所有网卡,允许远程主机访问API OLLAMA_HOST="0.0.0.0" # 允许跨域来源,Chatbox通过HTTP调用时需要 OLLAMA_ORIGINS="*" # 把ollama的bin目录加入PATH,方便命令行直接调用 PATH=$OLLAMA_HOME/bin:$PATHOLLAMA_MODELS是重点,默认模型存在/usr/share/ollama/.ollama/models,但项目要求统一放在/opt/deepseek/ollama/models,所以必须显式指定。OLLAMA_HOST设为0.0.0.0意味着监听所有网络接口,默认只监听127.0.0.1,不改的话远程Chatbox连不上。OLLAMA_ORIGINS="*"是给浏览器端跨域用的,Chatbox桌面版其实走的是本地HTTP请求,但加上没坏处。
权限和自启配置:
# 把整个ollama目录的属主改为ollama用户 sudo chown -R ollama:ollama /opt/deepseek/ollama # 重新加载systemd配置,让新service文件生效 sudo systemctl daemon-reload # 设置开机自启 sudo systemctl enable ollama # 立即启动服务 sudo systemctl start ollama # 查看运行状态,确认Active是running sudo systemctl status ollama状态输出里看到Active: active (running)就说明服务起来了。日志里会打印GIN路由注册信息,那是ollama内置的HTTP框架在注册API端点,属于正常输出。如果状态是failed,用journalctl -u ollama -n 50看最近50行日志,常见原因是ExecStart路径写错或者ollama.conf里有语法错误。
最后把ollama加入全局PATH,这样终端里直接敲ollama就能用:
# 追加到/etc/profile,对所有用户生效 echo 'export PATH=/opt/deepseek/ollama/bin:$PATH' | sudo tee -a /etc/profile # 当前会话立即生效 source /etc/profile到这里ollama服务本身已经跑起来了,但还没有模型。下一步处理离线模型导入。
3. 离线导入deepseek-r1:14b:从联网机拉取到内网create
3.1 在联网机器上导出GGUF模型文件
内网机器没有外网,没法直接ollama pull。标准做法是找一台同架构(arm64)的联网机器,先装ollama,把模型拉下来,再从ollama的模型仓库里把GGUF文件抠出来。为什么强调同架构?因为ollama的模型层是按平台分发的,arm64和x86_64拉到的blob可能不同,跨架构拷贝会出问题。
在联网机器上执行:
# 拉取deepseek-r1的14b蒸馏模型 # 14b表示140亿参数,蒸馏版基于Qwen架构,CPU推理相对友好 ollama pull deepseek-r1:14b # 查看模型的modelfile,确认FROM行指向的GGUF文件路径 ollama show --modelfile deepseek-r1:14bollama show --modelfile的输出里有一行FROM /path/to/blob,这个路径指向的就是实际的GGUF模型文件。把整段输出保存为modelfile.txt,然后把那个blob文件复制出来,重命名为deepseek-r1-14b.gguf。注意,modelfile.txt里的FROM行需要改成新文件名,否则导入时找不到文件。
# 假设blob路径是 /usr/share/ollama/.ollama/models/blobs/sha256-xxxx # 复制并重命名 cp /usr/share/ollama/.ollama/models/blobs/sha256-xxxx ./deepseek-r1-14b.gguf # 编辑modelfile.txt,把FROM行改为: # FROM ./deepseek-r1-14b.gguf这个GGUF文件大概9GB左右,拷贝到内网机器时建议用移动硬盘或者内网文件共享,别用分卷压缩再合并,容易出校验错误。
3.2 在内网机器上执行ollama create导入
把deepseek-r1-14b.gguf和modelfile.txt放到内网机器的同一个目录下,比如/opt/deepseek/。然后执行导入:
# 切换到模型文件所在目录 cd /opt/deepseek # 使用modelfile创建模型,-f 指定modelfile路径 ollama create deepseek-r1:14b -f modelfile.txt导入过程会输出一系列copying file、parsing GGUF、creating new layer的信息。这里有个坑:ollama create 会把GGUF文件复制到OLLAMA_MODELS指定的目录下,所以确保/opt/deepseek/ollama/models有足够空间,至少留出模型体积两倍的余量。导入完成后用ollama list查看:
ollama list # 输出示例: # NAME ID SIZE MODIFIED # deepseek-r1:14b 2d1a5972ac3a 9.0 GB 2 minutes ago看到模型出现在列表里,就可以直接运行:
ollama run deepseek-r1:14b # 进入交互模式,输入问题测试 >>> 你好,请介绍一下你自己CPU推理14B模型的速度取决于核心数和内存带宽。FT-2000一般是8核或16核,14B Q4量化模型大概能跑到每秒3到8个token,对话能感觉到延迟但可用。如果内存不足16GB,建议换7B或更小的模型,否则加载阶段就会失败。
3.3 配置模型开机自启的systemd服务
ollama服务本身开机自启了,但模型不会自动加载到内存。如果希望开机后模型就处于可调用状态,需要再加一个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,然后daemon-reload、enable、start三连。注意After=ollama.service确保ollama先启动,否则ollama run会找不到服务端。这个service的ExecStart会保持前台运行,模型常驻内存,第一次调用时不需要再加载,响应更快。
4. Chatbox客户端部署:AppImage打包与桌面图标配置
4.1 AppImage运行依赖与zlib1g-dev补装
Chatbox在Linux arm64上提供的是AppImage格式,单文件、免安装,双击就能跑。但麒麟V10默认可能缺zlib1g-dev,导致AppImage解压运行时库时报错。先装依赖:
# 安装zlib开发包,AppImage运行时需要 sudo dpkg -i zlib1g-dev_1%3a1.2.11.dfsg-2kylin1.5k0.2_arm64.deb如果提示依赖不满足,用sudo apt-get install -f自动修复。装完后把Chatbox的AppImage放到/opt/deepseek/下,赋予执行权限:
chmod +x /opt/deepseek/Chatbox-1.9.8-arm64.AppImage直接命令行运行./Chatbox-1.9.8-arm64.AppImage测试能否启动。如果报FUSE相关错误,说明系统没装libfuse2,用sudo apt-get install libfuse2补上。AppImage的本质是把应用和依赖打包成一个可执行文件,运行时通过FUSE挂载内部文件系统,所以FUSE是硬依赖。
4.2 制作桌面图标与快捷启动
命令行能跑之后,做一个桌面图标方便双击启动。在桌面新建Chatbox.desktop:
[Desktop Entry] Version=1.0 Name=Chatbox Comment=AI Chat Client Exec=/opt/deepseek/Chatbox-1.9.8-arm64.AppImage Icon=/opt/deepseek/Chatbox.png Terminal=false Type=Application Categories=Utility;Application;Exec指向AppImage完整路径,Icon指向一张PNG图标,没有的话可以从AppImage里提取或者随便找一张。保存后赋权:
chmod +x Chatbox.desktop双击图标就能启动。如果双击没反应,检查两点:一是Exec路径是否绝对路径且文件有执行权限,二是.desktop文件本身是否有执行权限。麒麟的桌面环境对desktop文件权限比较敏感,缺一个都点不开。
4.3 Chatbox连接ollama的API配置
打开Chatbox后,点设置,模型提供方选Ollama API。关键配置项:
| 配置项 | 值 | 说明 |
|---|---|---|
| API域名 | http://127.0.0.1:11434 | 本机ollama默认端口 |
| 模型名称 | deepseek-r1:14b | 必须与ollama list中的名称一致 |
| 上下文长度 | 4096 | 根据内存调整,14B模型建议不低于2048 |
如果Chatbox装在其他机器上,API域名改成ollama所在主机的IP,比如http://192.168.1.100:11434。前提是ollama.conf里OLLAMA_HOST已经设为0.0.0.0,并且防火墙放行了11434端口。麒麟V10默认的firewalld可能没开,用sudo firewall-cmd --add-port=11434/tcp --permanent加一下,然后reload。
配置保存后新建对话,输入问题,如果能看到流式输出就说明整条链路通了。第一次请求会触发模型加载,等待时间较长,之后就会快很多。
5. 避坑排查:离线部署中最容易翻车的五个点
5.1 ollama服务启动失败,日志报permission denied
现象:systemctl status ollama显示failed,journalctl里看到permission denied打开某个目录或文件。
原因:/opt/deepseek/ollama目录属主是root,而service以ollama用户运行,没有写权限。尤其是OLLAMA_MODELS指向的models目录,如果没提前创建并赋权,ollama启动时会尝试创建但失败。
解决:sudo chown -R ollama:ollama /opt/deepseek/ollama,确保整个目录树属主正确。如果models目录是单独挂载的,也要单独赋权。
5.2 ollama create导入模型时报错“file not found”
现象:执行ollama create deepseek-r1:14b -f modelfile.txt后提示找不到GGUF文件。
原因:modelfile.txt里的FROM行写的是相对路径,而执行create时的当前工作目录与modelfile所在目录不一致。ollama解析FROM时以modelfile文件所在目录为基准,但有些人会把modelfile复制到别处执行。
解决:要么在modelfile所在目录执行create,要么FROM行写绝对路径。我一般直接写绝对路径,省得搞混。
5.3 Chatbox连接ollama超时,但本机curl能通
现象:本机curl http://127.0.0.1:11434/api/tags有返回,但Chatbox填了本机IP后连接超时。
原因:ollama默认只监听127.0.0.1,即使OLLAMA_HOST设了0.0.0.0,如果ollama.conf文件没被正确加载(比如service里EnvironmentFile路径写错),实际还是默认监听。
解决:sudo systemctl show ollama | grep EnvironmentFile确认加载的文件路径,然后ss -tlnp | grep 11434看监听地址是127.0.0.1还是0.0.0.0。如果是前者,检查ollama.conf语法,等号两边不要有空格,值不要加引号(除非值本身含空格)。
5.4 模型加载到一半被killed,dmesg看到OOM
现象:ollama run deepseek-r1:14b运行几秒后进程消失,dmesg | tail显示Out of memory killer。
原因:14B模型Q4量化后约9GB,加载时需要额外内存做推理缓存,总需求可能到12-14GB。如果机器只有16GB且其他服务占用较多,就会触发OOM。
解决:换更小的模型如deepseek-r1:7b,或者在ollama.conf里加OLLAMA_NUM_PARALLEL=1限制并发,减少内存占用。也可以设置OLLAMA_MAX_LOADED_MODELS=1确保只加载一个模型。
5.5 AppImage双击无反应,命令行运行报FUSE错误
现象:桌面图标双击没动静,终端里执行AppImage提示dlopen(): error loading libfuse.so.2。
原因:系统缺少FUSE 2库,AppImage依赖它来挂载内部文件系统。
解决:sudo apt-get install libfuse2。如果源里没有,找对应的deb包离线安装。麒麟V10的软件源里一般有,但内网环境需要提前把deb包也下载好带进去。
6. 远程调用与性能调优:让14B模型在CPU上跑得更稳
远程连接这块,核心就一句话:在远程主机装Chatbox,API域名填ollama主机的IP。但实际用起来有几个细节值得说。第一,ollama的API默认没有认证,任何能访问11434端口的人都能调用模型。内网环境问题不大,但如果网段里有不受控的设备,建议用防火墙限制来源IP,比如firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="11434" protocol="tcp" accept'。第二,远程调用时模型加载仍在服务端,客户端只负责收发文本,所以远程机器的配置无所谓,关键是服务端内存要够。
性能调优方面,CPU推理的瓶颈通常在内存带宽和核心数。ollama会自动检测CPU核心并设置线程数,但有时候默认值不是最优。可以通过环境变量OLLAMA_NUM_THREADS手动指定,比如16核机器设为12或14,留几个核心给系统。设太高反而会因为上下文切换导致性能下降。我一般会跑一个简单的基准:ollama run deepseek-r1:14b --verbose看eval rate,然后逐步调整线程数,找到峰值。
另一个实用技巧是控制上下文长度。Chatbox里默认可能给到4096甚至8192,但CPU推理时上下文越长,内存占用和计算量越大。如果只是日常问答,2048足够。在Chatbox设置里把上下文长度调到2048,响应速度会有明显提升。
最后说一个验证方法:用curl直接调ollama的API,排除Chatbox的干扰。比如:
curl http://127.0.0.1:11434/api/generate -d '{ "model": "deepseek-r1:14b", "prompt": "用一句话解释什么是操作系统", "stream": false }'如果这个命令能返回JSON结果,说明ollama服务本身没问题,问题就在Chatbox配置上。反过来,如果curl都不通,那就别折腾客户端了,先查服务端。
从那以后我每次离线部署模型,都会先用curl把API跑通,再配客户端。这个习惯帮我省了很多来回排查的时间。希望帮到你。
本文还有配套的精品资源,点击获取