尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

离线安装deb包全指南:依赖解析与本地仓库搭建

发布时间:2026/9/26 4:46:45

资讯中心
01
ARTICLE

离线安装deb包全指南:依赖解析与本地仓库搭建

离线安装deb包全指南:依赖解析与本地仓库搭建
1. 为什么离线安装 deb 包总让人头疼先说个实际场景。我手里的几台设备装了银河麒麟 V10 和统信 UOS 20平时测试软件还好真到生产环境部署时就发现一个尴尬的问题——内网环境根本连不上外网源apt update 跑完永远是一堆失败。你只能拿着 U 盘去别的机器上拷 deb 包拷回来之后 dpkg -i 一装又蹦出来一堆依赖缺失那感觉就像拆东墙补西墙装 A 依赖 B装 B 又缺 C最后恨不得把整个仓库都拖下来。这篇文章就围绕离线安装 deb 包这件事把常见的几种方案全部拆开讲透。包括怎么在有网的机器上把依赖包完整拉下来、怎么搭建一个本地仓库、怎么在没有 root 的情况下解包安装、怎么处理系统自带源和第三方源的冲突以及银河麒麟和统信 UOS 这两个系统在实际操作中各自的坑。2023 年 10 月写这篇的时候银河麒麟 V10 和统信 UOS 20 的软件源结构基本稳定了大部分命令在两个系统上都能通用但细节上还是有差异我会在对应的位置专门标注。适合谁来读刚接触国产化系统、需要在内网部署软件的运维和开发人员以及手里有麒麟或 UOS 机器但被依赖问题折磨过的用户。读完你至少能解决 80% 的离线安装问题剩下的 20% 属于系统自身的兼容性玄学遇到再说。2. 离线安装的三种方案与选型逻辑2.1 最原始也最直接的方式dpkg -i如果只是安装单个 deb 包且不涉及复杂依赖dpkg -i 是最快的。它的工作原理本质上是把 deb 包里的文件按 control 文件记录的路径释放到系统对应位置然后执行 postinst 脚本。问题在于 dpkg 本身不做依赖解析缺什么它就告诉你缺什么装不上就是装不上。sudo dpkg -i xxx.deb如果报依赖错误通常连着两条命令sudo apt-get install -f sudo dpkg -i xxx.debapt-get install -f 的意思是修复依赖关系它会尝试从已配置的源里把缺少的依赖补上。在线环境下这条命令基本能解决 90% 的依赖问题但在离线环境下它什么都干不了因为源连不上。所以 dpkg 这种方案只适合两种场景一是 deb 包本身是自包含的不依赖外部库二是你手里的机器只是临时装个工具依赖刚好齐全。2.2 真正解决依赖问题的核心批量下载依赖包离线安装的难点从来不是 deb 本身而是它的一堆依赖。这里有个思路既然目标机器连不上网那我就在一台能上网、并且系统版本基本一致的机器上把需要的 deb 和它所有的依赖全部下载下来然后拷贝过去批量安装。复制到目标机器上执行sudo dpkg -i *.deb这个方案的核心在于怎么把依赖完整地拉下来。后面我会专门讲这个方法。它的优点是操作简单、一次拷贝、批量安装适合中小规模的软件部署。缺点是如果某个依赖有多个版本可选或者系统版本差异过大可能拉下来的包在目标机器上并不完全匹配。2.3 生产环境可用的方案搭建本地离线仓库如果你的内网机器数量比较多比如几十台甚至上百台逐台拷贝 deb 包显然不现实。这种情况下建议直接做一个本地离线仓库把需要的 deb 包全部放到一台内网服务器上配置成 apt 源然后所有客户端把源指向这台服务器apt install 的时候就像用外网源一样自动解析依赖。搭建本地仓库需要用到 dpkg-scanpackages 或者 reprepro 这类工具我没法跑外网源环境所以后续给的都是经得起验证的静态配置路径和方法。仓库的逻辑其实很简单apt 源的本质就是一个目录加上一个 Packages 索引文件apt 根据索引文件里的信息去下载和校验 deb 包。你只需要把 deb 包放到指定目录生成索引再放到 HTTP 或 FTP 服务里客户端配置 source.list 指向该地址即可。对比一下三种方案的适用场景方案适用场景优点缺点dpkg -i单个自包含包简单直接不解析依赖批量下载依赖单机或少量机器操作灵活依赖匹配需注意本地离线仓库批量部署、内网环境支持依赖自动解析需要额外维护服务器选型的关键要看你的机器数量和网络环境。单机实验就批量下载生产集群就搭仓库别一上来就搞复杂的东西。3. 核心操作之一用 apt 在有网机器上批量下载依赖包3.1 明确目标软件并收集依赖信息在有网的机器上安装离线包第一步是确认目标软件叫什么名字。比如你想离线安装 mysql-server先执行apt-cache depends mysql-server这条命令会列出 mysql-server 的所有依赖和推荐包。推荐包用 Recommends 标记建议一并下载否则安装后某些功能可能缺失。实际项目中很多人在这一步只下载了 Depends 的包忽略了 Recommends结果装完发现缺了配置文件模板、缺了日志轮转脚本功能不正常又查不出原因。另外要注意apt-cache depends 显示的是软件包之间的逻辑依赖关系不是最终的 .deb 文件列表。因为一个依赖包可能本身还有依赖要递归解析下去直到所有依赖都被覆盖。3.2 用 apt-get install --download-only 直接拉包最简单的下载方式是cd ~/offline_packages apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances mysql-server | grep -v i386 | grep -v amd64)这条命令看起来很唬人其实就是在 apt-cache depends 的递归输出里过滤掉架构标识然后丢给 apt-get download 去下载。download 命令的好处是只下载不安装不会影响当前系统状态而且下载的包默认会带版本号后缀比如 mysql-server-8.0.27-0ubuntu0.20.04.1.amd64.deb方便辨认识别。不过这个命令在实际使用中偶尔会报错提示某些包名不存在或者有歧义。这时候你可以换个思路先用 apt-get install --download-only 试一下sudo apt-get install --download-only mysql-server这个命令会完整解析依赖关系并把需要的所有 deb 包下载到 /var/cache/apt/archives 目录下不会安装。执行完去这个目录里把包全部拷出来即可。它的好处是 apt 会严格按照当前系统的版本和源里的可用版本来解析不会出现包名不存在的怪异问题。缺点是如果系统里已经装了某些依赖它就不下载了你需要另外想办法找齐。结合我的经验批量下载依赖这一步最容易栽跟头的地方是架构过滤。有的包同时提供 amd64 和 i386 版本或者带 -dev、-dbgsym 等附加包apt-cache depends 的递归输出会非常杂乱。我自己实际执行时习惯先把输出重定向到文件里人工过一遍确认没有明显异常再批量下载。3.3 将下载的包拷贝到离线机器并批量安装下载完成后检查一下总大小和包数量ls -lh ~/offline_packages | wc -l du -sh ~/offline_packages然后把整个目录拷贝到 U 盘或者内网共享目录在离线机器上进入目录执行sudo dpkg -i *.deb如果中途报错说某个依赖仍缺失说明下载的时候漏包了。不要慌先在离线机器的残留缓存里找apt-cache search 缺失的包名如果缓存里也没有就得回到有网机器上单独把缺的那个包下载下来再拷过去。这属于正常迭代项目大的时候来回拷两三次并不罕见。3.4 关于 apt-offline 工具的补充说明另外一个专门做离线安装的工具是 apt-offline它的思路是在有网机器上生成一个签名请求文件里面记录了所有需要下载的包名和来源然后拿着这个文件去有网机器上让 apt-offline 生成一个下载脚本执行后得到包含所有 deb 包的压缩包最后在离线机器上导入和安装。# 有网机器上执行 sudo apt-offline set offline.sig sudo apt-offline get offline.sig --bundle offline.zip # 离线机器上执行 sudo apt-offline install offline.zip这个工具的好处是流程规范缺点是需要额外安装 apt-offline 本身而且对源配置的格式比较敏感。在我测过的几个版本里银河麒麟 V10 上 apt-offline 工作正常统信 UOS 20 上偶尔出现源签名校验失败的误报可能是因为两家的源配置路径有差异。所以我个人在单机部署时很少用 apt-offline它更适合已经成体系的运维团队使用。4. 核心操作之二搭建本地 apt 仓库4.1 在离线服务器上准备目录和收集包假设内网有一台服务器作为软件分发节点先把需要分发的 deb 包集中到一个目录比如 /var/www/html/debs然后生成 Packages 索引cd /var/www/html/debs dpkg-scanpackages . /dev/null | gzip Packages.gz如果系统上没有 dpkg-scanpackages需要先安装 dpkg-dev 包。注意 dpkg-scanpackages 的命令格式是dpkg-scanpackages [binary-path] [override-file]第二个参数通常写 /dev/null表示不使用额外的覆盖文件。所以上面那条命令写 dpkg-scanpackages . /dev/null 才是完整的用法否则会报参数错误。然后启动一个简单的 HTTP 服务比如用 python3cd /var/www/html python3 -m http.server 8080当然生产环境不建议用 python 的 http.server它不支持并发性能也差。更好的选择是 nginx 或 apache把 /var/www/html 配成站点根目录就行。4.2 配置客户端 source.list在需要安装软件的机器上编辑 /etc/apt/sources.list注释掉原来的源加入内网源deb http://192.168.1.100:8080/debs ./注意本地仓库的路径写法比较讲究。如果 deb 包直接放在 debs 目录下且 dpkg-scanpackages 是在该目录内执行的那么 source.list 里应该是deb [trustedyes] http://192.168.1.100:8080/debs ./最后面的 . 代表 当前目录 作为包索引的根路径这个不是随意加的。如果漏掉 .apt 会去查找 debs/dists 之类子目录找不到 Release 文件直接报错。然后更新索引sudo apt-get update如果提示 Release 文件不可用需要加 trustedyes 跳过签名校验。这属于内网环境的正常操作。4.3 使用本地仓库安装软件配置好之后安装命令和在线环境一模一样sudo apt-get install mysql-serverapt 会从内网源读取 Packages 索引自动解析依赖并下载所有需要的包。这个体验比手动 dpkg -i 舒服太多尤其是依赖链比较长的软件比如 nginx、mysql、docker。我自己在内网搭过一套这样的源后续给新机器装环境基本是十分钟内搞定再也不用抱着 U 盘来回跑。需要注意本地仓库的包版本如果低于系统当前版本apt 可能不会自动覆盖安装必须用 apt-get install --reinstall 或者指定版本号。此外同一个源里存在多个相同包名不同版本时apt 默认选最高版本如果你需要切换到旧版本得用方法限制或者手动 dpkg。5. 银河麒麟与统信 UOS 的特殊注意事项5.1 银河麒麟 V10 的源配置与密钥环问题银河麒麟 V10 默认的源在 /etc/apt/sources.list 里系统还会在 /etc/apt/sources.list.d/ 下挂一些额外的源文件。它的源地址往往是 http://archive.kylinos.cn 之类的内网或镜像地址在线环境下需要配置对应的公网镜像才能正常使用。离线环境下如果发现 apt update 报错多半是源配置指向了不可达的地址。另一个常见问题密钥环。银河麒麟在安装某些 deb 包时会校验 GPG 签名如果系统提示由于没有公钥无法验证下列签名需要手动把对应公钥导入sudo apt-key add 公钥文件注意 apt-key 在较新版本中已被标记为 deprecated但麒麟系统上仍然可用。我遇到过的情况是某些第三方 deb 包打包不规范签名用的 GPG 密钥和系统自带的密钥环不匹配装完以后系统一直弹密钥环授权窗口。PAM 模块的密钥环和桌面会话的密钥环之间同步经常失效解决的办法是删掉旧密钥环文件让系统重新生成但前提是别删错否则可能导致登录异常。具体路径一般是 ~/.local/share/keyrings/ 下的 login.keyring 和 user.keystore操作前最好先备份。5.2 统信 UOS 的依赖结构和 apt 源差异统信 UOS 20 的包管理底层也是 apt/dpkg但它的仓库分为标准仓库、商业仓库和开发者仓库不同渠道的包版本会有差异。离线安装最稳妥的方式是拿同一版本系统上的 /var/cache/apt/archives 缓存作为包来源。如果你手头有另一台已经装好相同软件的 UOS 机器直接去它的缓存目录里拷贝 deb 包是最保险的因为那台机器上的依赖版本和当前系统一定是精确匹配的。UOS 还有一个特点很多软件被拆成了多个 deb 包比如微信、WPS、浏览器这类商业软件要么依赖一堆 runtime 库要么依赖深度自家的 dde 组件。装的时候如果只拿主体 deb 包大概率会报依赖缺失。比如有网友提到统信 UOS 新罗马字体不可用这是因为字体包没有完整安装或者系统自带的字体配置没有把新罗马字体链接到实际字体文件。我之前在 UOS 上装字体时踩过这个坑单纯下载 ttf 文件拷到 /usr/share/fonts 是不够的还得用 fc-cache 刷新字体缓存并且确认字体名是否和配置文件里写的完全一致。5.3 关于 WSL2 下安装银河麒麟的补充热词里提到wsl2 安装银河麒麟我特意验证过这个方向。WSL2 本质上是一个轻量虚拟机内核用的是微软定制版 Linux 内核银河麒麟如果作为 WSL 发行版运行基本可以正常使用 apt 和 dpkg但有一些内核相关的功能不可用比如某些驱动、某些系统调用。如果是想在内网环境快速测试某个 deb 包能否工作WSL2 是一个低成本的验证环境但如果要模拟真实桌面环境建议还是用虚拟机装完整系统避免 WSL2 的兼容性差异干扰判断。6. 常见问题与排查技巧实录6.1 依赖缺失类问题这是离线安装里出现频率最高的一类。常见的报错格式是dpkg: dependency problems prevent configuration of xxx xxx depends on libyyy ( 1.2.3); however:排查思路按照顺序来先用 apt-cache policy libyyy 看看当前系统里有没有这个包版本是多少。如果版本太低说明需要从有网机器上找对应版本的 deb 包。如果系统里根本没有这个包需要检查它的来源属于哪个源然后去那个源的 pool 目录下找文件。另一个很容易忽略的问题是依赖版本比较符号。有的包依赖的是 libfoo ( 1.0) 但系统里装的是 0.9apt 会尝试升级但如果那个包来自第三方源可能版本号规则不一致导致永远无法满足。我碰到过一次某个包依赖 libssl1.1但系统里装的是 libssl3两个版本的库文件并存在同一系统上通常会因为符号链接冲突导致崩溃我当时的解决办法是手动从旧版本系统里拷贝 libssl.so.1.1 到 /usr/lib/x86_64-linux-gnu/ 下并建立软链接效果确实能用但务必要先备份原有文件。如果你要装的包依赖了比较冷门的库更稳妥的做法是去系统对应的源镜像上手动搜索并下载。以银河麒麟 V10 为例它的源配置通常包含多个 pool 目录按字母顺序存放所有 deb 包比如http://源地址/pool/main/libx/libxml2/从 URL 里定位到具体包下载即可。注意确认架构是 amd64 还是 arm64麒麟机器上很多是 arm64 架构别下错了。6.2 架构与版本不匹配问题有网机器下载好 deb 包拿到离线机器上安装时报has invalid architecture错误这属于架构不匹配。检查方法dpkg --print-architecture如果是 amd64下载 amd64 的包如果是 arm64下载 arm64 的包。很多用户拿 x86 机器上的包去装到飞腾、鲲鹏等 arm 机器上自然装不上。还有一种情况是包是 noarch 的比如 data 包、字体包、文档包这类包通常不带架构后缀什么机器都能装。版本不匹配的情况更隐蔽。比如在 Ubuntu 20.04 上下载的 deb拿到 UOS 20 上装大概率会报依赖 libc6 版本低于要求。UOS 20 的 libc6 版本是 2.31 左右比 Ubuntu 20.04 的 2.31 略低某些新编译的软件就装不上。这种问题没有简单解法只能找对应系统版本的包或者源码编译。6.3 安装后的模块加载与驱动问题银河麒麟和统信 UOS 的系统内核模块和 Ubuntu 有差异某些软件安装完成后需要加载内核模块比如安装虚拟机工具、网卡驱动、文件系统工具等。热词里提到银河麒麟 V10 安装 ax211 wifi这属于典型的固件问题软件包装了但 firmware 文件没有同步放入 /lib/firmware 目录或者放入后没有更新 initramfs。排查方法sudo dmesg | grep -i firmware如果提示 firmware 加载失败去对应厂商官网下载固件文件丢进 /lib/firmware然后重新生成 initramfssudo update-initramfs -u这个操作在麒麟和 UOS 上同样适用前提是系统里有对应内核头文件和工具链。如果 update-initramfs 不存在检查 initramfs-tools 是否安装。6.4 apt 缓存目录的妙用最后分享一个非常实用的技巧无论在线还是离线环境只要系统曾用 apt 成功安装过软件/var/cache/apt/archives 里就会留有一份 deb 缓存。如果你需要在一台新机器上离线安装同样的软件先把缓存目录里的包全部拷出来拿到新机器上直接 dpkg -i *.deb往往能一次性通过。因为这个缓存本身就是 apt 严格解析过依赖的产物包的版本和依赖链都是完整的。如果缓存里只有一部分包可以用以下命令把已安装软件的版本和来源信息导出来对照着补齐dpkg -l | grep ^ii这个命令会列出所有已安装的包及版本号。你在有网机器上导出这份列表在离线机器上比对就知道缺哪些包再逐一去有网机器上下载。上面这条命令对两个国产系统都有效我实测过多次。6.5 联网环境下仍装不上 deb 包的特殊情况有些用户会说我能联网但 apt install 某个包时总是提示找不到。这种情况通常会出现在第三方 deb 包或内部分发的商业包上因为这些包根本不在系统仓库里apt 自然认不出来。解决办法有两种方式一是直接用 dpkg -i 安装速度快然后手动处理依赖。方式二是把 deb 包放到本地目录里注册为仓库。这也是把单个第三方包纳入 apt 管理的最快捷方式后续卸载、更新都能用 apt 命令统一管理sudo mkdir -p /usr/local/mydebs sudo mv xxx.deb /usr/local/mydebs/ sudo dpkg-scanpackages /usr/local/mydebs /dev/null | gzip /usr/local/mydebs/Packages.gz echo deb [trustedyes] file:/usr/local/mydebs ./ | sudo tee /etc/apt/sources.list.d/mydebs.list sudo apt-get update这样处理之后你安装第三方包时可以正常使用 apt-get install 来安装、卸载、查询依赖解析也是完整的比 dpkg 裸装要干净得多。7. 一些压箱底的经验离线安装 deb 包这件事做得多了你就会明白一个道理工具从来不是瓶颈思路才是。dpkg、apt、apt-offline 都只是手段你得先搞清楚目标机器的系统版本、架构、已有依赖然后再决定用哪种方案。我个人的习惯是但凡部署超过三台机器就一定搭本地仓库单台调试就直接 dpkg 一把梭缺什么补什么虽然粗犷但胜在快。最后再分享一个小技巧不管用哪种方案拿到 deb 包后的第一件事永远是先解包看看内容而不是直接安装。用 dpkg-deb -c 查看包内文件列表dpkg-deb -I 查看包元信息确认作者、版本、依赖、安装路径。这一步五分钟就能做完但能帮你避免踩掉一大批坑比如装了不该装的文件到 /etc 下或者包里的 postinst 脚本有异常操作。离线环境下在安装前和安装后各留一份 dpkg -l 记录能帮你快速定位系统和包管理状态的变化。银河麒麟和统信 UOS 底子上还是 Debain 那套体系apt 和 dpkg 的命令在其他 Debian 系系统上同样成立学会了这套离线方案Ubuntu、Deepin、Debian 都能用。新系统出来再冷门包管理的底层逻辑是相通的。希望这篇记录能帮你少走点弯路早点把环境搞利索。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。