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,相当于添加第三方源。
  • 包名 :多为小写+连字符,如 nginxbuild-essential(开发工具组)。
macOS 特有要点
  • 系统自带 :通过 App Store 或双击 .pkg / .dmg 安装,不提供命令行"包名→安装"的统一工具。
  • Homebrewhttps://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 -qayum list installed,纯文本、易用 grep/脚本 控制面板列表、或 winget list;偏图形 启动台、应用程序文件夹;brew list 看 Homebrew 装的
查"某文件谁装的" rpm -qf /pathyum 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.rpmbind-utils-9.7.1-1.el5.i586.rpm

同一软件可能还有不同架构的包:bind-9.7.1-1.noarch.rpmbind-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/inittabrpm -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:让编译器能找到你装的头文件
    • MANPATHman -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.rpmrpm -qpl /path/to.rpm
升级 rpm -Uvh NEW.rpm
卸载 rpm -e NAME
校验 rpm -V NAMErpm -K PACKAGE.rpm
导入密钥 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
重建数据库 rpm --rebuilddb

2. yum 常用速查

操作 命令
安装 yum install PACKAGE
升级 yum updateyum update PACKAGE
卸载 yum remove PACKAGE
查文件属哪个包 yum provides /path
列表 yum list installedyum list availableyum list updates
清理缓存 yum clean all
包组 yum grouplistyum 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)

相关推荐
Linux运维技术栈1 小时前
实战运维|CentOS7 Nexus3.21.1 迁移至 Rocky Linux9.5 + 升级至3.68.1
运维·nexus3
廋到被风吹走1 小时前
DDD领域驱动设计深度解析:从理论到代码实践
java·大数据·linux
麦德泽特1 小时前
OpenWrt在机器人中的高级网络应用:AP+STA模式、中继与防火墙配置实战
运维·网络·机器人
我命由我123451 小时前
Java 开发 - 如何让一个类拥有两个父类
java·服务器·开发语言·后端·java-ee·intellij-idea·intellij idea
这儿有一堆花2 小时前
Linux 软件包管理:从源码编译到现代自动化运维
linux·运维·自动化
范什么特西2 小时前
狂神--守护线程
java·linux·服务器
github.com/starRTC2 小时前
Claude Code中英文系列教程32:Claude Code官方推荐的MCP 服务器
运维·服务器
德迅云安全_初启2 小时前
2026年十大危险DNS攻击类型及预防措施
linux·服务器·网络
之歆2 小时前
Bash 循环与函数、Linux 进程管理
linux·chrome·bash