云逸工作室 - Linux常用命令
type: channel
link: https://blog.hfyunyi.cn/index.php/category/Linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/
items: Linux 服务器生产环境完整初始化与深度优化指南
items: 在 Rocky Linux 9 上使用 UPnP 客户端自动配置端口转发
items: 将openssh 编译成RPM包
items: OVF模板转OVA
items: 使用 OVF Tool 轻松导出 ESXi 虚拟机模板与备份
items: linux服务器传感器输出格式说明
items: 服务器内存溢出排查与优化完全指南
items: LVM 完全入门：组件关系、日常查询、扩容与缩容
items: PAM 用户锁定解除
items: IPMI 命令学习笔记

Linux 服务器生产环境完整初始化与深度优化指南
type: item
date: 2026-04-20T12:39:26+08:00
description: 适用发行版：CentOS 7/8、Rocky Linux、Alibaba Cloud Linux 等 RHEL 系 目标：安全加固 + 性能调优 + 可观测性（日志/时间） 风险提示：部分操作（如关闭 Swap、修改 SSH 配置）可能影响现有业务或导致无法登录，请仔细阅读注释并在测试环境验证。1. 为什么要做系统初始化？生产环境操作系统初始状态普遍存在：安全漏洞：SELinux 策略复杂、防火墙规则冲突、默认 SSH 端口暴露性能瓶颈：Swap 导致内存抖动、内核参数未调优、I/O 调度器不当故障难排查：日志仅存于内存、时间不同步、ulimit 过小本文提供 基础加固 → 环境依赖 → 内核深度调优 → 日志管理 → 时间同步 → 磁盘/内存专项优化 全流程，每个参数均有中文释义与推荐值。2. 操作系统基础安全加固2.1 关闭 Swap 交换分区原因：Swap 引入磁盘 I/O 竞争，在 Kubernetes 等容器环境中会干扰资源统计。生产环境强烈建议禁用 Swap。# 立即关闭所有 swap 分区 swapoff -a # 永久禁用：注释 /etc/fstab 中所有包含 swap 的行（使用更宽松的正则匹配空格/tab） sed -i '/\sswap\s/ s/^/#/' /etc/fstab2.2 关闭 SELinux原因：SELinux 提供强制访问控制，但配置复杂易干扰应用。云原生场景通常关闭。# 当前关闭 setenforce 0 # 永久禁用 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config2.3 关闭 firewalld 并重置 iptables原因：云环境已由安全组防护；冗余的防火墙规则可能干扰容器网络（如 Calico）。systemctl stop firewalld && systemctl disable firewalld yum -y install iptables-services systemctl start iptables && systemctl enable iptables iptables -F service iptables save2.4 关闭非必要服务（示例：postfix）systemctl stop postfix && systemctl disable postfix3. 基础环境与依赖包安装3.1 更新系统并安装常用工具yum makecache && yum -y update # 注意：包名 yum-utils（不带 .noarch 后缀） yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp \ wget vim-enhanced lrzsz net-tools git psmisc bash-completion yum-utils \ nmap bind-utils chrony工具说明：conntrack（连接跟踪）、ipvsadm（kube-proxy IPVS 模式）、chrony（高精度时间同步）3.2 配置时区与硬件时钟timedatectl set-timezone Asia/Shanghai timedatectl set-local-rtc 0 # 硬件时钟使用 UTC systemctl restart rsyslog crond 2>/dev/null || true # 若服务不存在则不报错3.3 配置 Chrony 时间同步（使用阿里云 NTP）cp /etc/chrony.conf /etc/chrony.conf.bak sed -i 's/^pool/#pool/' /etc/chrony.conf cat >> /etc/chrony.conf <<EOF server ntp.aliyun.com iburst server ntp1.aliyun.com iburst allow 127.0.0.1 EOF systemctl enable --now chronyd chronyc sources -v4. 系统日志持久化与限流默认 systemd-journald 将日志存储在内存中（/run/log/journal），重启会丢失。生产环境必须持久化。mkdir -p /var/log/journal /etc/systemd/journald.conf.d创建配置文件 /etc/systemd/journald.conf.d/99-production.conf：⚠️ 重要：systemd-journald 配置文件不支持行内注释（即 K…

在 Rocky Linux 9 上使用 UPnP 客户端自动配置端口转发
type: item
date: 2026-04-20T10:14:30+08:00
description: 让你的服务器自动向路由器申请端口转发，省去手动登录路由器配置的繁琐步骤。本文提供完整的安装、使用教程，以及一个支持多端口、多 IP 的自动续期脚本，让 UPnP 映射像静态端口转发一样持久有效。🔧 准备工作：确保路由器开启 UPnP在使用 UPnP 客户端之前，需要先确认你的路由器已经开启了 UPnP 功能。不同品牌路由器的管理界面可能略有差异，一般步骤如下：登录路由器管理后台（通常是 192.168.1.1 或 192.168.0.1）。寻找“转发规则”、“高级设置”或“安全设置”等选项。找到“UPnP”或“通用即插即用”功能，并确保其状态为 “开启”或 “启用”。💡 如果找不到该选项，可以查阅路由器说明书或搜索“你的路由器型号 + UPnP 开启”。📦 在 Rocky Linux 9 上安装 miniupnpcminiupnpc 是 UPnP 客户端的核心工具，它存在于 EPEL（Extra Packages for Enterprise Linux）仓库中。# 启用 EPEL 仓库 sudo dnf install epel-release -y # 安装 miniupnpc sudo dnf install miniupnpc -y安装完成后，你会获得 upnpc 命令行工具，用于管理 UPnP 端口映射。🚀 核心命令与操作步骤1. 发现 UPnP 设备首先使用 -s 参数列出网络中的 UPnP 设备和服务信息，确认客户端与路由器之间的 UPnP 通信正常：upnpc -s如果一切正常，该命令会返回路由器的描述信息、公网 IP 等。如果提示 No valid UPnP device found，请检查路由器的 UPnP 是否已开启，以及防火墙是否阻止了 UPnP 广播（见下文“注意事项”）。2. 添加单条端口映射使用 -a 参数添加一条端口转发规则，基本命令格式：upnpc -a [内网IP] [内网端口] [外网端口] [协议][内网IP]：运行服务的 Rocky Linux 服务器的内网 IP 地址，例如 192.168.1.100。[内网端口]：服务器上服务实际监听的端口，例如 8080。[外网端口]：希望从互联网访问的端口，例如 80。[协议]：tcp 或 udp。示例：将内网 IP 192.168.1.100 上 8080 端口的 Web 服务，通过路由器的 80 端口对外发布：upnpc -a 192.168.1.100 8080 80 tcp成功后，从外部网络访问路由器的公网 IP 的 80 端口，就会被转发到服务器的 8080 端口。⏱️ 可选参数：你还可以在命令末尾加上一个有效期（单位：秒），例如 upnpc -a 192.168.1.100 8080 80 tcp 3600 表示映射只在 1 小时内有效。不指定则请求“无限期”，但大部分路由器并不会真正永久保留。3. 管理现有规则列出所有规则：upnpc -l删除一条规则（按外部端口和协议）：upnpc -d 80 tcp⚠️ 注意事项与常见排错防火墙配置Rocky Linux 9 自带的 firewalld 可能会阻止 UPnP 广播。请放行 UPnP 服务：sudo firewall-cmd --permanent --add-service=upnp sudo firewall-cmd --reload如果仍然无法发现 UPnP 设备，可以临时关闭防火墙进行测试（sudo systemctl stop firewalld），以确认问题来源。内网 IP 地址稳定性如果你的服务器通过 DHCP 获取 IP，地址可能会变动，导致端口映射规则指向错误的 IP。建议：在路由器中为服务器设置 静态 DHCP 分配（IP 与 MAC 绑定），或直接在服务器上配置 静态 IP。安全性UPnP 在带来便利的同时，也可能被恶意软件利用来在路由器上创建后门。建议：只为必要的、可信的服务启用 UPnP 映射。定期运行 upnpc -l 检查当前激活的规则。考虑在不需要时关闭路由器的 UPnP 功能。💾 如何让端口映射永久生效（支持多端口、多 IP）上面介绍的 upnpc -a 命令添加的端口映射是临时的。路由器重启、WAN 口重连或 UPnP 服务重启后，这些规则往往会丢失。如果你希望映射能够长期稳定存在，可以使用下面提供的自动续期脚本。脚本特性支持多个端口映射（不同内网 IP、不同端口、混合 TCP/UDP）。通过配置文件集中管理所有需要保活的映射。定期检查，发现缺失则自动重新添加。轻量级，仅依赖 miniupnpc 和 bash。1. 创建配置文件创建一个配置文件（例如 /etc/upnpc/maps.conf），每行一条映射规则，格式为：<内网IP> <内网端口…

将openssh 编译成RPM包
type: item
date: 2026-04-17T14:58:46+08:00
description: 一、背景介绍OpenSSH 是 Linux 系统远程管理的核心服务，其安全性至关重要。2024年7月，安全社区披露了一个高危漏洞 CVE-2024-6387（regreSSHion）。该漏洞存在于基于 glibc 的 Linux 系统中，影响 OpenSSH 版本 8.5p1 至 9.8p1（不含9.8p1），攻击者可在无需认证的情况下远程执行任意代码，从而获得系统控制权。对于已经停止维护的 CentOS 7 等老旧系统，官方仓库不再提供新版 OpenSSH 的更新包，因此需要自行编译升级。boypt/openssh-rpms 项目提供了一个自动化脚本，能够将最新版本的 OpenSSH 源代码编译成 RPM 包，极大简化了编译过程，并支持批量部署。该项目支持的系统包括：CentOS 5/6/7/8/Stream 8、Amazon Linux 1/2/2023、UnionTech OS Server 20、openEuler 22.03、AnolisOS 7.9/8.6 等。本文以 CentOS 7.x 系统为例，详细介绍如何编译 OpenSSH 9.8p1 的 RPM 包并完成升级。二、升级前的环境确认升级前请确认当前 OpenSSH 版本：[root@ncayu8847 ~]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017可以看到当前版本为 7.4p1，远低于安全版本，存在多个已知漏洞。三、下载所需软件包1. OpenSSH 源码下载地址https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/2. 自动化编译脚本仓库https://github.com/boypt/openssh-rpms/3. 直接下载压缩包（推荐）wget https://github.com/boypt/openssh-rpms/archive/refs/heads/main.zip四、上传并解压文件将下载的 main.zip 上传到 CentOS 7 服务器，然后解压：unzip openssh-rpms-main.zip cd openssh-rpms-main/五、安装编译环境编译 RPM 包需要安装开发工具及相关依赖：yum groupinstall -y "Development Tools" yum install -y imake rpm-build pam-devel krb5-devel zlib-devel libXt-devel libX11-devel gtk2-devel perl perl-IPC-Cmd六、修改 OpenSSL 版本（可选）项目默认可能使用 OpenSSL 3.0.x，但 CentOS 7 环境建议使用兼容性更好的 1.1.1 系列。编辑 version.env 文件：cat version.env根据需要修改，例如：# OPENSSLSRC=openssl-3.0.14.tar.gz # 注释此版本 OPENSSLSRC=openssl-1.1.1v.tar.gz # 修改为1.1.1 OPENSSHSRC=openssh-9.8p1.tar.gz ASKPASSSRC=x11-ssh-askpass-1.2.4.1.tar.gz PERLSRC=perl-5.38.2.tar.gz PKGREL=1七、拉取源码并开始编译运行脚本自动下载源码：./pullsrc.sh如果下载过程中出现错误，可以手动将源码文件放入 downloads/ 目录。下载完成后查看：[root@ncayu8847 openssh-rpms-main]# ll downloads/ 总用量 11564 -rw-r--r--. 1 root root 1910393 7月 1 15:34 openssh-9.8p1.tar.gz -rw-r--r--. 1 root root 9893443 1月 22 2024 openssl-1.1.1v.tar.gz -rw-r--r--. 1 root root 29229 7月 5 17:52 x11-ssh-askpass-1.2.4.1.tar.gz执行编译脚本：./compile.sh编译完成后，RPM 包位于 el7/RPMS/x86_64/ 目录下：[root@ncayu8847 openssh-rpms-main]# ll el7/RPMS/x86_64/ 总用量 16840 -rw-r--r--. 1 root root 5112928 7月 23 12:05 openssh-9.8p1-1.el7.x86_64.rpm -rw-r--r--. 1 root r…

OVF模板转OVA
type: item
date: 2026-04-16T15:59:45+08:00
description: 什么是OVF/OVA？及转换方法在虚拟化环境中，我们经常需要导出、分发或部署虚拟机。OVF 和 OVA 就是两种常见的虚拟机打包格式，下面来简单介绍一下它们的区别与转换方法。OVF 与 OVA 的区别OVF（Open Virtualization Format，开放虚拟机格式）是一种针对虚拟设备（或允许软件运行的虚拟机）进行打包和发布的开放标准。它通常包含多个文件，例如虚拟机描述文件（.ovf）、虚拟磁盘文件（.vmdk）、BIOS 设置文件（.nvram）以及校验文件（.mf）等。OVA 与 OVF 的唯一区别在于，OVA 是一个单文件，它实际上是对 OVF 相关文件进行打包（tarball）后得到的归档文件。简单来说：OVA 就是把 OVF 的多个文件“压缩”成一个文件，便于分发和传输。转换方法方式一：使用 ovftoolovftool 是 VMware 提供的命令行工具，可以轻松完成 OVF 与 OVA 之间的相互转换。将 OVF 转换成 OVAovftool /ovfs/my_vapp.ovf /ovfs/my_vapp.ova将 OVA 转换成 OVFovftool /ovfs/my_vapp.ova /ovfs/my_vapp.ovf方式二：使用 tar 命令手动打包通常，从 ESXi 导出的 OVF 模板会包含以下四个文件：文件名作用my_vapp.ovf虚拟机描述文件my_vapp-1.vmdk虚拟磁盘文件my_vapp.nvramBIOS 设置信息my_vapp.mfSHA1 校验文件（包含所有文件的校验信息）重要： 使用 tar 打包成 OVA 时，需要按照一定顺序添加文件：第一个文件必须是 .ovf 文件然后是 .mf 校验文件最后是其他文件（如 .vmdk、.nvram 等）关于文件所有者（可选）ovftool 打包出来的 OVA 文件，内部所有者和用户组为 someone。如果你希望使用 tar 打包出的文件也具有相同的所有者信息，可以事先创建用户并指定。Linux 创建用户：useradd someoneMac 查看用户 ID：id -u someone注意： 这并不是必须的，你可以根据实际情况决定是否指定所有者。打包命令示例假设当前目录下已有 *.ovf、*.mf、*.vmdk 等文件，按以下步骤打包：创建 OVA 文件并添加 .ovf 文件（作为第一个文件）：tar cvf myova.ova *.ovf --owner=someone --group=someone追加 .mf、.vmdk 等其他文件：tar uvf myova.ova *.mf *.vmdk --owner=someone --group=someone查看打包后的内容（可选）：tar tvf myova.ova完成以上步骤后，myova.ova 就是一个符合规范的 OVA 文件，可以直接用于部署。

使用 OVF Tool 轻松导出 ESXi 虚拟机模板与备份
type: item
date: 2026-04-16T15:57:42+08:00
description: 在日常的虚拟化运维工作中，虚拟机模板导出和备份是一项基础却至关重要的操作。VMware 官方提供的 OVF Tool 是一款功能强大的命令行工具，能够帮助用户将虚拟机导出为开放虚拟化格式（OVF/OVA）包，实现跨平台迁移、模板分发和快速备份。本文将详细介绍 OVF Tool 的安装与使用方法，并重点分享实际操作中容易遇到的“坑”及其解决方案。一、OVF Tool 简介开放虚拟化格式（OVF）是一种行业标准，用于以 XML 格式描述虚拟机镜像的元数据。VMware OVF Tool 是一款命令行工具，帮助用户将 OVF 软件包导入和导出到各种 VMware 产品之间。OVF Tool 提供了以下核心功能：支持 OVA 包的导入和生成（OVA 是 OVF 标准的一部分，将虚拟机的所有文件打包为单个文件）在 vSphere、vCloud Director、VMX 和 OVF 等格式之间直接转换支持从本地文件、HTTP、HTTPS 或 FTP 源访问 OVF部署前可关闭虚拟机电源，部署后可自动开机支持 OVF 包的数字签名与验证提供上下文相关的错误提示，帮助快速定位问题二、安装 OVF Tool2.1 下载地址最新官方下载地址：https://developer.broadcom.com/tools/open-virtualization-format-ovf-tool/latest/OVF Tool 支持 Windows、Linux 和 macOS 三大平台。 私有地址下载 Windows ：https://hfyunyi.lanzoum.com/isU9Q3nedzva2.2 Windows 安装下载 Windows 安装包（.msi 文件，约 7.3 MB）双击安装包，按照默认选项完成安装（一路点击“下一步”）默认安装路径为：C:\Program Files\VMware\VMware OVF Tool建议：为了方便使用，可以将该目录添加到系统环境变量 PATH 中，这样无需每次切换目录即可直接执行 ovftool 命令。2.3 Linux 安装Linux 版本下载后解压即可使用。需要注意，新版 Linux 系统可能缺少 libnsl.so.1 库，需要手动安装：dnf install -y libnsl # CentOS/RHEL 系 # 或 apt install libnsl1 # Debian/Ubuntu 系2.4 macOS 安装macOS 用户需要注意，解压后 ovftool 可能被系统识别为不可信软件，需要先提权并移除隔离标记：chmod +x ovftool sudo xattr -r -d com.apple.quarantine "ovftool目录" # 建议创建软链接到 /usr/local/bin sudo ln -s ovftool绝对路径 /usr/local/bin/ovftool2.5 验证安装安装完成后，运行以下命令验证是否成功：ovftool --version三、核心命令格式与参数详解3.1 基本命令格式ovftool <源位置> <目标位置>源位置：可以是 ESXi/vCenter 上的虚拟机（使用 vi:// 协议）、本地 VMX 文件，或已有的 OVF/OVA 文件目标位置：本地文件路径（OVA/OVF），或目标 ESXi/vCenter 主机3.2 导出虚拟机的核心命令ovftool vi://用户名:密码@ESXi_IP/虚拟机名称 本地存放路径/文件名.ova示例（在 OVF Tool 安装目录下执行）：.\ovftool.exe vi://root@192.168.5.5/debian C:\Users\admin\Desktop\ova\debian.ova导出为 OVF 格式（多文件）的示例：.\ovftool.exe vi://root@192.168.222.8/CentOS7.4 D:\OVF\CentOS7.4-out.ovf3.3 常用参数说明参数说明--noSSLVerify跳过 SSL 证书验证（内网环境推荐）--powerOffSource导出前自动关闭虚拟机电源，确保数据一致性-o / --overwrite目标文件已存在时自动覆盖--compress=9对导出的 OVA 文件进行压缩（1~9，值越大压缩率越高但速度越慢）--acceptAllEulas自动接受所有最终用户许可协议--name=<新名称>导入时指定虚拟机的新名称--datastore=<存储名>导入时指定目标数据存储--powerOn导入完成后自动开机3.4 密码中的特殊字符处理当密码包含 @ 或 \ 等特殊字符时，需要 URL 编码：@ → %40\ → %5c示例（密码为 Adm…

linux服务器传感器输出格式说明
type: item
date: 2026-04-16T11:34:00+08:00
description: 无论你是用 ipmitool、sensors 还是 BMC 网页，传感器数据格式五花八门。本文带你一次搞懂！前言服务器硬件监控是运维的基本功。但当你敲下 ipmitool sensor list 或者 sensors 命令时，面对满屏的数字、英文缩写、竖线分隔符，是不是经常一脸懵？为什么有的行有 10 列，有的只有 6 列？那个 na 到底是不是故障？本文将系统地介绍 4 种最常见的传感器输出格式，逐一拆解每一列的真正含义，并教你 3 秒钟快速定位异常。格式一：ipmitool sensor list – 完整阈值格式（10 列）这是最标准、最完整的传感器输出，常见于华为、曙光、HPE 等主流服务器。输出示例+VCORE0 | 1.700 | Volts | ok | 1.000 | 1.100 | 1.200 | 2.500 | 2.600 | 2.700 PCH_Temp | 44.000 | degrees C | ok | -6.000 | -4.000 | -2.000 | 79.000 | 81.000 | 83.000 列拆解（从第 1 列到第 10 列）列号含义说明1传感器名称如 +VCORE0（CPU核心电压）、PCH_Temp（芯片组温度）2当前读数实时值3单位Volts、degrees C、RPM、Watts、Amps、percent、discrete（离散状态）4状态ok=正常，cr=临界，nc=非临界，na=无数据5LNR低不可恢复阈值 – 低于此值硬件可能损坏6LC低临界阈值 – 严重告警7LNC低非临界阈值 – 警告，性能可能下降8UNC高非临界阈值 – 警告，建议检查9UC高临界阈值 – 严重告警10UNR高不可恢复阈值 – 高于此值硬件可能损坏如何判断异常？状态列不是 ok → 立即处理。当前值 < LNC（第7列）或 > UNC（第8列） → 发出警告。当前值 < LC（第6列）或 > UC（第9列） → 严重告警。当前值 < LNR（第5列）或 > UNR（第10列） → 硬件面临损坏风险。注意：未设置的阈值会显示 na，表示该级阈值不存在。格式二：简化阈值格式（6 列）很多服务器（如浪潮 NF5270M3、部分 Supermicro）只输出 低阈值 + 高阈值，没有细分的 LNR/LC/LNC。输出示例CPU0_VTT | 0.990 | Volts | ok | 0.720 | 1.180 P1V1_PCH | 1.090 | Volts | ok | 0.810 | 1.240 DIMM_0 | 29.000 | degrees C | ok | na | 90.000 列拆解（6 列）列号含义1传感器名称2当前读数3单位4状态5低阈值（下限）6高阈值（上限）判断逻辑当前值 < 低阈值 或 > 高阈值 → 异常。若阈值显示 na，表示未设置该方向阈值（例如只有高阈值，没有低阈值）。这种格式简单直观，但缺少“严重程度”分级。建议结合厂商手册了解阈值含义。格式三：离散传感器格式（discrete）有些传感器不是连续的数值，而是状态标志。它们用 十六进制数 表示事件。输出示例CPU0_Status | 0x0 | discrete | 0x8080| na | na | na | na | na | na PSU_Redundant | 0x0 | discrete | 0x0180| na | na | na | na | na | na Fan1_Present | 0x0 | discrete | 0x0280| na | na | na | na | na | na 列含义当前值：通常 0x0 表示正常/无事件。非 0x0 可能表示故障或特定状态（如冗余丢失、设备不在位）。状态列（第4列）：对于离散传感器，这一列常显示 0x**** 格式的事件码，而不是 ok。需要查阅 IPMI OEM 手册才能解析每个 bit 的含义。运维建议大部分离散传感器当前值为 0x0 且状态也是 0x0 或 0x0080 时可视为正常。如果看到 0x01、0x02 等非零值，或状态码有明显变化，需要进一步排查。一个常见的例外：Pwr Unit Redund 显示 0x1200 可能表示电源冗余降级，虽然当前值为 0x0，但状态码给出了详细原因。格式四：lm-sensors 命令输出（Linux 常用）如果你安装了 lm-sensors 包，sensors 命令会提供更人性化的输出，常用于 PC 服务器或工作站。输出示例coretemp-isa-0000 Adapter: ISA adapter Package id 0: +45.0°C (high = +85.0°C, crit = +95.0°C) …

服务器内存溢出排查与优化完全指南
type: item
date: 2026-04-14T14:39:07+08:00
description: 当服务器突然变慢、进程莫名消失、甚至系统崩溃，很可能是 内存溢出（OOM） 惹的祸。本文带你从零开始，一步步检查内存溢出、定位具体程序、优化内核参数，并分别针对数据库和 Java 程序分析常见“罪魁祸首”。1. 什么是内存溢出简单说，内存溢出就是程序向操作系统申请内存时，系统说“没有足够的内存给你用了”。 结果可能是：申请内存失败，程序崩溃操作系统启动 OOM Killer（内存杀手），强行杀掉占用内存最多的进程就好比你往一个已经满了的杯子里继续倒水，水会溢出——内存“溢出”到其他不该占用的地方，系统就会乱套。2. 第一步：检查服务器是否发生内存溢出当怀疑服务器内存有问题时，先用几个命令快速“望闻问切”。2.1 查看整体内存使用情况free -h输出示例： total used free shared buff/cache available Mem: 7.6G 6.9G 0.2G 0.1G 0.5G 0.3G Swap: 2.0G 1.8G 0.2Gavailable 列显示还剩多少可用内存，如果非常小（<100M）就危险了。Swap 使用率很高（例如 used > 80%），也说明物理内存紧张。2.2 查看内存占用最高的进程top -o %MEM按 M 键（大写）可以按内存使用率排序，一眼看到谁吃内存最多。2.3 查看系统日志中的 OOM 记录CentOS/RHEL 老版本：grep -i "out of memory" /var/log/messagesUbuntu/Debian：grep -i "out of memory" /var/log/syslog使用 dmesg 查看内核消息：dmesg | grep -i "oom"如果看到类似 Out of memory: Kill process 12345 (java) score 987 or sacrifice child 的字样，说明已经发生过 OOM 事件。2.4 查看历史 OOM 记录（systemd 系统）journalctl -k | grep -i oom3. 第二步：定位到具体“凶手”程序找到 OOM 记录后，里面会包含 进程 ID（PID） 和 进程名，例如：Out of memory: Kill process 1892 (mysqld) score 987那么凶手就是 mysqld。 但有时进程已经被杀，如何找到它的“遗言”？3.1 从 OOM 日志中提取详细信息dmesg | grep -A 20 "Kill process"-A 20 会显示匹配行之后的 20 行，里面包含了该进程的内存映射、页表等。3.2 查看被杀进程的启动命令如果日志里只有 PID，可以通过以下方式反查（前提是进程还未完全消失或你记得时间）：ps -p <PID> -o cmd但 OOM 发生后进程已终止，所以最好在问题复现时立即监控。 更聪明的办法是开启内核参数记录 pid：echo 1 > /proc/sys/kernel/print_oom_kill_task3.3 使用 smem 统计真实内存占用top 中的 RES 可能包含共享内存，smem 可以更准确：smem -r -s rss | head -20（需要先安装 smem）4. 第三步：服务器内核参数优化通过调整内核参数，可以降低 OOM 发生的概率，或者让系统行为更可控。4.1 vm.overcommit_memory – 内存超售策略内核允许程序申请比实际物理内存更大的虚拟内存，这叫 overcommit。0（默认）：启发式超售，内核自己判断是否允许。1：总是允许超售（风险大，但适合某些内存分配苛刻的应用）。2：禁止超售，申请的内存总和不能超过 swap + 物理内存 * overcommit_ratio。推荐设置（避免过度超售导致 OOM）：sysctl -w vm.overcommit_memory=2 sysctl -w vm.overcommit_ratio=80 # 最多使用物理内存的80%4.2 vm.panic_on_oom – OOM 时是否重启系统0：触发 OOM Killer 杀进程（默认）1：直接内核 panic 重启系统（适合高可用环境，让集群切换）sysctl -w vm.panic_on_oom=14.3 调整 OOM Killer 的评分机制每个进程都有一个 oom_score（0~1000），分数越高越容易被杀。你可以手动调整某个进程的 adj 值：echo -500 > /proc/<PID>/oom_score_adj负值表示降低被杀概率，正值表示提高。数据库或关键 Java 应用可以设置较小的 adj。4.4 vm.swappiness – 控制 Swap 使用倾…

LVM 完全入门：组件关系、日常查询、扩容与缩容
type: item
date: 2026-04-14T14:20:00+08:00
description: 如果你刚接触 LVM，别怕——把它想象成 “存储乐高”。 硬盘是散装的积木，LVM 能让你随时把它们拼在一起、切出任意大小的空间，还能不停机扩容。一、先搞懂 3 个核心部件（配乐高类比）部件全称乐高类比作用PV物理卷单块积木把一块硬盘或分区变成 LVM 可用的“原材料”VG卷组积木池（大箱子）把多块 PV 积木扔进一个大箱子，变成共享仓库LV逻辑卷从箱子里取出的积木块从 VG 仓库里划分出一块空间，格式化后就能挂载使用它们的层级关系： 物理硬盘 → PV → VG → LV → 格式化(ext4/xfs) → 挂载到目录一个具体例子：硬盘 /dev/sda + 硬盘 /dev/sdb ↓ ↓ PV(/dev/sda) PV(/dev/sdb) └──────┬──────────┘ ↓ VG (名为 myvg) ┌──────┴──────┐ ↓ ↓ LV(root) LV(home) 10GB 20GB ↓ ↓ 格式化ext4 格式化xfs ↓ ↓ 挂载到 / 挂载到 /home关键理解：你不能直接使用 PV 存文件，它只是半成品。VG 只是一个“容量池”，不直接占用空间，空间存在 PV 里。LV 才是你最终能读写文件的“虚拟分区”。二、新手必须掌握的查询命令（看一眼就懂）1. 查看所有硬盘和分区（包括新加的硬盘）lsblk # 树形显示，LVM 卷会用 lvm 标记示例输出：NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 40G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 39G 0 part └─vg0-root 253:0 0 30G 0 lvm / sdb 8:16 0 20G 0 disk ← 新加的硬盘，还没有使用2. 查看 PV、VG、LV 的简洁信息（最常用）pvs # 列出所有物理卷 vgs # 列出所有卷组（重点看 VFree 空闲空间） lvs # 列出所有逻辑卷3. 查看详细信息（调试时用）pvdisplay vgdisplay lvdisplay4. 查看文件系统类型和挂载点df -hT # 显示所有挂载的文件系统及其类型（ext4/xfs）💡 习惯养成：任何操作前，先执行 vgs 看 VG 有无空闲空间；执行 df -hT 看目标 LV 的文件系统类型。三、扩容（重点：不停机，在线完成）扩容分为两种情况：情况A：VG 里还有空闲空间 → 直接扩 LV 和文件系统（最简单）。情况B：VG 空间不够了 → 先加新硬盘 → 扩展 VG → 再扩 LV（本文重点）。情况A：VG 已有空闲空间（直接扩容）示例：把 /dev/myvg/data 从 10G 扩大到 15G。# 1. 确认当前 VG 有空闲空间 vgs # 输出示例： VG #PV #LV #SN Attr VSize VFree # myvg 2 2 0 wz--n- 29.99g 5.00g ← 空闲 5GB，足够 # 2. 扩展逻辑卷（增加 5GB） lvextend -L +5G /dev/myvg/data # 3. 扩展文件系统（关键！很多人忘记这步） # 先检查文件系统类型 df -hT /dev/myvg/data # 如果是 ext4： resize2fs /dev/myvg/data # 如果是 xfs： xfs_growfs /mount/point # 注意：xfs 后面必须跟挂载点，如 /mnt/data # 4. 验证 df -h /dev/myvg/data情况B：新加一块硬盘来扩容（详细步骤）场景：原来的 VG myvg 已经满了（VFree 为 0），你给虚拟机/物理机加了一块 20GB 的新硬盘 /dev/sdb。步骤1：确认新硬盘被系统识别lsblk # 你应该能看到 sdb，大小 20G，没有分区，没有挂载点步骤2：将新硬盘初始化为 PV（物理卷）# 方式一：使用整个硬盘（推荐新手，简单） pvcreate /dev/sdb # 方式二：先分区再创建 PV（用于需要多个分区时，新手先跳过） # fdisk /dev/sdb 创建一个分区 /dev/sdb1，然后 pvcreate /dev/sdb1执行后可以用 pvs 查看，应该能看到新的 PV /dev/sdb。步骤3：把新 PV 加入现有的 VGvgextend myvg /dev/sdb # 执行后，myvg 的 VFree 就会增加 20GB（可用 vgs 确认）步骤4：扩展逻辑卷（比如想给 /dev/myvg/data 增加 15GB）lvextend -L +15G /dev/myvg/data # 或者直接指定最终大小： lvexten…

PAM 用户锁定解除
type: item
date: 2026-03-16T17:07:00+08:00
description: 这篇文章的内容非常详实，覆盖了PAM用户锁定的主要场景和命令。原博客的结构已经不错，但可以通过调整章节顺序、合并同类项、使标题更明确来让逻辑更清晰。以下是修改建议和润色后的版本，你可以直接替换原内容：PAM用户锁定与解锁完全指南当Linux用户无法登录时，通常有三种可能：自动安全锁定（因多次失败尝试）、管理员手动锁定，或账户过期。本文将按此逻辑，帮你快速诊断并解除锁定。⚠️ 重要提示：以下所有操作通常都需要 sudo 权限。在修改PAM配置文件前，务必保持一个已登录的root会话，以防配置错误导致无法登录系统。1. 第一步：诊断锁定原因在动手解锁前，建议先判断锁定类型。可以使用以下命令快速查看账户状态：sudo passwd -S <用户名> # 示例：sudo passwd -S alice输出解读（以alice P 04/01/2025 0 99999 7 -1为例）：重点关注第二个字段的密码状态：P：表示密码正常可用，账户未被手动锁定。问题可能出在自动安全锁定或账户过期。L 或 LK：表示密码被手动锁定（如通过 passwd -l）。请跳至第3节查看解锁方法。NP：表示没有密码，无法登录。如果密码状态为 P，但用户仍无法登录，请继续阅读第2节（自动锁定）和第4节（账户过期）。2. 自动安全锁定与解除当用户因多次输入错误密码被系统自动锁定时，相关信息由PAM模块记录。在不同Ubuntu版本中，使用的模块不同，请根据你的系统版本选择下方对应的小节进行操作。2.1 对于 Ubuntu 22.04及更新版本：使用 faillockfaillock 是 pam_faillock 模块的管理工具。查看所有用户的失败记录：sudo faillock输出示例：alice: When Type Source Valid 2025-04-01 10:23:15 RHOST ssh:notty V 2025-04-01 10:23:18 RHOST ssh:notty V bob: When Type Source Valid解读：输出按用户分组。对于用户 alice，列出了两次失败的尝试。如果失败次数达到或超过PAM配置的阈值（默认为3次），该用户即被锁定。用户 bob 则没有失败记录。查看指定用户：sudo faillock --user alice解除锁定（清除失败记录）：sudo faillock --user alice --reset此命令无成功提示。再次用 sudo faillock --user alice 查看，记录应已清空，用户即被解锁。2.2 对于较旧版本（如Ubuntu 18.04及之前）：使用 pam_tally2在 pam_faillock 成为默认模块前，系统使用 pam_tally2。查看所有用户的失败计数：sudo pam_tally2输出示例：Login Failures Latest failure From alice 3 04/01/25 10:23:18 ssh:notty解读：如果 Failures 列的数字（此处为3）达到了系统设定的阈值，则该用户当前处于锁定状态。查看指定用户：sudo pam_tally2 --user alice解除锁定（重置计数）：sudo pam_tally2 --user alice --reset输出示例：Login Failures Latest failure From alice 3 04/01/25 10:23:18 ssh:notty解读：此命令会先显示被重置前的最后一次记录，然后清空计数。再次查看时，该用户将不再显示。3. 手动锁定与解除管理员可以使用以下命令手动锁定或解锁账户。这种锁定是持久性的，直到再次解锁。3.1 使用 passwd 命令手动锁定用户：sudo passwd -l alice原理是在 /etc/shadow 文件的密码哈希前加上 !，使其无法被认证。手动解锁用户：sudo passwd -u alice查看账户状态（最常用）：sudo passwd -S alice如前所述，输出第二个字段为 L 表示锁定，P 表示正常。3.2 使用 usermod 命令usermod 是更通用的用户管理命令，效果与 passwd 相同。sudo usermod -L alice # 锁定 sudo usermod -U alice # 解锁这些命令执行后通常没有输出，可通过 passwd -S 验证状态。4. 账户过期检查与解除如果账户因过期而无法登录，passwd -S 可能仍显示 P（密码有效）。此时需用 chage 命令查看账户时效。查看账户过期信息：sudo chage -l alice输出解读：重点关注 Account expires 字…

IPMI 命令学习笔记
type: item
date: 2026-03-16T16:36:26+08:00
description: 1. IPMI 简介IPMI（Intelligent Platform Management Interface，智能平台管理接口）是一种工业标准，用于带外（out-of-band）管理服务器硬件。它独立于操作系统（OS）和 BIOS，允许管理员远程监控硬件状态、控制电源、查看传感器数据、访问串行控制台等。通常通过 Baseboard Management Controller（BMC，基板管理控制器）实现。常用的 IPMI 工具是 ipmitool，它支持通过本地或网络与 BMC 通信。2. 安装 ipmitoolCentOS / RHELyum install ipmitoolUbuntu / Debianapt-get install ipmitool源码编译从 SourceForge 下载源码并编译。3. 基本用法3.1 连接方式本地（KCS 接口）：在服务器上直接执行（需要加载内核模块，如 ipmi_devintf）。ipmitool <command>远程（LAN 接口）：通过网络连接到 BMC。ipmitool -H <BMC_IP> -U <用户名> -P <密码> <command>常用选项：-H：BMC 的 IP 地址-U：BMC 用户名-P：密码（也可用 -f 从文件读取，或通过环境变量 IPMITOOL_PASSWORD）-I：接口类型（lan 或 lanplus，推荐 lanplus 支持加密）-p：BMC 端口（默认 623）示例：ipmitool -H 192.168.1.100 -U admin -P password -I lanplus chassis power status4. 常用命令分类4.1 电源管理命令说明chassis power on开机chassis power off强制关机（相当于长按电源键）chassis power soft软关机（发出 ACPI 关机信号，需 OS 支持）chassis power reset重启chassis power cycle先关闭再开启电源chassis power status查看当前电源状态示例：ipmitool -H 192.168.1.100 -U admin -P password chassis power status4.2 传感器信息命令说明sensor list列出所有传感器及其读数sensor get "<传感器名>"获取单个传感器的详细信息sdr list显示传感器数据记录（SDR）sdr type <类型>按类型过滤（如 Temperature, Voltage, Fan）示例：ipmitool sensor list ipmitool sdr type Temperature4.3 用户管理命令说明user list列出所有用户user set name <用户ID> <用户名>设置用户名user set password <用户ID> <密码>设置密码（提示输入）user enable <用户ID>启用用户user disable <用户ID>禁用用户user priv <用户ID> <权限级别> <通道号>设置用户权限（2=User, 3=Operator, 4=Admin）权限级别：1：Callback2：User3：Operator4：Administrator5：OEM示例：# 添加用户 ipmitool user set name 2 john ipmitool user set password 2 ipmitool user priv 2 4 1 ipmitool user enable 24.4 网络配置命令说明lan print <通道号>显示当前网络参数（通道号通常为1）lan set <通道号> ipsrc <static/dhcp>设置 IP 来源lan set <通道号> ipaddr <IP>设置静态 IPlan set <通道号> netmask <掩码>设置子网掩码lan set <通道号> defgw ipaddr <网关>设置默认网关示例：ipmitool lan print 1 ipmitool lan set 1 ipsrc static ipmitool lan set 1 ipaddr 192.168.1.100 ipmitool lan set 1 netmask 255.255.255.0 ipmitool lan set 1 defgw ipaddr 192.168.1.14.5 通道设置命令说明channel info [通道号]显示通道信息channel getaccess <通道号> <用户ID>查看用户通道访问权限channel setaccess <通…