RHCSA 学习笔记(三):软件包、系统服务、存储管理、SELinux、防火墙与容器
学习红帽课程中的一些笔记,本系列共 3 篇,这是第 3 篇。
- RHCSA 学习笔记(一):命令行基础、用户权限、文本处理与进程管理
- RHCSA 学习笔记(二):网络、Shell 脚本、SSH、高级权限与文件系统
- RHCSA 学习笔记(三):软件包、系统服务、存储管理、SELinux、防火墙与容器(本篇)
软件包管理
rpm 包管理器
| 常用操作类别 | 选项 | 选项含义与作用说明 | 典型示例命令 | 注意事项 / 提示 |
|---|---|---|---|---|
| 查询 (Query) | -qa |
query all:查询系统已安装的所有 RPM 包 | rpm -qa | grep nginx |
运维中最高频的查询组合,配合 grep 过滤指定软件 |
-qc |
query configfiles:列出已安装软件包的配置文件路径 | rpm -qc nginx |
快速定位 /etc 等目录下的核心配置文件,排查修改项 |
|
-qd |
query docfiles:列出已安装软件包的文档与帮助文件路径 | rpm -qd nginx |
查看 README、man 手册、许可协议等相关文档 | |
-qf |
query file:查看某个具体文件/命令归属于哪个 RPM 包 | rpm -qf /usr/sbin/nginx |
知道命令或文件路径,反查其来源包(必填文件的绝对路径) | |
-qi |
query info:查看已安装软件包的详细信息(版本/描述等) | rpm -qi nginx |
显示版本、发布者、打包时间、功能描述等元数据 | |
-ql |
query list:列出已安装软件包释放的所有文件路径 | rpm -ql nginx |
快速定位软件释放的所有可执行文件、日志和配置文件目录 | |
-qpl |
query package list:预览未安装的 .rpm 文件包含的文件 | rpm -qpl package.rpm |
在正式安装前,先检查该本地 .rpm 包会把文件放进哪些目录 |
|
| 安装 / 更新 | -i |
install:安装新的 RPM 软件包 | rpm -ivh package.rpm |
无法自动解决依赖:若缺少依赖会报错终止,需手动先装依赖包 |
-U |
Upgrade:升级软件包(若未安装则安装) | rpm -Uvh package.rpm |
实际运维中最常用的安装命令,比单纯的 -i 更具通用性 |
|
-v |
verbose:显示指令执行过程的详细信息 | rpm -ivh package.rpm |
通常与 -i 或 -U 组合使用,观察安装过程 |
|
-h |
hash:显示安装进度条(输出 # 号) |
rpm -ivh package.rpm |
配合 -v 一起使用,提供直观的百分比进度反馈 |
|
--nodeps |
no dependencies:强制忽略依赖关系 | rpm -ivh --nodeps package.rpm |
慎用!强制安装可能导致软件因缺少关键依赖而无法运行 | |
--force |
force:强制覆盖安装 | rpm -ivh --force package.rpm |
相当于 --replacepkgs + --replacefiles + --oldpakge,用于修复损坏的软件包 |
|
| 卸载 (Erase) | -e |
erase:卸载/移除已安装的 RPM 软件包 | rpm -e nginx |
参数填写的是包名(如 nginx),而不是 .rpm 文件文件名 |
-e --nodeps |
卸载时忽略其他软件对该包的依赖 | rpm -e --nodeps nginx |
强行卸载底层依赖包可能会破坏其他依赖它的上层应用 |
注意:
- 软件中被手动修改过的文件不会随重装被覆盖,也不会随卸载而删除;如果加上
--force则会覆盖 -hv(显示详细信息及进度条)可以用于安装-ivh也可用于卸载-evh
yum / dnf 包管理器
YUM 和 DNF 是 Red Hat 系 Linux(如 RHEL、CentOS、Rocky Linux 等)中用于自动解决依赖、从网络源一键下载并安装软件的高级包管理工具。
在现代 Linux 系统中,输入 yum 会自动重定向调用 dnf,两者的常用命令语法完全通用。
软件包仓库配置
| 场景类型 | 配置文件内容结构(/etc/yum.repos.d/xxx.repo) |
参数拆解与注意事项 |
|---|---|---|
| 在线软件源 (以阿里云 EPEL 源为例) |
[epel-aliyun]name=Extra Packages for Enterprise Linuxbaseurl=https://mirrors.aliyun.com/epel/7/$basearchenabled=1gpgcheck=1gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7 |
• baseurl:使用 http:// 或 https:// 协议,指向远程 Web 镜像服务器。• $basearch:Yum 内置变量,自动匹配 CPU 架构(如 x86_64)。• 前提条件:服务器需能正常访问外网或内网镜像站。 |
| 本地光盘/ISO 源 (以挂载 ISO 为例) |
[local-cdrom]name=Local ISO Mediabaseurl=file:///media/cdromenabled=1gpgcheck=1gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release |
• baseurl:使用 file:// 协议(注意协议头加路径共三个斜杠 file:///)。• 前提条件:需先挂载光盘,如 mount /dev/sr0 /media/cdrom。• 若无网且无需校验,可设 gpgcheck=0。 |
安装、更新与卸载
| 分类 | 命令示例 | 功能说明 | 运维实用技巧 / 提示 |
|---|---|---|---|
| 安装与重装 | yum install -y <包名> |
安装指定软件包并自动解决依赖,-y 跳过交互确认 |
自动化脚本必备参数 -y;支持同时安装多个包 |
yum reinstall <包名> |
重新安装指定软件 | 修复误删文件或二进制损坏时的快捷手段,依赖不会被重新安装 | |
yum localinstall <本地.rpm> |
安装本地 RPM 包,并自动联网下载解决依赖 | 相比 rpm -i,能自动补全缺失的依赖包 |
|
| 更新与升级 | yum check-update |
检查当前系统中所有可升级的软件包 | 仅列出可更新清单,不发起实际更新操作 |
yum update -y [包名] |
升级指定包或系统所有已安装的软件包,-y 跳过交互确认 |
生产环境慎用全局升级,建议接具体包名单独更新 | |
yum update --excludepkg=<包名> |
升级软件包,但排除指定软件包 | 避免自动升级内核(kernel)或生产数据库 |
|
| 卸载与清理 | yum remove <包名> |
卸载指定软件包及其关联依赖 | 卸载前需核对依赖链,防止误删系统核心库 |
yum autoremove |
自动清除系统中不再被任何软件使用的无用依赖 | 清理长期积累的“孤立依赖包”,释放磁盘空间 | |
yum clean all |
清理本地缓存的元数据与软件包 | 排错必备:源报错、下载卡死或更新异常时首选 | |
yum makecache |
重新建立本地软件包元数据缓存 | clean all 后执行,可大幅提升后续搜索与安装速度 |
|
| 查询与搜索 | yum search <关键字> |
在软件源中根据名称和描述进行模糊搜索 | 不确定精确包名时使用 |
yum info <包名> |
查看指定软件包的详细元信息(版本、大小、来源等) | 类似 rpm -qi,但适用于未安装的源内软件包 |
|
yum list installed |
列出系统中已安装的所有软件包 | 配合 grep 筛选,如 yum list installed | grep nginx |
|
yum provides <路径/命令> |
根据文件路径或命令反查其归属的软件包 | 高频神器:如 yum provides */ifconfig 查工具包 |
|
| 软件源管理 | yum repolist |
显示当前系统中已启用的软件源(Repository)列表 | 用于确认第三方源(如 EPEL、Docker 源)是否生效 |
yum-config-manager --enable <源ID> |
动态启用或禁用指定的软件源 | 需安装 yum-utils 工具包 |
|
| 软件组操作 | yum grouplist |
列出可用的软件包组(如“开发工具”、“桌面环境”) | 快速了解可进行批量安装的套件 |
yum groupinstall "Development Tools" |
批量安装整个功能套件 | 部署编译环境(含 gcc、make 等)的最佳方式 |
|
| 历史与撤销 | yum history |
查看 Yum 的历史操作事务列表及 ID | 审计历史安装/升级记录 |
yum history undo <事务ID> |
撤销指定的历史操作(版本回滚/卸载) | 误装或升级导致故障时的“后悔药” |
/var/log/dnf.log记录了yum命令的相关操作/var/log/dnf.rpm.log记录了包的安装情况
搭建局域网私有软件仓库
| 环节 | 模块 / 节点 | 路径 / 配置内容 | 作用与处理逻辑 |
|---|---|---|---|
| 1. 官方源输入 | 官方 ISO 镜像 | 挂载至 /var/www/html/repo/BaseOS/挂载至 /var/www/html/repo/AppStream/ |
光盘已自带 repodata/ 索引文件夹,直接通过 Nginx 暴露 |
| 2. 私有源输入 | 零散 RPM 包 | 存放于 /var/www/html/repo/custom/ |
放置第三方或自主开发的裸 .rpm 文件,自己放的包需要使用 createrepo_c 生成索引 |
| 3. 索引构建 | createrepo_c |
执行:createrepo_c /var/www/html/repo/custom/ |
扫描该目录下的所有 .rpm 包,并在该目录下生成 repodata/ 索引(含 repomd.xml) |
| 4. 自动维护 | 定时任务 (Cron) | crontab -e 0 2 * * * root createrepo_c --update /var/www/html/repo/custom/ |
每天自动增量扫描新上传的 RPM 包并更新索引 |
| 5. Web 共享 | Nginx 服务 ( 192.168.1.100) |
/etc/nginx/conf.d/yum_repo.conf:nginxserver { listen 80; root /var/www/html/repo; location / { autoindex on; }} |
监听 80 端口,开启目录遍历,将 BaseOS、AppStream 及 custom 目录通过 HTTP 协议暴露给局域网 |
| 6. 客户端调取 | 局域网 Client ( 192.168.1.x) |
/etc/yum.repos.d/lan-repo.repo:[lan-baseos]name=LAN BaseOSbaseurl=http://192.168.1.100/repo/BaseOSenabled=1gpgcheck=0[lan-custom]name=LAN Custombaseurl=http://192.168.1.100/repo/customenabled=1gpgcheck=0 |
客户端通过 URL 拉取索引,实现自动解决依赖并安装官方与私有软件包 |
源码包安装
| 步骤 | 命令行 | 核心作用 |
|---|---|---|
| Step 1: 准备环境 | yum install -y gcc pcre-devel zlib-devel openssl-devel make |
安装 C 语言编译器及 Nginx 依赖的底层开发库 |
| Step 2: 配置预编译参数 | ./configure --prefix=/usr/local/nginx --with-http_ssl_module |
检查编译环境、指定安装目录,并启用需要的扩展功能模块 |
| Step 3: 编译源码 | make |
将 C 语言源代码编译转化为机器可执行的二进制文件 |
| Step 4: 写入系统安装 | make install |
将编译好的二进制文件和配置文件复制到指定的目标路径下 |
服务管理和系统启动流程
systemctl 管理服务
常用操作
| 分类 | 常用命令 | 作用与功能说明 |
|---|---|---|
| 基础服务控制 | systemctl start <服务名> |
启动指定服务 |
systemctl stop <服务名> |
停止指定服务 | |
systemctl restart <服务名> |
重启指定服务 | |
systemctl reload <服务名> |
平滑加载配置(不中断服务) | |
systemctl status <服务名> |
查看服务的当前运行状态与最新日志 | |
| 开机自启管理 | systemctl enable <服务名> |
设置服务开机自动启动 |
systemctl disable <服务名> |
禁止服务开机自动启动 | |
systemctl enable --now <服务名> |
立即启动服务并设置开机自启 | |
systemctl is-enabled <服务名> |
检查服务是否已设置开机自启 | |
| 服务状态查询 | systemctl is-active <服务名> |
检查服务当前是否正在运行 |
systemctl list-units --type=service |
列出目前已加载的所有服务单元 | |
systemctl list-units --type=service --state=running |
查看当前正在运行的服务列表 | |
systemctl list-unit-files --type=service |
查看系统中所有已安装服务的开机自启状态 | |
systemctl list-failed |
列出启动失败或处于报错状态的服务 | |
| 安全与保护 | systemctl mask <服务名> |
屏蔽服务(锁定,使其无法手动或被其他服务调用启动) |
systemctl unmask <服务名> |
解除对服务的屏蔽 | |
| 配置重载 | systemctl daemon-reload |
重新加载修改后的 Service 配置文件(修改 .service 文件后必敲) |
| 系统电源管理 | systemctl reboot |
重启操作系统 |
systemctl poweroff |
关闭操作系统(关机) | |
systemctl suspend |
使系统进入休眠/挂起状态 |
服务单元配置文件
服务单元配置文件(Service Unit Configuration File)是 Systemd 用来定义、管理和控制 Linux 后台服务(守护进程/Daemon)的纯文本描述文件,后缀为 .service。
安装的软件通常默认在 /usr/lib/systemd/system/ 创建了一个服务单元配置文件,文件名就是服务名。
设置开机启动命令 systemctl enable <服务名>,本质就是在 /etc/systemd/system/multi-user.target.wants/ 中创建了一个软链接,指向 /usr/lib/systemd/system/ 中的配置文件。
graph TD
subgraph Storage ["1. 配置存储源"]
UsrFile["/usr/lib/systemd/system/nginx.service<br/>(软件安装时自带的默认配置文件)"]
end
subgraph EnableDir ["2. 开机扫描挂载目录"]
WantsDir["/etc/systemd/system/multi-user.target.wants/"]
end
subgraph Engine ["3. Systemd 引擎 (PID 1)"]
Boot["系统开机启动"]
end
%% 流程关系
Cmd["执行 systemctl enable nginx"] -->|"1. 创建软链接"| Link["软链接: nginx.service"]
Link -->|"存放在"| WantsDir
Link -.->|"指向"| UsrFile
Boot -->|"2. 扫描挂载目录"| WantsDir
WantsDir -->|"3. 顺着软链接读取"| UsrFile
UsrFile -->|"4. 解析 ExecStart"| Launch["拉起后台服务进程"]
%% 样式定义
style Storage fill:#f9f9f9,stroke:#333
style EnableDir fill:#e1f5fe,stroke:#0288d1
style Engine fill:#e8f5e9,stroke:#388e3c
服务单元配置文件示例:
1 | [Unit] |
管理启动目标
在 Systemd 的架构中,启动目标(Target) 替代了传统 Linux 中运行级别(Runlevel)的概念。Target 本质上是一组服务单元(.service)及其他单元的逻辑分组与同步点。
| 分类 | 命令 | 详细说明 | 关联底层路径 / 原理 |
|---|---|---|---|
| 查询目标状态 | systemctl get-default |
查看系统开机时默认进入的 Target | 读取 /etc/systemd/system/default.target 软链接 |
systemctl list-units --type=target |
查看当前正在运行/已激活的 Target | - | |
systemctl list-unit-files --type=target |
列出系统中所有可用的 Target 配置文件 | 扫描 /usr/lib/systemd/system/*.target |
|
| 修改默认目标 | systemctl set-default multi-user.target |
设置开机默认进入多用户命令行模式 | 创建软链接 default.target -> multi-user.target |
systemctl set-default graphical.target |
设置开机默认进入图形界面模式 | 创建软链接 default.target -> graphical.target |
|
| 切换运行模式 | systemctl isolate graphical.target |
临时切换到图形界面(无需重启系统) | 停止当前 Target 独有服务,拉起新 Target 关联服务 |
systemctl isolate multi-user.target |
临时切换回命令行模式 | 关闭桌面 GUI 进程及关联图形服务 | |
systemctl isolate rescue.target |
切换到单用户救援模式 | 停止所有普通服务与用户会话,仅留根 Shell | |
| 快捷电源控制 | systemctl reboot |
重启系统 | 切换并执行 reboot.target |
systemctl poweroff |
关机 | 切换并执行 poweroff.target |
|
systemctl suspend |
系统挂起 / 休眠 | 切换并执行 suspend.target |
Linux 系统的启动流程
graph TD
%% 全局样式与方向控制
direction TB
%% --- BIOS 流程分支 ---
subgraph BIOS_Branch ["BIOS (Legacy) + MBR 模式"]
direction TB
B1["<b>1. 硬件自检与 MBR</b><br/>• 上电 / 复位<br/>• BIOS 读取 NVRAM 配置<br/>• 硬件自检 (POST)<br/>• 读取硬盘 0 扇区 (512B)<br/>• 加载 MBR"]
B2["<b>2. GRUB 分阶段引导</b><br/>• 执行 MBR Boot Loader (Stage 1)<br/>• 加载 MBR 保留扇区 (Stage 1.5 驱动)<br/>• 读取 /boot/grub2/grub.cfg (Stage 2 菜单)"]
B3["<b>3. 内核引导与 initramfs</b><br/>• 加载内核 (vmlinuz) 入内存<br/>• 加载虚拟文件系统 (initramfs) 入内存<br/>• 内核挂载 initramfs 并执行 /init"]
B1 --> B2 --> B3
end
%% --- UEFI 流程分支 ---
subgraph UEFI_Branch ["UEFI + GPT 模式"]
direction TB
U1["<b>1. UEFI 固件初始化</b><br/>• 上电 / 复位<br/>• UEFI 初始化硬件 (SEC/PEI/DXE)<br/>• 读取 NVRAM 中的 Boot Manager 启动项"]
U2["<b>2. ESP 分区与 Bootloader</b><br/>• 直接解析 FAT32 格式的 ESP 分区<br/>(/boot/efi/EFI/.../grubx64.efi)<br/>• 执行 UEFI 版 GRUB2<br/>• 读取 /boot/grub2/grub.cfg 显示菜单"]
U3["<b>3. 内核引导与 initramfs</b><br/>• 加载内核 (vmlinuz) 入内存<br/>• 加载虚拟文件系统 (initramfs) 入内存<br/>• 内核挂载 initramfs 并执行 /init"]
U1 --> U2 --> U3
end
%% --- 收敛节点:用户空间初始化 ---
subgraph Shared_Stage ["4. 用户空间初始化 (两模式在此收敛)"]
direction TB
Init["<b>切换至真实系统并启动 PID 1</b><br/>• 切换至真实根文件系统 (switch_root)<br/>• 执行 /sbin/init (指向 Systemd, PID 1)<br/>• Systemd 解析 default.target (如 multi-user / graphical)<br/>• 并发拉起系统服务及依赖链<br/>• 启动 Getty / Display Manager 登录界面"]
end
%% 两条分支收敛到同一节点
B3 --> Init
U3 --> Init
%% 节点与子图样式配置
style BIOS_Branch fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style UEFI_Branch fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
style Shared_Stage fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
style B1 fill:#ffffff,stroke:#f57c00
style B2 fill:#ffffff,stroke:#f57c00
style B3 fill:#ffffff,stroke:#f57c00
style U1 fill:#ffffff,stroke:#1976d2
style U2 fill:#ffffff,stroke:#1976d2
style U3 fill:#ffffff,stroke:#1976d2
style Init fill:#ffffff,stroke:#7b1fa2
Linux 开机故障处理
| 故障场景 | 故障现象与含常见诱因 | 排查与修复方法 |
|---|---|---|
| 1. GRUB2 引导程序破坏 (Stage 1/MBR 损坏) | 报错现象:开机直接黑屏并提示 Operating System not found;卡在 grub error: no such partition / grub rescue> 提示符下;或直接跳过硬盘引导转入第二启动项(如网络/光盘)。常见诱因: • MBR 主引导记录或 ESP 分区 Boot Loader 被误擦除/破坏; • 在已有的 Linux 系统后重装了 Windows,导致 Windows Boot Manager 强制覆盖了 MBR/引导扇区; • 磁盘分区表损坏,导致 GRUB 无法定位物理启动扇区。 |
1. 使用 Linux 安装光盘/ISO 引导,进入救援模式(Rescue Mode)。 2. 切换环境: chroot /mnt/sysroot3. 重新向磁盘写入 GRUB2 引导代码: • BIOS 模式: grub2-install /dev/sda• UEFI 模式: grub2-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=redhat4. 退出并重启: exit → reboot |
2. GRUB2 配置文件丢失 (grub.cfg) |
报错现象:开机直接停留在黑屏文本界面的 grub> 提示符,无法自动弹出内核选择菜单并卡住。常见诱因: • 误删除了 /boot/grub2/grub.cfg(或 UEFI 下的配置文件);• 手动修改 grub.cfg 时输入了错误配置或存在语法逻辑错误;• 执行内核更新或软件包升级时中断,导致菜单生成失败。 |
方案 A(救援模式重构): 1. 光盘引导进入 Rescue Mode 并切换: chroot /mnt/sysroot2. 重新生成配置文件: • BIOS 模式: grub2-mkconfig -o /boot/grub2/grub.cfg• UEFI 模式: grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg方案 B(GRUB 命令行手动临时引导): 在 grub> 界面手动指定路径启动:1. grub> set root=(hd0,msdos1) 指定开机引导文件所在的根设备分区2. grub> linux /vmlinuz-xxx root=/dev/mapper/rhel-root ro 加载内核并传递根目录参数(xxx 按 Tab 补全)3. grub> initrd /initramfs-xxx.img 加载虚拟内存文件系统镜像(xxx 按 Tab 补全)4. grub> boot |
3. 整个 /boot 分区文件丢失 / 误删 |
报错现象:开机后提示 Missing operating system 或引导直接崩溃;进入救援界面检查发现 /boot 目录下空无一物(内核 vmlinuz、initramfs 和 grub2 全灭)。常见诱因: • 运维误操作执行了 rm -rf /boot/*;• 独立 /boot 分区被错误挂载并被初始化/格式化;• 底层存储块阵列损坏或文件系统崩溃导致 /boot 目录丢失。 |
1. 启动进入光盘 Rescue Mode 挂载网络或本地光盘源。 2. 挂载系统与挂载点: chroot /mnt/sysroot3. 挂载光盘镜像到 /mnt 并重新安装内核软件包(生成 vmlinuz 和 initramfs):rpm -ivh /mnt/BaseOS/Packages/kernel-core-x.x.x.rpm --force4. 重装 GRUB2 引导程序与菜单: grub2-install /dev/sdagrub2-mkconfig -o /boot/grub2/grub.cfg5. 退出并重启。 |
4. 文件系统挂载故障 (/etc/fstab 错误) |
报错现象:开机卡在 Emergency Mode(紧急模式)或 Maintenance Mode,提示 Cannot open access to console... 或文件系统检查失败(fsck error)。常见诱因: • /etc/fstab 中填写的 UUID、设备名或文件系统类型错误;• 挂载了已移除的硬件磁盘或已断开的 NFS/iSCSI 网络存储,且未设置 nofail;• 服务器异常断电导致分区逻辑损坏,触发了系统自动检查( fsck/xfs_repair)失败。 |
1. 根据提示输入 root 密码进入紧急命令行。 2. 重新以读写模式挂载根分区: mount -o remount,rw /3. 检查并修改 /etc/fstab:注释掉增删的非必要挂载项,或修正拼写错误(若是因为不关键的分区导致,可在该行 defaults 后加上 ,nofail 参数防止卡开机)。4. 若是磁盘损坏,针对报错分区执行修复: xfs_repair /dev/sdb1 或 fsck -y /dev/sdb15. 执行 systemctl reboot 重启。 |
5. 忘记并重置 root 密码 |
报错现象:无法通过 root 账号与密码登录系统,拒绝访问,导致无法进行系统运维与配置更改。 常见诱因: • 系统管理员遗忘或输错了 root 密码; • 离职交接遗漏,或服务器遭到未经授权的密码篡改; • 自动化部署脚本误修改了凭据配置。 |
方法:通过 GRUB 菜单修改引导参数 1. 重启系统,在 GRUB 菜单界面按 e 键进入编辑模式。2. 找到以 linux 开头的行,删掉 ro 之后的所有内容并在末尾添加:rd.break。3. 按 Ctrl + x 启动进入单用户内核终端。 4. 依次执行以下命令重置密码: mount -o remount,rw /sysrootchroot /sysroot 从内存环境进入硬盘上的真实操作系统环境passwd root 输入新密码touch /.autorelabel (重要:触发表重新打标,防止 SELinux 阻止登录)exit → exit |
| 6. 加密与解密 GRUB2 引导程序 | 报错/加密现象:在 GRUB 菜单按 e 编辑内核参数或进入 c 命令行时,系统强制弹窗要求输入受保护的用户名与密码。配置与触发诱因: • 配置加密:出于等保合规与安全加固需求,防止有物理/虚拟机接触权限的人通过追加 rd.break 直接绕过密码获取 root 权限;• 解密/故障救援:运维人员忘记了设置的 GRUB 菜单密码,导致无法进入单用户模式维护系统。 |
配置加密 (设置密码): 1. 执行 RHEL 9 官方加密命令: grub2-set-password2. 根据提示连续输入两次设置的 GRUB 密码,配置即时生效(自动生成 user.cfg)。解密 / 取消加密 (忘记 GRUB 密码时): 1. 使用 ISO 光盘引导进入 Rescue Mode; 2. 切换环境: chroot /mnt/sysroot;3. 直接删除密码凭据文件即可解密: rm -f /boot/grub2/user.cfg /boot/efi/EFI/redhat/user.cfg |
系统日志服务和时间管理服务
系统日志服务
| 对比维度 | systemd-journald |
rsyslog |
|---|---|---|
| 存储格式 | 二进制文件(含 Hash 索引与字段元数据) | 纯文本文件(如 /var/log/messages) |
| 存储路径 | /run/log/journal/(内存) |
/var/log/ 目录下各类文本日志文件 |
| 查询方式 | 专用命令行工具 journalctl |
标准 Linux 文本处理工具(cat、grep、awk、tail 等) |
| 检索效率 | 极高(基于索引字段检索,如 _SYSTEMD_UNIT、_PID) |
一般(依赖正则表达式逐行扫描大文本) |
| 启动时机 | 内核加载后极早期启动(initramfs 阶段即可捕获) | 系统引导较后期作为常规服务启动 |
systemd-journald 日志服务
| 分类 | 常用命令示例 | 功能与作用说明 |
|---|---|---|
| 基础查看 | journalctl |
查看系统所有日志(默认按时间从旧到新排列,自动调用 less 分页)。 |
journalctl -n 20 |
仅显示最新的 20 条日志(相当于 tail -n 20)。 |
|
journalctl -f |
实时追踪最新日志输出(相当于 tail -f)。 |
|
| 按服务/进程过滤 | journalctl -u sshd.service |
仅查看指定服务单元(Unit)的所有日志。 |
journalctl -u nginx -f |
动态实时查看 Nginx 服务的日志。 | |
journalctl _PID=1 |
过滤指定 PID 进程产生的日志。 | |
journalctl _COMM=sshd |
过滤指定进程名称的日志。 | |
| 按时间段过滤 | journalctl --since "2026-08-30 00:00:00" |
查看指定时间之后产生的日志。 |
journalctl --since "10 min ago" |
查看最近 10 分钟内的日志。 | |
journalctl --since "1 hour ago" --until "15 min ago" |
查看指定时间区间内的日志。 | |
| 按系统启动序列过滤 | journalctl -b |
仅查看本次开机后的所有日志。 |
journalctl -b -1 |
查看上一次开机(上个 Boot 周期)的完整日志。 | |
journalctl --list-boots |
列出磁盘中保存的所有开机历史记录及其索引编号。 | |
| 按日志级别过滤 | journalctl -p err |
仅显示错误(err)及以上级别的日志(级别:emerg, alert, crit, err, warning, notice, info, debug)。 |
journalctl -p err..warning |
过滤显示从 Error 到 Warning 级别的日志。 | |
| 高级与运维诊断 | journalctl -xe |
排错神器:-x 附带系统专家诊断说明,-e 直接跳转到末尾(常用于 systemctl start 失败后的快速诊断)。 |
journalctl -o json-pretty |
以美化后的 JSON 格式输出日志的所有底层元数据字段。 | |
journalctl --disk-usage |
查看日志在磁盘上占用的真实空间大小。 | |
journalctl --vacuum-size=500M |
手动清理日志,将磁盘占用压缩限制在 500MB 以内。 |
配置持久化存储
1 | vim /etc/systemd/journald.conf |
rsyslog 日志服务
常用命令
| 常用命令/工具 | 针对的日志文件 | 典型使用命令示例 | 适用场景与功能 |
|---|---|---|---|
tail |
/var/log/messages |
tail -f /var/log/messages |
动态监听通用系统日志(系统事件、服务启动、硬件变动等)。 |
/var/log/secure |
tail -n 50 /var/log/secure |
安全审计:查看最近 50 条登录、用户鉴权、sudo 授权日志。 |
|
grep |
/var/log/messages |
grep -i "error" /var/log/messages |
快速在文本日志中检索包含关键词(如 error / fail)的行。 |
/var/log/secure |
grep "Failed password" /var/log/secure |
检索 SSH 爆破与密码错误登录记录。 | |
less / more |
/var/log/maillog |
less /var/log/maillog |
打开大体积文本日志文件(如邮件日志),支持上下翻页与 / 关键词搜索。 |
dmesg |
内核环形缓冲区 | dmesg -T | grep -i "eth" |
查看系统开机阶段及硬件驱动(PCI/USB/网卡/磁盘等)的内核原生输出。 |
logrotate |
/etc/logrotate.d/* |
logrotate -f /etc/logrotate.conf |
日志切割工具:配合 rsyslog 定期将文本日志按天/按大小切割归档(如生成 messages-20260830.gz)。 |
部署集中式日志服务器
graph TD
Server[中央日志服务器 - IP: 192.168.1.100]
ClientA[客户端 01 Host A - IP: 192.168.1.10]
ClientB[客户端 02 Host B - IP: 192.168.1.20]
ClientC[客户端 03 Host C - 故障节点: 主机挂了/程序无法启动]
ClientA -->|发送日志 UDP/TCP 514| Server
ClientB -->|发送日志 UDP/TCP 514| Server
ClientC -.->|崩溃前最后日志传输| Server
- 服务端配置
1 | # 编辑服务器配置文件 |
- 客户端配置
1 | vim /etc/rsyslog.conf |
logrotate 日志轮询服务
logrotate 是一个用于自动切割、压缩、轮转和清理日志文件的系统工具。logrotate 的主配置文件是 /etc/logrotate.conf,通常我们在 /etc/logrotate.d/ 目录下为具体服务(如 Nginx、MySQL、自定义应用)创建独立的配置文件。
/etc/logrotate.d/nginx 内容示例
1 | /var/log/nginx/*.log { |
logger 命令手动写入日志
logger 是一个用于向系统日志系统手动写入日志消息的命令行工具。
运行 logger 命令时,它会向系统内核或日志套接字(syslog)发送一条消息。这条消息会同时被 systemd-journald 和 rsyslog 捕获并记录。
| 参数 | 长参数 | 作用说明 |
|---|---|---|
-t |
--tag <TAG> |
为日志指定一个标记/标签(标识日志来源,如脚本名或模块名)。 |
-p |
--priority <facility.level> |
指定日志的设施(Facility)与优先级(Level),如 user.notice 或 local0.err。 |
-i |
--id |
自动在日志中附带当前运行进程的 PID。 |
时间管理
管理系统的时间和时区
| 运维 / 系统需求 | date 命令实现 |
timedatectl 命令实现 |
功能与适用场景说明 |
|---|---|---|---|
| 查看系统当前时间与状态 | date |
timedatectl |
date 仅显示一行本地时间;timedatectl 显示本地时间、UTC 时间、时区及 chronyd 对时状态。 |
| 格式化输出指定时间 | date "+%Y-%m-%d %H:%M:%S" |
(不支持格式化输出) | date 专用于脚本内拼接时间格式(如 2026-08-31 21:55:00);timedatectl 无此功能。 |
| 手动修改系统日期和时间 | date -s "2026-08-31 21:55:00" |
timedatectl set-time "2026-08-31 21:55:00" |
强制将系统时间设定为指定值(使用 timedatectl 前需先关闭 chronyd 自动对时)。 |
| 手动仅修改系统日期 | date -s "2026-08-31" |
timedatectl set-time "2026-08-31" |
只修改日期,保持当前时分秒不变。 |
| 查看 / 修改系统时区 | date +%Z (仅查看时区名) |
timedatectl set-timezone Asia/Shanghai |
date 无法直接改时区;timedatectl 允许通过 list-timezones 查询并一键修改时区。 |
| 开关自动对时 | (不支持控制服务) | timedatectl set-ntp truetimedatectl set-ntp false |
date 无对时控制能力;timedatectl 可一键开启或关闭后台 chronyd 时间同步功能。 |
| 推算过去或未来时间 | date -d "3 days ago" "+%Y%m%d"date -d "next week" "+%Y-%m-%d" |
(不支持时间计算) | 脚本必备。date 支持计算相对日期;timedatectl 无此功能。 |
| 时间戳转换与生成 | date "+%s" (生成时间戳)date -d @1756677272 (转换时间戳) |
(不支持时间戳操作) | date 独有功能,用于获取 Unix 时间戳或将时间戳解析回标准日期。 |
| 硬件时钟 (RTC) 管理 | (不支持直观设置 RTC) | timedatectl set-local-rtc 0 |
timedatectl 可直接配置主板硬件时钟是否使用 UTC(推荐设置为 0 保持 UTC)。 |
chronyd 时间校准服务
| 操作 | 命令 | 作用 |
|---|---|---|
| 查看时间同步源 | chronyc sources -v |
最常用。列出所有配置的 NTP 服务器及其连接状态(^* 表示当前正在使用的源,^+ 表示备选源),-v 是 verbose 的缩写,意思是“详细模式”。 |
| 手动添加 NTP 源 | chronyc add server <IP/域名> iburst |
在不修改配置文件的情况下,临时动态添加一个 NTP 上游服务器。 |
| 手动删除 NTP 源 | chronyc delete <IP/域名> |
动态移除某个已配置的 NTP 时间源。 |
配置局域网时间同步
- 服务端
1 | # 1. 编辑 chrony 配置文件 |
- 客户端
1 | # 1. 编辑 chrony 配置文件 |
内核和内核参数
内核概述
Linux 内核(Kernel)是操作系统的核心掌控者与底层大管家。
它运行在最高权限区(Ring 0),向下直接操纵物理硬件,向上为应用程序提供安全稳定的运行环境。主要负责 5 件核心大事:
- 进程调度:决定谁能使用 CPU 及用多久,实现多任务并发。
- 内存管理:分配与隔离物理内存,通过“虚拟内存”防止程序越界互相干扰。
- 文件系统 (VFS):把各种磁盘和存储设备抽象成统一的文件接口(“一切皆文件”)。
- 网络协议栈:处理 TCP/IP 封包、路由与数据传输。
- 设备驱动:作为“翻译官”,指挥网卡、显卡、磁盘等硬件工作。
graph TD
subgraph 用户空间
A[应用 / 工具 / 服务] --> B[glibc 库]
end
B --> C[系统调用 Syscall]
subgraph 内核空间
C --> KernelCore[内核核心子系统: 进程 / 内存 / VFS / 网络 / 驱动]
I[内核模块] -.-> KernelCore
end
KernelCore --> J[物理硬件]
内核模块
内核模块(Kernel Module,扩展名 .ko)是 Linux 内核动态扩展功能的“插件”机制。
它允许在系统无需重新编译内核、无需重启机器的情况下,将代码动态加载到运行中的内核空间,或从中卸载。
常见分类
- 设备驱动程序:最常见的模块(如 Nvidia 显卡驱动、Realtek 网卡驱动、NVMe 磁盘驱动)。
- 文件系统驱动:对某种特定存储格式的支持(如 NTFS、exFAT、OverlayFS 等)。
- 网络与安全插件:网络协议扩展或高级防火墙功能(如 WireGuard VPN、ip_tables 扩展模块、eBPF 相关模块)。
| 运维 / 管理需求 | 推荐命令 | 命令功能与作用解析 |
|---|---|---|
| 查看已加载模块 | lsmod |
列表显示当前运行在内核空间的所有模块及其依赖关系。 |
| 查看模块详细信息 | modinfo <模块名> |
查看模块的版本、作者、依赖项以及支持的参数(无需先加载)。 |
| 智能加载模块 | modprobe <模块名> |
最推荐。通过模块名在标准库中自动检索路径,并优先加载该模块依赖的所有上游模块。 |
| 卸载模块 | modprobe -r <模块名>或 rmmod <模块名> |
modprobe -r 会自动清理无用的空闲依赖模块;rmmod 仅强行卸载指定的单一模块。 |
| 指定路径强制加载 | insmod /path/to/mod.ko |
专门用于通过绝对路径直接注入非标准目录下的 .ko 文件(不自动处理模块依赖)。 |
| 开机自动加载模块 | vim /etc/modules-load.d/custom.conf |
在文件中直接写入需要开机加载的模块名称(一行一个)。 |
/proc 目录
/proc 是 Linux 系统中一个非常特殊的目录,它并不是存在于硬盘上的物理文件夹,而是一个基于内存的虚拟文件系统(procfs,Process Filesystem)。
当系统运行时,Linux 内核把系统硬件状态、内核运行参数、进程详细信息等动态数据,以“文件”的形式映射到 /proc 目录中,供管理员和应用程序读取或修改。
| 路径 / 文件名 | 对应包含的系统信息 |
|---|---|
/proc/cpuinfo |
CPU 详细规格信息(型号、主频、缓存、flags 指令集支持等) |
/proc/meminfo |
系统内存与 Swap 交换分区的详细使用状况(总量、可用、缓存等) |
/proc/partitions |
块设备及其分区列表(主/次设备号、块数量、设备名称) |
/proc/filesystems |
当前内核已支持/已加载的文件系统类型列表(如 ext4, xfs, overlay 等) |
/proc/cgroups |
内核 **Control Groups(控制组)**的配置与子系统启用状态 |
/proc/modules |
当前已被内核加载的所有模块列表 |
/proc/mounts |
当前系统已挂载的所有文件系统列表 |
/proc/sys/ |
内核参数控制目录(网络、虚拟内存、安全等),向内部文件写入值可实现实时内核调优 |
/proc/<PID>/ |
某个指定进程(PID)的全部运行上下文 |
/proc/<PID>/cgroup |
显示该指定进程当前被分配到了哪些 cgroup 资源控制组中(Docker/K8s 容器中常用来判断进程所在的 Pod 或容器 ID)。 |
/proc/<PID>/cmdline |
启动该进程所使用的完整命令行参数。 |
/proc/<PID>/cwd |
符号链接,指向该进程当前的工作目录。 |
/proc/<PID>/exe |
符号链接,指向该进程对应的执行文件绝对路径。 |
/proc/<PID>/environ |
该进程运行时的所有环境变量。 |
/proc/<PID>/fd/ |
目录,包含该进程打开的所有文件描述符(网络套接字、磁盘文件等)。 |
/proc/<PID>/status |
包含该进程的运行状态、内存占用、父进程 PID 及 UID/GID。 |
tuned-adm 内核调优
Tuned 是 Linux 系统(尤其在 RHEL / CentOS / Rocky Linux / Fedora 中默认集成)中用于自动化性能调优的系统服务。
| 运维 / 管理需求 | 常用 tuned-adm 命令 |
功能与作用解析 |
|---|---|---|
| 查看当前运行与推荐配置 | tuned-adm active |
显示系统当前正生效的 Tuned 调优 Profile 方案。 |
| 让系统推荐最适合的方案 | tuned-adm recommend |
RHCSA 考点。让 Tuned 根据当前系统硬件(如虚拟机、物理服务器等)推荐最佳方案。 |
| 列出所有预设方案 | tuned-adm list |
显示系统支持的所有内置 Profile 方案及其简介。 |
| 一键切换/应用调优方案 | tuned-adm profile <方案名> |
立即将系统的性能策略切换至指定的 Profile(无需重启系统)。 |
| 关闭所有调优配置 | tuned-adm off |
恢复系统默认设置,暂停 Tuned 策略生效。 |
磁盘管理
分区方案
| 对比维度 | MBR (Master Boot Record) | GPT (GUID Partition Table) |
|---|---|---|
| 提出时间与标准 | 1983 年(IBM PC DOS 时代标准) | 1990 年代末(EFI / UEFI 规范的一部分) |
| 最大支持磁盘容量 | 2 TiB (基于 32 位 LBA 及 512 字节扇区计算) | 8 ZiB (94 亿 TB,基于 64 位 LBA 计算) |
| 分区数量限制 | 最多 4 个主分区 (或 3 主分区 + 1 扩展分区内嵌套逻辑分区) |
无理论上限 (Windows 默认限制为 128 个分区) |
| 数据冗余与安全性 | 无备份 (分区表仅存于首扇区 LBA 0,损坏即丢失整盘分区) |
首尾双备份 + CRC32 校验 (磁盘头部与末尾均保存分区表,支持自动修复) |
| 分区识别方式 | 1 字节的分区类型代码(如 0x83 代表 Linux) |
128 位 GUID(全局唯一标识符) |
| 主引导记录位置 | 固定的首扇区(字节 0~445 存放 Boot Code) | LBA 0 设为 Protective MBR (防止旧工具误将 GPT 识别为空盘而覆盖) |
| 推荐引导模式 | Legacy BIOS (或 UEFI 的 CSM 兼容模式) | UEFI (现代操作系统与硬件的标准组合) |
| Linux 常用分区工具 | fdisk / parted |
gdisk / parted |
- MBR 分区
graph TD
subgraph MBR ["MBR 结构 (≤ 2TB)"]
direction TB
subgraph S0 ["LBA 0 (512B)"]
Code["Boot Code (446B)"]
Table["DPT 分区表 (64B)"]
Sig["Flag (0x55AA, 2B)"]
end
subgraph Parts ["数据区"]
P1["主分区 1"]
P2["主分区 2"]
P3["主分区 3"]
subgraph Ext ["扩展分区"]
L1["逻辑分区 1"]
L2["逻辑分区 2"]
end
end
end
Table --> P1
Table --> P2
Table --> P3
Table --> Ext
- GPT 分区
graph TD
subgraph GPT ["GPT 结构 (支持 > 2TB)"]
direction TB
subgraph Head ["主 GPT (磁盘头部)"]
LBA0["Protective MBR"]
LBA1["主 GPT Header"]
LBA2["分区表项"]
end
subgraph Data ["数据区"]
P1["分区 1"]
PN["分区 N..."]
end
subgraph Tail ["备份 GPT (磁盘尾部)"]
BLBA1["备份分区表项"]
BLBA0["备份 GPT Header"]
end
end
LBA2 --> P1
LBA2 --> PN
LBA1 -. 镜像备份 .-> BLBA0
LBA2 -. 镜像备份 .-> BLBA1
分区工具
| 对比维度 / 工具 | fdisk | gdisk | parted |
|---|---|---|---|
| 工具定位 | 传统 MBR 分区工具(现代版本也支持 GPT,但在 GPT 上功能不如 gdisk 丰富) |
专为 GPT 设计的分区工具(界面、快捷键与 fdisk 高度保持一致) | 通用大块存储与脚本化分区工具(完全支持 MBR 与 GPT) |
| 交互式体验 | 支持(菜单驱动,基于单字符快捷指令,如 n, d, p, w) |
支持(菜单驱动,快捷键与 fdisk 保持一致,增加专家模式 x) |
双模式(支持交互式命令行提示符 (parted),也支持纯命令行参数) |
| 变更生效机制 | 内存暂存,手动写入 (修改全在内存缓冲区,执行 w 写入并退出,执行 q 不保存放弃) |
内存暂存,手动写入 (修改全在内存缓冲区,执行 w 写入并退出,执行 q 不保存放弃) |
即时生效,无撤销 (命令一旦回车即直接对磁盘表生效,没有 w 保存过程,误操作风险高) |
| 最佳适用场景 | 快速处理 2TB 以下的传统 MBR 磁盘分区;RHCSA/RHCE 基础存储运维 | 专门用于 2TB 以上 GPT 磁盘的精确分区、备份/恢复 GPT 头及 GUID 转换 | 自动化 Shell 脚本部署、大于 2TB 的 GPT 分区操作、调整分区大小(resize) |
| 进入交互 | fdisk /dev/sdb |
gdisk /dev/sdb |
parted /dev/sdb |
| 查看分区表 | fdisk -l /dev/sdb(交互内: p) |
gdisk -l /dev/sdb(交互内: p) |
parted /dev/sdb print |
| 创建新分区 | 交互内按 n -> 选择类型/编号 -> 指定起始与结束扇区(如 +5G) |
交互内按 n -> 指定编号/起始/结束扇区 -> 输入 GUID code(如 8300) |
parted /dev/sdb mkpart primary ext4 1MiB 5GiB |
| 设置分区表类型 | 交互内按 g(新建 GPT)或 o(新建 MBR) |
默认进入即强制转换为 GPT 逻辑 | parted /dev/sdb mklabel gpt(或 mklabel msdos 设置为 MBR) |
| 删除分区 | 交互内按 d -> 指定分区号 |
交互内按 d -> 指定分区号 |
parted /dev/sdb rm 1 |
| 保存并退出 | 交互内按 w |
交互内按 w |
无需保存(执行即写入,使用 quit 退出) |
| 放弃并退出 | 交互内按 q |
交互内按 q |
无(操作已即时写入) |
创建文件系统
| 功能 | 示例指令 | 解析 |
|---|---|---|
| 标准通用格式 | mkfs -t <文件系统类型> <设备路径> |
mkfs -t xfs /dev/sdb1(通过 -t 参数指定类型,工具内部自动调用 mkfs.xfs) |
| 快捷专有格式 | mkfs.<文件系统类型> <设备路径> |
mkfs.xfs /dev/sdb1直接调用具体工具,语法简练 |
| 查询文件系统类型及UUID | blkid |
只有文件系统创建了之后,才有UUID |
挂载和卸载文件系统
mount临时挂载文件系统
| 参数 / 选项 | 作用解析与使用说明 | 典型示例 / 命令写法 |
|---|---|---|
-a |
挂载 /etc/fstab 中的未挂载条目自动读取并挂载 /etc/fstab 中所有配置了 auto 选项且当前尚未挂载的文件系统。常用于校验配置文件语法无误。 |
mount -a |
-r |
只读挂载(相当于 -o ro)禁止在该文件系统内进行任何写入、修改或删除操作。 |
mount -r /dev/sdb1 /data |
-w |
读写挂载(相当于 -o rw,默认值)允许在该文件系统内正常读写与创建文件。 |
mount -w /dev/sdb1 /data |
-t |
显式指定文件系统类型 手动告知内核设备的文件系统格式(如 xfs, ext4, vfat, iso9660 等)。未指定时内核会自动尝试识别。 |
mount -t xfs /dev/sdb1 /data |
-L |
基于卷标(LABEL)挂载设备 使用文件系统的逻辑名称(卷标)进行挂载,避免受设备路径变化影响。 不同文件系统卷标管理命令: • XFS:设置 xfs_admin -L 'rhcsa' /dev/sdb1 ;清除 xfs_admin -L '--' /dev/sdb1• EXT:设置 e2label /dev/sdb1 'rhce' ;清除 e2label /dev/sdb1 '' |
mount -L "rhcsa" /data |
-U |
基于 UUID 挂载设备 使用文件系统唯一标识符(UUID)挂载,生产环境与 /etc/fstab 最推荐的挂载方式。 |
mount -U "a1b2c3d4-..." /data |
-o |
指定额外的挂载选项 传递一个或多个以逗号分隔的低层挂载策略控制选项(如 -o ro,noexec,nosuid)。 |
mount -o remount,rw / |
↳ defaults |
默认挂载组合 包含 rw, suid, dev, exec, auto, nouser, async 的预设选项集合,日常运维最常用。 |
mount -o defaults /dev/sdb1 /data |
↳ remount |
在线重新挂载 在无需卸载( umount)设备的前提下,实时修改已挂载文件系统的挂载选项(如只读转读写)。 |
mount -o remount,rw / |
↳ ro / rw |
只读 / 读写控制ro 为强制只读;rw 为允许读写。 |
mount -o ro /dev/sdb1 /backup |
↳ async / sync |
异步 / 同步写入模式async(默认):修改先写内存缓冲区,再由内核定时刷盘,性能更高;sync:所有写操作同步直接写入物理磁盘,安全性更高但性能较低。 |
mount -o sync /dev/sdb1 /data |
↳ atime / noatime |
访问时间戳记录atime(默认):每次读取文件或目录时更新访问时间;noatime:禁用更新访问时间,大幅降低磁盘写入,显著提升 I/O 性能。 |
mount -o noatime /dev/sdb1 /data |
↳ auto / noauto |
自动挂载支持auto(默认):运行 mount -a 或开机时自动挂载;noauto:跳过自动挂载,仅在显式手动执行 mount 命令时挂载。 |
mount -o noauto /dev/sdb1 /media |
↳ exec / noexec |
可执行文件运行权限exec(默认):允许运行该分区内的二进制文件及脚本;noexec:禁止直接运行该分区内的可执行文件,用于 /tmp 等目录安全加固。 |
mount -o noexec /tmp |
↳ dev / nodev |
设备文件解析支持dev(默认):识别并支持分区内的块/字符设备文件(/dev 节点);nodev:忽略并禁止解析挂载点内的设备节点。 |
mount -o nodev /home |
↳ suid / nosuid |
SUID / SGID 提权支持suid(默认):允许 set-user-identifier 位生效;nosuid:屏蔽 SUID/SGID 位,防止普通用户利用该分区上的可执行文件越权提权。 |
mount -o nosuid /var |
↳ user / nouser |
普通用户挂载权限user:允许非 root 普通用户挂载(须配合 /etc/fstab 配置);nouser(默认):仅允许 root 用户执行挂载。 |
mount -o user /dev/cdrom /mnt |
unmount临时卸载文件系统
| 参数 / 选项 | 作用解析与使用说明 | 典型示例 / 命令写法 |
|---|---|---|
| 标准卸载 | 指定设备路径或挂载点目录进行卸载(最常用) | sudo umount /dev/sdb1或 sudo umount /data |
-v |
显示详细过程 (Verbose) 输出卸载的具体进度与结果信息。 |
sudo umount -v /data |
-l |
懒惰卸载 (Lazy Unmount) 立即将设备从文件系统层级拆离,待该设备上的所有活动进程结束后再清理相关引用。 专门解决 target is busy 报错。 |
sudo umount -l /data |
-f |
强制卸载 (Force) 主要用于断开失效的网络文件系统(如已挂掉的 NFS / CIFS 共享服务)。 |
sudo umount -f /mnt/nfs |
-R |
递归卸载 (Recursive) 卸载指定的目录及其下挂载的所有子目录树。 |
sudo umount -R /mnt |
- 解决
umount: /data1: target is busy.
1 | [root@router ~]# fuser -v /data1 |
- 永久挂载/卸载配置
编辑 /etc/fstab,末尾添加一行
| 字段序号 | 字段名称 | 推荐填写的数值/格式 | 说明与运维建议 |
|---|---|---|---|
| 第 1 列 | 设备标识 (Device) | UUID="a1b2c3d4-..." 或 LABEL="rhcsa" |
强烈推荐使用 UUID(通过 blkid 获取),防止盘符重排序(如 /dev/sdb 变 /dev/sdc) |
| 第 2 列 | 挂载点 (Mount Point) | /data |
必须为系统中的绝对路径,如果目录不存在需提前 mkdir |
| 第 3 列 | 文件系统类型 (Filesystem) | xfs / ext4 / vfat |
必须与 blkid 查询到的真实文件系统类型一致,否则开机报错 |
| 第 4 列 | 挂载选项 (Mount Options) | defaults 或 defaults,noatime,noexec |
通常填 defaults;如有安全性或性能优化需求可加额外选项 |
| 第 5 列 | Dump 备份标志 | 0 |
0 表示不进行 dump 备份,1 表示备份(现代 Linux 几乎统一填 0) |
| 第 6 列 | fsck 自检顺序 | 0 (XFS 填 0,EXT4 非根分区填 2) |
0 为不检查,1 留给根分区 /,2 为其他从分区。XFS 自身有日志修复机制,统一填 0 |
swap 交换分区/交换文件
| 步骤 | 操作阶段 | 创建 Swap 分区命令 | 创建 Swap 文件命令 | 作用解析与核心参数说明 |
|---|---|---|---|---|
| 1 | 分配存储空间 | sudo fdisk /dev/sdb(新建分区并按 t 修改 Type 代码为 82) |
sudo fallocate -l 2G /swapfile(或 sudo dd if=/dev/zero of=/swapfile bs=1M count=2048) |
划定专用的存储空间。 分区方式写在分区表;文件方式直接在根分区下生成 2GB 大文件。 |
| 2 | 安全权限控制 | (物理分区无需此步骤) | sudo chmod 600 /swapfile |
文件方式必做。 限制 Swap 文件权限为仅 root 可读写( rw-------),防止普通用户读取内存敏感数据。 |
| 3 | 格式化 Swap | sudo mkswap /dev/sdb2 |
sudo mkswap /swapfile |
初始化元数据,写入 Swap 专属的文件系统标头与标志位。 |
| 4 | 启用(挂载)Swap | sudo swapon /dev/sdb2 |
sudo swapon /swapfile |
将 Swap 激活并挂载至当前内核,使其立即生效。 |
| 5 | 状态验证 | swapon --show(或 free -h) |
swapon --show(或 free -h) |
查看 Swap 是否挂载成功、容量及使用的优先级(Priority)。 |
| 6 | 配置开机自动挂载 | 编辑 /etc/fstab 追加:/dev/sdb2 none swap defaults 0 0 |
编辑 /etc/fstab 追加:/swapfile none swap defaults 0 0 |
写入配置文件,确保系统重启后自动重新挂载并启用该 Swap 空间。 |
文件系统检查和修复
| 操作阶段 | 核心命令与实操指南 | 作用解析与核心参数说明 |
|---|---|---|
| 安全卸载目标分区 | umount /dev/sdb1(若 Busy: fuser -mv /dev/sdb1 杀进程或加 -l 卸载) |
绝不能对已挂载的分区进行修复!直接修复读写状态的分区会导致文件系统元数据彻底损坏,造成二次破坏。 |
| 修复 EXT4 文件系统 | e2fsck -fy /dev/sdb1(或 fsck.ext4 -fy /dev/sdb1) |
EXT4 专属工具。-f:强制检查(即便标记为 Clean);-y:对所有自动修复提示默认回答 “yes”,无需手动交互确认。 |
| 修复 XFS 文件系统 | xfs_repair /dev/sdb1(若日志损坏: xfs_repair -L /dev/sdb1) |
XFS 专属工具(注意:XFS 没有 fsck.xfs 实体功能)。-L:清空元数据日志(当日志损坏导致无法修复时使用,可能会丢失最近未落盘的数据,属最后手段)。 |
| 通用前端调用(备选) | fsck -fy /dev/sdb1 |
通用前端命令。fsck 会自动读取设备的文件系统类型,并自动调用后台对应的 fsck.ext4 或 xfs_repair。 |
| 重新挂载与验证 | mount -a然后执行: df -hT /dev/sdb1 |
修复完成后,重新挂载分区并检查挂载状态与文件读写是否恢复正常。 |
LVM 逻辑卷管理
LVM 架构
graph TD
subgraph 物理存储层 [物理存储层 Physical Storage]
sda1[物理分区 /dev/sda1]
sdb1[物理分区 /dev/sdb1]
sdc[整块物理磁盘 /dev/sdc]
end
subgraph LVM_PV [物理卷层 Physical Volumes]
pv1[PV: /dev/sda1]
pv2[PV: /dev/sdb1]
pv3[PV: /dev/sdc]
end
subgraph LVM_VG [卷组层 Volume Group]
vg[VG: vg_data <br> 将所有 PV 划分为最小存储单元 PE]
end
subgraph LVM_LV [逻辑卷层 Logical Volumes]
lv1[LV: lv_root]
lv2[LV: lv_home]
end
subgraph 文件系统层 [文件系统与挂载点]
fs1[XFS / EXT4 文件系统 <br> 挂载至 /]
fs2[XFS / EXT4 文件系统 <br> 挂载至 /home]
end
sda1 -->|pvcreate| pv1
sdb1 -->|pvcreate| pv2
sdc -->|pvcreate| pv3
pv1 -->|vgcreate| vg
pv2 -->|vgcreate| vg
pv3 -->|vgcreate| vg
vg -->|lvcreate| lv1
vg -->|lvcreate| lv2
lv1 -->|mkfs & mount| fs1
lv2 -->|mkfs & mount| fs2
classDef storage fill:#f9f9f9,stroke:#666,stroke-width:1px;
classDef lvm fill:#e1f5fe,stroke:#0288d1,stroke-width:2px;
classDef vgStyle fill:#fff3e0,stroke:#f57c00,stroke-width:2px;
classDef fsStyle fill:#e8f5e9,stroke:#388e3c,stroke-width:1px;
class sda1,sdb1,sdc storage;
class pv1,pv2,pv3,lv1,lv2 lvm;
class vg vgStyle;
class fs1,fs2 fsStyle;
使用 LVM 逻辑卷
- 查看状态
| 步骤 | 常用命令 | 核心参数 & 常用选项解析 | 典型示例 / 命令写法 |
|---|---|---|---|
| 查看 PV / VG / LV 状态 | pvsvgslvs |
列出存储各层级的简要汇总信息。 • -o:自定义输出列;• -a:显示未分配或未激活的设备。 |
pvsvgslvs |
| 扫描与刷新 LVM 缓存 | pvscanvgscanlvscan |
深度扫描系统底层块设备,识别或更新 LVM 元数据与缓存。 • -v:显示详细的扫描过程与调试日志。 |
vgscan |
| 查看详细配置与 PE 映射 | pvdisplayvgdisplaylvdisplay |
输出详细元数据,包括 PE 大小、UUID、分布路径等。 | lvdisplay /dev/vg_data/lv_storage |
| 查看文件系统与挂载状态 | lsblkdf -hT |
• lsblk -f:查看块设备树状拓扑、UUID 及文件系统类型;• df -hT:查看已挂载 LV 的容量使用率和文件系统(XFS/EXT4)。 |
lsblk -fdf -hT |
- 创建和挂载
| 步骤 | 常用命令 | 核心参数 & 常用选项解析 | 典型示例 / 命令写法 |
|---|---|---|---|
| 1. 初始化物理卷 (PV) | pvcreate |
将物理磁盘或分区初始化为 PV。 | pvcreate (多个)磁盘或分区pvcreate /dev/sdb /dev/sdc1 |
| 2. 构建卷组 (VG) | vgcreate |
组合 PV 形成存储池。 • -s:指定 PE 单元大小(默认 4M)。 |
vgcreate 卷组名 物理卷vgcreate vg_data /dev/sdb |
| 3. 划分逻辑卷 (LV) | lvcreate |
从 VG 切割分配 LV。 • -L:按绝对容量(如 -L 20G);• -l:按 PE 数或百分比(如 -l 100%FREE);• -n:指定 LV 名称。 |
lvcreate -L 20G -n lv_storage vg_data |
| 4. 格式化文件系统 | mkfs.xfs或 mkfs.ext4 |
在创建好的 LV 上建立文件系统。 • 逻辑卷设备路径: /dev/卷组名/逻辑卷名 |
mkfs.xfs /dev/vg_data/lv_storage |
| 5. 临时挂载 | mount |
将 LV 挂载到指定目录(重启后失效)。 | mkdir -p /datamount /dev/vg_data/lv_storage /data |
配置 /etc/fstab 自动挂载 |
blkid及 nano /etc/fstab |
将 LV 挂载信息写入配置文件,开机自动挂载。 • 步骤 1:用 blkid 获取 LV 的 UUID;• 步骤 2:在 /etc/fstab 格式追加配置;• 步骤 3:用 mount -a 验证配置正确性。 |
写入 /etc/fstab 的标准行:UUID="xxxx-xxxx-..." /data xfs defaults 0 0(或用路径: /dev/vg_data/lv_storage /data xfs defaults 0 0)测试语法: mount -a |
- 扩容和缩容
| 步骤 | 常用命令 | 核心参数 & 常用选项解析 | 典型示例 / 命令写法 |
|---|---|---|---|
| 1. 在线扩容 LV 和文件系统 | lvextend |
扩展 LV 容量并同步刷新文件系统(无需卸载,在线即时生效)。 • -L <Size>:指指定扩容后的目标大小或增加量(如 -L 10G 或 -L +5G)。;• -l +100%FREE:分配 VG 剩余的所有空闲空间;• -r / --resizefs:自动识别并刷新底层文件系统(XFS/EXT4),一步到位。 |
lvextend -L +10G -r /dev/vg_data/lv_storage(或 lvextend -l +100%FREE -r /dev/vg_data/lv_storage) |
| 2. 单独扩容文件系统 | xfs_growfs resize2fs |
• xfs_growfs /挂载目录:适用于 xfs• resize2fs /dev/卷组名/逻辑卷名:适用于 ext4 |
xfs_growfs /data resize2fs /dev/vg_data/lv_storage |
| 1. 缩减 LV 前卸载并强制自检 (仅限 EXT4) | umount & e2fsck |
绝对不能在线缩容!必须先卸载文件系统,并强行自检确保没有元数据错误。 • -f:强制检查。 |
umount /datae2fsck -f /dev/vg_data/lv_storage |
| 2. 缩减文件系统大小 (仅限 EXT4) | resize2fs |
先缩文件系统,再缩 LV(次序绝对不能颠倒,否则数据毁灭)! • 将文件系统缩小到指定目标容量。 |
resize2fs /dev/vg_data/lv_storage 10G(缩小到 10G) |
| 3. 缩减 LV 逻辑卷 (仅限 EXT4) | lvreduce |
缩减 LV 设备容量归还给 VG。 • -L <Size>:指定缩减后的目标大小或缩小量(如 -L 10G 或 -L -5G)。(或直接用 lvreduce -L 10G -r 带 -r 自动依次执行文件系统缩减) |
lvreduce -L 10G /dev/vg_data/lv_storage完成后重新挂载: mount /dev/vg_data/lv_storage /data |
| 扩容或缩减卷组 VG | vgextend vgreduce |
将新的 PV 加入现有 VG 存储池,扩大总池容量;或者从现有 VG 存储池移除 PV。 | pvcreate /dev/sdcvgextend vg_data /dev/sdc |
- 迁移和卸载
| 步骤 | 常用命令 | 核心参数 & 常用选项解析 | 典型示例 / 命令写法 |
|---|---|---|---|
| 1. 移走坏盘/旧盘上的数据 | pvmove |
在线热迁移数据。将某个 PV 上的所有数据块(PE)实时转移到同一个 VG 内的其他空闲 PV 上,业务不中断。 | pvmove /dev/sdb(自动迁移至同 VG 空闲 PV) 或 pvmove /dev/sdb /dev/sdc |
| 2. 安全剔除并移除旧 PV | vgreduce & pvremove |
数据迁移完成后,将旧 PV 从 VG 中移除并清理 LVM 标头元数据。 | vgreduce vg_data /dev/sdbpvremove /dev/sdb |
| 1. 卸载文件系统 | umount |
彻底断开挂载,防止读写数据造成数据损坏。 (必须同步删除 /etc/fstab 中对应的自动挂载配置) |
umount /data |
| 2. 删除逻辑卷 (LV) | lvremove |
释放 LV 占用的空间并归还给 VG。 • -f / --force:强制删除(跳过确认提示)。 |
lvremove -f /dev/vg_data/lv_storage |
| 3. 销毁卷组 (VG) | vgremove |
彻底销毁整个存储池。 • -f:强制删除(连同下属未清理的 LV 一并清除)。 |
vgremove -f vg_data |
| 4. 清理物理卷 (PV) | pvremove |
清除底层磁盘的 LVM 标头元数据,恢复为普通物理盘。 | pvremove /dev/sdb /dev/sdc |
- 备份和还原
| 步骤 | 常用命令 | 核心参数 & 常用选项解析 | 典型示例 / 命令写法 |
|---|---|---|---|
| 创建快照 | lvcreate |
• -s(--snapshot):创建快照卷;• -L:指定快照分配容量(根据变更量设定);• -n:指定快照逻辑卷名称。 |
lvcreate -L 5G -s -n lv_data_snap /dev/vg_data/lv_data |
| 快照手动扩容 | lvextend |
当快照 Data% 接近上限时手动追加空间。• -L +<size>:为快照增加指定容量。 |
lvextend -L +2G /dev/vg_data/lv_data_snap |
| 快照自动扩容 | vim /etc/lvm/lvm.conf |
在配置文件中修改 snapshot 相关参数 |
snapshot_autoextend_threshold = 70:当快照空间使用率超过 70% 时,触发自动扩容snapshot_autoextend_percent = 20:触发扩容时将自动追加当前 20% 的空间 |
| 还原/合并快照 | lvconvert |
将源 LV 恢复至快照创建时刻的状态。 • --merge:合并快照至源卷(须先卸载源卷与快照卷,合并完成后快照自动销毁)。 |
umount /mnt/datalvconvert --merge /dev/vg_data/lv_data_snap |
| 删除快照 | lvremove |
清除不再需要的快照,释放 VG 物理扩展(PE)空间。 • -f:强制删除(无需交互确认)。 |
umount /mnt/snapshotlvremove -f /dev/vg_data/lv_data_snap |
存储与共享
NFS 共享存储
- NFS 服务端(提供共享的服务器)
| 步骤 | 核心命令 / 修改的文件 | 核心参数与选项解析 | 典型示例 / 命令写法 |
|---|---|---|---|
| 安装服务 | 大多数 Linux 发行版中默认不自带(或仅自带客户端组件),通常需要手动安装 | yum install nfs-utils -y |
|
| 配置文件 | /etc/exports | 定义共享路径、允许访问的主机/网段及权限。 • rw / ro:读写 / 只读权限;• sync:数据同步写入磁盘(保证一致性);• root_squash:(默认) 将客户端 root 用户映射为服务端的匿名用户(通常为 nfsnobody 或 nobody);• no_root_squash:保留客户端 root 用户权限(不降权为匿名用户);• all_squash:将所有访问客户端的用户(无论是 root 还是普通用户)统统映射为匿名用户。• no_all_squash:(默认) 保持普通用户的 UID/GID 不变(按 UID 在服务端匹配对应用户)。 |
/data/share 192.168.1.0/24(rw,sync,no_root_squash) |
| 服务管理 | systemctl |
启动 NFS 核心服务并设置开机自启。 | systemctl enable --now nfs-server |
| 动态刷新 | exportfs |
不重启服务即时加载或管理共享表。 • -r:重新加载 /etc/exports 配置文件;• -v:显示当前导出的详细共享列表与权限;• -au:卸载所有导出的共享目录。 |
exportfs -rv |
| 本地校验 | showmount |
查看本地生效的导出列表。 • -e:显示导出(exports)列表。 |
showmount -e localhost |
| 防火墙配置 | firewall-cmd |
放行 NFS 依赖的服务流量(nfs, rpc-bind, mountd)。 | firewall-cmd --permanent --add-service={nfs,rpc-bind,mountd}firewall-cmd --reload |
- NFS 客户端(使用共享的主机)
| 步骤 | 核心命令 / 修改的文件 | 核心参数与选项解析 | 典型示例 / 命令写法 |
|---|---|---|---|
| 探测共享 | showmount |
查询远端 NFS 服务器暴露的共享目录。 • -e:指定远端服务器 IP 地址。 |
showmount -e 192.168.1.100 |
| 手动挂载 | mount |
临时/手动挂载远端 NFS 目录。 • -t nfs:指定文件系统类型为 NFS。 |
mount -t nfs 192.168.1.100:/data/share /mnt/nfs_share |
| 安全卸载 | umount |
卸载挂载点。 • -l:延迟卸载(Lazy);• -f:强制卸载(针对服务端离线/连接卡死)。 |
umount -lf /mnt/nfs_share |
| 永久挂载 | /etc/fstab | 配置开机自动挂载。 • _netdev:指定必须等待网络就绪后再挂载(防止开机卡死)。 |
192.168.1.100:/data/share /mnt/nfs_share nfs defaults,_netdev 0 0 |
| 服务诊断 | rpcinfonfsstat |
• rpcinfo -p:查看远端端口映射与 RPC 注册情况;• nfsstat -c:查看客户端 NFS 运行状态与性能统计。 |
rpcinfo -p 192.168.1.100nfsstat -c |
autofs 按需挂载
| 步骤 | 触发命令 / 配置文件变化 | 后台核心行为与机制解析 |
|---|---|---|
| 1 | 安装服务:yum install autofs -y |
安装 autofs 软件包,-y 免交互。 |
| 2 | 编辑主配置文件:echo "/mnt/nfs /etc/auto.nfs --timeout=60" >> /etc/auto.master |
加载主规则: 指定 /mnt/nfs 为 Autofs 监控的父目录;指定 /etc/auto.nfs 为子配置文件(文件名任意);--timeout=60 设定空闲 60 秒后自动卸载。 |
| 3 | 创建子配置文件:echo "docs -rw,soft,sync 192.168.1.100:/data/docs" > /etc/auto.nfs |
定义具体映射: 声明相对子目录 docs(即挂载到/mnt/nfs/docs);- 后面为挂载参数 rw,soft,sync;远端 NFS 共享路径 192.168.1.100:/data/docs。 |
echo "* -rw,soft,sync 192.168.1.100:/data/&" > /etc/auto.nfs |
使用通配符自动批量挂载: NFS 服务器 192.168.1.100 的 /data/ 目录下存在文件夹时,在客户端自动挂载为同名文件夹。 |
|
| 4 | 启动服务:systemctl enable --now autofs |
注册伪挂载点: 内核在 /mnt/nfs 挂载一个轻量级 autofs 伪文件系统开启监听。此时 df -h 看不到远端 NFS。 |
SELinux
查看和切换模式
| 操作类型 | 操作 | 命令作用与效果说明 |
|---|---|---|
| 查看模式 | getenforce |
快速查看:仅返回当前运行模式名称(Enforcing / Permissive / Disabled)。 |
sestatus |
详细查看:显示当前模式、配置文件预设模式、策略名称(targeted)等信息。 |
|
| 临时修改 | setenforce 0 |
切为宽容模式(Permissive):保留安全日志记录,但不再实际阻断任何违规操作。 |
setenforce 1 |
切为强制模式(Enforcing):恢复完整安全防护,违规操作将被直接拒绝并记录。 | |
| 永久切换模式 | 修改 /etc/selinux/config 文件 |
强制模式: SELINUX=enforcing 宽容模式: SELINUX=permissive 禁用模式: SELINUX=disabled 修改后需执行 reboot 重启生效。⚠️ 若从 Disabled 切换到 Enforcing,需注意全盘重新打标( touch /.autorelabel)。 |
SELinux 标签系统
标签系统(在 SELinux 中正式称为 安全上下文 Security Context)是 SELinux 实现强制访问控制的基础。没有标签,SELinux 的所有规则就失去了作用对象。
类型(Type)是标签(Label/Security Context)中最核心的一部分,在 SELinux 的日常交流中,大家为了方便,经常把“类型(Type)”俗称为“标签”(比如“给这个文件打上 httpd_sys_content_t 标签”),但在底层逻辑上,它们是包含与被包含的关系。
完整标签(Context / Label):指 system_u:object_r:httpd_sys_content_t:s0 这一长串完整的字符串(包含 User、Role、Type、Level 4个维度)。
类型(Type):只是其中第 3 个位置上的那个名字(比如 httpd_sys_content_t)。
- 文件标签
| 操作类型 | 核心命令 / 步骤写法 | 核心选项含义 | 作用原理与适用场景 |
|---|---|---|---|
| 查看文件标签 | ls -Z <文件或目录>ls -Zd <目录> |
• -Z(--context):显示文件的 SELinux 安全上下文信息• -d(--directory):仅显示目录本身的信息,而非展开其内容 |
属性检查:显示文件或目录的安全上下文(用户:角色:类型:敏感度)。 示例: ls -Z /var/www/html |
| 临时修改 (重打标或全盘恢复后失效) |
chcon -R -t <类型> <文件或目录> |
• -R(--recursive):递归处理目录及其下的所有子文件与子目录• -t(--type):指定要修改的目标 SELinux 类型(Type) |
快速调试/排错:直接修改文件系统节点上的安全上下文。 示例: chcon -R -t httpd_sys_content_t /webdata |
| 永久修改 (标准规范) |
步骤 1(写数据库):semanage fcontext -a -t <类型> "<文件或目录>"步骤 2(刷新文件): restorecon -Rv <文件或目录> |
semanage 选项: • fcontext:管理文件上下文映射规则• -a(--add):添加自定义映射规则• -t(--type):指定映射规则中的目标类型• "(/*)?":正则表达式,匹配该目录及其下所有子路径restorecon 选项: • -R / -r:递归刷新目录及其子项• -v:显示修改过程中的详细信息 |
生产与考试规范:先将映射关系存入 /etc/selinux 策略数据库,再应用到物理文件。示例: semanage fcontext -a -t httpd_sys_content_t "/webdata(/.*)?"restorecon -Rv /webdata |
| 规则查询/删除 | • 查询:semanage fcontext -l | grep "<文件或目录>"• 删除: semanage fcontext -d "<文件或目录>" |
• -l(--list):列出数据库中所有的文件上下文定义• -d(--delete):删除指定的自定义映射规则 |
用于检查数据库中已有的路径标签定义,或清除不再需要的自定义映射规则。 |
- 进程标签
| 操作类型 | 核心命令 / 步骤写法 | 核心选项含义 | 作用原理与适用场景 |
|---|---|---|---|
| 查看运行进程标签 | ps -efZ | grep <进程名> |
• -e(--everyone):显示所有进程• -f(--full):列出进程的详细字段信息• -Z(--context):显示进程的安全上下文(包含用户:角色:类型:灵敏度) |
运行状态核查:查看系统当前正在运行进程的 SELinux 域名(Domain,如 httpd_t)。示例: ps -efZ | grep httpd |
| 查看进程文件标签 | ls -Z <可执行文件路径> |
• -Z(--context):显示文件或目录的安全上下文 |
起点排查:查看二进制可执行文件自身的类型(如 httpd_exec_t),决定了进程启动时能否成功转换到目标 Domain。示例: ls -Z /usr/sbin/httpd |
| 修改二进制文件标签 (修改进程启动源) |
semanage fcontext -a -t <文件类型> "<文件路径>"restorecon -v <文件路径> |
• semanage fcontext -a:添加文件上下文默认规则• restorecon -v:根据策略库将新标签应用到实际文件 |
自定义程序放行:当从非标准路径(如 /opt/bin/)启动服务时,修正其二进制文件类型,使其启动时能正常触发 SELinux 域转换(Domain Transition)。示例: semanage fcontext -a -t httpd_exec_t "/opt/myweb/bin/httpd" |
| 手动指定域运行 (调试/测试场景) |
runcon -t <域类型> <命令> |
• -t(--type):临时指定命令运行时的 SELinux 域类型(Domain) |
调试与安全隔离:在特定安全域下运行一次性命令或测试程序,不改变系统全局策略,通常用于权限测试。 示例: runcon -t httpd_t /tmp/test_script.sh |
- 端口标签
| 操作类型 | 核心命令 / 步骤写法 | 核心选项含义 | 作用原理与适用场景 |
|---|---|---|---|
| 查看端口标签 | semanage port -lsemanage port -l | grep <协议/端口/服务> |
• -l(--list):列出数据库中所有已定义的端口安全上下文映射关系 |
映射查询:查看所有网络端口(TCP/UDP)与 SELinux 端口类型(如 http_port_t、ssh_port_t)的关联。示例: semanage port -l | grep http_port_t |
| 添加端口标签 (永久修改) |
semanage port -a -t <端口类型> -p <协议> <端口号> |
• -a(--add):添加自定义端口映射规则• -t(--type):指定目标端口 SELinux 类型(Type)• -p(--proto):指定传输层协议(tcp 或 udp) |
非标端口放行:当服务修改为非默认端口(如 Web 改为 8888、SSH 改为 22222)时,将新端口写入策略库,允许对应进程绑定。 示例: semanage port -a -t http_port_t -p tcp 8888 |
| 修改端口标签 (修改已有规则) |
semanage port -m -t <端口类型> -p <协议> <端口号> |
• -m(--modify):修改已被定义的端口映射规则,重定向到新的类型 |
重定向类型:修改已被分配给其他类型的端口定义。 示例: semanage port -m -t ssh_port_t -p tcp 22222 |
| 删除端口标签 (清除自定义规则) |
semanage port -d -t <端口类型> -p <协议> <端口号> |
• -d(--delete):删除指定的自定义端口映射规则 |
规则清理:移除不再需要的自定义端口绑定规则,恢复默认配置。 示例: semanage port -d -t http_port_t -p tcp 8888 |
SELinux 类型强制
在 SELinux 的安全架构中,类型强制(Type Enforcement, 简称 TE) 是其最核心的访问控制机制。而在 TE 机制下,布尔值(Booleans) 相当于一个 “动态控制开关系统”,它极大地提升了 SELinux 策略管理的灵活性与可运维性。
| 功能类型 | 核心命令 / 步骤写法 | 核心选项含义 | 作用原理与适用场景 | 对应命令的作用与区别 |
|---|---|---|---|---|
| 查询布尔值 | getsebool -agetsebool <布尔值> |
• -a(--all):列出当前系统中所有已定义的布尔值及其当前运行状态 |
轻量排查:只从内核内存中读取当前的 on/off 状态,不包含额外说明,适合脚本调用或快速验证。 |
• getsebool:只读查询工具,输出极简,速度最快。• 区别:对比 semanage,它无法查看功能描述(Description)和磁盘默认状态。 |
| 查询布尔值 | semanage boolean -l | grep <关键字> |
• -l(--list):列出布尔值名称、当前状态、默认状态及功能描述(Description) |
文档查阅:从策略数据库中读取布尔值信息,提供完整的文字说明,用于不确定某个开关具体作用时查阅。 | • semanage boolean:综合管理/文档工具,信息最丰富。• 区别:对比 getsebool,它能带出官方功能解释,便于定位未知开关。 |
| 修改布尔值 | setsebool [-P] <布尔值> <on|off> |
• -P(--persistent):同步写入磁盘策略库,实现重启后永久生效(不加 -P 仅临时修改内存) |
常用开关:直接通过内核接口修改内存/策略,语法直观且执行速度极快(1~3 秒),是运维与考试的首选。 | • setsebool:专属控制工具,默认仅修改内存(需显式加 -P 持久化)。• 区别:相比 semanage,执行效率极高、参数简单好记。 |
| 修改布尔值 | semanage boolean -m <--on|--off> <布尔值> |
• -m(--modify):修改策略库中的默认布尔值规则 |
策略重构:修改 SELinux 本地策略存储库并触发后台重新编译,天然实现永久生效(无需类似 -P 参数)。 |
• semanage boolean:高层抽象管理入口,默认直接写入磁盘策略。• 区别:相比 setsebool,需要调用 Python 引擎重编策略,耗时较长(3~8 秒)。 |
SELinux 的日志
默认情况下SElinux产生的日志是不会记录到 rsyslog 或者 journald 日志中,通过安装 setroubleshoot-server 服务将 SELinux 的日志转换到 rsyslog 或者 journald 以增强日志可读性。
1 | yum install -y setroubleshoot-server |
管理防火墙
iptables 和 firewalld 本质上都是用户态的“管理客户端/前端工具”,它们真正控制的都是 Linux 内核底层的同一个防火墙框架——Netfilter。
iptables 工具
iptables 是 Linux 系统中最经典、影响最深远的包过滤防火墙管理工具。
虽然在 RHEL 8/9、Ubuntu 20.04+ 等现代 Linux 发行版中,默认的防火墙管理前端已经逐渐切换为 nftables 或 firewalld,但 iptables 的架构模型(表、链、规则)依然是理解 Linux 网络数据包流转、Docker 容器网络隔离以及 Kubernetes CNI 网络插件的基石。(仅作了解)
通过 Cockpit Web 页面管理
Cockpit 本身并不具备防火墙过滤算法,也不直接编写内核规则。
当登录 Cockpit 的网页界面,在“防火墙(Networking / Firewall)”菜单下点击“添加服务”或“开放端口”时,后台默默调用的就是 firewalld 的 API 或命令(firewall-cmd),firewalld 再去更新内核底层的 Netfilter / nftables 规则。
1 | # 安装 Cockpit |
访问 http://<服务器IP地址>:9090 来管理 Linux。
firewalld 工具
| 分类 | 核心命令写法 | 作用与实用场景 |
|---|---|---|
| 状态与查询 | firewall-cmd --state |
查看防火墙运行状态(running / not running)。 |
firewall-cmd --get-active-zones |
查看当前生效的 Zone 以及分别绑定的网卡或 IP。 | |
firewall-cmd --list-all |
最高频:查看默认 Zone 内当前生效的所有规则。 | |
firewall-cmd --get-services |
查看系统预定义了哪些服务名(如 nfs, ssh, http)。 |
|
| Zone 管理 | firewall-cmd --set-default-zone=<zone> |
更改系统的默认 Zone(如改为 internal 或 work)。 |
firewall-cmd --permanent --zone=<zone> --change-interface=<eth> |
将网卡(如 eth0)永久绑定到指定 Zone。 |
|
firewall-cmd --permanent --zone=<zone> --add-source=<ip/mask> |
将特定 IP/网段(如 10.0.0.0/24)绑定到指定 Zone。 |
|
| 放行/拒绝 | firewall-cmd --permanent --add-service=<service> |
按服务放行:永久允许指定服务(如 --add-service=nfs)。 |
firewall-cmd --permanent --add-port=<port/proto> |
按端口放行:永久允许特定端口(如 --add-port=8080/tcp)。 |
|
firewall-cmd --permanent --remove-service=<service> |
移除已放行的服务。 | |
| 地址伪装 (NAT) |
firewall-cmd --permanent [--zone=<zone>] --add-masquerade |
开启地址伪装:允许内部私有 IP 通过本机的外网卡转换上网(路由器 SNAT),也是跨网段端口转发的先决条件。 |
firewall-cmd --permanent [--zone=<zone>] --remove-masquerade |
关闭(指定 Zone 的)地址伪装功能。 | |
firewall-cmd [--zone=<zone>] --query-masquerade |
查询(指定 Zone)是否已经开启地址伪装(输出 yes 或 no)。 |
|
| 端口转发 (DNAT) |
firewall-cmd --permanent [--zone=<zone>] --add-forward-port=port=<源端口>:proto=<协议>:toport=<目标端口> |
本地端口重定向:将访问本机的“源端口”流量转发到本机的“目标端口”(例如将 8888 转到本地 80)。 |
firewall-cmd --permanent [--zone=<zone>] --add-forward-port=port=<源端口>:proto=<协议>:toport=<目标端口>:toaddr=<目标IP> |
跨机器端口转发:将访问本机的流量转发到后端其他服务器的 IP 和端口(如将外部访问本机的 8080 转给内网 192.168.1.100:80)。需先开启伪装。 |
|
firewall-cmd --permanent [--zone=<zone>] --remove-forward-port=port=<源端口>:proto=<协议>:toport=<目标端口>[:toaddr=<目标IP>] |
删除已配置的本地或跨机器端口转发规则。 | |
| 持久化生效 | firewall-cmd --reload |
必做:重载防火墙,让所有 --permanent 规则立刻生效。 |
firewall-cmd --runtime-to-permanent |
将当前内存中临时试用的规则直接转存为永久规则。 |
- zone 包含的规则配置项
| 配置项(Key) | 值类型 / 语法格式 | 作用与含义 |
|---|---|---|
target |
• default:取决于该 Zone 配置文件底层定义的默认行为(通常等同于 REJECT 或 DROP)• ACCEPT:放行所有未匹配的包 • DROP:丢弃所有未匹配的包• REJECT:拒绝所有未匹配的包• %%REJECT%%:使用 firewalld 全局配置中指定的默认拒绝方式 |
默认拒绝/放行动作:当数据包不匹配当前 Zone 里的任何规则时,最终执行的操作。 |
icmp-block-inversion |
• no(默认:仅阻断列表内的类型)• yes(反转:仅放行列表内的类型) |
ICMP 阻断反转开关:开启后,icmp-blocks 的逻辑由“黑名单”翻转为“白名单”。即阻断所有 ICMP 类型,只允许 icmp-blocks 里列出的类型。 |
interfaces |
网卡接口名称列表(空格分隔) | 绑定的网卡接口:当前 Zone 所托管的物理或虚拟网卡。 |
sources |
IP 地址、CIDR 网段或 MAC 地址 | 绑定的来源 IP/网段:匹配这些来源流量并强制使用本 Zone 规则(优先级高于 interfaces)。 |
services |
服务名称列表(定义在 /usr/lib/firewalld/services/ 下) |
预定义服务放行:通过服务名快速放行其对应的一组默认端口。 |
ports |
端口号/协议 或 起始端口-结束端口/协议 |
按端口放行:手动指定开放的具体 TCP/UDP 端口(绕过服务名定义)。 |
protocols |
网络协议名称(定义在 /etc/protocols 中) |
按协议放行:放行指定的网络层/传输层协议流量。 |
masquerade |
yes | no |
IP 伪装(NAT/SNAT):是否开启源地址转换,常用于将本 Zone 作为网关或路由器出口。 |
forward-ports |
port=源端口:proto=协议:toport=目标端口:toaddr=目标IP |
端口转发:将发往当前 Zone 指定端口的流量重定向到本地其他端口或远程 IP。 |
source-ports |
端口号/协议 |
按来源端口放行:根据客户端(发起方)的源端口号放行流量(使用较少)。 |
icmp-blocks |
ICMP 类型名称列表 | ICMP 阻断/放行:显式禁止或允许响应的 ICMP 类型。 |
rich rules |
结构化字符串(Rich Language 标准语法) | 富规则(复杂规则):支持将源 IP、端口、服务、日志及动作组合配置的高级规则。 |
Podman 容器
镜像管理
| 操作类型 | 核心命令写法 | 解析与实用场景 |
|---|---|---|
| 登录仓库 | podman login <镜像仓库地址> |
参数:-u(用户名)、-p(密码)。场景:登录私有或企业镜像仓库(如 Harbor、Quay.io)。凭据在 Rootless 模式下保存在 ~/.config/containers/auth.json,Root 模式下保存在 /run/containers/0/auth.json。 |
| 登出仓库 | podman logout <镜像仓库地址> |
参数:无。 场景:清除本地保存的指定仓库认证 Token,防止凭据残留。 |
| 搜索镜像 | podman search <关键字> |
参数:--limit <N>(限制返回结果条数)。场景:在全局配置的镜像仓库列表(如 Docker Hub、Quay)中检索开源或公共镜像。 |
| 列出镜像 | podman images(或 podman image ls) |
参数:-a(显示包含中间层的所有镜像)、-q(仅输出 Image ID)。场景:查看本地已存在的所有镜像列表、标签(TAG)、镜像 ID 与占用体积。 |
| 查看镜像 | podman inspect <镜像ID/名称> |
场景:查看镜像底层元数据,如默认环境变量、暴露端口、预设入口点(ENTRYPOINT)等。 |
| 拉取镜像 | podman pull <[仓库地址/]镜像名[:TAG]> |
参数:例 podman pull quay.io/centos/centos:stream9。场景:从远程仓库下载指定镜像。若不写仓库前缀,会自动依据 /etc/containers/registries.conf 的配置顺序搜索。 |
| 编译镜像 | podman build -t <镜像名:TAG> . |
参数:-t(指定镜像名称与标签)、-f(手动指定 Dockerfile/Containerfile 路径)。场景:读取当前目录下的 Containerfile 或 Dockerfile 编译出自定义镜像。 |
| 导出镜像 | podman save -o <镜像包.tar> <镜像名[:TAG]> |
参数:-o(--output,指定导出的目标文件路径)。场景:将本地镜像及其完整历史层归档打包为离线 .tar 文件,用于跨网络环境或无网环境分发。 |
| 导入镜像 | podman load -i <镜像包.tar> |
参数:-i(--input,指定导入的文件路径)。场景:将离线打包的 .tar 镜像恢复载入到本地 Podman 镜像存储库中。 |
| 删除镜像 | podman rmi <镜像ID/名称> |
参数:-f(强行删除,即使镜像正被现有容器依赖)。场景:清理指定的单个或多个无用镜像。 |
| 清理镜像 | podman image prune [-a] |
参数:-a(清理所有未被使用的镜像,而不仅是悬空镜像 dangling)。场景:一键垃圾回收,清理无容器引用的残余镜像以释放磁盘空间。 |
容器部署
| 操作类型 | 核心命令写法 | 解析与实用场景 |
|---|---|---|
| 创建容器 | podman run [网络/存储/端口选项] --name <容器名> -d <镜像名> |
参数:-d(后台运行)、--name(自定义容器名)、--rm(容器停止后自动删除物理文件)、-e(注入环境变量,如 -e MYSQL_ROOT_PASSWORD=123)。场景:创建并启动容器的核心命令,常结合下方存储与网络选项组合使用。 |
进入交互 :-it |
参数 :-i (--interactive 保持标准输入打开)、-t(--tty 分配一个伪终端)。场景:不加 -d 的话运行 podman run 后会立即进入容器内终端,可用于临时调试、一次性交互操作(退出即停止)。组合 -d 使用可以使容器保活。 |
|
临时容器:--rm |
参数:--rm:临时容器,用完即销毁。场景:测试或调试完退出后, Podman 会自动删除该容器实例,不占用磁盘空间。 |
|
目录挂载 :-v </宿主机路径|卷名>:/容器路径:Z |
参数::Z(独占 SELinux 标签)、:z(多容器共享 SELinux 标签)、:ro(只读挂载)。场景:直接将宿主机路径映射到容器(如 Web 目录 /opt/html)。在开启 SELinux 的系统上,必须带 :Z 或 :z 尾巴,否则容器内部会报 Permission denied。 |
|
桥接网络 (默认) :--net bridge (或不写) |
解析:容器拥有独立的 IP 地址段,通过 Podman 虚拟网桥与外界打通。 场景:默认模式,安全隔离性最高。 |
|
主机网络 :--net host |
解析:容器与宿主机共享网络协议栈和 IP,无 NAT 转换开销。 场景:适用于高性能要求或需要直接监听宿主机网络端口的场景。注意:容器内监听端口会直接占用宿主机端口。 |
|
容器共享网络 :--net container:<已有容器ID/名称> |
解析:与指定的另一个现有容器共享相同的网络命名空间(包括 IP 和 localhost)。场景:常用于边车(Sidecar)模式或辅助调试工具容器与主容器通信。 |
|
端口映射 :-p <宿主机端口>:<容器端口>[/协议] |
参数:例 -p 8080:80(TCP端口)、-p 53:53/udp(UDP端口)、-p 127.0.0.1:3306:3306(仅限本地回环访问)。场景:在 Bridge 模式下,通过系统 DNAT 将宿主机特定网卡端口流量重定向到容器内部对应的监听端口。 |
|
| 启停容器 | podman start|stop|restart <容器ID/名称> |
参数:-t <秒数>(停止时的超时等待时间)。场景:手动开关或重启已存在的容器。 |
| 列出容器 | podman ps |
参数:-a(列出所有状态的容器,包含已退出的 Exited 容器)。场景:查看容器当前的运行状态、映射端口与运行时长。 |
| 查看对象 | podman inspect <容器|镜像|Pod|存储卷|网络> |
参数:-f <字段> (--format 使用 Go 模板语法直接抓取指定字段)。场景:查看对象的完整配置信息,包含运行时状态、环境变量、网络 IP 地址、挂载卷路径、资源限制等全部细节。 |
| 删除容器 | podman rm [-f] <容器ID/名称> |
参数:-f(强行 Kill 正在运行的容器并直接清理)。场景:物理删除一个或多个容器。 |
| 命名卷管理 | podman volume create|ls|inspect [卷名] |
子命令:create(新建卷)、ls(列出卷)、inspect(查看卷)场景:由 Podman 统一管理的命名卷,屏蔽宿主机物理路径细节,适合数据库等重要数据的持久化存储(如 MySQL 数据目录)。 |
| 自定义网络 | podman network create <网络名>--net <网络名> |
解析:基于 Podman 内置 DNS 创建独立网桥。 场景:属于同一个自定义网络的多个容器,可以直接通过容器名称互相域名解析和通信。 |
| 进入容器 | podman exec -it <容器ID/名称> <命令> |
参数:-i(保持标准输入)、-t(分配伪终端 TTY)。场景:进入正在运行的容器内部执行命令(如: podman exec -it my-web /bin/bash 或 sh)。 |
| 查看日志 | podman logs [-f] [--tail N] <容器ID/名称> |
参数:-f(实时追踪打印 Follow)、--tail N(仅显示最后 N 行)。场景:查看容器内部应用程序打出的标准输出(stdout/stderr)日志,故障排查的核心工具。 |
| 查看状态 | podman stats [<容器ID/名称>] |
参数:无。 场景:动态实时查看容器的 CPU 占用率、内存使用量、网络 I/O 及磁盘 Read/Write 吞吐率。 |
无根容器与 systemd 集成
无根容器(Rootless Container) 指的是在不需要获取宿主机 root 权限(普通用户身份)下运行和管理的容器。
- 作为普通用户登录,不能从 root 用户通过
su -切换; - 普通用户默认只能绑定 ≥1024 的端口,挂载的目录需要有相应的权限;
- 普通用户执行
podman run --userns=keep-id(把宿主机当前普通用户的 UID 直接映射为容器内部相同的 UID)。
Root 容器只要容器在创建时指定了 --restart 策略,它就会在系统启动时被这个服务统一唤醒;
而无根容器需要借助 systemd 用户服务机制,把 Podman 容器包装成宿主机 systemd 管理的一个标准系统服务,这样普通用户也能实现容器开机自启。
| 步骤 | 命令行 | 作用说明 | 关键选项 / 参数解析 |
|---|---|---|---|
| 1. 启动容器 | podman run -d --name my-web -p 8080:80 nginx |
后台运行一个基于 nginx 镜像的无根容器 |
• -d:后台隐式运行(Detached mode)。• --name my-web:指定容器名称为 my-web。• -p 8080:80:将宿主机 8080 端口映射到容器内 80 端口。 |
| 2. 创建服务目录 | mkdir -p ~/.config/systemd/user/ |
创建用于存放当前用户级 systemd 服务配置文件的标准目录 | • -p:递归创建目录,若父目录不存在则一并创建,且已存在时不报错。• ~/.config/systemd/user/:无根 systemd 用户服务的默认检索路径。 |
| 3. 生成并移动服务文件 | podman generate systemd --name my-web --files --newmv container-my-web.service ~/.config/systemd/user/ |
读取容器配置自动生成 .service 文件,并将其移入用户级 systemd 目录 |
• --name my-web:声明要为其生成配置的容器名称。• --files:将配置输出为文件(生成 container-my-web.service)而非打印到标准输出。• --new:指示 systemd 在服务启动/停止时使用全新创建和销毁容器的方式(podman run/rm),提高可靠性。• mv:移动文件至 step 2 创建的配置路径。 |
| 4. 注册并启动服务 | systemctl --user daemon-reloadsystemctl --user enable --now container-my-web |
让 systemd 重载用户配置,随后开启该服务的开机自启并立即启动 | • --user:以当前普通用户上下文管理 systemd 服务(区别于系统级的 sudo systemctl)。• daemon-reload:重新扫描并加载配置文件变更。• enable:配置服务在系统启动(或用户 Session 激活)时自动运行。• --now:在设置 enable 的同时,立即触发 start 启动服务。 |
| 5. 开启用户保活 (Linger) | loginctl enable-linger <user>(需管理员或 sudo 权限执行) |
开启指定用户的 Linger 机制,允许其 systemd 用户服务在无 SSH/Console 登录时依然后台自启并常驻 | • enable-linger:指示 logind 系统守护进程在宿主机开机时自动初始化指定 UID 的 systemd --user 服务树。• <user>:需要开启保活特性的目标用户名或 UID。 |
把容器做成 systemd 服务后,容器本质上依然是一个标准的 Podman 容器。常用的调试、日志查看、进入容器等命令均不受任何影响。但凡是涉及到改变容器运行状态(启动、停止、重启、删除)的操作,建议优先使用 systemctl --user,而不是 podman 命令。
| 管理需求 | 推荐使用的命令 | 为什么这么用? |
|---|---|---|
| 日常排查/调试 | podman logs / podman exec |
podman 的诊断命令功能更丰富,支持交互和即时日志。 |
| 控制开关/重启 | systemctl --user <start|stop|restart> |
由 systemd 统一接管生命周期,保持服务状态一致,避免误触发自动重启。 |
| 删除服务 | systemctl --user disable --now container-my-web.servicerm -f ~/.config/systemd/user/container-my-web.servicesystemctl --user daemon-reload |
1. 停止服务并取消开机自启 2. 删除对应的 service 配置文件 3. 重新加载 systemd 配置,使其不再追踪该服务 |
| 看系统整体状态 | systemctl --user status / journalctl --user |
可以查看结合了宿主机事件、开机自启状态和容器输出的全局日志。 |
构建镜像
| 步骤阶段 | 命令行 / 文件 | 核心作用说明 | 关键选项与语法解析 |
|---|---|---|---|
| 1. 编写构建脚本 | vim Containerfile(或 Dockerfile) |
用文本形式定义镜像的基础环境、安装依赖、文件复制及默认启动命令 | 具体字段详见下表 |
| 2. 执行镜像构建 | podman build -t image-name:v1.0 . |
读取 Containerfile 脚本,逐层执行指令并打包生成本地新镜像;镜像名称可以只写镜像名称,也可以写完整的 域名/命名空间/镜像名称 |
• -t my-custom-app:v1.0:为生成的新镜像打上名称与版本标签(<镜像名>:<Tag>)。• .:(不可忽略)指定构建上下文路径(Context),代表将当前目录下的文件提交给构建引擎。 |
| 3. 验证与测试 | podman imagespodman run --rm my-custom-app:v1.0 |
检查本地镜像库并运行临时容器,验证构建结果是否符合预期 | • podman images:确认新镜像已成功保存在本地存储树中。• podman run --rm:以临时交互或单次运行模式拉起新镜像,容器退出后自动清理,用于功能验证。 |
| 指令 (Instruction) | 语法格式 | 核心作用说明 | 最佳实践 / 注意事项 |
|---|---|---|---|
FROM |
FROM <image>:<tag> |
指定基础镜像,必须是第一条非注释指令 | 尽量指定具体 Tag(如 alpine:3.19),避免使用 latest 导致构建不确定。 |
RUN |
RUN <command> |
在构建镜像时执行 Shell 命令并生成新的镜像层 | 建议用 && 合并多条命令(如 yum update && yum install -y ...),减少镜像层数与体积。 |
CMD |
CMD ["executable","param1"] |
指定容器启动时的默认执行命令 | 可被 podman run 命令行参数覆盖。建议优先使用 Exec 格式(JSON 数组格式)。 |
ENTRYPOINT |
ENTRYPOINT ["executable"] |
配置容器启动时固定的主进程入口 | 例如对于 ENTRYPOINT ["ping"] 的镜像,执行 podman run my-image 8.8.8.8 相当于容器内执行 ping 8.8.8.8。同时存在 CMD 时,会将 CMD 内容作为 ENTRYPOINT 的默认参数(会被用户参数覆盖)。 |
COPY |
COPY <src> ... <dest> |
将宿主机本地文件/目录原样复制到镜像内部 | 相比 ADD 更透明安全。支持使用 --chown=<user>:<group> 自动修复宿主机文件属主。 |
ADD |
ADD <src> ... <dest> |
增强版 COPY,支持解压归档包与 URL 下载 |
自动解压 .tar.gz 等压缩包。除明确需要自动解压外,常规文件复制应优先选用 COPY。 |
WORKDIR |
WORKDIR /path/to/workdir |
为后续的 RUN、CMD、ENTRYPOINT 设置工作目录 |
目录若不存在会自动创建。避免在 RUN 中写大量的 cd /dir,应统一用 WORKDIR 控制。 |
ENV |
ENV <key>=<value> |
设置全局持久化环境变量 | 变量在构建期和容器运行时均有效。在 Containerfile 后续指令中可用 $KEY 引用。 |
USER |
USER <user>[:<group>] |
切换后续指令及容器运行时的用户身份 (UID) | Rootless 无根模式黄金字段!显式指定非 root 用户(如 USER 1001)提升容器安全性。 |
EXPOSE |
EXPOSE <port>[/<protocol>] |
声明容器运行时监听的网络端口 | 仅起文档标识作用,不会真正开放宿主机端口(实际映射仍需在 podman run 时加上 -p)。 |
VOLUME |
VOLUME ["/path/in/container"] |
声明容器内的某个目录为匿名数据挂载点 | 阻止写时复制(Copy-on-Write)对持久化性能的影响。构建时该目录下的修改在后续层不可逆。 |
LABEL |
LABEL <key>=<value> |
为镜像添加自定义 KV 键值对元数据 | 用于标注维护者(maintainer)、版本号、组织架构或 Git Commit Hash 信息。 |