☰
银河麒麟离线安装QGis:依赖树整理与本地源搭建实践
2026/10/14 4:58:20 网站建设 项目流程

简介:银河麒麟系统离线安装QGis的完整资源包,面向需要在无网络环境下部署地理信息系统(GIS)的运维人员与科研用户,尤其适配飞腾等国产CPU架构的使用场景。压缩包共95个文件、约358.59MB,文件类型以89个deb安装包为主,其中涵盖QGis 3.10.4主程序、Python扩展、Qt运行库和GDAL等地理数据处理组件;另有2个安装/配置shell脚本、1个离线依赖包tar.gz、校验签名sig及说明txt,可有效免去逐一下载依赖的繁琐过程。目前已有1249人浏览学习。借助包内脚本与图文说明,使用者可按步骤完成软件包校验、依赖关系处理和安装,并通过内置工具验证数据读取、图层叠加、空间分析等核心功能,为地理信息、环境监测、城市规划等领域提供一个安全可靠的国产化GIS工作平台。

1. 银河麒麟离线装QGis:从三天返工到一次通过

接到在银河麒麟系统上离线装QGis的需求时,我心里是发怵的。QGis不是普通小软件,它带Qt图形界面、Python插件体系,底下还挂着GDAL、GEOS、PROJ这一串地理计算库,在线装都要看版本脸色,何况在完全不连外网的终端上。刚开始我按老思路找现成安装包,结果在libgdal、python3-qgis、qgis-providers之间来回打转,装了三天原地踏步。直到把思路从“找包”换成“把依赖树理顺后塞给apt自己调度”,一个下午就把系统装通了。这篇就是那次踩坑的完整复盘,你可以拿它当一份能直接照着走的作业。

2. 离线安装先搞懂:银河麒麟的仓库机制与QGis的依赖全景

2.1 银河麒麟的包管理生态:Debian系血统决定安装基本盘

银河麒麟虽然看着像个特殊系统,但它的软件管理底层走的是Debian系那套路线。包安装和卸载由dpkg负责,软件以deb文件为基本单位;依赖解析交给apt,安装前自动检查每个包声明的“依赖关系”。所以“离线安装”的实质,就是把apt原本要从网络源获取的deb文件提前准备好放在本地,再把源指向本地目录,让依赖解析和安装照常运转。想通这一点,比到处求一个“万能安装包”有用得多。

动任何命令之前,先别急着拷文件。我第一件事永远是确认系统身份和处理器架构,三个命令一起跑:

cat /etc/os-release uname -m dpkg --print-architecture

第一行看发行版名称和版本标识,确认这台机器确实是银河麒麟 V10 系列;第二行是内核视角的CPU架构,x86_64对应amd64,aarch64对应arm64;第三行是包管理视角的架构代号。后面两个值必须匹配,离线包里选错了架构,apt在安装阶段会直接报“有未满足的依赖关系”。这个检查花不了十秒钟,却是最便宜的后悔药。

理解了包管理体系,接下来要面对QGis这种软件最麻烦的地方:它的依赖不是一个包,而是一棵树。

2.2 QGis的依赖层次:为什么离线包里必须有一整棵树

QGis的依赖可以按四层来看。最底层是Qt基础库,负责界面框架,像QtCore、QtGui、QtWidgets这些;往上是地理数据核心库,GDAL负责各类栅格与矢量格式的读写,GEOS做空间几何计算,PROJ做坐标投影转换,SpatiaLite操作空间数据库;第三层是数据库驱动,比如PostgreSQL的libpq;最上面才是Python运行时和qgis-python绑定,插件系统靠它跑Python脚本。任何一层缺一个包,安装进程都会停下来。

我第一次打包时犯过夜郎自大的错误:只在在线机器上执行了一次apt-get download qgis,拿到本体就以为完事了。结果拿到目标机一装,apt报缺GEOS库;补上下一个缺PROJ;再补一个又缺Qt5里的某个模块,来回折腾。原因就是没递归收集依赖,而QGis依赖树里的很多库还有版本强约束,光看包名不看版本照样翻车。

正确做法是把整个依赖树先拉出来看一眼,在线机器上执行:

apt-cache depends qgis --recurse --no-recommends --no-suggests \ | sort | uniq -c | sort -rn | head -n 30

这条命令把qgis的依赖递归展开,过滤掉推荐和建议包,只保留真正硬性的运行时依赖,然后按被依赖次数排序。你一眼就能看到哪些包被依赖得最密集,打包时心里就有底了。注意,推荐包不收集也没关系,目标机安装时用--no-install-recommends跳过,QGis的主功能和插件照常完整。

还有一类“间接依赖”容易漏掉:依赖包本身还有依赖。比如apt-get download libgdal,但它要求的libnetcdf、libhdf5等并不会跟着下来,必须对整棵依赖树上的每个包逐层展开。所以我后来写打包脚本时坚持用--recurse,只收一层等于没干活。

另外提醒一句,如果在线机器的apt输出是中文环境,apt-cache depends的表头会显示“依赖”而不是“Depends”,后面第3章我会给一个兼容中英文输出的字段提取脚本。这个不起眼的差异,曾让我脚本一次跑完没报错,装上目标机才发现少了两个包。

3. 离线包内部结构:它不是一个deb,而是一个完整本地源

3.1 解压之后你看到的实际上是一个Linux软件仓库

这份离线安装包拿到手,别只盯着其中一个deb文件看。把它整个解压后,用tree命令列一下,你会看到类似这样的结构:

qgis-offline/ ├── debs/ │ ├── amd64/ │ │ ├── qgis_*.deb │ │ ├── python3-qgis_*.deb │ │ ├── qgis-providers_*.deb │ │ └── ... │ └── arm64/ │ └── ... ├── Packages ├── Packages.gz ├── Release └── README.txt

debs目录按架构分成两个子目录,里面是整理好的deb包。文件名里的*不用较真,Debian的命名规则是“包名_版本号_架构.deb”,同一版本的包在不同镜像里可能带不同修订号,不影响安装。

顶层Packages文件是dpkg-scanpackages生成的索引,apt-get update读取的就是它,每个包的包名、版本、依赖关系、文件大小、校验值都记录在里面。Release文件是仓库的“招牌”,记录发布时间和校验信息。README.txt是安装说明,写明适用版本、架构和一些已知问题。汇总成表更清楚:

文件/目录作用
debs/amd64x86_64架构的deb包,对应dpkg --print-architecture输出amd64
debs/arm64aarch64架构的deb包,对应输出arm64
Packages / Packages.gz包索引,apt update的读取对象
Release仓库标签与校验信息
README.txt安装说明、适用版本、注意事项

之所以按这种结构组织,是因为apt不认零散的deb。把一堆deb塞进目录,apt只会当它们不存在;只有生成Packages索引、把目录包装成合法仓库,apt才愿意把它当作软件源来调度。

3.2 按依赖收包:为什么不做整个镜像同步

做离线源还有一种无脑思路:把整个发行版仓库镜像同步下来。这种方法最省心,但代价太大,完整镜像动辄几十GB,对单台终端来说绝大多数包用不上。这份包走的是按依赖收包的路子,只把QGis这棵子树捞出来,体积小、可控、失误排查也简单。

收集依赖的顺序是:在线机器上先递归取出包名清单,逐个下载。下面的脚本是打包时用的核心逻辑,直接基于2.2那条依赖命令:

#!/bin/bash # 收集 qgis 的运行时依赖 deb,全部下载到当前目录 mkdir -p debs/amd64 && cd debs/amd64 PACKAGE_LIST="qgis" ALL_PACKAGES="$(apt-cache depends --recurse --no-recommends --no-suggests \ "$PACKAGE_LIST" \ | grep -v '^ ' \ | awk -F'[ <|]' '{print $2}' \ | sed 's/:any$//;s/:amd64$//;s/:arm64$//' \ | sort -u)" for pkg in $ALL_PACKAGES; do apt-get download "$pkg" 2>/dev/null || echo "skip $pkg" done

逐行解释:grep -v '^ '把apt-cache depends输出的树形缩进行过滤掉,那种行不是真正的包条目;awk -F'[ <|]' '{print $2}'按空格、尖括号和竖线分割,取第二列包名;sed把“python3:any”“libgdal:amd64”这类带架构后缀的包名清理掉;sort -u去重。for循环逐个下载,下载不到的包打印skip而不是中断,方便回头检查是源里没有还是包名解析异常。

下载完成后,在仓库根目录生成索引:

cd /opt/qgis-offline dpkg-scanpackages . /dev/null > Packages gzip -k Packages apt-ftparchive release . > Release

dpkg-scanpackages第一个参数是仓库根目录,第二个/dev/null指定覆盖描述文件;gzip -k保留原始Packages的同时生成Packages.gz,apt会优先读取.gz;apt-ftparchive release生成Release。没有GPG签名对本地源来说不是问题,后面配源时加trusted=yes标记就能跳过签名校验。这一步跑完,整个目录就成为名副其实的本地源,可以拷进U盘带去目标机了。

4. 目标机器上五步完成离线安装:从预检到验证

4.1 环境预检:先核对系统和架构

U盘插到目标机上,别急着拷贝。先确认这台机器的底子和我打包时用的基础环境一致,还是这三条命令,再看结果:

cat /etc/os-release uname -m dpkg --print-architecture

如果uname -m输出aarch64,源里debs/arm64子目录就是给它准备的;如果输出x86_64,走amd64。反过来,ARM机器上想用amd64包是装不上的,不是源的问题,是包根本不匹配。这一步判断错,后面所有步骤都白费。

4.2 拷贝离线包到目标机并备份原始源

拷贝前建议用lsblk -f看一眼U盘文件系统。FAT32格式对单文件大小有限制,超过4GB的文件会拷不进去;如果包里某个deb特别大,就把U盘格式化成ext4或exfat再试。目标位置放在/opt这个系统盘分区,别直接指到/media下的U盘挂载点,原因后面避坑章会讲。

sudo cp -r /media/usb/qgis-offline /opt/ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

第二行备份原始源,是留后悔药。离线环境配坏了,还能把备份恢复回去。我吃过没备份的亏,配完源发现包不完整想退回原状,原文件已经覆盖,只能凭记忆重写,耽误了不少时间。

4.3 用本地源替换默认源并刷新索引

这里直接替换掉/etc/apt/sources.list比追加更省心。很多内网环境默认源地址是走不通的,留着它会导致apt update卡在超时重试。替换命令:

sudo bash -c 'echo "deb [trusted=yes] file:///opt/qgis-offline ./" > /etc/apt/sources.list' sudo apt-get update

逐项拆解:deb表示二进制包源;file:///后面跟绝对路径/opt/qgis-offline;末尾的./表示当前目录就是包和索引所在层;[trusted=yes]让apt跳过GPG签名校验,因为本地仓库没有也不打算配签名。apt-get update读取Packages索引,如果路径写错,这一步会报“无法成功读取”,立刻就能发现,不用等到安装阶段。

4.4 安装QGis本体

源配好,接下来这一条命令就能收尾:

sudo apt-get install -y --no-install-recommends qgis

-y跳过安装确认;--no-install-recommends和打包时的依赖收集策略对应,告诉apt不要去源里找推荐包,因为离线源只装了Depends层。如果安装中提示某个依赖包“无法定位”,注意看包名,回到/opt/qgis-offline/debs/下确认这个deb是不是在打包时被漏掉了。

4.5 验证安装:命令行与GUI两条路都要走

安装结束不等于万事大吉,三步验证通常在终端里一起跑:

qgis --version python3 -c "from qgis.core import Qgis; print(Qgis.QGIS_VERSION)" ls -l /usr/bin/qgis /usr/share/applications/qgis.desktop

第一行确认二进制版本,输出“QGIS 3.x.x”就是正常;第二行验证Python绑定能被import,这关系到插件系统是否健康,如果这行报错,多半是python3-qgis没装上;第三行确认可执行文件和桌面快捷方式都存在。图形界面验证要等下面几步做完后再去点一下桌面图标,如果图标点击没反应,回到刚才第二行的输出找原因。

到了这里,“安装”这件事已经算完成。但如果你在类似环境里装过就会知道,真正影响后续体验的是插件加载和地图渲染。这两块的坑,我放在避坑章里专门讲。

5. 离线安装避坑:五个翻车现场

5.1 抓包阶段容易翻车的两个环节

坑1:架构选错,包压根不属于这台机器

现象:目标机上apt install时报“软件包有未满足的依赖关系: qgis:amd64”或“无法安装 libgdal:arm64”。

原因:打包时明明分了amd64和arm64两套目录,但拷U盘时没核对目标机架构,拿错了目录。

解决:安装前先跑dpkg --print-architecture,再ls /opt/qgis-offline/debs/对比目录名,一致才继续:

dpkg --print-architecture # 目标机 ls /opt/qgis-offline/debs/ # 对比输出与目录名

这是离线安装里最高频的错误,成本极低但代价极大,我翻过一次之后每次必查。

坑2:依赖收集没做递归,装到一半缺东缺西

现象:装qgis主包装到一半,apt提示“依赖关系将无法满足”,报出的包名你手里根本没有。

原因:收集依赖时只下载了qgis根包,没有对整棵依赖树递归。apt-get download qgis只下载它自己,不会自动把libgdal、libproj这些一起拉下来。

解决:用3.2里那段脚本把整棵依赖树全部收下来,重新生成Packages索引再走安装流程。不要抱着侥幸心理手动逐个补包,QGis的依赖树有几十上百个包,手补不现实。

5.2 安装阶段容易翻车的三个环节

坑3:Packages索引缺失或路径写错,apt找不到包

现象:apt-get update执行成功,但apt-get install qgis提示“E: 无法定位软件包 qgis”。

原因:本地目录里只有deb文件,没有Packages或Packages.gz;或者源路径写到了debs子目录,apt在子目录里没找到索引。

解决:源地址必须指向Packages文件所在那层,也就是仓库根目录。如果之前写错了,回到根目录重新生成索引:

cd /opt/qgis-offline dpkg-scanpackages . /dev/null > Packages gzip -k Packages

坑4:本地源被GPG签名校验拦下

现象:apt-get update时报“NO_PUBKEY”或“The repository ... is not signed”,源里明明有包也装不了。

原因:本地仓库没有GPG签名,apt默认要求Release文件携带合法签名。

解决:在sources.list的deb行加[trusted=yes]。如果已经加了还报错,把apt的lists缓存清掉再update一次:

sudo rm -rf /var/lib/apt/lists/* sudo apt-get update

这个坑的隐蔽之处在于,签名错误提示和源路径错误很像,容易让人误判成仓库坏了,实际只是信任策略问题。

坑5:QGis能启动,但插件面板里Python脚本全线失灵

现象:QGis主界面正常,打开插件管理器却报“Cannot load Python modules”,或者import qgis.core直接失败。

原因:python3-qgis这个绑定包没被安装,或者PYTHONPATH没有指向QGis的Python目录。

解决:先补装再验证:

sudo apt-get install -y python3-qgis python3 -c "from qgis.core import Qgis; print(Qgis.QGIS_VERSION)"

如果import成功但插件还是报错,在QGis设置里把Python插件路径指到/usr/lib/qgis/python或等效目录。这个坑表面看起来像插件本身坏了,实际是绑定层缺失,不动python3-qgis这个包的话,重新装多少遍插件都没用。

6. 把离线安装沉淀成一套可复用的习惯:锁版本与自检

6.1 用版本锁和安装清单,给这台机器留一份档案

QGis装完,别急着把U盘收起来。我习惯顺手把QGis相关包锁住版本,防止系统日后做安全更新时把Qt或GDAL冲掉,导致QGis跑不起来:

sudo apt-mark hold qgis python3-qgis qgis-providers apt-mark showhold

第一条命令把核心包固定在当前版本,第二条确认锁定生效。锁定后apt upgrade会自动跳过这些包,踩不到“系统升级把软件升级没”的雷。同时把已安装清单导出一份做台账:

dpkg -l | grep -E "qgis|gdal|proj|geos" > installed-list.txt

这份清单以后排查问题很有用:哪天机器异常,对比清单就能看出来哪些包被动过。

6.2 一段自检脚本,装完半分钟确认状态

我把验证步骤写成一个脚本,放在离线包的根目录里,每次装完直接跑:

#!/usr/bin/env bash # QGis 离线安装自检脚本 set -e echo "== 1. 检查 qgis 可执行文件" command -v qgis && qgis --version echo "== 2. 检查 Python 绑定" python3 -c "from qgis.core import Qgis; print(Qgis.QGIS_VERSION)" echo "== 3. 检查 GDAL/PROJ 动态库" ldconfig -p | grep -E "libgdal|libproj" | head -n 5 echo "== 4. 检查桌面快捷方式" test -f /usr/share/applications/qgis.desktop && echo "OK"

脚本只有四步:查可执行文件、查Python绑定、查关键动态库、查菜单项。半分钟内跑完,机器状态一目了然。从那以后,我每次给离线终端装定制软件,都会强制走一遍“对架构、配源、装完跑自检、随手归档版本清单”这四步,这个习惯帮我挡掉了不少返工。如果你手头正卡在银河麒麟装QGis这件事上,这份整理好的离线包和配套脚本应该能让你省下我当初那三天,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询