Linux 软件包管理与编译安装

本章系统讲解 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。

📑 目录


一、程序与软件包基础 🧩

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-ports
  • netstat -a --numeric-hosts
  • netstat -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)

相关推荐
未济5 天前
linux 配置环境变量
linux
傲世仙尊5 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
虎头金猫5 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
_艾伦 耶格尔.5 天前
进程间通信
linux
AI职业加油站5 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
Liuqy-055 天前
Linux IO编程——静态库、动态库
linux
此冬歌咏5 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
彧azz5 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
-梅5 天前
linux(8) 软硬链接
linux·运维·服务器
Wang's Blog5 天前
Java 项目实战: 外卖平台-文件下载与ServletOutputStream回写浏览器
服务器·项目开发