RHCSA 学习笔记(三):软件包、系统服务、存储管理、SELinux、防火墙与容器

学习红帽课程中的一些笔记,本系列共 3 篇,这是第 3 篇。

软件包管理

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 Linux
baseurl=https://mirrors.aliyun.com/epel/7/$basearch
enabled=1
gpgcheck=1
gpgkey=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 Media
baseurl=file:///media/cdrom
enabled=1
gpgcheck=1
gpgkey=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:
nginx
server {
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 BaseOS
baseurl=http://192.168.1.100/repo/BaseOS
enabled=1
gpgcheck=0
[lan-custom]
name=LAN Custom
baseurl=http://192.168.1.100/repo/custom
enabled=1
gpgcheck=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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
[Unit]
# 服务的简短描述信息
Description=My Custom Python Web Service
# 帮助文档链接(可选,执行 systemctl status 时会展示)
Documentation=https://docs.example.com/my-app

# 启动顺序控制:指定本服务必须在网络服务(network.target)启动完成后再启动
After=network.target
# 依赖关系:如果网络未启动,尝试拉起网络服务(非强依赖,启动失败也不影响本服务继续尝试)
Wants=network.target

[Service]
# 服务启动类型:
# simple(默认):ExecStart 启动的进程就是主进程
# forking:程序自身会转入后台(如 Nginx),需配合 PIDFile 使用
# oneshot:执行一次性任务,完成后即退出
Type=simple

# 运行该服务进程的 Linux 用户和组(安全隔离,避免使用 root 运行)
User=www-data
Group=www-data

# 启动命令执行前的工作目录
WorkingDirectory=/var/www/my-app

# 环境变量设置(支持配置多个)
Environment="PORT=8080"
Environment="NODE_ENV=production"
# 也可以直接从外部文件加载环境变量
# EnvironmentFile=/var/www/my-app/.env

# 启动服务的绝对路径命令(注意:必须写绝对路径!)
ExecStart=/usr/bin/python3 /var/www/my-app/main.py

# 服务重新加载配置时的命令(可选,执行 systemctl reload 时触发)
ExecReload=/bin/kill -HUP $MAINPID

# 进程崩溃与自愈策略:
# on-failure:当进程返回非0退出码、被信号杀死或超时死机时自动重启
# always:无论以何种原因退出,一律自动重启
Restart=on-failure

# 进程异常退出后,等待 5 秒再尝试重新拉起
RestartSec=5s

# 防止死循环重启:如果 60 秒内连续重启超过 5 次,Systemd 将停止尝试并报错
StartLimitIntervalSec=60s
StartLimitBurst=5

# 资源限制(可选):限制该服务最大使用的内存为 512M
MemoryMax=512M
# 限制最高占用 1 个 CPU 核心(100% 代表单个 CPU 核心满载)
CPUQuota=100%

[Install]
# 挂载目标:指定当系统进入多用户模式(正常开机命令行环境)时启用该服务
# 执行 systemctl enable my-app.service 时,Systemd 会在 /etc/systemd/system/multi-user.target.wants/ 目录下建立该文件的软链接
WantedBy=multi-user.target

管理启动目标

在 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/sysroot
3. 重新向磁盘写入 GRUB2 引导代码:
• BIOS 模式:grub2-install /dev/sda
• UEFI 模式:grub2-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=redhat
4. 退出并重启:exit → reboot
2. GRUB2 配置文件丢失 (grub.cfg) 报错现象:开机直接停留在黑屏文本界面的 grub> 提示符,无法自动弹出内核选择菜单并卡住。

常见诱因:
• 误删除了 /boot/grub2/grub.cfg(或 UEFI 下的配置文件);
• 手动修改 grub.cfg 时输入了错误配置或存在语法逻辑错误;
• 执行内核更新或软件包升级时中断,导致菜单生成失败。
方案 A(救援模式重构):
1. 光盘引导进入 Rescue Mode 并切换:chroot /mnt/sysroot
2. 重新生成配置文件:
• 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/sysroot
3. 挂载光盘镜像到 /mnt 并重新安装内核软件包(生成 vmlinuz 和 initramfs):
rpm -ivh /mnt/BaseOS/Packages/kernel-core-x.x.x.rpm --force
4. 重装 GRUB2 引导程序与菜单:
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg
5. 退出并重启。
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/sdb1
5. 执行 systemctl reboot 重启。
5. 忘记并重置 root 密码 报错现象:无法通过 root 账号与密码登录系统,拒绝访问,导致无法进行系统运维与配置更改。

常见诱因:
• 系统管理员遗忘或输错了 root 密码;
• 离职交接遗漏,或服务器遭到未经授权的密码篡改;
• 自动化部署脚本误修改了凭据配置。
方法:通过 GRUB 菜单修改引导参数
1. 重启系统,在 GRUB 菜单界面按 e 键进入编辑模式。
2. 找到以 linux 开头的行,删掉 ro 之后的所有内容并在末尾添加:rd.break。
3. 按 Ctrl + x 启动进入单用户内核终端。
4. 依次执行以下命令重置密码:
mount -o remount,rw /sysroot
chroot /sysroot 从内存环境进入硬盘上的真实操作系统环境
passwd root 输入新密码
touch /.autorelabel (重要:触发表重新打标,防止 SELinux 阻止登录)
exit → exit
6. 加密与解密 GRUB2 引导程序 报错/加密现象:在 GRUB 菜单按 e 编辑内核参数或进入 c 命令行时,系统强制弹窗要求输入受保护的用户名与密码。

配置与触发诱因:
• 配置加密:出于等保合规与安全加固需求,防止有物理/虚拟机接触权限的人通过追加 rd.break 直接绕过密码获取 root 权限;
• 解密/故障救援:运维人员忘记了设置的 GRUB 菜单密码,导致无法进入单用户模式维护系统。
配置加密 (设置密码):
1. 执行 RHEL 9 官方加密命令:grub2-set-password
2. 根据提示连续输入两次设置的 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
2
3
4
5
6
vim /etc/systemd/journald.conf
[Journal]
#Storage=auto
# auto:当/var/log/journal目录存在,就是持久化存储,如果不存在就是易失性存储 /run/log/journal
# none:都不会持久化存储
# persistent:无论/var/log/jounal目录是否存在都是持久化存储,目录不存在会自动创建

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 编辑服务器配置文件
vim /etc/rsyslog.conf

# 取消以下四行的注释(启用 UDP 514 和 TCP 514 接收)
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")

# 追加自定义模板:将不同客户端的日志自动存入对应主机名目录
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log" # 定义模板
*.* ?RemoteLogs # 应用模板,这里不会解析变量所以要先把变量写到模板里

# 放行防火墙并重启服务
firewall-cmd --permanent --add-port=514/tcp --add-port=514/udp
firewall-cmd --reload
systemctl restart rsyslog
  • 客户端配置
1
2
3
4
5
6
7
8
vim /etc/rsyslog.conf
# 在文件末尾追加
*.* @@192.168.1.100:514
# *.* 表示不限来源(auth, kern, cron等),不限日志级别(info, notice, warning 等)
# @ 表示 UDP,@@ 表示 TCP

# 重启客户端 rsyslog 服务
systemctl restart rsyslog
logrotate 日志轮询服务

logrotate 是一个用于自动切割、压缩、轮转和清理日志文件的系统工具。
logrotate 的主配置文件是 /etc/logrotate.conf,通常我们在 /etc/logrotate.d/ 目录下为具体服务(如 Nginx、MySQL、自定义应用)创建独立的配置文件。

/etc/logrotate.d/nginx 内容示例

1
2
3
4
5
6
7
8
9
10
11
12
13
/var/log/nginx/*.log {
daily # 轮转周期:每天执行一次(可选 weekly, monthly)
rotate 7 # 保留最近 7 个备份文件,旧的自动删除
missingok # 如果日志文件不存在,忽略错误继续执行
notifempty # 如果日志文件为空,不进行轮转
compress # 轮转后的历史日志进行 gzip 压缩 (.gz)
delaycompress # 延迟压缩(把上一次的备份在下一次轮转时再压缩,防止正在写入的文件被压缩报错)
create 0640 nginx nginx # 切割后创建新的空日志文件,并指定权限与属主属组
sharedscripts # 针对通配符匹配到的所有日志,下面的 postrotate 脚本只执行一次
postrotate # 切割完成后执行的命令/脚本
/usr/bin/systemctl kill -s HUP nginx.service >/dev/null 2>&1 || true
endscript # 脚本结束标识
}

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 true
timedatectl 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 编辑 chrony 配置文件
vim /etc/chrony.conf

# 2. 允许局域网内的客户端网段连接本服务器获取时间
# 根据实际局域网网段修改(例如:192.168.1.0/24 或 10.0.0.0/8)
allow 192.168.1.0/24

# 3. 孤岛模式(离线权威时间源)
# 即使本服务器无法连接外网 NTP 源,也强制将本机系统时间作为权威时间源提供给客户端
# stratum 10 表示层级为 10(数值越小优先级越高,10 适合内网孤岛源)
local stratum 10

# 如果启用了 firewalld 防火墙,必须放行 UDP 123 端口
firewall-cmd --permanent --add-service=ntp
firewall-cmd --reload
  • 客户端
1
2
3
4
5
6
# 1. 编辑 chrony 配置文件
vim /etc/chrony.conf

# 2. 将上游时间源指向局域网 NTP 服务器的 IP 地址
# iburst 参数可以让客户端在刚启动时快速发送 4 个包完成初始化对时
server 192.168.1.100 iburst

内核和内核参数

内核概述

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
2
3
4
5
[root@router ~]# fuser -v /data1
USER PID ACCESS COMMAND
/data1: root kernel mount /data1
root 1633 ..c.. bash
[root@router ~]# fuser -km /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 状态 pvs
vgs
lvs
列出存储各层级的简要汇总信息。
• -o:自定义输出列;
• -a:显示未分配或未激活的设备。
pvs
vgs
lvs
扫描与刷新 LVM 缓存 pvscan
vgscan
lvscan
深度扫描系统底层块设备,识别或更新 LVM 元数据与缓存。
• -v:显示详细的扫描过程与调试日志。
vgscan
查看详细配置与 PE 映射 pvdisplay
vgdisplay
lvdisplay
输出详细元数据,包括 PE 大小、UUID、分布路径等。 lvdisplay /dev/vg_data/lv_storage
查看文件系统与挂载状态 lsblk
df -hT
• lsblk -f:查看块设备树状拓扑、UUID 及文件系统类型;
• df -hT:查看已挂载 LV 的容量使用率和文件系统(XFS/EXT4)。
lsblk -f
df -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 /data
mount /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 /data
e2fsck -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/sdc
vgextend 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/sdb
pvremove /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/data
lvconvert --merge /dev/vg_data/lv_data_snap
删除快照 lvremove 清除不再需要的快照,释放 VG 物理扩展(PE)空间。
• -f:强制删除(无需交互确认)。
umount /mnt/snapshot
lvremove -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
服务诊断 rpcinfo
nfsstat
• rpcinfo -p:查看远端端口映射与 RPC 注册情况;
• nfsstat -c:查看客户端 NFS 运行状态与性能统计。
rpcinfo -p 192.168.1.100
nfsstat -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 -l
semanage 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 -a
getsebool <布尔值>
• -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
2
3
4
5
yum install -y setroubleshoot-server
# 在 journalctl 中查看 SELinux 相关的友好日志
journalctl -t setroubleshoot --since "5 min ago"
# 或者在 /var/log/messages 中查看
grep "setroubleshoot" /var/log/messages

管理防火墙

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
2
3
4
5
6
7
# 安装 Cockpit
yum install -y cockpit
# 启动服务并设置为开机自启
systemctl enable --now cockpit.socket
# 放行 cockpit 预定义服务(即 9090 端口)
firewall-cmd --permanent --add-service=cockpit
firewall-cmd --reload

访问 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 权限(普通用户身份)下运行和管理的容器。

  1. 作为普通用户登录,不能从 root 用户通过 su - 切换;
  2. 普通用户默认只能绑定 ≥1024 的端口,挂载的目录需要有相应的权限;
  3. 普通用户执行 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 --new
mv 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-reload
systemctl --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.service
rm -f ~/.config/systemd/user/container-my-web.service
systemctl --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 images
podman 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 信息。