news 2026/7/6 2:56:11

管理Linux软件包和进程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
管理Linux软件包和进程

Linux软件包管理:从源码编译到YUM仓库,再到进程管理 —— 原理与实战

前言

在Linux系统中,软件包管理是运维人员最常打交道的操作之一。无论是安装Web服务器,还是部署数据库环境,都离不开它。但你有没想过:为什么Linux有源码安装、RPM、YUM这么多种装软件的方式?它们之间是什么关系?YUM仓库里的repodata目录到底存了什么?

本文将以CentOS 7为操作环境,从软件安装方式的演进历史讲起,深入解析YUM仓库的核心机制(特别是 repodata 目录的结构与原理),再延伸到进程管理,助你从原理到实战全方位掌握Linux软件包和进程管理的知识。


一、软件安装方式的演进:源码 → RPM → YUM

在讲具体操作之前,我们先理清这三者的由来与关系,这能帮你建立起完整的认知框架。

1.1 源码编译 —— 最原始的方式

由来:在Linux早期,软件以源代码的形式发布。开发者用C/C++等语言写好代码,打包成.tar.gz.tar.bz2压缩包,用户下载后需要自行编译安装。

为什么需要它?

  • 早期Linux发行版(如Slackware、早期Debian)没有统一的包管理标准
  • 源码包可移植性好,一套源码可以在不同架构的机器上编译
  • 可以自定义编译参数,实现"量体裁衣"的性能优化

痛点:安装步骤繁琐——需要手动解压、运行configure检测环境、make编译、make install安装。最关键的是,依赖关系要手动解决(比如装A之前要先装B,B又依赖C……)。

1.2 RPM —— 二进制包的标准化

由来:为了解决"每次安装都要编译"的问题,红帽公司(Red Hat)提出了RPM(Red Hat Package Manager,红帽包管理器)。它将软件在特定环境下预先编译好,打包成.rpm格式,用户直接安装二进制包即可,无需编译。

为什么需要它?

  • 安装速度极快(省去了编译时间)
  • 软件包格式统一,命名规范,便于管理和查询
  • 产生了"包数据库"的概念(RPM数据库位于/var/lib/rpm/),可以查询已安装的包、文件归属等

痛点(致命缺陷):依赖地狱(Dependency Hell)。RPM虽然解决了编译问题,但依赖关系依然需要人工处理。假如你要装一个软件,它依赖10个库,每个库又依赖更多——手动逐一下载安装的工作量是不可接受的。这就催生了下一代的YUM。

1.3 YUM —— 自动解决依赖的智慧

由来:YUM(Yellow dog Updater, Modified)最初由Yellow Dog Linux发行版开发,后被红帽采纳为RHEL/CentOS的默认包管理器。它的核心创新是引入了"软件仓库(repository)"的概念。

为什么需要它?

  • 将所有RPM包集中到仓库服务器上
  • 仓库中附带元数据数据库(repodata),提前计算好了每个包的依赖关系
  • YUM客户端通过查表对比,自动计算完整的依赖链,一次性下载并安装所有需要的包
  • 管理员从"手工找依赖"变成了"一条命令搞定"

1.4 三者的关系图

┌─────────────────────────────────────────────────────┐ │ 软件安装方式演进 │ ├─────────────┬──────────────────┬─────────────────────┤ │ 源码编译 │ RPM安装 │ YUM/DNF安装 │ ├─────────────┼──────────────────┼─────────────────────┤ │ 手工编译 │ 预编译二进制包 │ 仓库元数据自动解析 │ │ 依赖手动 │ 依赖手动 │ 依赖自动解决 │ │ 灵活最高 │ 安装最快 │ 使用最便捷 │ │ 效率最高 │ 标准化 │ 支持批量管理 │ ├─────────────┴──────────────────┴─────────────────────┤ │ 时间/便捷度 → │ │ (越往后越方便,但离源码越远) │ └──────────────────────────────────────────────────────┘

一句话总结:源码编译是"自己做饭",RPM是"买速冻食品",YUM是"叫外卖还帮你配好套餐"。


二、源码编译安装:理解软件的"编译-安装"全过程

2.1 实战:编译安装Nginx

我们从官网获取Nginx源码包来演示。

(图中红色下划线标注了 wget 命令的下载地址和文件保存位置,这是从Nginx官网获取源码的关键一步)

下载完成后解压,可以看到源码目录的结构:

(红色下划线标注了源码目录中最核心的三个部分:configure可执行脚本、Makefile.in模板文件、以及源码的README文档)

2.2 configure —— 安装环境检测器

这是源码安装的灵魂步骤。configure是一个Shell脚本(由autoconf工具生成),它的任务包括:

  • 检查系统是否安装了所需的编译器(gcc、g++等)
  • 检查依赖的库文件和头文件是否存在
  • 检查关键系统函数和特性的可用性
  • 根据检测结果生成 Makefile 文件(后续make命令就靠它了)

执行./configure开始检测:

configure会逐项检查编译环境,红色下划线标注了它正在检测的关键项

如果环境中缺少依赖,configure会报错并终止。例如编译Nginx需要PCRE库(正则表达式支持)和OpenSSL库(HTTPS支持),我们就先用yum安装它们:

(图中使用了 yum install 而非 rpm 安装依赖——这恰好印证了YUM自动解决依赖的优势,一条命令就把库及其所有子依赖全装好了)

所有依赖安装完毕后,再次执行configure,如果看到以下界面说明环境已就绪:

(红色下划线标注了configure执行成功的标志性输出,最后一行提示"现在可以执行make了")

2.3 make && make install

configure生成Makefile后,make命令读取Makefile中的指令,调用编译器(gcc)将源码编译为二进制可执行文件。make install将这些文件安装到系统目录(通常为/usr/local/)。

思考:源码安装虽然步骤多,但为什么还有人在用?因为在本机编译的代码能针对当前CPU指令集做优化,性能往往比通用RPM包高5%~15%。在追求极致性能的场景(如高频交易、数据库内核)中,源码编译仍是首选。


三、RPM包管理:二进制包的标准化分发

3.1 RPM解决了什么问题

源码编译虽好,但每次安装都要等编译(大型软件如MySQL编译一次可能半小时)。RPM将软件在特定环境下预编译好打包,用户直接rpm -ivh 包名.rpm即可安装。

RPM包命名规则(以zsh-5.0.2-14.el7.x86_64.rpm为例):

zsh -5. 0. 2 -14 .el7 .x86 .64 软件名 主版本 次版本 修订 发布次数 系统版本 CPU架构 系统位数

其中.el7表示该包是为RHEL 7 / CentOS 7编译的,这保证了二进制包与操作系统的兼容性。

3.2 RPM的"依赖地狱"

RPM安装时会读取包头部的Requires字段,检查系统是否满足依赖。如果不满足则报错退出。例如安装QQ Linux版时:

[root@server /]# rpm -ivh linuxqq_3.1.1-11223_x86_64.rpm错误:依赖检测失败: libXScrnSaver 被 linuxqq-3.1.1_11223-1.x86_64 需要

你必须手动找到libXScrnSaver这个包,先安装它:

[root@server /]# yum install libXScrnSaver # 这里用yum,因为libXScrnSaver本身也有依赖[root@server /]# rpm -ivh linuxqq_3.1.1-11223_x86_64.rpm

假如依赖链是 A → B → C → D → E,你就得手动装5次——这就是依赖地狱(Dependency Hell)

关键转折:RPM本身不具备自动处理依赖的能力,它只是"检查并拒绝"。真正解决这个问题的是下一代的YUM。


四、YUM —— 自动化解依赖的仓库机制(核心重点)

4.1 YUM是什么

YUM(Yellow dog Updater, Modified)是在RPM之上构建的高层包管理工具。它仍然使用RPM包作为安装单元,但通过引入软件仓库(Repository)的概念,解决了依赖问题

一句话:YUM = RPM + 仓库元数据 + 自动依赖解析。

在 CentOS 7 中,yum就是原生命令,不是软链接:

[root@server ~]# which yum/usr/bin/yum[root@server ~]# rpm -qf /usr/bin/yumyum-3.4.3-168.el7.centos.noarch

4.2 YUM的工作原理(核心机制)

YUM的工作流程可以分解为以下步骤:

用户执行 yum install httpd │ ▼ 读取 /etc/yum.repos.d/*.repo 配置文件 │ ▼ 连接 baseurl 指定的仓库地址 │ ▼ 下载 repodata/repomd.xml(仓库入口文件) │ ▼ 根据 repomd.xml 下载 primary.xml.gz 等元数据 │ ▼ 与本机 RPM 数据库(/var/lib/rpm/)比对 │ ▼ 计算完整的依赖树(递归解析 requires 和 provides) │ ▼ 一次性下载所有需要的 RPM 包并安装

核心思想:提前建好数据库(repodata),安装时查表比对,一次解决所有依赖。

4.3 深度解析:repodata(YUM仓库的核心)

这是本文最核心的章节——repodata目录到底存放了什么?

当一个目录被配置为YUM仓库时,必须包含repodata/子目录,该目录由createrepo命令生成。如果把YUM仓库比作一家超市,RPM包是货架上的商品,那么repodata就是超市的商品目录和索引——告诉你什么商品在哪个货架、商品之间有什么搭配关系。

repodata/ ├── repomd.xml ← 仓库的总入口文件(清单) ├── primary.xml.gz ← 所有RPM包的基本信息(名称、版本、依赖、提供) ├── filelists.xml.gz ← 所有RPM包中包含的文件列表 ├── other.xml.gz ← 额外信息(变更日志、包描述等) ├── primary.sqlite.bz2 ← SQLite格式的primary数据(兼容旧版yum) └── filelists.sqlite.bz2 ← SQLite格式的filelists数据
repomd.xml —— 仓库"清单"

这是YUM客户端第一个下载的文件。它的作用是告诉YUM:

  • 这个仓库里有哪几个元数据文件
  • 每个元数据文件的文件名、路径
  • 每个文件的校验值(checksum,用于验证文件完整性)
  • 文件的生成时间

可以理解为超市门口的"导购图"——告诉你各个区域在哪里。

primary.xml.gz —— 最核心的元数据

这是最关键的元数据文件,记录了仓库中每一个RPM包的完整信息:

信息类别内容作用
包标识名称、版本号、架构、大小区分和识别包
Requires(依赖)运行时需要哪些库/包YUM据此判断缺什么
Provides(提供)提供了哪些库/能力YUM据此匹配依赖
Conflicts(冲突)与哪些包不兼容避免安装冲突
Obsoletes(取代)取代了哪些旧包处理包更名和升级
filelists.xml.gz

记录了每个RPM包安装后会产生哪些文件及其路径。当你使用yum provides /path/to/file查询某个文件由哪个包提供时,YUM就是在这个文件中查找的。

例如你误删了/bin/ls,可以用:

yum provides /bin/ls# 返回:coreutils-8.22-24.el7.x86_64# 说明/bin/ls由coreutils包提供,重新安装即可
依赖解析的完整示例

我们来模拟一下YUM安装httpd时的依赖解析过程:

Step 1: YUM 读取 primary.xml.gz,找到 httpd 的 Requires 发现需要:libapr-1.so.0, libaprutil-1.so.0, libpcre.so, ... Step 2: YUM 在同一仓库中查找 Provides 这些库的包 找到:apr-1.6.3 提供了 libapr-1.so.0 apr-util-1.6.1 提供了 libaprutil-1.so.0 pcre-8.44 提供了 libpcre.so Step 3: 递归检查这些依赖包自身是否还有依赖 apr 还需要:libc.so.6, libpthread.so.0(glibc提供,系统已安装) ...递归直到全部满足 Step 4: 确定最终的安装集合:httpd + apr + apr-util + pcre + ... 一次性下载并安装

这就是YUM自动解决依赖的底层原理——基于预计算元数据的查表替换了人工递归查找

repodata的生成

如果你搭建自己的YUM仓库,使用createrepo命令生成repodata:

createrepo /path/to/repo/# 会自动在 /path/to/repo/ 下生成 repodata/ 目录

初次生成较慢,之后可以用--update增量更新:

createrepo--update/path/to/repo/

4.4 CentOS 7的仓库结构

CentOS 7中,ISO镜像挂载后是单一仓库结构

/media/ ├── Packages/ ← 存放所有RPM包的目录(数千个) ├── repodata/ ← 仓库元数据(本文核心) ├── .discinfo ├── RPM-GPG-KEY-* ├── isolinux/ └── ...

这与RHEL 8+/CentOS 8+不同——后者拆分为BaseOSAppStream两个仓库(双仓库架构)。CentOS 7的单一仓库同时包含系统组件和应用程序的包,由一个元数据集(单个repodata)统一管理。

(图中红色下划线标注了 CentOS 7 ISO 挂载后的关键目录结构:Packages 目录存放所有RPM包,repodata 目录存放元数据。这两个目录共同构成了一个完整的YUM仓库)

4.5 配置YUM本地源

第一步:挂载ISO镜像
mount/dev/cdrom /media

(挂载前 /media 目录为空,红色下划线标注了光驱设备文件 /dev/sr0)

第二步:编写 .repo 配置文件

YUM的所有仓库配置存放在/etc/yum.repos.d/目录下,以.repo结尾。系统启动时会扫描该目录下所有.repo文件。

# 先备份原有的repo文件,使其失效mv/etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back# 新建本地源配置文件vim/etc/yum.repos.d/local.repo

写入以下内容:

[local-repo] name=Local YUM Repository baseurl=file:///media/ gpgcheck=0 enabled=1

(图中红色下划线标注了三个关键参数:baseurl 指向本地挂载路径、gpgcheck=0 跳过GPG验证、enabled=1 启用仓库。新手最容易犯错的就是路径写错或指向了repodata内部,注意baseurl要指向包含repodata的那一层目录,而不是repodata本身)

参数解读
参数含义说明
[local-repo]仓库ID唯一标识,不能重复,不能有空格
name仓库描述名给人看的,会显示在yum repolist
baseurl仓库地址file://本地路径、http://https://网络路径、ftp://
gpgcheck是否校验GPG签名1开启(安全),0关闭(方便)
gpgkeyGPG公钥文件路径gpgcheck=1时必须指定
enabled是否启用0禁用,1启用(可缺省,默认启用)

重要:baseurl的路径要指向包含 repodata 目录的父目录。YUM会自动在 baseurl 路径下查找repodata/repomd.xml。如果路径写成了/media/repodata/,YUM会找不到入口文件。

第三步:生成缓存并验证
yum clean all# 清除旧缓存yum makecache# 重新生成缓存(下载repodata到本地/var/cache/yum/)yum repolist# 查看当前启用的仓库yuminstalltree-y# 测试安装

4.6 配置YUM网络源

相比本地源,网络源只是将baseurlfile://换成了http://

[base] name=CentOS-7 - Base baseurl=http://mirrors.aliyun.com/centos/7/os/x86_64/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [extras] name=CentOS-7 - Extras baseurl=http://mirrors.aliyun.com/centos/7/extras/x86_64/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [updates] name=CentOS-7 - Updates baseurl=http://mirrors.aliyun.com/centos/7/updates/x86_64/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

注意:这里打开了gpgcheck=1,因为是从互联网下载,需要验证包的签名以确保没有被篡改。gpgkey指定了公钥的下载地址。

需要说明的是,网络源的仓库目录结构在远端的镜像服务器上也是标准化的——每个子仓库(base、extras、updates)都独立拥有自己的Packages/repodata/目录。

(红色下划线标注了网络源配置中的关键差异:baseurl 从 file:// 换成了 http:// 网络地址,且配置了 gpgkey 进行包签名验证)

4.7 验证配置结果

执行yum repolist查看已生效的仓库:

(图中红色下划线标注了配置成功的标志性输出:repolist 正确显示了仓库ID和包数量。如果显示0或者报错,通常是 baseurl 路径错误或网络不通)

4.8 常用YUM命令速查

命令用途类比
yum repolist查看启用的仓库列表查看"外卖店"列表
yum list all列出所有可安装包翻看菜单
yum list installed列出已安装的包看冰箱里有什么
yum info 包名查看包详细信息看菜品的配料表
yum install 包名安装包(自动解依赖)点一份套餐
yum groupinstall "开发工具"安装整个包组点一份全家桶
yum update 包名升级包换新口味
yum remove 包名卸载包扔掉
yum provides /path查文件属于哪个包查这个零件从哪来
yum search 关键词模糊搜索包名按关键词搜菜单
yum clean all清除本地缓存清空手机缓存
yum makecache重新生成缓存刷新页面
yum reinstall 包名重新安装包重新下载(修复用)

五、管理进程

软件装好了要运行,运行中的程序就是进程。下面我们来看看如何查看和管理进程。

5.1 程序、进程与线程

概念定义生活中的比喻
程序存储在磁盘上的二进制文件(静态)一本菜谱
进程程序的一次执行实例(动态,有生命周期)按照菜谱做菜的过程
线程进程内的最小执行单元多个厨师协作做同一道菜

关键区别:

  • 进程是资源分配的最小单位(拥有独立的内存空间)
  • 线程是CPU调度的最小单位(共享进程的内存空间)
  • 一个程序可以对应多个进程(如Nginx Master + Worker),一个进程可以包含多个线程

5.2 ps命令 —— 查看进程静态快照

ps用于显示某个瞬间的系统进程状态。最经典组合是ps aux

(图中红色下划线标注了 ps aux 输出中最关键的几个字段:PID(进程标识符)、%CPU(CPU占用率)、%MEM(内存占用率)、STAT(进程状态)、COMMAND(进程命令)。其中 PID 是管理进程的唯一标识,STAT 反映了进程当前的生命周期状态)

输出字段详解:

字段含义说明
USER运行该进程的用户root表示系统进程,普通用户运行自己的进程
PID进程ID(唯一标识)管理中最重要的字段,kill时需要它
%CPUCPU占用百分比多核下可能超过100%,单个核最高100%
%MEM物理内存占用百分比如果某个进程异常高,可能是内存泄漏
VSZ占用虚拟内存大小(KB)进程申请的虚拟地址空间
RSS驻留物理内存大小(KB)实际占用的物理内存,但这个值不准确
TTY关联的终端?表示没有终端(后台服务进程)
STAT进程状态R运行、S睡眠、D不可中断、T停止、Z僵尸
START启动时间看系统已运行多久了
TIME占用CPU的总时间不是运行时间,是累计占用的CPU时间
COMMAND进程命令名通常包含完整的命令路径

STAT进程状态速查口诀:

状态码含义说明
R运行中(Running)正在占用CPU或处于运行队列
S可中断睡眠(Sleeping)等待某事件发生,可被信号唤醒
D不可中断睡眠通常是I/O等待,杀不死(连kill -9也不行)
T已停止(Stopped)通常被Ctrl+Z挂起
Z僵尸(Zombie)已终止但父进程未回收,占着PID不释放
<高优先级优先获得CPU时间
N低优先级谦让CPU时间
s会话领导者通常是进程的父进程
l多线程进程包含多个线程
+前台进程组当前终端的前台进程

僵尸进程特别说明:子进程结束后会发送SIGCHLD信号给父进程,父进程调用wait()系统调用回收子进程的资源。如果父进程没调用wait(),子进程变成僵尸——它的资源已被释放,但在进程表中仍占一个条目。僵尸无法被kill -9杀死,只能杀掉它的父进程,由init进程接管回收。

5.3 top命令 —— 实时动态监控

ps看到的是某一瞬间的快照,top则提供持续刷新的动态视图:

(图中红色下划线标注了 top 输出中最核心的指标:第一行的负载平均值(load average)、第三行的CPU空闲率(id)、以及进程列表中的%CPU和%MEM。这是判断系统是否健康的首要观察点)

统计信息区(前5行)逐行解读:

第1行:系统概况 ───────────────────────────────────────────────────────────── top - 17:21:03 up 4:32, 5 users, load average: 0.19, 0.08, 0.06 ↑当前时间 ↑运行时长 ↑登录用户数 ↑1分钟/5分钟/15分钟平均活跃进程数 load average 解读(重要): - 数值 = 平均有多少进程在等待CPU(包括正在运行的 + 排队等待的) - 判断标准:与CPU核心数对比。4核CPU上 load < 4.0 基本正常 - > 4.0 表示有进程在排队,系统过载 - > 8.0 表示严重过载,需要排查 - 三个值趋势:如果1分钟 > 5分钟 > 15分钟,说明负载在上升,要关注
第2行:进程统计 ───────────────────────────────────────────────────────────── Tasks: 483 total, 3 running, 480 sleeping, 0 stopped, 0 zombie ↑进程总数 ↑运行中 ↑睡眠中 ↑停止 ↑僵尸 Zombie 不为 0 通常意味着程序有bug,需要关注。
第3行:CPU使用率(最重要!) ───────────────────────────────────────────────────────────── %Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st us (user) : 用户空间程序占用的CPU → 高说明应用程序在干活 sy (system) : 内核空间占用的CPU → 高说明系统调用频繁(可能有问题) ni (nice) : 被调整过优先级的进程占的CPU → 通常很低 id (idle) : 空闲CPU百分比 → 越低说明系统越忙 wa (iowait) : 等待I/O完成占用的CPU → 高说明磁盘/网络是瓶颈(重要!) hi (hardirq) : 硬件中断占用的CPU si (softirq) : 软件中断占用的CPU st (steal) : 被虚拟机偷走的CPU时间(仅虚拟机有意义) 排障口诀: us高 → 应用程序有问题或请求太多 wa高 → 磁盘I/O是瓶颈(换SSD或加内存缓存) id高 + 系统卡 → 可能有锁竞争或进程挂起
第4-5行:内存使用率 ───────────────────────────────────────────────────────────── KiB Mem : 3865528 total, 1842620 free, 811540 used, 1211368 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 2743928 avail Mem total/free/used: 物理内存总量/空闲/已用 buff/cache: 内核用做缓存和缓冲的内存(可被回收) avail Mem: 新进程实际可用的内存(比 free 更准确的指标) Swap used: 如果 > 0,说明物理内存不够用了,系统在用磁盘当内存(性能急剧下降)

进程信息区字段:

字段含义说明
PID进程ID唯一标识
USER进程所有者
PR内核调度优先级由内核动态调整
NInice值(用户可调)-20~19,越低优先级越高
VIRT虚拟内存(KB)进程申请的总内存(含共享库)
RES常驻物理内存(KB)实际占用的物理内存
SHR共享内存(KB)与其他进程共享的内存
S进程状态R/S/D/T/Z
%CPUCPU占用按核计算
%MEM内存占用相对于物理内存总量
TIME+CPU累计时间进程启动以来占用CPU的总时间
COMMAND命令名

5.4 进程管理实战命令

# 查找进程pgrep-lsshd# 按名字查PID(-l显示名称)pidof sshd# 直接查sshd的PIDpsaux|grepsshd# 经典组合,grep过滤# 查看进程树pstree# 树形展示,能清晰看到父子关系# 自定义查看字段psaxo user,pid,ppid,%mem,%cpu,comm--sort=-%mem# 按内存占用排序# 结束进程kill-15PID# SIGTERM,优雅终止(默认)kill-9PID# SIGKILL,强制终止(慎用)killall进程名# 按名字批量终止pkill进程名# 按名字终止(更灵活)

六、总结与思考

知识脉络图

软件安装方式的演进(背后的逻辑是什么?) ═══════════════════════════════════════ 没有包管理 → 源码编译(手工解压 → configure → make → make install) ↓ 痛点是:每次都要编译,依赖要自己找 RPM 诞生 → 二进制预编译包(解决了编译问题) (1997年) ↓ 痛点是:依赖仍需手动解决,陷入"依赖地狱" YUM 诞生 → 仓库 + repodata(解决依赖问题) (2003年) ↓ 核心创新:预计算依赖数据库,查表替代递归查找 DNF 迭代 → YUM的下一代(RHEL 8+ 默认) (2012年) ↓ 用libsolv库,依赖解析性能提升 容器化 → Docker/Flatpak/Snap(完全隔离,未来趋势)

核心收获

  1. repodata 是YUM仓库的灵魂。它本质上是一个预计算的依赖数据库——primary.xml 记录每个包的 requires 和 provides,YUM通过查表匹配,一次性计算出完整的依赖链。这一设计思想(预计算 → 存起来 → 查表重用)在计算机科学中非常经典,你可以在构建系统(Make)、缓存系统、甚至大型软件项目的模块管理中找到类似的设计。

  2. 从源码到RPM到YUM,每一次演进都在解决前一代的痛点:编译太慢→用RPM预编译;依赖太难→用YUM + repodata自动解析。理解了这个演进逻辑,你就不会觉得这些工具只是"一堆命令"。

  3. 进程是程序的运行时实例,是一切故障排查的起点。ps看静态快照、top看动态趋势、kill发信号控制。load average、CPU iowait、swap使用率是系统健康度的"三大指标"。

延伸思考

如果你管理多台服务器,可以搭建本地YUM仓库镜像(使用reposync同步官方源 +createrepo生成repodata),这样内网服务器从本地仓库安装,速度快且不受外网影响。进阶可以结合nginx做HTTP仓库服务器,或使用katello/foreman实现企业级的包生命周期管理。


本文基于 CentOS 7 实战操作撰写,所有截图均为作者实际运行环境所得。

  1. repodata 是YUM仓库的灵魂。它本质上是一个预计算的依赖数据库——primary.xml 记录每个包的 requires 和 provides,YUM通过查表匹配,一次性计算出完整的依赖链。这一设计思想(预计算 → 存起来 → 查表重用)在计算机科学中非常经典,你可以在构建系统(Make)、缓存系统、甚至大型软件项目的模块管理中找到类似的设计。

  2. 从源码到RPM到YUM,每一次演进都在解决前一代的痛点:编译太慢→用RPM预编译;依赖太难→用YUM + repodata自动解析。理解了这个演进逻辑,你就不会觉得这些工具只是"一堆命令"。

  3. 进程是程序的运行时实例,是一切故障排查的起点。ps看静态快照、top看动态趋势、kill发信号控制。load average、CPU iowait、swap使用率是系统健康度的"三大指标"。

延伸思考

如果你管理多台服务器,可以搭建本地YUM仓库镜像(使用reposync同步官方源 +createrepo生成repodata),这样内网服务器从本地仓库安装,速度快且不受外网影响。进阶可以结合nginx做HTTP仓库服务器。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 2:55:35

GraphRAG 实战:工程实践里的常见坑

《GraphRAG 实战&#xff1a;工程实践里的常见坑》看起来是个大话题&#xff0c;但真落到项目里&#xff0c;常常就是几个具体选择。下面我尽量按实际开发时会遇到的问题来讲。摘要这篇面向需要构建企业知识库和复杂问答系统的开发者&#xff0c;但不会把“GraphRAG 实战&#…

作者头像 李华
网站建设 2026/7/6 2:55:09

大部分管理信息系统(MIS)都少不了员工

当为员工创建帐号并分配相应的权限后&#xff0c;该帐号即可登录系统并进行相应的操作。当员工与系统进行交互操作时&#xff0c;系统会把员工Id、操作时间、操作IP、操作内容等信息记录到操作日志中&#xff0c;以便随时审计。   这样&#xff0c;从Domain的角度讲&#xff…

作者头像 李华
网站建设 2026/7/6 2:48:26

企业级Agentic AI实战指南:从概念到落地的智能体架构与应用

&#x1f680; 30款热门AI模型一站整合&#xff0c;DeepSeek/GLM/Qwen 随心用&#xff0c;限时 5 折。 &#x1f449; 点击领海量免费额度 最近和不少企业技术负责人交流&#xff0c;发现一个普遍现象&#xff1a;大家聊起大模型和生成式AI&#xff08;GenAI&#xff09;时头…

作者头像 李华