首页 / 资讯中心 / 文章详情

银河麒麟离线安装QGis:依赖闭环与批量部署实战

银河麒麟离线安装QGis:依赖闭环与批量部署实战 ★ FEATURED ARTICLE
简介本资源面向在银河麒麟操作系统上需要离线部署QGIS的用户尤其是使用国产CPU架构、内网环境或无法联网的科研与生产场景。QGIS作为开源地理信息系统常用于地理数据采集、管理、分析与展示而银河麒麟基于Linux内核软件安装与常见发行版存在差异离线安装需提前准备完整依赖。资源包共95个文件以89个deb安装包为主另含sh安装脚本、txt说明、sig校验文件、log日志与gz压缩包整体约358.59MB覆盖QGIS主程序、GDAL、Python3相关库及Qt组件等依赖便于一次性完成环境搭建。已有1242人学习下载。通过该资源读者可获取适配银河麒麟的QGIS离线安装包集合、依赖清单与安装脚本减少逐个解决依赖的繁琐过程并借助校验文件与日志排查安装问题为地理信息处理、环境监测、城市规划等工作提供可复用的部署基础。1. 银河麒麟离线装 QGis内网机器上那套能跑通的依赖闭环一台银河麒麟 V10 SP1 的机器摆在机房里网口是封的软件源指向一个内网地址apt update转两圈就超时。需求很朴素把 QGis 装上能打开 shp、能加载天地图影像、能给图层做投影转换。听起来是双击安装包的事实际动手才发现 QGis 在 Linux 上从来不是一个孤立的.deb它背后拖着 GDAL、PROJ、GEOS、Qt5、QScintilla、Python3-qgis 一大串东西缺一个就起不来或者起来了但一加载数据就崩。这篇讲的就是在这种断网或半断网环境下怎么把 QGis 的依赖闭环在银河麒麟上补齐。适合两类人一类是内网 GIS 岗机器不能连外网但必须出图另一类是信创环境适配的工程师被要求把 QGis 跑在麒麟上做验证。核心思路不是「找一个万能离线包」而是「在一台能联网的同版本麒麟上把依赖抓全再搬到目标机按顺序装」。下面从版本对齐讲到依赖抓取、安装顺序、报错排查最后给一个批量部署的脚本习惯。2. 版本对齐银河麒麟 V10 的底子和 QGis 的选型2.1 先确认系统到底是哪个小版本银河麒麟 V10 有 SP1、SP2、SP3还有桌面版和服务器版之分底层虽然都基于 RPM 系或 DEB 系但具体到 SP 版本glibc、Qt、Python 的版本都不一样。QGis 对 glibc 和 Qt 的版本敏感装错一个 SP 的包轻则依赖冲突重则dpkg直接报架构不匹配。先在目标机上把底子摸清楚这几条命令的输出要记下来# 查看系统版本和 SP 号 cat /etc/kylin-release cat /etc/os-release # 查看架构x86_64 还是 aarch64这决定后面抓哪个架构的包 uname -m # 查看 glibc 版本QGis 3.x 一般要求 2.28 以上 ldd --version | head -1 # 查看已装的 Qt5 和 Python3 版本 qmake --version 2/dev/null || echo no qt python3 --version/etc/kylin-release里会写明是 V10 (SP1) 还是 V10 (SP2)这个字符串要和后面抓包的源严格对应。uname -m在信创机器上经常是aarch64也就是 ARM 架构这时候网上大部分 x86_64 的离线包直接用不了必须找 ARM 源或者自己编译这是第一个大坑。2.2 QGis 版本怎么选别追新QGis 的版本策略是 LTR长期支持和最新版两条线。内网离线环境我一般选 LTR比如 3.28 或 3.34 这类原因是 LTR 的依赖相对稳定社区里针对麒麟的适配经验也多。最新版往往依赖更新的 PROJ 和 GDAL在麒麟自带的源里找不到对应版本得连带编译工作量翻倍。选型时看三个东西一是 QGis 官方文档里写的依赖最低版本二是银河麒麟软件源里 GDAL、PROJ、GEOS 的版本三是目标机 Python3 的版本因为python3-qgis这个包对 Python 小版本有要求。如果源里的 GDAL 是 3.0那 QGis 就选依赖 GDAL 3.0 的那一档别硬上要求 GDAL 3.6 的新版。提示银河麒麟的软件源分「桌面版源」和「服务器版源」同一 SP 下这两个源的包版本可能不同。抓依赖前先确认目标机/etc/apt/sources.list或/etc/yum.repos.d/里配的是哪个源抓包机要和它一致。2.3 联网机与目标机必须同源同版本离线安装的本质是「把联网机的下载结果搬到目标机」。如果联网机是 Ubuntu 20.04目标机是银河麒麟 V10 SP1两者的包名和依赖树完全不同搬过去必然失败。所以第一步是找一台和目标机同版本、同架构、能联网的银河麒麟用它作为「抓包机」。如果实在找不到同版本的联网麒麟退而求其次用 Docker 跑一个同版本麒麟的镜像在容器里抓包。但要注意容器里的架构要和目标机一致x86 的容器抓的包在 ARM 机器上装不了。这一步没有捷径版本对齐是后面所有步骤的地基。3. 依赖抓取在联网机上把 QGis 的包链完整拉下来3.1 用 apt 的 download 模式抓全依赖银河麒麟桌面版基于 DEB 系用apt-get install --download-only可以把一个包及其所有依赖下载到本地缓存但不安装。这是抓依赖最省事的办法。# 在联网的银河麒麟上执行先更新源索引 sudo apt-get update # 只下载不安装把 qgis 及其依赖全部拉到 /var/cache/apt/archives sudo apt-get install --download-only -y qgis python3-qgis qgis-plugin-grass # 把下载好的 deb 包集中到一个目录方便打包搬运 mkdir -p /tmp/qgis-offline cp /var/cache/apt/archives/*.deb /tmp/qgis-offline/ # 统计包数量和总大小心里有个数 ls /tmp/qgis-offline/*.deb | wc -l du -sh /tmp/qgis-offline/--download-only是关键参数它让 apt 走完依赖解析但不执行安装。qgis是主程序python3-qgis是 Python 绑定加载天地图、跑处理脚本都要它qgis-plugin-grass是 GRASS 插件如果不用 GRASS 分析可以去掉能少抓一批包。抓完后ls | wc -l通常会显示一两百个 deb这是正常的QGis 的依赖链就是长。如果只有十几个说明源里缺包apt 没解析全得检查源配置。3.2 用 dpkg 的依赖树反查漏网之鱼--download-only有个盲区它只抓「当前源里能解析到的」依赖。如果某个依赖在源里版本不够apt 会跳过或者报错但不会告诉你缺了哪个。这时候用dpkg反查依赖树把缺口找出来。# 查看 qgis 主包的依赖列表 dpkg -I /tmp/qgis-offline/qgis*.deb | grep Depends # 对每个依赖包递归查它的依赖找出没被下载的 for pkg in /tmp/qgis-offline/*.deb; do dpkg -I $pkg | grep -E Depends|Pre-Depends done | tr , \n | grep -oE [a-z0-9][a-z0-9.-] | sort -u /tmp/required.txt # 对比已下载的包名列出缺失的 ls /tmp/qgis-offline/*.deb | xargs -n1 dpkg -I | grep Package: | awk {print $2} | sort -u /tmp/have.txt comm -23 /tmp/required.txt /tmp/have.txtcomm -23输出的是「在 required 里但不在 have 里」的包名这些就是缺口。缺口里的包如果源里没有就得去 QGis 官方仓库或者第三方源单独找找到后同样用--download-only抓下来补进目录。3.3 处理源里没有的包单独下载与版本锁定有些包在银河麒麟自带源里版本偏低比如 PROJ 数据包proj-dataQGis 3.28 要求 PROJ 6 以上但源里可能只有 5.x。这时候有两个选择一是降 QGis 版本去迁就源二是单独下载高版本 PROJ 的 deb 手动装。我一般选前者因为降 QGis 版本比手动编译 PROJ 省事得多而且内网环境最怕引入源外的手工包后面维护的人搞不清依赖关系。如果非要上高版本就把对应 deb 单独下载在安装时用dpkg -i指定顺序先装 PROJ 再装 QGis。# 单独下载指定版本的包不装 apt-get download proj-data6.3.1-1 # 查看下载下来的包信息确认版本和架构 dpkg -I proj-data_6.3.1-1_all.deb | head -20apt-get download和--download-only的区别是前者只下一个包不解析依赖后者解析依赖。补缺口时用apt-get download精确抓单个包避免把已经有的依赖重复下载。3.4 打包搬运目录结构和校验抓齐后把整个目录打包搬运到目标机。打包前做一次完整性校验避免传输过程中损坏。# 生成 md5 校验文件 cd /tmp/qgis-offline md5sum *.deb MD5SUMS # 打包用 tar.gz 比 zip 更保权限 tar -czvf qgis-offline-kylin.tar.gz *.deb MD5SUMS # 目标机上解压后先校验 md5sum -c MD5SUMSmd5sum -c会逐行比对全部 OK 才继续装。这一步看着多余但内网传输经常用 U 盘或跳板机文件损坏的概率不低校验能省掉后面「装到一半报错」的排查时间。4. 目标机安装顺序、命令和依赖冲突处理4.1 安装顺序先底层库再主程序离线装 deb 包最忌讳一把梭dpkg -i *.deb因为 dpkg 不解析依赖顺序先装 QGis 主包会因为缺依赖直接失败。正确做法是按依赖层级分批装或者用apt-get install ./*.deb让 apt 帮你排序。# 方法一用 apt 从本地目录安装apt 会自动排序依赖 cd /tmp/qgis-offline sudo apt-get install -y ./*.deb # 方法二如果 apt 报依赖错误用 dpkg 强制配置再补依赖 sudo dpkg -i *.deb sudo apt-get install -f -y方法一的apt-get install ./*.deb是首选它会把本地 deb 当成源来解析依赖自动按顺序装。方法二是兜底dpkg -i装完后如果有依赖没满足apt-get install -f会尝试修复但在离线环境下-f可能因为找不到源而失败所以方法一更稳。4.2 用 apt 的本地源方式批量装如果目标机上有几十台要装把 deb 目录做成一个本地源更省事。这样每台机器只需要配一次源地址后面用apt install qgis就行。# 在存放 deb 的机器上生成 Packages 索引 cd /tmp/qgis-offline dpkg-scanpackages . /dev/null | gzip -9c Packages.gz # 目标机上配置本地源假设 deb 目录挂在 /mnt/qgis-offline echo deb [trustedyes] file:/mnt/qgis-offline ./ | sudo tee /etc/apt/sources.list.d/qgis-local.list # 更新源并安装 sudo apt-get update sudo apt-get install -y qgis python3-qgisdpkg-scanpackages生成索引[trustedyes]跳过签名校验内网自建源没有 GPG 签名不加这个会报 NO_PUBKEY。file:协议指向本地目录不需要网络。这套做法适合批量部署一次配好后面重复用。4.3 依赖冲突libqt5 和 libgdal 的版本打架麒麟系统里如果之前装过其他 GIS 或 Qt 应用可能已经带了旧版libqt5core5a或libgdal和 QGis 要求的版本冲突。典型报错是dpkg: dependency problems prevent configuration of qgis后面跟着一串but X is to be installed。处理办法是先看冲突的是哪个包用apt-cache policy查可用版本然后决定是升级还是降级。# 查看冲突包的版本情况 apt-cache policy libgdal26 libqt5core5a # 如果本地 deb 里有更高版本强制指定安装 sudo dpkg -i --force-depends libgdal26_3.0.4_arm64.deb sudo apt-get install -f -y--force-depends是危险参数只在确认版本兼容时用强行装完可能让其他依赖旧版的应用崩掉。更稳的做法是先把冲突的旧包卸掉再装 QGis 带的新版但卸之前要确认没有其他关键应用依赖它。4.4 装完验证命令行和图形界面各测一遍装完不能只看dpkg -l | grep qgis有输出就算完要实际跑一下。# 命令行验证查版本和 Python 绑定 qgis --version python3 -c from qgis.core import Qgis; print(Qgis.QGIS_VERSION) # 图形界面验证启动后加载一个 shp 测试 qgisqgis --version能输出说明主程序可执行。python3 -c那条能打印版本说明 Python 绑定装好了后面用 PyQGIS 写脚本处理数据才没问题。图形界面启动后加载一个 shp如果图层能显示、属性表能打开基本就通了。5. 避坑排查离线装 QGis 最常见的五个翻车点5.1 报错cannot open shared object file: libqgis_core.so现象是启动 QGis 时终端报找不到libqgis_core.so或类似.so文件图形界面闪退。原因是主程序装了但核心库没装全或者库文件路径没进ldconfig缓存。解决分两步先确认库文件在不在find / -name libqgis_core.so*在的话执行sudo ldconfig刷新缓存再启动。不在的话说明qgis主包和libqgis库包版本不匹配回抓包机重新抓同版本的库包补装。5.2 报错NO_PUBKEY导致本地源不可用用本地源方式装时apt-get update报NO_PUBKEY源被跳过。原因是自建源没有 GPG 签名apt 默认不信任。解决是在源配置里加[trustedyes]或者导入签名公钥。内网环境直接用[trustedyes]最省事格式是deb [trustedyes] file:/mnt/qgis-offline ./。注意trustedyes和file:之间要有空格写错了 apt 解析不了。5.3 ARM 机器上装了 x86 的包现象是dpkg -i报package architecture (amd64) does not match system (arm64)。原因是抓包机是 x86目标机是 ARM架构不匹配。解决是回到抓包机确认uname -m输出aarch64然后从 ARM 源重新抓。如果 ARM 源里没有 QGis就得考虑用源码编译或者找麒麟官方适配的 ARM 版 QGis 包。这一步没有取巧办法架构错了就是全盘重来。5.4 装完能启动但加载天地图影像白屏现象是 QGis 能打开XYZ Tiles 加了天地图 URL 后图层是白的不显示影像。原因通常是网络不通内网访问不了天地图服务器或者 QGis 的 XYZ 连接没配代理。解决是先在内网机器上用curl测天地图 URL 通不通不通就是网络策略问题得走内网地图服务。通的话检查 QGis 的「设置-选项-网络」里缓存和超时配置把超时调大。天地图影像的 URL 模板要带 keykey 失效也会白屏。5.5 依赖装完但python3-qgis导入报错现象是qgis能跑但python3 -c from qgis.core import Qgis报ModuleNotFoundError。原因是python3-qgis包没装或者装的 Python 版本和 QGis 绑定的不一致。解决是先dpkg -l | grep python3-qgis确认包在不在在的话检查python3 --version和 QGis 要求的版本是否一致。麒麟上可能有多个 Pythonpython3指向的未必是 QGis 绑定的那个用/usr/bin/python3绝对路径试一下。6. 进阶把离线安装做成可复用的批量脚本单台装完不算完内网环境经常是十几台机器要统一装。这时候把前面的步骤串成一个脚本配合本地源能省掉大量重复劳动。我一般会写一个deploy_qgis.sh放在跳板机上通过内网 SSH 批量推。#!/bin/bash # deploy_qgis.sh - 银河麒麟离线批量部署 QGis # 用法在跳板机上执行参数是目标机 IP 列表文件 DEB_DIR/mnt/qgis-offline TARGETS$1 # 1. 在每台目标机上配置本地源 while read -r ip; do ssh root${ip} echo deb [trustedyes] file:${DEB_DIR} ./ /etc/apt/sources.list.d/qgis-local.list ssh root${ip} apt-get update done $TARGETS # 2. 批量安装记录每台的退出码 while read -r ip; do if ssh root${ip} apt-get install -y qgis python3-qgis; then echo ${ip}: OK else echo ${ip}: FAILED /tmp/qgis_deploy_failed.log fi done $TARGETS # 3. 验证 Python 绑定 while read -r ip; do ssh root${ip} python3 -c from qgis.core import Qgis; print(Qgis.QGIS_VERSION) \ echo ${ip}: python bind ok \ || echo ${ip}: python bind fail /tmp/qgis_deploy_failed.log done $TARGETS脚本里三个循环分别做「配源、装包、验证」每步的失败都记到日志方便回头单独处理。DEB_DIR是共享目录可以用 NFS 挂载也可以每台机器本地放一份。验证那步用python3 -c导入 QGis 是最直接的检查比看dpkg -l靠谱因为包在但绑定坏的情况很常见。一个我踩过的坑批量 SSH 时如果目标机的known_hosts没提前加第一次连接会卡在 yes/no 确认上脚本就挂住了。解决办法是在跳板机上先ssh-keyscan把所有目标机的指纹扫进known_hosts或者 SSH 命令加-o StrictHostKeyCheckingno。这个细节不写进脚本批量跑的时候必翻车。另外脚本里没写卸载逻辑。如果某台机器之前装过旧版 QGis直接装新版可能冲突。稳妥做法是在装之前先apt-get remove -y qgis python3-qgis清一遍但清之前要确认没有其他应用依赖这些包。内网环境里卸载比安装更需要谨慎因为一旦卸错恢复起来比装新的还麻烦。这套流程我在几个麒麟内网环境里跑过从抓包到批量部署单台顺利的话半小时内能搞定批量的话主要时间花在传输和 SSH 等待上。真正耗时的不是命令本身是版本对齐和依赖缺口排查这两步做扎实了后面就是流水线。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站