云逸工作室 - alick
type: channel
link: https://blog.hfyunyi.cn/index.php/author/1/
description: alick
items: MySQL 双主热备 + Keepalived 全自动切换方案
items: Win10 多用户远程登录指南：RDPWrap 组策略
items: Docker 在线安装
items: Linux 服务器生产环境完整初始化与深度优化指南
items: 在 Rocky Linux 9 上使用 UPnP 客户端自动配置端口转发
items: mikrotik 端口映射之原进原出
items: 将openssh 编译成RPM包
items: OVF模板转OVA
items: 使用 OVF Tool 轻松导出 ESXi 虚拟机模板与备份
items: linux服务器传感器输出格式说明

MySQL 双主热备 + Keepalived 全自动切换方案
type: item
date: 2026-05-07T14:35:14+08:00
description: 纯热备场景下，用最少的组件（Keepalived + MySQL 原生复制）实现故障全自动切换、自动恢复、零数据丢失。兼容 MySQL 5.7 / 8.0 / MariaDB。一、设计思路1.1 核心问题在做这个方案之前，先想清楚三个问题：问题 1：为什么不用 MHA / ProxySQL？MHA 的 Manager 是单点，且切换后 Manager 自动退出，旧主恢复后仍需人工处理ProxySQL 功能强但引入了新的高可用问题（ProxySQL 本身也要做 HA），纯热备场景下得不偿失Keepalived 极其成熟，几万行 C 代码跑了二十年，比任何"智能"方案都可靠问题 2：为什么用双主而不是主从？传统主从 + VIP 的问题：切换后需要 CHANGE MASTER 反转拓扑。双主（互为主从）的好处是：不管 VIP 在哪台，另一台本来就是它的从库，切换时无需改复制拓扑，VIP 漂过去就能直接写。问题 3：如何防止恢复后 VIP 自动回切？这是整个方案最核心的设计点。来看看常规方案的问题：常规方案（仅用 priority + weight）： db-a priority=100 (主), db-b priority=90 (备) db-a 宕机 → db-a=80, db-b=90 → db-b 接管 ✓ db-a 恢复 → db-a=100, db-b=90 → db-a 抢回 ✗ （不必要的第二次中断！）如果加 nopreempt：nopreempt 只对 Keepalived 进程启动时的状态转换生效对 track_script 引起的动态权重变化不生效更糟的是，如果两台都加 nopreempt，连正常的故障切换都会被阻止本方案的解法：让 health check 脚本利用 MySQL 原生的复制 IO 线程状态来判断"主库是否还活着"：check_mysql.sh 逻辑： 1. MySQL 进程是否存活？→ 否 → exit 1（降权） 2. 我是只读（read_only=ON）吗？ - 是 → IO 线程是否在运行？ - 是 → 主库还活着，我安心当备机 → exit 1（降权，不抢占） - 否 → 主库挂了，我可以竞选 → exit 0 - 否 → 我已是主库 → exit 0这样恢复后的节点自动检测到当前主库还活着，主动降低优先级，不会抢占 VIP。1.2 方案架构应用 ──► VIP (192.168.7.33) ──► 当前主库 (read_only=OFF) └─► 备机 (read_only=ON) 双向复制 (GTID + 半同步) | check 脚本监控复制 IO 线程 判断主库是否存活 → 控制优先级1.3 故障切换时序正常状态： db-a (priority=100, read_only=OFF, IO-thread 活跃) db-b (priority=90, read_only=ON, IO-thread 活跃 → check 返回 1 → 实际=70) db-a 宕机后 8 秒内： db-a check 连续失败 2 次 → priority=80 db-b check 发现 IO 线程断开 → 返回 0 → priority=90 90 > 80 → db-b 接管 VIP notify_master 将 db-b read_only 关闭 db-a 恢复： MySQL 启动，read_only=ON（my.cnf 默认） IO 线程连上 db-b → 活跃 → check 返回 1 → priority=80 db-b 仍是 priority=90 80 < 90 → VIP 留在 db-b（不回切！）1.4 Priority 推演表场景db-a 状态db-a 实际 prioritydb-b 状态db-b 实际 priorityVIP 在初始正常read_only=OFF100read_only=ON, IO 活跃70 (90-20)db-adb-a 宕机MySQL 挂了80 (100-20)read_only=ON, IO 断开90db-bdb-a 恢复read_only=ON, IO 活跃80 (100-20)read_only=OFF90db-b（不回切）db-b 宕机read_only=ON, IO 断开100MySQL 挂了70 (90-20)db-a二、环境信息角色IP初始状态Keepalived prioritydb-a192.168.7.31read_only=ON，等 Keepalived 竞选100db-b192.168.7.32read_only=ON，等 Keepalived 竞选90VIP192.168.7.33——注意：两台 my.cnf 都配置 read…

Win10 多用户远程登录指南：RDPWrap 组策略
type: item
date: 2026-04-30T17:19:43+08:00
description: 1. 前言Windows 10 桌面版（专业版/企业版）默认只允许一个活跃的远程桌面会话。当你尝试让第二个用户通过远程桌面连接时，要么会把当前用户挤下线，要么会直接锁屏。这是因为微软在 termsrv.dll 文件中设置了硬编码的单用户限制。要突破这个限制，实现多人同时远程登录、互不影响，最常见的方式是使用开源工具 RDPWrap。本文将完整讲解从系统准备、安装破解到验证配置的全过程，并给出替代方案。2. 系统要求在开始之前，请确认你的系统满足以下条件：项目要求操作系统版本Windows 10 专业版、企业版或教育版（家庭版不支持远程桌面主机功能）远程桌面权限已在“设置 → 系统 → 远程桌面”中开启独立用户账户在“设置 → 账户 → 家庭和其他用户”中，为每位远程用户创建独立的本地账户，并添加到 Remote Desktop Users 组中github开源地址：https://github.com/stascorp/rdpwrap/releases/tag/v1.6.23. 使用 RDPWrap 破解多用户限制RDPWrap 是一个开源项目，通过封装和修补系统文件 termsrv.dll，在不对原始文件直接修改的情况下，让 Windows 桌面版支持多个并发远程桌面会话。⚠️ 重要：RDPWrap 原项目多年来已停止更新，但社区通过维护更新的 rdpwrap.ini 配置文件，使其能持续支持新版本的系统。3.1 详细操作步骤第一步：下载并安装从以下任一资源获取必要文件：官方原版（v1.6.2）：虽然原作者已停更，但安装器仍可正常使用。社区维护版：sebaxakerhtc/rdpwrap，持续更新 rdpwrap.ini 文件，支持更多新版本。推荐：下载社区维护版，直接解压即可使用，省去手动替换配置文件的步骤。以管理员身份运行 install.bat。脚本会自动将程序部署到 C:\Program Files\RDP Wrapper，并安装所需服务。第二步：更新配置文件（最关键的一步）如果用的是官方原版，需要手动替换新的配置文件：停止服务：以管理员身份运行命令 net stop termservice从 sebaxakerhtc/rdpwrap.ini 仓库下载最新的 rdpwrap.ini用下载的文件覆盖 C:\Program Files\RDP Wrapper\rdpwrap.ini启动服务：以管理员身份运行命令 net start termservice如果用的是社区维护版，通常已包含较新的配置文件，可直接进入验证步骤。若不成功，仍可参照上述方法更新。第三步：配置本地组策略按 Win+R 打开运行，输入 gpedit.msc 并回车。定位到：计算机配置 → 管理模板 → Windows 组件 → 远程桌面服务 → 远程桌面会话主机 → 连接。双击 “将远程桌面服务用户限制到单独的远程桌面服务会话”，设置为 “已禁用”。双击 “限制连接的数量”，设置为 “已启用”，并在选项中填入允许的最大并发连接数（例如 5 或 999999）。3.2 安装RDPwrap补丁防火墙会进行拦截3.3 如何验证是否成功？运行 C:\Program Files\RDP Wrapper 目录下的 RDPConf.exe，检查状态面板。如果 所有条目都显示为绿色，说明破解成功。你也可以运行 RDPCheck.exe 进行直观测试：如果能弹出一个新的远程桌面窗口，且没有挤掉当前会话，就说明多用户同时登录功能已生效。4. 常见问题与故障排查4.1 运行 RDPConf.exe 后出现红色或黄色警告这通常是因为 rdpwrap.ini 配置与当前系统版本不兼容。解决方法：按 Win+R，输入 winver 并回车，查看系统详细版本和 内部版本号（OS Build）。访问 sebaxakerhtc/rdpwrap.ini 的 GitHub 仓库，查找是否有针对你内部版本号的更新配置文件。下载该文件，覆盖到 C:\Program Files\RDP Wrapper\rdpwrap.ini。重启远程桌面服务或重启电脑。4.2 重启或系统更新后失效原因：系统大版本更新（如从 22H2 升级到 24H2）会替换部分系统文件，导致 RDPWrap 失效。解决方法：重新运行安装和配置文件更新步骤。

Docker 在线安装
type: item
date: 2026-04-21T15:17:41+08:00
description: 在云原生时代，Docker 已成为应用打包、交付和运行的事实标准。本文将以 CentOS 7 系统为例，详细介绍如何利用阿里云镜像站在线安装 Docker CE、配置国内镜像加速源、安装 Docker Compose，并演示一个典型的多服务容器化部署流程。一、安装 Docker CE（社区版）1.1 安装必要系统工具首先需要安装 yum-utils，它提供了 yum-config-manager 工具，方便我们管理软件源。sudo yum install -y yum-utils1.2 添加阿里云 Docker 软件源使用阿里云提供的官方仓库地址，能显著提升下载速度和稳定性。yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo1.3 安装 Docker 及相关组件执行以下命令安装 Docker 引擎、CLI 工具、容器运行时以及构建插件和 Compose 插件。sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y注：docker-compose-plugin 是 Docker Compose V2 的插件形式，若习惯使用 docker-compose 命令，也可以单独安装传统版本的 Compose（见后文）。1.4 启动 Docker 服务sudo systemctl enable --now docker1.5 校验安装查看 Docker 版本信息，确认安装成功。docker version如果正常显示客户端和服务端版本号，说明 Docker 已正确安装并运行。二、配置国内镜像加速源（重要）由于网络原因，直接从 Docker Hub 拉取镜像可能非常缓慢。通过配置国内镜像加速器，可以大幅提升拉取速度。2.1 创建/编辑 daemon.jsonvim /etc/docker/daemon.json2.2 写入以下内容{ "registry-mirrors": [ "https://51mbg7lq.mirror.aliyuncs.com", "https://9cpn8tt6.mirror.aliyuncs.com", "https://registry.docker-cn.com", "https://a0f4d5484dea442caf5d1193f09abdd4.mirror.swr.myhuaweicloud.com", "https://do.nark.eu.org", "https://dc.j8.work", "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://ccr.ccs.tencentyun.com" ] }说明：这里列出了多个国内常用镜像源（阿里云、华为云、中科大、南京大学、网易、百度、腾讯云等），按优先级排列。你可以根据实际网络情况增删。2.3 重新加载配置并重启 Dockersudo systemctl daemon-reload sudo systemctl restart docker2.4 设置开机自启sudo systemctl enable docker完成上述步骤后，Docker 的基础环境就准备好了。三、安装 Docker Compose（可选）如果你的项目需要使用 docker-compose.yml 进行多容器编排，建议安装 Docker Compose。 若已通过 docker-compose-plugin 安装了 V2 版本，可以直接使用 docker compose 命令（注意中间没有横线）。但传统 docker-compose 命令在很多教程中仍被广泛使用，因此下面也提供独立安装方法。3.1 下载稳定版二进制文件以 v2.5.1 为例（你也可以到 GitHub Releases 查看最新版本号）：sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/doc…

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> <内网端口…

mikrotik 端口映射之原进原出
type: item
date: 2026-04-18T23:47:36+08:00
description: 具体来说，需要在 mangle 表中标记外部进入的连接，并在 route 表中为这些连接创建一个专属的、指定了源IP和网关的路由，从而强制回程流量从正确的接口出去。⚙️ 详细配置步骤基础网络设置确保所有WAN口已经正确配置了IP地址、网关，并确保网络通畅。标记连接进入 IP -> Firewall -> Mangle 标签页，为从每个公网IP进入的连接打上“连接标记”。Chain: preroutingSrc. Address: 留空（或填写特定公网IP）Dst. Address: 填写你要映射的公网IP地址，子网掩码为 /32In. Interface: 选择该公网IP所在的物理接口（如 ether1）Action: mark connectionNew Connection Mark: 为这个连接起一个名字，例如 conn_public_ip_1Passthrough: yes（必须选“是”，让标记继续传递）为其他公网IP，重复此步骤。标记路由在同一个 Mangle 表中，创建规则，将上一步的“连接标记”转换为“路由标记”。Chain: outputConnection Mark: 选择上一步创建的标记名，例如 conn_public_ip_1Action: mark routingNew Routing Mark: 为路由表起一个名字，例如 route_public_ip_1Passthrough: no为其他公网IP，重复此步骤。创建专属路由表进入 IP -> Routes 标签页，为每个公网IP创建一个新的路由表。Dst. Address: 0.0.0.0/0（默认路由）Gateway: 选择该公网IP对应的网关地址Routing Mark: 选择上一步创建的“路由标记”，例如 route_public_ip_1为其他公网IP，重复此步骤。配置端口映射最后，创建端口映射（dstnat）规则。Chain: dstnatDst. Address: 填写要映射的公网IP地址Protocol: 选择要映射的协议（如 tcp）Dst. Port: 填写要映射的端口号Action: dst-natTo Addresses: 填写内网服务器的IP地址To Ports: 填写内网服务器的端口号📝 完整配置脚本示例假设你有两条线路，线路A的接口是ether1，IP为203.0.113.1，网关203.0.113.254；线路B的接口是ether2，IP为198.51.100.1，网关198.51.100.254。你想把内网192.168.1.100的80端口分别映射到这两个公网IP的80端口上。你可以在New Terminal中执行以下脚本：# --- 1. 标记连接 (Mangle) --- /ip firewall mangle add chain=prerouting dst-address=203.0.113.1 in-interface=ether1 action=mark-connection new-connection-mark=conn_lineA passthrough=yes /ip firewall mangle add chain=prerouting dst-address=198.51.100.1 in-interface=ether2 action=mark-connection new-connection-mark=conn_lineB passthrough=yes # --- 2. 标记路由 (Mangle) --- /ip firewall mangle add chain=output connection-mark=conn_lineA action=mark-routing new-routing-mark=route_lineA passthrough=no /ip firewall mangle add chain=output connection-mark=conn_lineB action=mark-routing new-routing-mark=route_lineB passthrough=no # --- 3. 创建策略路由 (Routes) --- /ip route add dst-address=0.0.0.0/0 gateway=203.0.113.254 routing-mark=route_lineA /ip route add dst-address=0.0.0.0/0 gateway=198.51.100.254 routing-mark=route_lineB # --- 4. 端口映射 (NAT) --- /ip firewall nat add c…

将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) …