CentOS离线安装stress的两种方法及避坑指南
简介针对 CentOS 环境未联网服务器的一次性压力测试工具离线交付包面向系统运维、应用性能测试等场景。资源内置 stress-1.0.4 主程序源码包及编译安装辅助文件同时打包 gcc-g-4.8.5 等 11 个 rpm 依赖包解决离线状态下 gcc、make 等基础工具缺失导致无法安装的典型问题并附带 sar 命令相关组件便于压测过程中同步采集 CPU、内存等系统性能指标形成较为完整的性能基线数据。资源共 43 个文件除 rpm 依赖包外还有 configure、Makefile 模板、C 源码、info 说明文档、shell 辅助脚本等包体约 46.66MB目录结构涵盖编译、安装、验证所需的完整环节。当前已有 2582 人学习下载。读者可据此在完全内网环境完成 stress 工具部署、自定义压力参数测试并结合 sar 收集负载日志适合需要掌握 Linux 压测环境搭建与离线部署思路的运维人员。1. 离线安装 stress 之前先想清楚你装的到底是什么在 CentOS 服务器上做压力测试stress 是最常用的工具之一它能模拟 CPU、内存、IO 和磁盘负载帮你快速验证系统稳定性、散热、供电和内核调度。但现实场景里生产网段往往和外网隔离yum install stress 这条命令根本敲不通。于是「linux centos stress离线安装」成了运维和测试工程师的常见搜索词问题本质上不是 stress 本身有多难装而是离线下怎么把依赖包凑齐、怎么解决架构不一致、怎么验证装完的二进制真的能跑。我自己的经验是离线装 stress 有两条稳妥路线一是找一台相同系统版本的联网机器把 rpm 包和依赖全部拉下来拷过去二是直接把 CentOS 安装镜像挂载为本地 yum 源从光盘仓库里装。这篇笔记把两条路线都展开包含命令、参数、依赖陷阱和压测验证方法新手能照着做完熟手也能看到版本和架构边界。2. 离线安装 stress 的两种路线本地源与下载依赖包2.1 离线安装的核心思路先在联网机器上拉齐依赖stress 这个工具本身非常轻它只有一个可执行文件和对应的 man 文档不依赖 ncurses、libaio 这类重库。但 rpm 包安装时仍有依赖检查如果在离线机器上直接 rpm -ivh stress-1.0.4-16.el7.x86_64.rpm大概率会遇到依赖缺失的报错常见提示是libc.so.6()(64bit)未满足。libc 是系统最底层的库你不可能为了装 stress 去升级 libc那会破坏整个系统。所以离线安装的正确思路是用 yum 的下载模式把 stress 和它声明的依赖全部拉成一个本地目录再整体搬运到目标机器上安装。我一般会先查 stress 在 CentOS 7 下的确切包名和版本# 在能联网且系统版本一致的机器上执行 yum list stress --showduplicates # 输出会显示类似 stress-1.0.4-16.el7.x86_64 的完整包名 # --showduplicates 会列出所有可用版本方便选一个和离线机器匹配的版本这里的关键是「系统版本一致」。CentOS 7 的 rpm 包不能装到 CentOS 8 上因为 glibc 版本和 ELF 格式虽兼容但软件包编译时链接的库版本不同装上去运行时会报version GLIBC_2.28 not found之类的问题。所以第一步先确认离线机器的cat /etc/redhat-release再决定在哪台联网机器上下包。2.2 方法一用 yumdownloader 拉取 stress 及全部依赖yumdownloader 是 yum-utils 包自带的工具目标是只下载 rpm 文件而不安装。它支持--resolve参数能把依赖一并拉下来这是离线安装最省事的一招。连续按以下命令操作# 1. 安装 yum-utils如果还没有的话 yum install -y yum-utils # 2. 创建目录专门存放下载的 rpm 包 mkdir -p /data/stress-rpms cd /data/stress-rpms # 3. 下载 stress 和全部依赖 yumdownloader --resolve --destdir/data/stress-rpms stress # 4. 看看拉下来几个包 ls -lh /data/stress-rpms/--resolve会把 stress 依赖的库也拉下来比如 glibc、libgcc 这些虽然系统里已经有了但 yumdownloader 还是会按依赖链下载。实际拉下来通常有 10 多个 rpm 文件这是因为 stress 依赖 glibcglibc 又依赖一堆基础库。把这整个目录拷贝到离线机器后用rpm -Uvh *.rpm或者yum localinstall安装都能过依赖检查。有个细节值得注意如果离线机器和联网机器的 CentOS 小版本不同比如一个是 7.6 一个是 7.9拉下来的 glibc 版本会比你系统里的旧或者新。此时直接装 stress 本身没问题但不要把拉下来的所有 rpm 全部强制安装只需要挑出 stress 和 system-release 相关之外的那几个关键库就行。更安全的做法是用rpm -qip逐个查看依赖关系再决定装哪些。2.3 方法二挂载 CentOS 镜像作为本地源如果公司内网本来就有 CentOS 7.9 的 iso 镜像或者你手边有光盘那可以不用下载任何 rpm。直接把 iso 挂载到目录配置成本地 yum 源后离线机器上跑yum install stress就会从本地源安装不再访问外网。这个方式的好处是依赖问题完全交给 yum 解决坏处是镜像里的软件包集合比在线源旧而且镜像体积通常 4GB 以上传输到离线机器需要花点时间。# 1. 创建挂载目录 mkdir -p /mnt/cdrom # 2. 挂载 iso如果是光盘设备名通常是 /dev/cdrom mount -o loop /data/CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom # 3. 备份原有 yum 源配置 mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ # 4. 写一个指向本地挂载目录的 repo 文件 cat /etc/yum.repos.d/local.repo EOF [local-base] nameLocal CentOS DVD baseurlfile:///mnt/cdrom enabled1 gpgcheck0 EOF # 5. 刷新缓存并直接安装 yum clean all yum makecache yum install -y stress用镜像源时 gpgcheck 建议设置为 0因为光盘自带的 GPG key 导入又是一个坑。另外挂载方式需要用loop选项不写的话mount会报 wrong fs type 之类的错误。如果目标是 arm 架构的 CentOS那 iso 也要对应 aarch64 版本这点后面会再展开讲。2.4 两种方法的取舍什么时候用哪个我的判断标准很简单如果离线机器数量少于 10 台用 yumdownloader 拉 rpm 包拷贝是最快的整个目录也就几 MB 到几十 MB拷起来方便。如果机器多或者是长期离线环境那直接挂载 iso 做本地源更划算以后装别的软件也能用同一个源。还有第三种场景是目标机器有其他 yum 源可以走内网 HTTP 访问那直接把 repo 指向内网镜像源就行严格说这不算离线但做法和挂载 iso 一样。3. 实操在 CentOS 7 上完整跑通离线安装 stress3.1 从联网机器到离线机器完整的搬运与安装命令这一节我们走一条完整的路径从联网机器下载、打包、传到离线机器、安装、验证。假设你是用 U 盘或者 scp 传递文件以下命令在联网机器上执行# 在联网机器上系统版本必须与离线机相同或相近 yum install -y yum-utils mkdir -p /data/stress-rpms cd /data/stress-rpms # 下载 stress 及其全部依赖到当前目录 yumdownloader --resolve --destdir/data/stress-rpms stress # 打包方便一次性拷走 tar czf stress-rpms.tar.gz *.rpm打包时有两点要注意一是不要带绝对路径不然解包会散到根目录二是 tar 的czf参数不要漏c创建、z压缩、f指定文件名。拷到离线机器上以后先不要急着一股脑安装先解压看看到底有哪些包tar xzf stress-rpms.tar.gz ls -lah *.rpm rpm -qip stress-*.rpmrpm -qipi 是 infop 是 package 文件会把 stress 的版本、架构、依赖信息显示出来。重点看Architecture字段是不是 x86_64如果离线机器是 aarch64 或者 i686那包是装不上去的rpm 会直接提示架构不符合。3.2 安装命令的选择rpm -ivh 与 yum localinstall 的区别离线机器上安装这一步有两条命令可用各有适用场景# 方式一rpm 直接安装推荐只装 stress 主包 rpm -ivh stress-1.0.4-16.el7.x86_64.rpm # 方式二yum 本地安装自动处理依赖但需要把所有依赖 rpm 都放到同一目录 yum localinstall -y /data/stress-rpms/*.rpm如果下载时用了--resolve依赖包都在同一个目录里yum localinstall -y *.rpm会一次性把依赖全部装好这是最不容易出错的方式。但注意yum localinstall在 CentOS 8 之后已经改名为yum installCentOS 7 上两个都能用。rpm -ivh的优点是快缺点是如果依赖没齐会报Failed dependencies列出缺失的库名你需要手动逐个补齐对新手不友好。我自己的习惯是如果只是想装 stress 一个工具直接rpm -ivh装主包报依赖了再回头装对应依赖如果是要在集群里批量发那用yum localinstall更省事一条命令把目录里所有包装上。3.3 验证安装结果不止看命令是否存在安装完成后还要验证一下能不能真的用这一步很多人会忽略# 1. 查看 stress 命令路径和版本 which stress stress --version # 2. 查看 rpm 包是否正确安装 rpm -qa | grep stress # 3. 跑一个最简单的 CPU 压力测试5 秒后退出 stress --cpu 1 --timeout 5sstress --version在 CentOS 7 上会输出类似stress 1.0.4的信息。注意老版本 stress 的--timeout参数支持s、m、h后缀也可以直接写数字表示秒。跑完--cpu 1 --timeout 5s后用echo $?看返回值如果是 0 说明正常退出非 0 说明压测过程中发生了异常。这一步不是为了压测而是验证二进制文件在目标系统上能正常调度 CPU。3.4 本地源配置的升级玩法把 rpm 目录变成 yum 源前面提到过挂载 iso 做本地源其实下载下来的 rpm 目录也可以变成 yum 源用createrepo工具生成元数据。这样后续再装其他工具的依赖也能从这个本地源里解析。做法不复杂# 在离线机器上先安装 createrepo如果系统自带就跳过 rpm -ivh createrepo-*.rpm # 对 rpm 目录生成仓库元数据 createrepo /data/stress-rpms/ # 写 repo 文件指向这个目录 cat /etc/yum.repos.d/local-rpms.repo EOF [local-rpms] nameLocal Stress RPMs baseurlfile:///data/stress-rpms enabled1 gpgcheck0 EOF这样做的好处是以后yum install其他包时yum 会把这个本地目录也当成一个源依赖解析范围更大。但要注意这个源里只有 stress 及其依赖装别的软件时如果依赖不在这个目录yum 还是会提示找不到。所以本质上这是在离线环境下自己维护一个小型软件仓库适合后续持续往目录里丢 rpm 包的场景。4. 离线安装 stress 的避坑记录版本、架构与依赖冲突4.1 现象yum install stress 提示 No package stress available离线机器上直接跑yum install stress往往报这行原因很简单CentOS 默认的 Base 源里并没有 stress 这个包它通常在 EPELExtra Packages for Enterprise Linux源里。所以就算你联网直接 yum 装也可能失败。解决的办法是提前把 EPEL 的 rpm 包也下载下来或者配置好 epel 的本地源再装。具体做法是先在联网机器上拉 epel-release 和 stress 的 rpm 一起拷贝或者用yumdownloader --enablerepoepel stress指定源下载。如果离线机器已经有 epel 源配置但没法访问外网那只要源配置是对的yum install stress还是能找到包只是网络不通会卡在请求元数据阶段。这种情况下把元数据缓存好再离线安装也可以走通。4.2 现象rpm 安装时报 Failed dependencies: libc.so.6()(64bit) is needed这个报错最容易让人慌因为它看起来像系统缺了核心库。其实 libc.so.6 是 glibc 提供的你的系统里必然有rpm 报依赖不满足是它没有在系统 RPM 数据库中登记这个库的版本信息。这种情况最常见的原因是 rpm 包是从不同版本的 CentOS比如 CentOS 8上拉下来的导致依赖版本比系统高。解决方法是确认包版本与系统匹配CentOS 7 用stress-1.0.4-16.el7.x86_64.rpm不要去拿 el8 的包。如果确认包没拿错还有一种可能是系统里 glibc 被手动替换过rpm 数据库里记录的信息和实际文件不一致。此时用rpm -V glibc验证一下如果不一致说明系统本身被改过先修复系统再装 stress 是更稳妥的做法。4.3 现象yum localinstall 时提示 Protected multilib versionsCentOS 7 的 64 位系统上安装 32 位 rpm 包时经常会遇到这个提示原因是系统启用了 multilib 保护。stress 本身是 x86_64 的包一般不会触发但如果你下载依赖时把 i686 的包也混进来了yum 就可能会因为保护机制拒绝安装。解决方法是把目录里的 i686 包清理掉只保留 x86_64 的 rpm。如果确实需要装 32 位兼容库可以在 yum 命令后面加--setoptmultilib_policyall但装 stress 不需要这么做。我自己遇到过一次是 yumdownloader 把 glibc 的 i686 版也拉下来了当时没注意localinstall 时直接报错删掉 i686 包后重跑就好了。4.4 现象装完 stress 报 stress: error while loading shared libraries: libc.so.6这个和 4.2 不一样它是运行时错误说明 stress 二进制文件在加载 libc 时失败了。常见原因是动态链接器缓存没有刷新用ldconfig命令刷新一下即可。另外也有可能是 stress 包版本对应当前系统的 glibc 版本过高比如把 CentOS 7 的 stress 装到了 CentOS 6 上glibc 版本不满足运行要求。排查时先看/lib64/libc.so.6这个符号链接是否存在然后ldd /usr/bin/stress查看实际加载情况。如果 ldd 输出显示 libc.so.6 找不到多半是链接器缓存问题执行ldconfig -v刷新后重新跑。如果是版本问题ldd 会提示GLIBC_2.xx not found那就必须换更低版本的包。4.5 现象CentOS 8/9 上用 CentOS 7 的 rpm 包报错这个坑很隐蔽因为 CentOS 8 和 CentOS 7 的 rpm 包格式都是 RPM v3rpm 工具本身不会拒绝安装。但装上以后运行时会因为 glibc 版本不兼容直接报错。CentOS 8 的 glibc 是 2.28CentOS 7 是 2.17stress 如果是在 CentOS 7 上编译的在 CentOS 8 上可能没问题反过来就不行。更稳妥的做法是装之前查一下系统版本和包版本用cat /etc/redhat-release看小版本号用rpm -qpi看包编译平台。如果是 CentOS Stream 或者 Rocky Linux 这些衍生系统尽量找对应的 el 标签el8、el9不要混用。5. 装好 stress 之后怎么用压测命令、参数边界与验证习惯5.1 stress 的最小压测命令CPU、内存与磁盘stress 装好以后最重要的是别乱用参数。很多人一上来就stress --cpu 8结果把服务器压到无响应最后只能强制重启。正确的做法是从小到大试探先单核跑 30 秒观察系统负载和温度再逐步增加。以下是我常用的几个场景命令# 场景一CPU 压力测试使用 4 个 worker运行 60 秒 stress --cpu 4 --timeout 60s # 场景二内存压力测试分配 512MB 内存并持续读写运行 120 秒 stress --vm 1 --vm-bytes 512M --vm-hang 5 --timeout 120s # 场景三磁盘 IO 压力测试创建 1GB 临时文件持续写入 stress --io 4 --hdd 1 --hdd-bytes 1G --timeout 60s--vm-hang这个参数值得解释它表示内存分配完后进程挂起的时间秒默认是无限挂起如果不加 timeout 进程不会退出。--hdd-bytes 1G表示每次写入 1GB 数据会反复写直到 timeout。注意 stress 不会自动清理临时文件--hdd产生的临时文件分布在当前目录用完记得手动删除。5.2 看压测结果不能只看 stress 输出配合系统工具验证stress 的输出很简洁就是告诉你 fork 了多少进程、每个进程在做什么。真正要评估系统稳定性得同时看 top、vmstat 和 dmesg。判断压测是否有效的标准不是 stress 本身退出码 0而是系统在压测期间有没有产生硬件错误、内核报错或者进程被杀。# 另开一个终端实时观察 CPU 负载和内存使用 top -d 1 # 看内存和 swap 变化 vmstat 1 10 # 压测结束后看内核日志里有没有硬件错误 dmesg | tail -n 30压测时出现大量soft lockup警告说明 CPU 资源分配异常出现Out of memory说明内存配置有问题出现thermal throttling说明散热不行。这些才是压测真正要发现的问题。我自己遇到过一台旧服务器stress 单核跑 5 分钟就触发内核 panic最后查出来是 CPU 供电模块老化。5.3 离线环境下重复使用的习惯保存 rpm 包目录离线安装一次不代表以后不再装尤其是要给一批机器批量部署的时候。我习惯在所有机器上把/data/stress-rpms这个目录保留下来不删。下次装新机器只需要把目录整体拷过去yum localinstall一条命令完事不需要再回到联网机器上重新下载。保存目录的时候顺带写一个 README 文件记录基于哪个 CentOS 小版本下载的包cat /data/stress-rpms/README EOF stress rpm packages for CentOS 7.9 x86_64 Downloaded from EPEL on 2024-11-20 Install: yum localinstall -y /data/stress-rpms/*.rpm EOF这个文件不花心思但能帮未来的自己省掉「这个包从哪来的」这种排查时间。尤其是过几个月再回来维护的时候版本和来源信息比命令本身更值钱。我希望这套离线安装 stress 的流程能帮到你至少能让你在断网环境里把压测工具顺利跑起来而不是卡在安装这一步。本文还有配套的精品资源点击获取