
说真的用命令行更新麒麟系统这件事看着唬人实际也就是几条命令的事。但就是这几条命令让我在客户那一堆国产化机器上少熬了无数个夜。很多运维朋友习惯在图形界面里点点点觉得命令行是给“高手”用的其实恰恰相反——在批量、远程、无桌面环境下命令行才是更新系统最不容易出错、最可控的方式。这篇文章不绕弯子直接聊我平时是怎么在麒麟系统上做命令行更新的会拆解到包管理器原理、不同版本的实际差异、实操参数、常见坑位以及那些文档里不会写、只有踩过坑才知道的细节。不管你是刚接手国产化设备的新手还是已经折腾过几轮的老手都能从中拿到可以直接抄作业的方案。1. 为什么我坚持用命令行更新麒麟系统1.1 图形界面更新并不能覆盖所有场景很多麒麟系统默认带图形化更新工具桌面版用户打开“更新管理器”点几下也能完成升级。但实际部署环境里图形界面更新有几个绕不过去的短板一是服务器版系统往往没有安装桌面环境你面对的就是一个命令行终端二是即使有桌面运维远程登录时通常只有SSH会话不可能为了点个“升级”按钮专门跑到机房开显示器三是图形更新工具出了问题之后错误信息往往堆在某个角落里根本看不出是依赖冲突还是源的问题。更关键的一点是图形界面更新的过程是个“黑盒”你只能看到进度条很难知道它到底在干什么、改了哪些包、动了哪个依赖。对于一个需要审计、需要追踪变更的生产系统来说这种不透明本身就很危险。1.2 命令行更新能解决什么问题命令行更新最大的价值不是“显得专业”而是它给了你完整的控制权和可见性。升级前你能看到有多少个软件包等待更新升级中你能看到每个包的处理过程升级后你能通过日志倒查任何一次变更。这才是运维层面最看重的东西。具体来说命令行更新可以做到图形界面做不到的几件事精确到某一个软件包只升级内核、只升级安全补丁、锁定某个软件版本不升级。批量化操作写一个脚本就能在几十台机器上执行同样的更新流程输出统一格式的日志。离线升级在内网隔离环境里靠deb或rpm包手工升级命令行是唯一可行的路径。故障定位哪一步报错、哪个包冲突终端里清清楚楚不像图形工具那样吞日志。1.3 麒麟系统的包管理器有哪些“派系”麒麟系统不是单一的一个发行版它分桌面版和服务器版底层技术路线也不一样。这是命令行更新时最容易踩坑的地方很多人上来就执行apt update结果报command not found其实就是没搞清楚自己系统用的是哪套包管理机制。目前的常见情况是银河麒麟桌面版V10系列基于Debian/Ubuntu体系包管理器用的是apt和dpkg银河麒麟高级服务器版V10系列则基于CentOS/RHEL体系包管理器用的是dnf或yum。统信UOS整体更接近Debian系以apt为主。所以接下来所有命令我都会按这两条技术路线分开写用到哪条看你机器的体系别混着来。注意判断系统属于哪条路线最快的方法是执行cat /etc/os-release查看里面的ID和ID_LIKE字段如果是debian系就走apt如果是rhel、centos系就走dnf这个细节我下面实操部分还会再强调。2. 更新前先做好这三件事避免翻车2.1 确认你手里的是哪一代麒麟系统命令行更新之前第一步永远是确认系统身份。我见过不少现场事故都是因为运维没确认版本用错了包管理器指令甚至稀里糊涂把服务器版的软件源指向了桌面版源结果依赖全乱。确认系统版本用这几条命令就够了# 查看发行版信息最直观 cat /etc/os-release # 银河麒麟特有的系统信息文件能看具体版本号 cat /etc/.kyinfo 2/dev/null || cat /etc/product-info 2/dev/null # 看内核版本 uname -a # 查看主机名和系统详细信息 hostnamectl实际输出会因为版本不同而有差异但重点看两个地方一个是ID_LIKE字段它直接告诉你系统底层接近哪个发行版另一个是系统版本号比如V10、SP1、SP2等版本代号不同小版本的软件源配置也会略有区别。把这些信息记下来后面配置源和排查问题时都用得着。2.2 备份软件源配置别等改坏了再后悔软件源是命令行更新的“生命线”源配置错了后面全部白搭。在动手更新前我习惯先备份源文件这算是运维的基本素质成本为零但出问题时能救命。apt体系的源文件在/etc/apt/目录下主要是sources.list和sources.list.d/子目录里的文件sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak.$(date %Y%m%d) sudo cp -r /etc/apt/sources.list.d /etc/apt/sources.list.d.bak.$(date %Y%m%d)dnf体系的源文件在/etc/yum.repos.d/目录下以.repo结尾sudo mkdir -p /etc/yum.repos.d/backup.$(date %Y%m%d) sudo cp /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup.$(date %Y%m%d)/这里多说一句麒麟系统的官方源地址跟Ubuntu、CentOS官方源不完全一样它有自己的镜像仓库。如果原厂源访问不了最稳妥的方案是联系服务商获取正确的源地址或者切换到本地已经同步好的内网镜像源千万别随便拿Ubuntu源硬套。2.3 更新前的“体检”项目确认版本、备份完源还要做一轮基础体检确保更新过程不会半路卡死。我总结了一个检查清单每一项都有明确的命令按顺序跑一遍用不了两分钟# 1. 检查根分区和/boot分区空间是否充足 df -h / /boot # 2. 检查网络连通性注意替换成你的实际源地址 ping -c 4 archive.ky... 2/dev/null || ping -c 4 mirrors.aliyun.com # 3. 检查是否有其他包管理进程在运行避免锁冲突 ps aux | grep -E apt|dpkg|dnf|yum | grep -v grep # 4. 查看系统最近是否有未完成的更新任务 sudo tail -n 50 /var/log/dpkg.log 2/dev/null磁盘空间这块要特别注意更新系统需要临时下载软件包apt系默认放在/var/cache/apt/archives/dnf系放在/var/cache/dnf/。如果根分区剩余空间不足5GB我建议先做一次清理再更新否则下载到一半磁盘满了那个场面比不更新还难看。3. 实操两条技术路线的完整更新流程3.1apt系桌面版/桌面环境的标准四步银河麒麟桌面版和统信UOS基本都是apt体系标准更新流程我习惯叫它“四步走”。这里的每一步都有它的意义不是无脑敲命令。第一步刷新软件源缓存sudo apt update这一步会重新读取软件源列表获取最新的软件包索引。注意它只更新索引并不升级任何软件。如果这一步报错后面的所有操作都不建议继续先把源的问题解决掉再说。第二步查看有哪些软件可以升级apt list --upgradable执行完后你会看到一串软件包列表左边是包名右边是当前版本和可升级版本。这一步可以帮你判断这次升级的规模有多大。如果发现某些关键软件也在可升级列表里而你暂时不想动它可以先用apt-mark hold把它锁住后面我会单独讲。第三步执行升级sudo apt upgrade -yupgrade会升级所有可升级的软件包但它的原则是“只升不改依赖”也就是说如果某个软件升级需要额外安装新依赖或删除旧依赖upgrade会跳过它。对于日常安全补丁、常规软件更新这一步完全够用。第四步有依赖变化时用到dist-upgradesudo apt dist-upgrade -ydist-upgrade在升级软件包的同时会智能处理依赖关系的变化该装新依赖就装该删旧包就删。这个命令比upgrade更“激进”一般在系统大版本更新或内核升级时使用。如果你只是做常规小补丁升级upgrade就够了没必要每次都上dist-upgrade。升级完成后顺手清理不需要的包和缓存sudo apt autoremove --purge -y sudo apt autocleanautoremove会删除已经不再被依赖的孤立软件包autoclean会清理缓存里已经没用的安装包。这一步能让系统保持干净也能腾出点磁盘空间。提示内核升级在apt体系里默认不会跟着upgrade一起自动完成你需要单独安装新内核包比如sudo apt install --only-upgrade linux-image-generic安装完再重启才能生效。这也是桌面版麒麟系统经常出现“命令行更新完了但uname -r一看内核还是旧的”的原因。3.2dnf/yum系服务器版的标准流程银河麒麟高级服务器版走的是dnf体系跟yum命令兼容。它的更新流程类似但命令措辞略有不同我分开写。第一步检查可更新的软件包sudo dnf check-update这条命令会列出所有可升级的软件包。注意如果系统已经是最新状态这条命令不会有任何输出而且退出码是0。有些脚本会利用这个退出码做判断直接写dnf check-update dnf update -y就能实现“有更新才执行后续命令”的效果。第二步执行更新sudo dnf update -y跟apt upgrade不同的是dnf update默认会一并处理内核更新包括新内核的安装不需要额外再做一步。这也是桌面版和服务器版在更新体验上一个比较明显的差异。第三步清理旧内核和多余包sudo dnf autoremove -y sudo dnf remove --oldinstallonlyautoremove清理孤立依赖包remove --oldinstallonly删除过旧的、不再需要保留的内核版本。在服务器上/boot分区被旧内核塞满是常见故障定期执行这两条命令能有效避免。第四步查看更新历史审计用sudo dnf history sudo dnf history info IDdnf history能列出所有历史事务记录每一条都有编号、操作时间和软件包数量。如果需要回滚某次更新可以用sudo dnf history rollback ID这是apt体系不太好实现的功能服务器版反而更讲究。3.3 重启验证与查看更新日志无论走哪条技术路线更新命令执行完都不代表事情结束了。系统更新会涉及内核、驱动、系统库的替换这些变更基本都需要重启才能真正生效。我见过太多人更新完不重启然后跑过来跟我说“版本号怎么没变”其实就是没重启。重启后第一时间做三件事# 1. 确认内核版本是否已更新到预期版本 uname -r # 2. 确认系统版本号 cat /etc/os-release # 3. 查看更新的历史日志apt系和dnf系位置不同 # apt系 grep -E upgrade|install /var/log/apt/history.log | tail -n 50 # dnf系 sudo dnf history特别说一点内核版本确认是重中之重。如果升级完uname -r显示的内核版本跟升级前一样说明新内核没有成功安装或者启动时默认引导了旧内核这个时候就要检查/boot分区和引导程序配置了。3.4 特殊场景离线升级与内网代理很多麒麟系统部署在隔离内网没法直接访问外网软件源这时候命令行更新的方式要从“在线拉取”换成“离线导入”。我的做法是准备一台能联网的同版本机器用apt download或dnf download下载好所有需要的软件包拷到U盘上带进去再用dpkg -i *.deb或rpm -Uvh *.rpm离线安装。apt系可以这样下载指定软件包# 在一台联网的同架构机器上执行 mkdir /tmp/updates cd /tmp/updates apt download $(apt list --upgradable -o APT::Cmd::pattern* 2/dev/null | awk -F/ {print $1} | tr \n )dnf系有专门的下载插件sudo dnf install -y dnf-plugins-core sudo dnf download --resolve --alldeps --destdir/tmp/updates 软件包名离线安装的时候有个细节安装包之间的依赖顺序必须正确后安装的包依赖先安装的包否则会反复报依赖缺失。我的习惯是先安装所有deb包两遍第一遍不管报错直接全量安装第二遍再补装失败的包基本能解决大部分依赖顺序问题。rpm系则注意用-Uvh而不是-ivh升级场景下-U语义更安全。如果内网环境需要通过代理访问外部源可以在命令行前面临时设置环境变量export http_proxyhttp://代理地址:端口 export https_proxyhttp://代理地址:端口 sudo -E apt update注意sudo -E的作用是保留当前用户的环境变量不加这个参数你设置好的代理在sudo之后可能就失效了。4. 更新中途翻过的车全在这儿了4.1 软件源报错、仓库失效、返回404命令行更新最常见的报错无非就是Failed to fetch、404 Not Found、The repository ... is not signed。遇到这种问题不用慌大部分是源配置失效或者镜像同步不完整导致的。我的排查顺序是这样的先看报错的URL指向哪里如果指向的是某个已经失效的路径多半是源版本不匹配比如系统已经从V10小版本升上去了但源还停留在旧版本的路径如果是指向某个第三方源检查这个第三方源是否还活着。确认之后把源配置改回官方源或可用镜像源再执行一次apt update或dnf makecache重新刷新缓存。注意修改源配置文件前一定记得备份我见过很多人改坏了源文件之后又忘了原来的内容是什么最后只能重装系统。备份命令在第2章已经给过了别偷懒。4.2 软件包依赖冲突系统让你“保留现状”apt系的典型报错是“下列软件包有未满足的依赖关系”“您要求某些软件包保持现状就是说它们不会被升级”dnf系往往直接报“依赖冲突”。这个问题在麒麟系统上尤其常见原因通常是系统里混装了不同来源的软件包比如某些商业软件自带的依赖库版本和官方源不一致。对付依赖冲突我先试保守方案sudo apt --fix-broken install -y sudo apt --fix-missing upgrade -y--fix-broken专门修复系统中已经损坏的依赖关系执行完之后再跑一次正常升级。如果还不行再考虑用dist-upgrade来做一次更彻底的依赖解析。dnf系也有对应的--allowerasing参数允许移除冲突的包但用之前一定再三确认别把关键库删了。千万不要一上来就dpkg --force-all -i硬装包这种强制操作运气好能救回系统运气不好直接让系统起不来对新手来说风险太高。4.3 更新到一半断网、断电包管理器卡死更新过程中断是最让人血压升高的事故。apt系如果中断下一次执行任何apt命令都会提示dpkg was interrupted要求先修复。修复命令是固定的sudo dpkg --configure -a这条命令会重新配置所有未完成的软件包把中断的事务补齐。dnf系中断后往往会在/var/cache/dnf留下锁文件导致后续命令一直提示“等待其他进程退出”。稳妥的做法是杀掉残留进程、备份并清理锁文件sudo pkill -9 dnf sudo rm -rf /var/cache/dnf/* sudo dnf clean all这里特意说一句断电断网这种事防不胜防最可靠的防护是在更新前做一次系统快照。虚拟机很快物理机也可以借助备份工具。哪怕只是临时用rsync把/etc和关键数据备份走都比裸奔强。4.4 更新后开机黑屏、进不了系统更新完重启结果机器黑屏或卡在启动界面这是最让人崩溃的场景。出现这种情况的原因通常有几种新内核与显卡驱动不兼容、系统引导配置被更新覆盖、某个核心库升级后与闭源驱动冲突。遇到黑屏不要着急重装先试着在开机启动菜单里选择旧的内核版本启动。麒麟系统默认支持多内核引导开机时按Esc或Shift具体按键跟引导方式有关一般会看到引导菜单选择Advanced options里的旧内核进入系统。能进系统之后再处理驱动问题比如把显卡驱动卸载重装或者把新内核卸掉。如果在引导菜单里连旧内核都找不到那就需要在grub界面按e进入编辑模式在内核启动参数末尾加上single进入单用户模式再通过命令行恢复。单用户模式也经常用来重置密码和修复引导这是我处理更新黑屏问题时的兜底方案。严重时可以考虑从Live镜像启动把系统盘挂载起来修复但那就是另外一个话题了。4.5 公钥签名报错PUBKEY缺失apt update时经常遇到“The following signatures couldnt be verified because the public key is not available: NO_PUBKEY XXXXXXXX”这类的提示dnf系则是GPG导入失败。原因是软件源发布方更新了签名密钥而本机没有导入新密钥。apt系的修复办法是导入缺失的公钥。比如报错里给出KEY_ID可以这样操作sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com KEY_ID不过新版麒麟系统逐渐弃用apt-key推荐用add-apt-repository或者手动把公钥放到/usr/share/keyrings/下再在源配置里用signed-by指定。dnf系通常是重新导入.repo文件里指定的GPG keysudo rpm --import GPG_KEY_URL或本地key文件遇到公钥问题首先要确认源是不是官方源。如果源本身来路不明这个公钥导入操作就完全没有意义甚至可能有安全风险。4.6 磁盘空间不足/boot分区被旧内核占满更新版本多了之后/boot分区爆满是迟早的事尤其是桌面版默认分配的/boot分区不是很大旧内核、旧initramfs文件会越堆越多。表现就是更新命令跑到一半报No space left on device。解决思路是清理旧内核。apt系先检查当前正在使用的内核版本然后把不需要的旧内核清理掉# 查看当前使用的内核 uname -r # 列出所有已安装的内核 dpkg --list | grep linux-image # 清理旧内核和孤立包 sudo apt autoremove --purge -ydnf系更简单一条命令清掉所有旧版本内核sudo dnf remove --oldinstallonly -y清理之前一定要确认当前正在使用的内核版本无论如何不要删掉正在运行的那个内核否则重启就起不来了。这个提示我用加粗写在这里它值得被记住。5. 生产环境更新的策略与长期习惯5.1 先备份再更新快照才是真正的后悔药“更新前做备份”这句话我从入门说到现在但真正严格执行的人其实不多。更新系统不是装个普通软件那么简单它动的是整个系统基底一次内核升级、一个系统库的替换就可能让某些业务软件无法运行。我个人的执行标准是生产机器更新前至少完成两部分备份。一部分是数据备份包括数据库、应用数据、/etc目录等关键配置另一部分是系统级备份虚拟机和云主机直接打快照物理机用备份工具做整盘镜像。前者保数据后者保系统两者缺一不可。有了快照之后更新出了问题最多花几分钟回滚没有快照的话可能就是几小时的抢救时间。5.2 灰度更新别拿生产环境当试验场批量更新几十台机器时我的习惯永远是先拿一台测试机跑完整流程确认没有任何问题了再分批次往生产环境推。这个习惯救过我很多次因为软件源仓库里偶尔会混入有问题的软件包在测试机上先把雷踩掉生产环境就不用踩了。另外生产环境里有些关键软件是不希望被随便升级的比如数据库客户端、某些定制业务组件。这时候可以用版本锁定功能让更新命令自动跳过这些包# apt系锁定/解锁软件包 sudo apt-mark hold 软件包名 sudo apt-mark unhold 软件包名 # 查看锁定列表 apt-mark showhold # dnf系需要启用versionlock插件 sudo dnf install -y dnf-plugins-core sudo dnf versionlock add 软件包名 sudo dnf versionlock delete 软件包名 sudo dnf versionlock list版本锁定是双刃剑锁得太多会让系统长期处于旧版本状态安全补丁也打不上来。我的建议是只锁定那些“升级必炸”的核心业务依赖其余包保持跟随系统更新。5.3 更新日志与审计每一次变更都要有据可查运维最怕的不是出事而是出事了找不到是谁在什么时候改了什么。命令行更新天然具备审计优势只要你会看日志每个包的变化都能追到。apt系每次安装、升级、卸载都会有记录日志集中在/var/log/apt/history.log记录命令操作和涉及的软件包/var/log/apt/term.log记录安装过程的终端输出/var/log/dpkg.log记录每个软件包的具体动作dnf系更成熟一条sudo dnf history就能列出所有事务记录配合dnf history info ID还能看到该次事务里每个包的详情。我建议运维同学把dnf history的输出定期归档尤其是批量更新之后留存一份更新前后的软件包列表这是排查问题的重要参照。5.4 建立定期更新的习惯安全补丁别积压麒麟系统会不定期推送安全补丁和功能更新很多人一忙起来就几个月都不更新等要用的时候发现系统已经落后太多一次更新要处理几百个软件包风险反而更大。我的建议是根据系统的实际用途建立不同的更新节奏测试环境可以每周或每两周更新一次保持接近最新状态生产环境至少每月做一次安全补丁更新同时结合业务窗口期安排重启。更新这件事就像家用车的定期保养按时做成本最低拖到最后一起修才真的费钱费时。提示如果你有大量麒麟机器需要维护可以考虑写一个简单的更新脚本用for循环加并发执行配合同样的日志输出格式跑完一批机器之后统一收集日志。但脚本里务必加“更新前检查磁盘空间”“更新后检查内核版本”这种关键判断比人肉操作靠谱得多。写在最后说一点个人体会这几年代维麒麟系统的经历让我养成一个习惯每次给客户做批量更新前我一定会先在一台测试机上完整跑一遍命令记录每一步的输出和耗时把可能出问题的包提前标记出来然后再动生产机器。真正翻车的几次几乎都发生在跳过这个步骤、直接开干的时候。命令行更新的门槛其实很低难的是把“更新”这件事做规范、做可控。希望这篇内容能让你少踩几个坑下次再看到终端里的更新命令心里能更有底。