本章系统讲解 Linux 软件管理:程序与软件包 的组成、RPM 的安装/查询/升级/卸载/校验、yum 仓库 与 yum 命令、源码编译安装 三步骤及 PATH/库/头文件/man 配置、以及 netstat 的常用用法。原文所有内容完整保留,并补充 Mermaid 图、生活例子和概念说明。
📌 本章核心概念一览
| 概念 | 一句话理解 |
|---|---|
| RPM | Red Hat 系二进制包格式;安装/查询/升级/卸载/校验,依赖数据库 /var/lib/rpm。 |
| yum | 前端工具,从仓库拉包并自动解决依赖,再调用 rpm 安装。 |
| 仓库 (repo) | 带元数据(primary、filelists、other、repomd)的目录,baseurl 指向 ftp/http/file。 |
| 依赖 | X 依赖 Y 表示装 X 前需先有 Y;rpm 不自动装依赖,yum 会。 |
| 编译安装 | ./configure → make → make install;安装后需配 PATH、库路径、头文件、man。 |
| GPG 校验 | 验签(来源)+ 摘要(完整性);rpm -K 校验,先 rpm --import 导入公钥。 |
| 多系统对比 | Red Hat 用 rpm/yum;Ubuntu 用 dpkg/apt;macOS 用 Homebrew/App Store,见二补充。 |
| 为何命令不同 | 内核只管"能跑",不管"怎么装";包格式和命令由发行版定,历史形成 RPM 系与 deb 系;Mac 非 Linux 内核,故更不同。 |
| 命令总览与存在原因 | 本章命令按包管理/编译/路径/查询/网络分类总览;为何要有 rpm、yum、configure、make、ldconfig、netstat 等见第十节。 |
| 与 Windows/Mac 使用对比 | 同一操作在三系统上的用法差异(CLI/图形、脚本化);Linux 用于运维线上项目的原因见 2.5。 |
📑 目录
- 一、程序与软件包基础
- [二、软件包管理器与 RPM 简介](#二、软件包管理器与 RPM 简介)
- [二补充、Red Hat/CentOS vs Ubuntu vs macOS 对比](#二补充、Red Hat/CentOS vs Ubuntu vs macOS 对比)
- 二补充、为什么不同系统有不同的包管理命令?
- [二补充、Linux 与 Windows/macOS 使用对比及运维线上定位](#二补充、Linux 与 Windows/macOS 使用对比及运维线上定位)
- [三、RPM 包命名与数据库](#三、RPM 包命名与数据库)
- [四、rpm 命令详解](#四、rpm 命令详解)
- [五、RPM 校验与 GPG 签名](#五、RPM 校验与 GPG 签名)
- [六、yum 仓库与 repo 配置](#六、yum 仓库与 repo 配置)
- [七、yum 命令详解](#七、yum 命令详解)
- 八、源码编译安装
- [九、netstat 命令参考](#九、netstat 命令参考)
- 十、本章命令总览与「为什么要有这些命令」
- 附录:命令速查与小结
一、程序与软件包基础 🧩
1.1 应用程序的形态
概念要点 :在 Linux 中,应用程序通常以两种形态存在:
| 形态 | 说明 | 生活例子 |
|---|---|---|
| 源码 | 人类可读的源代码(如 C、脚本) | 像菜谱------要经过"烹饪"才能变成能吃的菜 |
| 二进制 | 编译后的机器码,CPU 直接执行 | 像成品菜------直接可以吃 |
- C 语言 :源代码 → 编译 → 二进制格式(与 CPU 架构相关,如 x86、PowerPC)。
- 脚本 :由解释器(二进制程序)逐行解释执行,如 bash 解释 .sh。

源代码
编译
链接
二进制可执行文件
运行
1.2 程序与库
概念定义:
- 程序 = 指令 + 数据;指令 由 CPU 执行(分普通指令与特权指令),不同 CPU 有不同指令集(如 x86、PowerPC)。
- 库 (Library):被多个程序共用的代码集合,分为:
- 静态库 :编译时链接进程序,程序自带一份副本。
- 动态库(共享库) :单独存放在系统中,程序运行时再加载;多个程序可共享同一份,节省空间。
生活例子 :静态库 像把整本字典订进书里------书变厚但随时能查。动态库像图书馆------需要时去借,大家共用同一套书。
1.3 程序的组成部分
一个完整的软件包在系统中通常包含:
| 组成部分 | 说明 | 典型位置 |
|---|---|---|
| 二进制程序 | 可执行文件 | /usr/bin、/usr/sbin、/usr/local/bin |
| 库文件 | 静态库 / 动态库 | /lib、/usr/lib、/usr/local/lib |
| 配置文件 | 程序行为配置,格式如 dir=/path/to/somewhere |
/etc 下或程序指定目录 |
| 帮助文件 | 文档、man 页 | /usr/share/doc、/usr/share/man |
生活例子 :程序像一家店------二进制 是店员(干活的人),库 是共享的工具间,配置文件 是店规,帮助文件是使用说明书。
1.4 重要目录与分区建议
| 目录 | 说明 | 分区建议 |
|---|---|---|
| /dev | 设备文件 | 不能单独分区 |
| /root | root 家目录 | 不能单独分区 |
| /var | 可变数据(日志、缓存、yum 等) | 建议单独分区,避免写满根分区 |
| /boot | 内核、initrd(initramfs) | 可单独分区,存放引导所需文件 |
系统启动简要流程:
POST 加电自检
BIOS
MBR
Boot Loader
识别文件系统 ext2/3/xfs
内核
即:POST → BIOS(读硬盘)→ MBR → Boot Loader(认识文件系统结构,如 ext2、ext3、xfs)→ 加载内核。
二、软件包管理器与 RPM 简介 📋
2.1 软件包管理器的核心功能
概念定义 :软件包管理器 负责把"一堆文件 + 依赖信息"打包成软件包 ,并在系统中完成安装、卸载、升级、查询、校验 等操作,同时维护依赖关系(例如 X 依赖 Y,Y 依赖 Z)。
软件包管理器
制作软件包
安装
卸载
升级
查询
校验
生活例子 :软件包管理器像超市的进货与上架系统 ------要能入库 (安装)、下架 (卸载)、换新 (升级)、查库存 (查询)、验真伪(校验),还要知道"卖 A 必须先有 B"(依赖)。
2.2 主流发行版与包格式
| 发行版 | 包格式 | 后端工具 | 前端工具 |
|---|---|---|---|
| Red Hat、SUSE | RPM(RPM Package Manager,原 Red Hat Package Manager) | rpm | yum(Yellowdog Updater Modified)等 |
| Debian、Ubuntu | deb | dpkg | apt-get / apt |
依赖关系 :X → Y → Z 表示"装 X 需要先有 Y,装 Y 需要先有 Z"。前端工具(yum、apt)会自动解决依赖;后端工具(rpm、dpkg)只处理单个包,不自动拉取依赖。
用户
yum / apt-get
前端
rpm / dpkg
后端
数据库
/var/lib/rpm
2.3 Red Hat/CentOS、Ubuntu、macOS 软件管理对比 🆚
本章以 Red Hat/CentOS(RPM/yum) 为主;下面与 Ubuntu(deb/apt) 、macOS 做横向对比,便于在多系统间迁移或对照使用。
总体对比表
| 对比项 | Red Hat / CentOS | Ubuntu | macOS |
|---|---|---|---|
| 包格式 | .rpm | .deb | .pkg(安装包)、.dmg(镜像)、.app(应用包) |
| 后端工具 | rpm | dpkg | 系统安装器(pkgutil)、Homebrew 自管目录 |
| 前端工具 | yum / dnf | apt / apt-get | App Store(图形)、Homebrew(命令行) |
| 仓库/源配置 | /etc/yum.repos.d/*.repo | /etc/apt/sources.list、sources.list.d/ | Homebrew:Tap(公式 + 第三方) |
| 包数据库位置 | /var/lib/rpm | /var/lib/dpkg/ | Homebrew:/opt/homebrew(Apple Silicon)或 /usr/local(Intel) |
| 安装命令 | yum install / rpm -ivh | apt install / dpkg -i | brew install(Homebrew) |
| 卸载命令 | yum remove / rpm -e | apt remove / dpkg -r | brew uninstall |
| 升级命令 | yum update / rpm -Uvh | apt update && apt upgrade | brew upgrade |
| 查某文件属谁 | rpm -qf /path | dpkg -S /path | brew list --formula | xargs brew list(或查安装前缀) |
| 系统包来源 | 发行版官方 + 第三方 repo | 发行版官方 + PPA/第三方 | 系统/App Store;Homebrew 独立于系统 |
命令对照速查
| 操作 | Red Hat/CentOS | Ubuntu | macOS (Homebrew) |
|---|---|---|---|
| 安装软件 | yum install 包名 / rpm -ivh 包.rpm |
apt install 包名 / dpkg -i 包.deb |
brew install 包名 |
| 卸载 | yum remove 包名 / rpm -e 包名 |
apt remove 包名 / dpkg -r 包名 |
brew uninstall 包名 |
| 升级全部 | yum update |
apt update && apt upgrade |
brew upgrade |
| 搜索包 | yum search 关键词 |
apt search 关键词 |
brew search 关键词 |
| 已装列表 | rpm -qa / yum list installed |
dpkg -l / apt list --installed |
brew list |
| 包信息 | rpm -qi 包名 / yum info 包名 |
apt show 包名 / dpkg -s 包名 |
brew info 包名 |
| 文件属哪个包 | rpm -qf /path |
dpkg -S /path |
无直接等价,多为 Homebrew 前缀下文件属该 formula |
| 清理缓存 | yum clean all |
apt clean / apt autoclean |
brew cleanup |
Ubuntu 特有要点
- apt 是新一代前端,推荐用
apt代替老式apt-get(用法类似:apt install/remove/update/upgrade)。 - 源列表 :主配置
/etc/apt/sources.list,片段放在/etc/apt/sources.list.d/*.list;格式为deb URL 发行版 组件(如deb http://archive.ubuntu.com/ubuntu jammy main universe)。 - PPA (Personal Package Archive):
add-apt-repository ppa:用户/仓库名后apt update,相当于添加第三方源。 - 包名 :多为小写+连字符,如
nginx、build-essential(开发工具组)。
macOS 特有要点
- 系统自带 :通过 App Store 或双击 .pkg / .dmg 安装,不提供命令行"包名→安装"的统一工具。
- Homebrew (https://brew.sh):事实上的命令行包管理器。
- Formulae:命令行工具、库(如 git、nginx、python)。
- Casks :图形应用(如
brew install --cask firefox)。 - 安装路径:Apple Silicon 为
/opt/homebrew,Intel 为/usr/local;与系统自带的/usr/bin等隔离,避免覆盖系统文件。
- 其他:MacPorts、Fink 等使用较少,一般用 Homebrew 即可。
对比小结(生活例子)
- Red Hat/CentOS :像单位食堂------固定菜单(官方 repo),按名字打饭(yum install),食堂记账(/var/lib/rpm)。
- Ubuntu :像另一家食堂------菜单格式不同(deb),但也是"选菜名、自动带齐依赖"(apt install),仓库写在 sources.list。
- macOS :像超市 + 便利店 ------系统/App Store 是超市(图形、.pkg/.app);Homebrew 是便利店(命令行、brew install),自己有一片货架(/opt/homebrew 或 /usr/local),不碰系统自带的"货"。
Red Hat/CentOS
rpm / yum / .rpm
Ubuntu
dpkg / apt / .deb
macOS
Homebrew / App Store
.pkg .dmg .app
2.4 为什么不同系统有不同的包管理命令?底层不是 Linux 内核吗? 🤔
很多人会问:既然底层都是(或可以是)Linux 内核 ,为什么 Red Hat 用 yum、Ubuntu 用 apt、Mac 用 brew,命令和包格式都不一样?下面分几层说清楚。
内核只管"怎么跑",不管"怎么装"
Linux 内核 (Kernel)负责的是:进程调度、内存管理、文件系统、设备驱动、网络协议栈等------也就是让程序能跑起来 、能访问硬件和文件。内核不负责 "软件从哪里来、装到哪、依赖谁、用什么格式打包"。
也就是说:包格式(rpm/deb)、包管理命令(yum/apt)、仓库和配置文件放在哪,都不是内核规定的,而是"内核之上"那一层决定的。
应用程序
包管理器
yum / apt / brew
文件系统、库、配置
Linux 内核
进程·内存·驱动·网络
硬件
生活例子 :内核像房子的地基和承重墙------决定楼能不能立住、空间怎么划分。但"家具从哪家店买、怎么摆放、用哪种柜子"是**住户(发行版)**自己定的,和地基无关。
真正做选择的是"发行版",不是内核
在内核之上 ,有一个完整的操作系统 :库(glibc)、基础命令(coreutils)、init、Shell、包管理器 等。谁来决定用哪套包管理?是发行版 (Distribution):Red Hat、Debian、Ubuntu、SUSE 等。
每个发行版是一个独立项目,有各自的:
- 包格式(rpm vs deb)
- 文件布局(/etc、/usr 的用法)
- 默认软件源和仓库结构
- 配套工具链(gcc 版本、systemd vs SysV 等)
所以:同一颗 Linux 内核上,可以跑不同的发行版;不同发行版选了不同的"怎么装软件"的方案,所以命令和格式不一样。
可以粗略理解为:
| 层次 | 谁决定 | 例子 |
|---|---|---|
| 内核 | 内核社区 / 发行版打包的内核版本 | 进程、内存、驱动、系统调用 |
| 用户空间 + 包管理 | 发行版 | Red Hat 选 rpm/yum,Debian/Ubuntu 选 dpkg/apt |
历史原因:两套生态各自发展
- Red Hat 一脉 :早年 Red Hat 公司设计了 RPM 格式和
rpm命令,后来出现 yum 做依赖解析和仓库拉取。SUSE、CentOS、Fedora 等沿用这套,所以都用rpm/yum(或 dnf)。 - Debian 一脉 :Debian 社区设计了 .deb 格式和 dpkg ,后来有 apt 做依赖和源管理。Ubuntu 基于 Debian,所以继承 deb/apt。
两套体系在 1990 年代 就分叉了,没有统一成一套。一旦形成大量软件包、镜像站、文档、脚本 ,再统一成本极高,所以今天仍然是"两大家族":RPM 系 和 deb 系 。
结论 :不是"内核不一样",而是发行版历史上选了不同的包管理系统,所以命令不同。
macOS 为什么更不一样?
macOS 的底层不是 Linux 内核 ,而是 Darwin(XNU 内核),源自 BSD 和 Mach,和 Linux 是两套完全不同的内核与系统接口。所以:
- 系统自带的安装方式(.pkg、.dmg、App Store)是 Apple 自己设计的,和 Linux 的 rpm/deb 没有血缘关系。
- Homebrew 是后来社区做的"像 Linux 一样用命令行装软件"的工具,它自己维护一套公式和安装路径 (如 /opt/homebrew),刻意不取代系统自带的包,所以命令是
brew,和 yum/apt 只是"功能类似",不是"同一套东西换了个名字"。
所以:Mac 上命令不同,首先是因为连内核都不是 Linux,其次才是"谁来做包管理、怎么做"的选择。
一句话总结
| 问题 | 答案 |
|---|---|
| 底层不是 Linux 内核吗,为什么命令不一样? | 内核只负责让程序跑起来;用哪种包格式、哪条命令装软件,是"发行版"在用户空间定的,不是内核规定的。 |
| 为什么 Red Hat 和 Ubuntu 都是 Linux 却不同? | 历史上形成了两套生态(RPM 系 vs deb 系),各自选了不同的包格式和工具,所以命令不同。 |
| 为什么 Mac 更不一样? | Mac 用的是 Darwin/XNU 内核,不是 Linux;系统安装方式和 Homebrew 都是另一套设计。 |
2.5 Linux 与 Windows、macOS 使用对比及运维线上定位 🖥️
本节从使用方式 上对比:同一类操作在 Linux、Windows、Mac 上分别怎么做;并说明为什么运维线上项目通常用 Linux。
使用上的区别与对比(同一件事,三系统怎么做)
| 操作 | Linux(本章命令) | Windows | macOS |
|---|---|---|---|
| 安装软件 | 命令行:yum install 包名 / rpm -ivh 包.rpm;可脚本化、可远程 SSH 执行 |
多为图形:双击 .msi/.exe、Microsoft Store、或命令行 winget/choco | 图形:App Store、双击 .pkg/.dmg;命令行:brew install |
| 卸载 | yum remove / rpm -e,一条命令、可批量脚本 |
控制面板"卸载程序"或 winget uninstall | 拖到废纸篓或"启动台"删除;命令行 brew uninstall |
| 升级 | yum update 一次升级所有包;可写进 cron 定时执行 |
Windows Update 管系统;应用各自更新或 Store;winget upgrade | 系统更新 + App Store 更新;brew upgrade 升级 Homebrew 包 |
| 查"装了啥" | rpm -qa、yum list installed,纯文本、易用 grep/脚本 |
控制面板列表、或 winget list;偏图形 | 启动台、应用程序文件夹;brew list 看 Homebrew 装的 |
| 查"某文件谁装的" | rpm -qf /path、yum provides /path,直接对应到包 |
无统一等价,多为"在哪个程序目录下" | 无系统级等价;Homebrew 下可据前缀推断 |
| 配置安装源 | 编辑 /etc/yum.repos.d/*.repo,纯文本、可版本管理、可批量下发 | 组策略或每台机点选;winget 用系统/用户配置 | App Store 自动;Homebrew 用 tap,改 Git 源或配置 |
| 无图形界面 | 服务器默认无桌面,一切靠 SSH + 命令行,脚本可自动化 | 服务器版有 Core 无桌面,但生态和文档多围绕图形 | 服务器少见;有 macOS Server 但非主流 |
| 远程批量操作 | SSH + 脚本 + ansible/salt 等,对大量机器执行同一套命令 | 多用域控、组策略、PowerShell 远程;习惯与 Linux 不同 | 较少用于"大批量服务器"的统一运维 |
使用习惯小结:
- Linux :以命令行和文本配置 为主,装/卸/升/查都可脚本化,适合远程、批量、自动化。没有"双击安装包"的统一习惯,而是"改 repo、yum install"。
- Windows :以图形界面为主,普通用户习惯"下一步、下一步";命令行(winget、choco)在运维和开发中逐渐普及,但整体生态仍是"每台机可桌面操作"。
- macOS :图形 + 命令行混合;开发常用终端和 Homebrew,但系统更新、大部分应用仍走图形。单机体验强,批量管多台服务器不如 Linux 普遍。
同一件事:装/卸/升软件
Linux
命令行 + 文本配置
可脚本、可远程
Windows
多为图形
winget 可选
macOS
图形 + brew
单机为主
从"使用用户"角度看三系统差异
不同角色的人使用三系统时,感受完全不同------因为每个系统的设计初衷就在服务不同的用户群。
| 用户角色 | Linux | Windows | macOS |
|---|---|---|---|
| 普通用户(办公、上网) | 几乎不会接触;装系统、装软件都要命令行,日常办公软件少,学习成本高 | 主阵地------双击安装、Word/Excel/微信/QQ 全有,"下一步"即可上手 | 体验好但价格高;App Store 一键装应用,适合不想折腾的人 |
| 程序开发者 | 服务器环境一致,代码写完就能在同类环境测试;gcc/make/包管理原生支持 |
WSL2 可跑 Linux 子系统;Visual Studio/.NET 生态强;但原生命令行弱于 Linux | 开发体验最佳之一------Unix 底层 + brew + 终端,很多开发者首选;但编译大型 C 项目不如 Linux 原生 |
| 运维/SRE 工程师 | 主战场------线上服务器 90%+ 是 Linux,日常就是 SSH + yum/rpm + 脚本 + 监控 | 维护 Windows Server、AD 域控、SQL Server 时用;与 Linux 运维是两套知识体系 | 几乎不用于运维;运维工程师可能拿 Mac 当"本机终端"SSH 到 Linux |
| DBA(数据库管理员) | MySQL、PostgreSQL、Redis、MongoDB 官方主力平台;部署和文档以 Linux 为主 | SQL Server 的唯一平台(虽有 Linux 版但生态仍在 Windows) | 开发测试可以,生产几乎不用 macOS 跑数据库 |
| 学生 / 初学者 | 学习曲线陡------要记命令、看日志、改配置文件;但学会后技能直接用于工作面试 | 最熟悉------从小用到大,上手零门槛;但学的东西和"线上运维"关系不大 | 如果有 Mac,用终端 + brew 可以模拟 Linux 体验;很多编程教程也基于 Mac |
一句话 :Windows 面向"普通用户"设计、Mac 面向"创作者和开发者"设计、Linux 面向"服务器和运维"设计------所以同一条命令在三个系统上的"有没有、好不好用、需不需要"完全不同。
生活例子:
- 你是顾客(普通用户):去 Windows 这家大超市,啥都有、路标清楚;Linux 像批发市场,便宜高效但得自己找货、自己搬。
- 你是厨师(开发者):Mac 像精装厨房,工具顺手;Linux 像工业后厨,什么刀都有但要自己磨。
- 你是仓库经理(运维):Linux 是你的主仓库,天天在里面干活(yum/rpm/netstat);Windows 是隔壁仓库偶尔去看看;Mac 是你办公桌上的笔记本,用来远程连仓库。
不同角色
普通用户
开发者
运维/SRE
首选 Windows
点击安装、Office、微信
偏好 macOS / Linux
brew / gcc / 终端
主力 Linux
yum rpm ssh 脚本
为什么运维线上项目通常用 Linux?
"运维线上项目"指:在机房或云上长期跑网站、接口、数据库、定时任务 等,需要稳定、可远程、可批量、可自动化。这类场景下 Linux 占绝大多数,原因可以归纳为以下几点。
| 原因 | 说明 |
|---|---|
| 设计初衷 | Linux 从诞生起就面向多用户、网络、服务器;无图形也可完整操作,适合"只开 SSH、不接显示器"的服务器。 |
| 资源占用 | 服务器版默认无图形界面,内存和 CPU 留给业务和数据库;Windows 带桌面、Mac 偏桌面,在"大批量廉价虚拟机"上不如 Linux 省资源。 |
| 命令行与脚本 | 装软件、改配置、查日志、重启服务都是一条条命令,可写进 Shell 脚本或 Ansible 等,一次写好、多台执行;图形界面难以批量复现。 |
| 远程与自动化 | SSH 远程 + 密钥登录 + cron/systemd 定时任务,是 Linux 的标配;运维和 CI/CD 都围绕"远程执行命令"设计,Linux 生态最成熟。 |
| 软件与文档 | 服务器软件(Nginx、MySQL、Redis、Docker、K8s 等)官方文档和社区示例多以 Linux 为准;生产环境排错、搜到的也多是 Linux 命令。 |
| 成本与授权 | 大量发行版免费,无按机授权费;Windows Server 按授权计费,大规模机器时成本明显。 |
| 稳定性与定制 | 可裁剪、可只装需要的服务,补丁与重启策略可控;企业级支持有 RHEL、SUSE 等,适合 7×24 跑业务。 |
因此:本章里的 yum、rpm、configure、make、netstat 等,不是"随便几条命令",而是运维线上环境里"装软件、管服务、排错"的日常工具;在 Windows/Mac 上做桌面开发可以,但真正在机房或云上跑服务、做批量运维,绝大多数会用 Linux。
生活例子:
- Linux 像工厂流水线------没有华丽前台,但每一环都可编程、可重复、可远程控制,适合"管很多台机器、少人工干预"。
- Windows 像办公室电脑------每台机有人用、点界面完成操作多,单机好上手,但批量自动化要额外学 PowerShell 和域控。
- macOS 像个人工作台------开发、写代码、用 Homebrew 很顺手,但很少用来当"成百上千台服务器"的统一运维平台。
三系统定位一句话
| 系统 | 常见定位 | 本章命令在其中的角色 |
|---|---|---|
| Linux | 服务器、运维线上项目、云虚拟机、容器宿主机 | 日常装包、查包、编译安装、看端口与进程,都靠这些命令 |
| Windows | 办公桌面、部分企业应用服务器、.NET 生态 | 有图形和 winget,但运维脚本和社区示例多以 Linux 为主 |
| macOS | 开发机、个人办公、创意工作 | 用 brew 接近 Linux 体验,但线上跑服务、批量运维仍以 Linux 为主 |
三、RPM 包命名与数据库 📁
3.1 RPM 包命名格式
格式 :name-version-release.arch.rpm
| 部分 | 含义 | 示例 |
|---|---|---|
| name | 软件名称 | bind、zsh、httpd |
| version | 主版本号.次版本号.发行号(major.minor.release) | 9.7.1 |
| release | 打包发行号(同一版本的不同打包,如修 bug) | 1.el5 |
| arch | 适用架构 | i386、i586、x86_64、noarch、ppc |
版本号含义:
- 主版本号:重大改进。
- 次版本号:某个子功能发生较大变化。
- 发行号:修正部分 bug、小功能调整。
示例:bind-9.7.1-1.el5.i586.rpm
源码包常以 bind-9.7.1.tar.gz 形式发布;RPM 包是二进制格式,由作者在特定环境下编译、打包而成。
3.2 主包与子包
| 类型 | 说明 | 示例 |
|---|---|---|
| 主包 | 核心程序与常用功能 | bind-9.7.1-1.el5.i586.rpm |
| 子包 | 拆分出的库、工具等,按需安装 | bind-libs-9.7.1-1.el5.i586.rpm、bind-utils-9.7.1-1.el5.i586.rpm |
同一软件可能还有不同架构的包:bind-9.7.1-1.noarch.rpm、bind-9.7.1-1.ppc.rpm。查看本机内核版本(用于判断架构):uname -r;查看系统信息:uname -a。
3.3 RPM 数据库
RPM 的安装、卸载、查询等信息存放在 /var/lib/rpm 目录下的数据库中。rpmbuild 用于制作 RPM 包(本文不展开)。
四、rpm 命令详解 🔧
4.1 安装
bash
rpm -i /PATH/TO/PACKAGE_FILE
# 常用组合:-i 安装,-v 详细,-h 用 # 显示进度(每个 # 约 2%)
rpm -ivh /PATH/TO/PACKAGE_FILE
# 示例
rpm -ivh zsh-4.2.6-6.el5.i386.rpm
rpm -ivvh zsh-4.2.6-6.el5.i386.rpm # 更详细
| 选项 | 含义 |
|---|---|
-h |
以 # 显示进度,每个 # 表示约 2% |
-v |
显示详细过程 |
-vv |
更详细 |
--nodeps |
忽略依赖关系(可能导致运行异常) |
--replacepkgs |
重新安装,替换原有安装 |
--force |
强行安装,可实现重装或降级 |
示例:rpm -ivh --replacepkgs zsh-4.2.6-6.el5.i386.rpm
4.2 查询
已安装的包(用包名,不需要路径):
| 命令 | 含义 | 示例 |
|---|---|---|
rpm -q PACKAGE_NAME |
查询指定包是否已安装 | rpm -q zlib |
rpm -qa |
查询所有已安装的包 | `rpm -qa |
rpm -qi PACKAGE_NAME |
查询包的说明信息 | rpm -qi zlib |
rpm -ql PACKAGE_NAME |
查询包安装后生成的文件列表 | rpm -ql zlib |
rpm -qc PACKAGE_NAME |
查询包安装的配置文件 | rpm -qc zlib |
rpm -qd PACKAGE_NAME |
查询包安装的帮助文件 | rpm -qd zlib |
rpm -q --scripts PACKAGE_NAME |
查询包中的脚本(安装前/后等) | rpm -q --scripts zsh |
rpm -qf /path/to/file |
查询某文件由哪个包安装 | rpm -qf /etc/inittab、rpm -qf /bin/ls |
未安装的包(需要指定包文件路径):
| 命令 | 含义 | 示例 |
|---|---|---|
rpm -qpi /PATH/TO/PACKAGE_FILE |
查看包说明信息 | rpm -qpi httpd-devel-2.2.3-63.el5.i386.rpm |
rpm -qpl /PATH/TO/PACKAGE_FILE |
查看包安装后会生成的文件列表 | rpm -qpl httpd-devel-2.2.3-63.el5.i386.rpm |
记忆:q =query,i =info,l =list,c =config,d =doc,f=file。
4.3 升级
| 命令 | 含义 |
|---|---|
rpm -Uvh /PATH/TO/NEW_PACKAGE |
若已装老版本则升级 ,否则安装 |
rpm -Fvh /PATH/TO/NEW_PACKAGE |
若已装老版本则升级 ,否则不安装直接退出 |
rpm -Uvh --oldpackage /PATH/TO/OLD_PACKAGE |
降级到指定旧版本 |
可与 --force 组合,例如:rpm -Fvh --force nano-1.3.12-1.1.1.gls.i386.rpm。
降级示例:rpm -ivh --oldpackage nano-1.3.12-1.1.i386.rpm。
4.4 卸载
bash
rpm -e PACKAGE_NAME
# 示例
rpm -e zsh
rpm -e --nodeps PACKAGE_NAME # 忽略依赖强行卸载(慎用)
4.5 校验
校验已安装包中的文件是否被修改、丢失等:
bash
rpm -V PACKAGE_NAME
# 示例
rpm -V zsh
4.6 数据库重建
bash
rpm --rebuilddb # 重建数据库,一定会重新建立
rpm --initdb # 初始化数据库,没有才建立,有则不建
常用要点小结:rpm -qf 查文件属哪个包;rpm -qpl 查包会装哪些文件;rpm --import 导入 GPG 密钥;rpm --rebuilddb 重建数据库。
五、RPM 校验与 GPG 签名 🔐
5.1 校验来源与完整性
概念要点 :从网络或第三方获取的 RPM 包,需要验证两件事------来源是否可信 (签名)和内容是否被篡改(完整性,如 SHA1、MD5)。
| 校验类型 | 作用 | 可跳过选项 |
|---|---|---|
| 签名(dsa/gpg) | 验证来源合法性,确认是作者或发行方发布的 | --nosignature |
| 摘要(sha1、md5) | 验证软件包完整性,确认未被篡改 | --nodigest |
bash
rpm -K /PATH/TO/PACKAGE_FILE
# 示例
rpm -K zsh-4.2.6-6.el5.i386.rpm
rpm -K --nodigest zsh-4.2.6-6.el5.i386.rpm # 跳过完整性校验
rpm -K --nosignature zsh-4.2.6-6.el5.i386.rpm # 跳过签名校验
5.2 加密与密钥
| 类型 | 说明 | 生活例子 |
|---|---|---|
| 对称加密 | 加密和解密用同一把密钥 | 一把钥匙既能锁门又能开门 |
| 公钥加密 | 一对密钥:公钥可公开,私钥自己保管;公钥可从私钥导出 | 公钥像信箱投递口,私钥像你手里的信箱钥匙 |
| 单向散列 | 不可逆,用于校验完整性(如 SHA1、MD5) | 像指纹------不能从指纹还原出人,但能核对是否一致 |
Red Hat 系 GPG 公钥常放在:/etc/pki/rpm-gpg/,例如 RPM-GPG-KEY-redhat-release。
5.3 导入公钥并校验
bash
# 导入发行版公钥(校验前需先导入)
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
# 再次校验包
rpm -K zsh-4.2.6-6.el5.i386.rpm
查看 RPM 数据库目录:ls /var/lib/rpm/。
六、yum 仓库与 repo 配置 🏪
6.1 从 rpm 到 yum
概念要点 :rpm 只处理单个包 ,不自动解决依赖。yum 是前端工具,从仓库 (repository)里拉取包及其依赖,再调用 rpm 安装。仓库本质是一个带元数据的目录,可通过 HTTP、FTP 或本地 file 访问。
用户
yum install xxx
yum
仓库
baseurl
元数据
primary/filelists/other/repomd
RPM 包文件
rpm 安装
生活例子 :rpm 像单次去便利店买一瓶水;yum 像去超市------超市(仓库)有货架清单(元数据),你要买 A,系统会顺便把 A 依赖的 B、C 一起放进购物车再结账。
6.2 元数据文件说明
yum 仓库中常见元数据(多为 XML,半结构化数据;HTML=超文本标记语言,XML=可扩展标记语言):
| 文件 | 内容 |
|---|---|
| primary.xml.gz | 所有 RPM 包列表、依赖关系、每个包安装生成的文件列表 |
| filelists.xml.gz | 当前仓库中所有 RPM 包 的所有文件列表 |
| other.xml.gz | 额外信息,如 RPM 的修改日志 |
| repomd.xml | 记录上述几个文件的时间戳和校验和,供 yum 判断是否更新缓存 |
| comps.xml* | RPM 包分组信息(如 "Development Tools") |
仓库 URL 示例(按实际路径调整):
- FTP:
ftp://172.16.0.1/pub/{Server,VT,Cluster,ClusterStorage} - HTTP:
http://172.16.0.1/yum/{Server,VT} - 本地光盘:
/media/cdrom/{Server,VT,Cluster,ClusterStorage}
6.3 repo 文件格式
repo 文件通常放在 /etc/yum.repos.d/ 下,扩展名为 .repo。
ini
[Repo_ID]
name=Description
baseurl=ftp://... | http://... | file:///
enabled=1
gpgcheck=1
gpgkey=...
| 项 | 含义 |
|---|---|
| Repo_ID | 仓库唯一标识 |
| name | 描述信息 |
| baseurl | 仓库地址:ftp://、http://、file:/// |
| enabled | 1 启用,0 禁用 |
| gpgcheck | 1 校验 GPG,0 不校验 |
| gpgkey | 公钥 URL 或路径 |
6.4 创建本地 yum 仓库
使用 createrepo 命令在指定目录生成 repodata(含 primary、filelists、other、repomd 等),该目录即可作为 baseurl(file:// 或 http 发布后使用)。
示例目录结构:http://172.16.0.1/yum/{Server,VT},在对应目录下执行 createrepo .。
脚本片段示例(判断某路径是否存在):
bash
if [ -e $1 ]; then
echo "$1 exist."
exit 5
fi
七、yum 命令详解 📟
7.1 基本语法
bash
yum [options] [command] [package ...]
常用选项:
-y:自动回答 yes--nogpgcheck:不进行 GPG 校验
7.2 列表与清理
| 命令 | 含义 |
|---|---|
yum list [glob] |
列表,支持通配符 |
yum list all |
全部 |
yum list available |
仓库中有但未安装的 |
yum list installed |
已安装的 |
yum list updates |
可用的升级 |
| `yum clean [packages | headers |
| `yum repolist [all | enabled |
7.3 安装、升级、卸载
| 命令 | 含义 |
|---|---|
yum install PACKAGE_NAME |
安装 |
yum update |
升级所有可升级包 |
yum update PACKAGE_NAME |
升级指定包 |
yum update_to ... |
升级为指定版本 |
yum remove PACKAGE_NAME |
卸载(也可写 erase) |
7.4 查询与包组
| 命令 | 含义 |
|---|---|
yum provides /path/to/file |
查看某文件或特性 由哪个包提供(同 whatprovides) |
yum groupinfo "GROUP" |
查看包组信息 |
yum grouplist |
列出包组 |
yum groupinstall "GROUP" |
安装包组 |
yum groupremove "GROUP" |
卸载包组 |
yum groupupdate "GROUP" |
升级包组 |
示例:yum install zsh。
八、源码编译安装 🛠️
8.1 为什么需要编译安装?
概念要点 :RPM 是预编译的二进制包,由打包者在特定环境编译,存在以下限制:
- 编译时未选定的特性无法使用;
- 版本可能落后于上游源码(如 bind 源码已 9.8.7,RPM 仍是 9.7.2)。
定制安装 则从源码 手动编译:可自选特性、路径和优化,但需要编译环境 (开发库、开发工具)。Linux 下 C/C++ 常用 GNU 工具链 :gcc (GNU C Compiler)、g++ 、make (按 Makefile 顺序调用 gcc/g++ 编译)。Makefile 可由 automake 生成 makefile.in 再生成 Makefile,autoconf 生成 configure 脚本,用于检测环境和选择特性。
源码
./configure
选特性、查环境
make
编译
make install
安装
生活例子 :RPM 像成品家具 ------拿来就用,但尺寸和款式固定。编译安装 像定制家具------自己选料、尺寸,但要自己动手做(准备工具、编译、安装)。
8.2 编译安装三步骤(前提:已装开发环境)
前提:安装 "Development Tools" 和 "Development Libraries" 等开发包组。
| 步骤 | 命令 | 作用 |
|---|---|---|
| 1 | tar 解压后 ./configure [选项] |
选择编译特性、检查编译环境;常用 --prefix=/path、--sysconfdir=/path |
| 2 | make |
根据 Makefile 编译源码 |
| 3 | make install |
将编译好的文件安装到 prefix 等指定目录 |
configure 常用选项:
--help:查看所有选项--prefix=/path/to/somewhere:安装根目录--sysconfdir=/PATH/TO/CONFFILE_PATH:配置文件目录
示例一:tengine(Nginx 分支)
bash
tar xf tengine-1.4.2.tar.gz
cd tengine-1.4.2
./configure --prefix=/usr/local/tengine --conf-path=/etc/tengine/tengine.conf
make
make install
/usr/local/tengine/sbin/nginx # 启动
示例二:httpd(Apache)
bash
tar xf httpd-2.2.16.tar.bz2
./configure --help | less
rpm -q httpd # 若已装 rpm 版 httpd,建议先卸载避免冲突
./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd
make
make install
8.3 安装后的四项配置
编译安装的路径往往不在系统默认搜索路径中,需要手动配置 以下四项,系统才能找到程序、库、头文件、man 手册。
1)PATH:让系统找到二进制
- 方法一:编辑
/etc/profile,添加PATH=$PATH:/usr/local/tengine/sbin,然后source /etc/profile。 - 方法二:在
/etc/profile.d/下新建.sh文件,内容如export PATH=$PATH:/usr/local/tengine/sbin。
2)库文件路径:让系统找到 .so
系统默认搜索库路径:/lib、/usr/lib。新增路径做法:
- 在
/etc/ld.so.conf.d/下新建以.conf为后缀的文件,写入要添加的路径(如/usr/local/tengine/lib)。 - 执行
ldconfig通知系统重新加载库缓存;ldconfig -v可显示过程。
3)头文件路径:供开发时 #include
默认头文件路径:/usr/include。可把自装软件的头文件链接到该目录下,例如:
ln -s /usr/local/tengine/include/* /usr/include/或ln -s /usr/local/tengine/include /usr/include/tengine- Apache 示例:
ln -sv /usr/local/apache/include /usr/include/httpd
4)man 手册路径
- 临时:
man -M /PATH/TO/MAN_DIR COMMAND,如man -M /usr/local/apache/man htpasswd。 - 永久:在
/etc/man.config中添加一行MANPATH /usr/local/apache/man。
8.4 启动与进程管理
启动 Apache 示例:apachectl start。若需停止已有进程,可先用 netstat 查端口与进程,再用 kill 结束,例如:
netstat -tnlp查看监听与进程kill 16744结束对应 PID。
九、netstat 命令参考 🌐
概念要点 :netstat 用于打印 Linux 网络系统的状态信息,可查看连接、路由、接口等。本章保留原文中 netstat 的选项与示例,便于查阅;新系统更推荐用 ss 替代 netstat。
9.1 常用选项
| 选项 | 含义 |
|---|---|
-r |
显示路由表(Routing Table) |
-n |
数字显示 IP/端口,不反解 |
-t |
TCP |
-u |
UDP |
-l |
监听状态 |
-p |
显示进程号及进程名 |
-a |
所有状态 |
-i |
网络接口 |
-s |
各协议统计信息 |
-c |
持续输出(如每秒刷新) |
语法:netstat [选项]。
9.2 常用组合示例
bash
netstat -rn # 路由表,数字格式(不反解主机名)
netstat -tl # 监听中的 TCP
netstat -tul # 监听中的 TCP 和 UDP
netstat -a # 所有端口(监听+未监听)
netstat -at # 所有 TCP 端口
netstat -au # 所有 UDP 端口
netstat -l # 仅监听端口
netstat -lt # 监听 TCP
netstat -lu # 监听 UDP
netstat -lx # 监听 UNIX 域套接字
netstat -s # 各协议统计
netstat -st # TCP 统计
netstat -su # UDP 统计
netstat -pt # 带 PID/进程名
netstat -an # 所有连接,数字格式
netstat -ap | grep ssh
netstat -an | grep ':80' # 指定端口
netstat -i # 网络接口列表
netstat -ie # 接口详细信息(类似 ifconfig)
netstat -c # 持续输出
netstat -r # 核心路由
netstat -rn # 路由,数字格式
9.3 其他选项摘要
| 选项 | 含义 |
|---|---|
-A <网络类型> |
指定网络类型 |
-e / --extend |
扩展信息 |
-F |
FIB |
-g |
多播组 |
-M |
伪装连接 |
-o |
计时器 |
-x |
UNIX 套接字 |
--numeric-ports |
端口用数字 |
--numeric-hosts |
主机用数字 |
--numeric-users |
用户用数字 |
--verbose |
详细(会显示不支持的地址族等) |
不显示主机名/端口名/用户名时,可单独用数字:
netstat -a --numeric-portsnetstat -a --numeric-hostsnetstat -a --numeric-users
持续输出:netstat -c 每隔一段时间输出网络信息。
netstat --verbose 会在末尾显示系统不支持的地址族,例如:
netstat: no support for 'AF IPX' on this system.netstat: no support for 'AF AX25' on this system.
等。
更多选项 :-A 网络类型、-e 扩展、-F FIB、-g 多播、-M 伪装、-N 网络设备符号名、-o 计时器、-w raw、-x UNIX 套接字、--ip/--inet 等。
注意:无权限时部分进程可能不显示,可用 root 查看全部。
实用示例:
- 查看连接某服务端口最多的 IP:
netstat -ntu | grep :80 | awk '{print $5}' | cut -d: -f1 | awk '{++ip[$1]} END {for(i in ip) print ip[i],"\t",i}' | sort -nr - TCP 各状态列表及数量:
netstat -nt | grep -e 127.0.0.1 -e 0.0.0.0 -e ::: -v | awk '/^tcp/ {++state[$NF]} END {for(i in state) print i,"\t",state[i]}' - 查看 phpcgi 进程数(接近预设值说明需增加):
netstat -anpo | grep "php-cgi" | wc -l - 找出运行在指定端口的进程:
netstat -an | grep ':80' - 显示网络接口:
netstat -i;类似 ifconfig 的详细信息:netstat -ie
十、本章命令总览与「为什么要有这些命令」 📋
本节先按类别列出本章出现的 Linux 命令 ,看全不全;再说明为什么要有这些命令------各自解决什么问题、在软件管理里扮演什么角色。
10.1 本章命令按类别总览
本章涉及的命令
包管理
编译安装
路径与库
查询与排错
网络与进程
rpm / yum
tar / configure / make
ldconfig / ln / source / man
which / whereis / ldd / file
netstat / kill
1)包管理相关
| 命令 | 本章用法 | 说明 |
|---|---|---|
| rpm | 安装(-i)、查询(-q/-qi/-ql/-qc/-qd/-qf/-qpi/-qpl)、升级(-U/-F)、卸载(-e)、校验(-V/-K)、数据库(--rebuilddb/--initdb)、导入密钥(--import) | Red Hat 系后端包管理,直接操作 .rpm 与数据库 |
| yum | install、remove、update、list、search、clean、repolist、provides、group* | 前端工具,解决依赖并从仓库拉包再交给 rpm |
| createrepo | 在目录下生成 repodata,做成本地 yum 仓库 | 仓库要有元数据,yum 才能解析依赖和文件列表 |
| rpmbuild | 文中仅提及,用于制作 RPM 包 | 打包需要统一格式和规范,由专门工具完成 |
2)编译安装相关
| 命令 | 本章用法 | 说明 |
|---|---|---|
| tar | 解压源码包(tar xf xxx.tar.gz) | 源码常以 tar 归档发布,需要解压才能 configure/make |
| ./configure | 检测环境、选择特性,生成 Makefile | 不同机器环境不同,需要先"摸底"再决定怎么编译 |
| make | 按 Makefile 编译 | 项目多文件,需要按依赖顺序批量编译,不能手敲 gcc |
| make install | 把编译结果安装到 prefix 等目录 | 编译在源码目录,安装要把文件放到系统约定位置 |
3)路径、库、环境相关
| 命令 | 本章用法 | 说明 |
|---|---|---|
source (或 .) |
重新加载 profile,使 PATH 等生效 | 改完配置文件后不想登出,就 source 一下 |
| ldconfig | 更新动态库缓存,使新加的库路径生效 | 程序运行时通过 ldconfig 的缓存找 .so,新路径必须刷进缓存 |
| ln | 建软链接,把自装头文件链到 /usr/include | 编译器默认只找 /usr/include,不改编译器就要"迁就"默认路径 |
| man | 查手册;man -M 指定手册路径 | 自装软件的手册不在默认 MANPATH,需指定或配置 MANPATH |
4)查询与排错(本章提及或强烈相关)
| 命令 | 本章用法 | 说明 |
|---|---|---|
| uname | uname -r、uname -a,看内核与架构 | 选 rpm/deb 时要看架构(x86_64 等),和内核版本有时相关 |
| netstat | 查连接、路由、端口、进程 | 编译安装的服务要确认端口是否在监听、被谁占用 |
| kill | 结束进程(如 kill PID) | 重启服务前可能要先停掉旧进程 |
| ls | 查看目录(如 /var/lib/rpm、/etc/yum.repos.d) | 确认配置和数据库是否存在 |
5)补充:软件管理时常用的"周边"命令
以下命令本章未详讲,但和"装软件、找程序、排错"紧密相关,便于你判断是否看全。
| 命令 | 作用 | 为什么要有 |
|---|---|---|
| which | 查当前会执行到的哪个路径下的命令 | 自装和系统同名的命令可能有多份,which 看实际用哪一份 |
| whereis | 查二进制、man、源码所在目录 | 比 which 范围大,看包提供的所有相关路径 |
| type | Shell 内建,看命令是外部程序还是内建/别名 | 区分是 PATH 里的程序还是 shell 自己的逻辑 |
| file | 看文件类型(可执行、脚本、动态库等) | 判断是二进制还是脚本、是否损坏,便于排错 |
| ldd | 列出一个程序依赖的动态库及路径 | 运行报"找不到 .so"时,用 ldd 看缺哪几个库、在哪找的 |
| dnf | Fedora/CentOS 8+ 的 yum 替代,用法类似 yum | 新一代依赖解析和性能,命令设计更一致,所以要有新前端 |
10.2 为什么要有这些命令?------按"角色"理解
不是"多背几条命令",而是系统要完成"装软件、找软件、保证能跑" ,就必须有人做:打包格式、依赖解析、安装/卸载、查询、校验、编译、路径与库、排错。下面按"角色"说清楚。
角色一:包格式与单包操作(rpm)
- 为什么要有 rpm?
发行版要统一"一个软件怎么打包、装到哪、依赖谁、怎么记在数据库里"。rpm 定义 .rpm 格式和数据库(/var/lib/rpm),这样安装、卸载、查询、校验都有据可查,不会乱装乱删。 - 为什么还要 -q/-qi/-ql/-qf 这么多查询?
因为要回答不同问题:装没装(-q)、包说明(-qi)、会装哪些文件(-ql)、某文件是谁装的(-qf)、配置/文档(-qc/-qd)。一个问题对应一种查询,避免"要么没有、要么混在一起"。
角色二:依赖与仓库(yum、createrepo)
- 为什么要有 yum?
rpm 只认"当前这一个包",不帮你从网上下、也不自动装依赖。yum 负责:从仓库拉包 + 算依赖 + 按顺序调 rpm。这样用户只说"装 A",系统就能把 A 和依赖一起装好。 - 为什么要有 createrepo?
仓库不是"一堆 .rpm 扔进目录"就行,yum 需要元数据(包列表、依赖、文件列表)。createrepo 根据目录里的 rpm 生成这些元数据,所以要有这个命令才能"建仓库"。
角色三:源码到可执行(tar、configure、make、make install)
- 为什么是四步?
- tar:源码以归档形式发布,先解压才能继续。
- configure:检查本机环境(编译器、库、头文件)并让用户选特性(--prefix 等),生成适配本机的 Makefile。
- make:按 Makefile 调用 gcc 等编译,处理多文件依赖。
- make install :把生成的可执行文件、库、头文件、man 拷贝到 prefix 等目录,完成"安装"。
四步分工明确:解包 → 配置 → 编译 → 安装,缺一不可。
角色四:让系统"找到"自装软件(PATH、ldconfig、ln、man)
- 为什么要有 PATH / ldconfig / 头文件链接 / MANPATH?
系统有一批默认搜索路径 (如 /usr/bin、/lib、/usr/include、man 的路径)。编译安装往往装到 /usr/local 或自定义 prefix,不在默认路径里,所以:- 改 PATH :让 shell 能找到你装的命令;
- 用 ldconfig 和 /etc/ld.so.conf.d:让运行时能找到你装的库;
- 用 ln 链到 /usr/include:让编译器能找到你装的头文件;
- 配 MANPATH 或 man -M :让 man 能找到你装的手册 。
这些命令/配置的存在,就是为了把自装软件纳入系统的"查找规则",否则装上了也用不了、查不到。
角色五:校验与安全(rpm -K、--import)
- 为什么要有 rpm -K 和 --import?
包从网络来,可能被篡改或冒充。-K 校验签名(来源)和摘要(完整性);--import 导入发行方公钥,才能验证签名。没有这些,就难以保证"装的是官方包、没被改过"。
角色六:排错与运维(netstat、kill、which、ldd、file)
- 为什么要有 netstat?
服务装完要确认"有没有在监听、端口对不对、被谁占用"。netstat 看连接、监听、进程,是排查网络服务最直接的手段之一(新系统可用 ss 替代)。 - 为什么要有 kill?
要停掉旧进程、重启服务,或结束卡死进程,必须有一个"按 PID 发信号"的命令,即 kill。 - 为什么要有 which/whereis/ldd/file?
装完软件"打命令没反应"或"报找不到库":which 看用的是哪条命令;whereis 看包提供了哪些路径;ldd 看缺哪个 .so;file 看文件是否真的是可执行或库。它们都是定位问题用的,所以要有。
10.3 小结:命令和"层次"的对应关系
| 层次 | 要解决的问题 | 对应的命令/机制 |
|---|---|---|
| 单包 | 怎么装、怎么记、怎么查、怎么卸 | rpm -i/-q/-e/-V、数据库 |
| 依赖与源 | 从哪下、依赖谁、一起装 | yum、仓库、createrepo |
| 源码安装 | 解包、配置、编译、安装到指定位置 | tar、configure、make、make install |
| 可发现性 | 命令、库、头文件、man 能被找到 | PATH、ldconfig、ln、MANPATH |
| 可信与完整 | 包没被改、来源可信 | rpm -K、--import |
| 排错 | 端口、进程、命令路径、库依赖 | netstat、kill、which、ldd、file |
生活例子:
- rpm 像仓库管理员------只负责"这一件货"的入库、登记、出库、盘点。
- yum 像采购+调度------负责去仓库拿货、算清楚还要带哪些配套(依赖)、再交给管理员入库。
- configure/make/install 像自己在家做家具------量尺寸(configure)、动手做(make)、摆进家里(make install)。
- PATH/ldconfig 像家里贴的"东西放在哪"的清单------有了清单,你才能快速找到自己放的东西(命令、库)。
附录:命令速查与小结 📌
1. rpm 常用速查
| 操作 | 命令 |
|---|---|
| 安装 | rpm -ivh PACKAGE.rpm |
| 查询是否安装 | rpm -q NAME |
| 查询包生成的文件 | rpm -ql NAME |
| 查询某文件属哪个包 | rpm -qf /path/to/file |
| 查询未安装包信息 | rpm -qpi /path/to.rpm、rpm -qpl /path/to.rpm |
| 升级 | rpm -Uvh NEW.rpm |
| 卸载 | rpm -e NAME |
| 校验 | rpm -V NAME、rpm -K PACKAGE.rpm |
| 导入密钥 | rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release |
| 重建数据库 | rpm --rebuilddb |
2. yum 常用速查
| 操作 | 命令 |
|---|---|
| 安装 | yum install PACKAGE |
| 升级 | yum update、yum update PACKAGE |
| 卸载 | yum remove PACKAGE |
| 查文件属哪个包 | yum provides /path |
| 列表 | yum list installed、yum list available、yum list updates |
| 清理缓存 | yum clean all |
| 包组 | yum grouplist、yum groupinstall "GROUP" |
3. 编译安装三步骤 + 四项配置
| 步骤 | 内容 |
|---|---|
| 1 | ./configure --prefix=... --sysconfdir=... |
| 2 | make |
| 3 | make install |
| 配置 | PATH(/etc/profile 或 profile.d)、库(/etc/ld.so.conf.d + ldconfig)、头文件(链接到 /usr/include)、man(MANPATH) |