
刚接触银河麒麟系统的时候我差点被“离线安装软件”这件事劝退。单位的内网机器没有任何外网权限系统自带的软件源形同虚设想装个浏览器、编译个Nginx折腾了好几天都在报依赖错误。后来摸清楚了包管理机制和离线安装的几个关键路径才发现这事根本没有想象中那么复杂。这篇文章就把我踩过的坑、总结出来的方法以及官方资源的获取渠道一并整理出来给同样被离线环境折磨过的朋友做个参考。1. 卡住90%新手的不是安装命令而是“依赖地狱”很多人第一次在麒麟系统上离线装软件第一反应是去网上找一个.deb或.rpm包拷到内网直接双击或执行安装命令。结果往往是屏幕上冒出一长串“依赖关系不满足”的报错随后安装失败。这个问题的本质并不是你下载的包有问题而是Linux软件包之间普遍存在依赖关系。打个比方你想装一个软件它相当于一辆汽车而这辆汽车需要发动机、轮胎、方向盘才能跑起来。在线安装时包管理工具比如apt或yum会自动从软件源里把这些“零部件”一起拉下来装好。但在离线环境下没有软件源可用系统发现零部件不齐自然拒绝启动这辆车。银河麒麟系统比较特殊的一点是它有多个版本分支桌面版和服务器版的包管理体系并不完全一样。桌面版通常基于Debian体系使用dpkg和apt服务器版则不少基于RPM体系使用rpm和yum/dnf。这导致很多人在网上搜到的教程在自己机器上执行时命令根本不存在就开始怀疑是不是系统出了问题。我遇到过一个更隐蔽的情况系统里已经装了某个依赖库但版本太老不符合新版软件的要求或者架构不匹配比如在ARM版的麒麟上强装x86的包也会报错。所以离线安装的第一步不是急着下载目标软件而是先搞清楚三件事系统的包管理类型是什么、系统架构是什么、以及当前软件源里能不能找到可用信息。有一个非常实用的指令组合建议任何开始离线安装之前都先跑一遍uname -m cat /etc/os-release which apt 2/dev/null || which yum 2/dev/null || which dnf 2/dev/null第一行看架构是x86_64还是aarch64第二行看系统版本第三行确认可用的包管理器。这三样确定了后面找包、选安装方式才有的放矢。2. 离线安装的三种可行路径与适用场景离线安装并不是只有一种标准答案根据软件的类型、依赖复杂度和你的网络条件可以分成三条主要路径。我按实际项目中的使用频率给大家做个对比。安装路径核心工具/方式适用场景依赖处理难度我给出的建议软件包直接安装dpkg -i/rpm -ivh单文件软件、依赖简单或依赖已内置相对较低优先尝试源码编译安装./configure make make install需要定制参数、官方未提供现成包较高依赖准备要仔细应用商店/官方离线包麒麟软件商店、官方发布的离线安装包常见办公软件、商业软件最低最省事先说明路径A。如果你下载的是.deb包在桌面版麒麟上执行sudo dpkg -i 文件名.deb如果提示缺依赖可以用sudo apt --fix-broken install尝试自动修复。但离线环境下这个修复命令需要本地有可用的依赖包缓存。我常用的一个办法是在一台能联网的同版本麒麟机器上用apt download把目标软件以及它依赖的所有包都下载下来然后打包拷到内网统一安装。路径B适合那些没有现成二进制包、或者官方只提供源码的软件比如很多开源服务端程序。编译安装的好处是可以自己控制编译参数、选择模块坏处是必须先装好编译工具链和相关开发库。这部分后面用Nginx的实战案例细说。路径C最容易被忽略但实际最实用。银河麒麟官方应用商店里很多软件在详情页会提供离线安装包下载选项直接下载后双击即可安装依赖通常已经处理妥当。我处理过的一些审计类、办公类软件用这种方式一次成功比手动处理依赖省了无数时间。3. 第一次实战离线安装Chrome浏览器很多单位的办公环境需要浏览器访问内部系统但默认的Firefox版本太老或者某些Web应用只兼容Chrome内核。我以Google Chrome为例完整演示一遍离线安装的流程。第一步在一台可以联网、系统版本和架构相同的麒麟机器上打开终端确认系统信息无误后从Chrome官方站点或可信镜像下载Linux版.deb包。需要注意下载对应架构的版本目前主流x86_64机器下载64位版本即可。第二步把下载好的.deb文件用U盘或内网传输工具拷贝到目标机器放到一个没有中文路径的目录下比如/home/yourname/soft。第三步执行安装cd /home/yourname/soft sudo dpkg -i google-chrome-stable_current_amd64.deb正常情况下这一步如果依赖齐全会直接成功。如果报错提示缺少依赖先别慌执行sudo apt --fix-broken install这条命令会自动检查并安装缺失的依赖。离线环境如果本地缓存里有这些依赖包它也能直接使用。要是仍然提示找不到某个包那就回到联网机器上用下面的方式把依赖包全部拉下来mkdir chrome-deps cd chrome-deps apt-cache depends google-chrome-stable | grep Depends | awk {print $2} | xargs apt download sudo dpkg -i *.deb把chrome-deps整个目录拷到内网先手动dpkg -i这些依赖包再装Chrome本体。依赖包之间存在依赖顺序问题但dpkg -i *.deb在安装时会尽量排序只要所有包都在同一个目录里通常能自动解决。如果实在有顽固的依赖可以多执行几次sudo apt --fix-broken install直到依赖问题清零。装完之后在应用列表里就能找到Chrome图标。我实际测试过这种方式安装的Chrome可以正常登录内部系统、调用打印机控件稳定性没有区别。4. 升级难度离线源码编译安装Nginx离线安装Nginx是搜索热词里出现频率极高的需求说明很多人不只是想装个浏览器而是要部署完整的Web服务。Nginx官方虽然提供RPM包但版本往往偏旧而且很多单位的安全基线要求使用指定版本所以源码编译是最可靠的路子。源码编译的本质是把你拿到的.tar.gz源码包用C语言编译器在目标机器上“翻译”成可执行文件。这个过程需要三样东西编译器、依赖库头文件、以及足够的时间和耐心。Nginx的编译依赖相对温和主要需要gcc、make、pcre-devel、zlib-devel、openssl-devel。但离线环境最大的坑就在这里——这些开发库可不好找。我的经验是在联网机器上准备一个“编译底座”目录把整个工具链和开发库一次性打全。假设你已经通过某种方式准备好了编译环境接下来就是完整步骤。解压源码包tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0执行配置。这一步是最关键也最个性化的一步。以下是我常用的一个生产环境配置参数./configure \ --prefix/usr/local/nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_gzip_static_module \ --with-pcre \ --with-threads--prefix指定安装路径--with-http_ssl_module启用HTTPS支持这是必须的--with-http_v2_module启用HTTP/2--with-pcre显式启用正则库。如果你还要支持TCP代理、Stream模块等可以再加上--with-stream。配置成功后会生成Makefile然后执行make -j4 sudo make install其中-j4是指用4个CPU核心并行编译能明显加快速度。如果CPU核数多可以写成-j8或更高。编译完成后Nginx默认安装在/usr/local/nginx启动命令是sudo /usr/local/nginx/sbin/nginx验证是否启动成功用/usr/local/nginx/sbin/nginx -V curl -I http://localhost能看到版本信息和HTTP响应头就说明服务已经起来了。如果需要开机自启我建议在/etc/systemd/system/下写一个服务文件内容大致是[Unit] DescriptionNginx service Afternetwork.target [Service] Typeforking ExecStart/usr/local/nginx/sbin/nginx ExecReload/usr/local/nginx/sbin/nginx -s reload ExecStop/usr/local/nginx/sbin/nginx -s quit PrivateTmptrue [Install] WantedBymulti-user.target然后执行sudo systemctl daemon-reload sudo systemctl enable nginx即可。编译过程中常见的报错大概有这几种提示C compiler cc not found说明gcc没装提示pcre.h not found说明pcre开发库缺失提示openssl/ssl.h找不到说明OpenSSL开发库缺失。每一种都对应一个依赖包我建议前期准备阶段宁可多装也不要一个个去试错。5. 进阶场景ARM架构下的离线部署要点如果你用的是飞腾、鲲鹏等ARM处理器的麒麟系统离线安装的难度会再上一个台阶。原因很简单很多软件官方只发布x86_64版本ARM版本的包需要额外去找甚至需要自己交叉编译。查看架构命令前面已经提过uname -m如果输出aarch64就说明是ARM 64位系统。此时下载软件包必须认准arm64或aarch64标识否则会直接报“Wrong architecture”。我在ARM版麒麟上离线部署Qt应用时遇到过一个很典型的依赖问题。Qt应用本身编译成了可执行文件但运行时依赖大量动态链接库.so文件。把这些库找齐是个体力活也是最容易遗漏的环节。我的做法是分三步走第一步在联网的相同架构机器上用ldd命令查看目标程序依赖了哪些库ldd /path/to/your_app输出结果里标着not found的就是缺失的库需要手动去补齐。第二步把依赖的.so文件从系统库目录通常是/usr/lib/aarch64-linux-gnu或/usr/lib64复制出来连同你的应用一起打包。如果程序还依赖Qt的插件比如数据库驱动、平台插件这些通常在/usr/lib/qt5/plugins下也要一并带上。第三步在目标机器上设置LD_LIBRARY_PATH指向你的库目录再启动程序export LD_LIBRARY_PATH/opt/myapp/libs:$LD_LIBRARY_PATH /opt/myapp/myappARM架构的另一个坑是部分商业软件不提供ARM版本。比如某些单位的业务系统受控控件只有x86版在飞腾机器上根本装不了。这种情况只能看软件厂商是否提供麒麟ARM兼容包或者改用浏览器端的Web版本。选购硬件之前最好先确认核心软件有没有对应架构的版本否则机器买回来装不上软件非常被动。6. 高频问题速查wifi驱动、ssh升级、VMware Tools等搜索热词里有一批问题虽然不完全属于“离线装软件”的范畴但都是我实际处理过、且跟离线安装密切相关的场景这里一并解答。关于无线网卡驱动比如AX211网卡在麒麟上装不上本质上是内核模块缺失。离线环境下最稳妥的办法不是去下载厂商驱动而是先在联网机器上确认内核版本对应的linux-modules-extra包再找对应版本。具体命令是uname -r假设输出是5.4.18-85-generic那就去找与之匹配的linux-modules-extra-5.4.18-85-generic包下载后拷到内网用dpkg -i安装。驱动文件就位后重新加载内核模块即可。SSH升级的需求也很常见多为安全整改要求。和编译Nginx类似OpenSSH离线升级需要先准备编译依赖包括zlib-devel、openssl-devel、gcc等。特别提醒一点编译安装OpenSSH的过程中千万不要中断或退出当前SSH会话否则可能因为配置错误导致远程登录断开之后无法再连上来。生产环境操作前一定要提前开好一个临时会话或者掌握带外管理手段。VMware Tools在麒麟上的安装如果系统里没有装build-essential这类编译工具安装程序会中途报错。解决办法是先补齐perl、gcc、make、linux-headers-$(uname -r)这几个包。linux-headers又依赖内核源码所以完整的准备清单比想象中要长。我建议在联网机器上先执行一次apt download build-essential perl linux-headers-$(uname -r)把这一整套都下齐再带去内网。关于root密码重置的问题它跟离线安装关系不大但被搜索的次数太多了一句话说清楚单用户模式或者通过Live系统挂载根分区直接改/etc/shadow文件中的密码哈希即可。系统引导进grub时在内核启动参数里加init/bin/bash进入单用户环境修改。这个方法在多种Linux发行版上都通用。7. 官方资源与镜像获取避免踩到“假官网”的坑如果给离线安装的成败因素排个序软件包来源的可靠性绝对排在第一位。曾经有同事为了图方便在某第三方网站下载了一个“Nginx离线安装包”结果里面捆绑了不干净的东西装完之后SSH公钥被动过。所以在这里多说一句获取银河麒麟相关的安装包、依赖包、系统镜像一定要走官方渠道。银河麒麟的官方网站是www.kylinos.cn网站上提供了产品版本说明、帮助文档以及软件下载入口。系统ISO镜像、补丁包、部分官方软件的离线包都可以在官网的下载中心找到。除了官网几个主流开源镜像站也有麒麟相关的软件仓库镜像可以作为补充下载源但我还是建议以官方渠道为准。还有一个被很多人忽略的地方系统自带的软件商店。即便在没有外网的内网环境应用商店里也可能缓存了部分常用软件的离线安装包打开商店搜索一下能装就直接装。比如360压缩这样的工具性软件官方也提供了麒麟版本通过商店或官网直接下载后就能用不需要折腾命令行。对于需要批量部署多台机器的场景我强烈建议在联网机器上提前把常用依赖包下载完毕建立一个属于自己的“离线软件库”。目录结构可以这样规划/offline-repo/ ├── deb/ # 存放所有 .deb 依赖包 │ ├── build-essential/ │ ├── nginx-deps/ │ └── ... ├── rpm/ # 如果服务器版是 RPM 体系 ├── source/ # 源码包 └── installs/ # 最终目标软件安装包每次在联网机器上执行下载时用apt download把目标软件及所有依赖统一放进对应目录拷回内网后用一行命令批量安装cd /offline-repo/deb sudo dpkg -i *.deb这个习惯帮我在后续的项目部署中省了无数时间。第一次离线部署花了整整两天第二次只用了两小时第三次已经是标准操作了。最后再分享一个小技巧很多依赖包之间存在版本冲突批量安装时如果报错不要急着逐个删除可以尝试在同一个目录下重复执行几遍sudo apt --fix-broken install。大多数情况下包管理工具会在第二、第三轮把顺序理清楚。这个方法不优雅但确实管用。