rrdtool-1.4.7源码编译安装与老监控栈对接实战 简介RRDTool 1.4.7 是面向网络运维与系统监控人员的开源时序数据库工具源码包用于创建、更新和查询环形存储的时间序列数据常作为 Smokeping、Cacti、MRTG 等监控系统的底层组件适合需要搭建流量、延迟、CPU 与内存监控的中高级运维人员参考使用。压缩包共 314 个文件约 1.29MB以 49 个 C 源文件与 22 个头文件构成核心实现辅以 31 个 pod 与 31 个 html 文档、30 个 txt 说明及 configure、Makefile.in 等构建脚本另含多语言本地化与示例配置便于编译安装与二次开发。已有 264 人学习下载。包内文档覆盖 rrdcreate、rrdgraph、rrdcached 等命令用法与 RPN 表达式说明可帮助读者理解心跳间隔、数据压缩与图表生成机制并对照源码排查与 Smokeping、Cacti 集成中的兼容性问题。1. 老监控栈里绕不开的 rrdtool-1.4.7一次装错三套面板全哑上周帮一个做机房监控的朋友收拾一台老 CentOS 6 的采集机机器上跑着 smokeping 和 cacti结果 rrdtool 一升级两个面板同时开始画空白图日志里全是rrd_update报错。这种场景在存量监控系统里太常见了rrdtool-1.4.7.tar.gz 这个包几乎是老一代监控栈的标配依赖smokeping、cacti、mrtg 都靠它写 RRD 文件、出图。装对了采集和绘图一条线跑通装错了轻则图表断线重则历史数据写坏回滚都费劲。这篇笔记按我实际部署的顺序走一遍先列环境、再编译安装、配依赖、验证出图最后把踩过的坑摊开讲。适合还在维护老监控系统、需要从源码装 rrdtool 的开发者照着复现。2. 装前把环境列清rrdtool-1.4.7 的依赖与版本取舍2.1 为什么老监控栈还锁在 1.4.7rrdtool 的版本线拉得很长1.4.x 是很多老监控系统的默认依赖版本。smokeping 的早期版本、cacti 0.8.x 系列、mrtg 的绘图后端都按 1.4 系列的 API 和命令行参数写的。你直接上 1.7 或 1.8rrdtool update和rrdtool graph的参数兼容性会出问题尤其是--alt-autoscale、--rigid这类绘图参数的行为有细微差异面板上表现就是刻度错乱或者曲线消失。我一般的判断标准是先看现有监控系统文档里写的依赖版本再决定装哪个。如果面板是 cacti 0.8.8 那一代rrdtool 就老老实实锁 1.4.7如果是新部署、没有历史包袱才考虑更高版本。1.4.7 这个包本身是源码 tar.gz编译安装可控性最高适合老系统上 yum 源已经不可用的情况。2.2 依赖清单与版本对照rrdtool 编译依赖不算多但老系统上缺一个就卡在 configure 阶段。下面这张表是我在 CentOS 6/7 和 Debian 老版本上实际用到的依赖装之前对着核一遍依赖作用老系统常见问题libpng / libpng-devel出 PNG 图缺 devel 包configure 报 png.h not foundzlib / zlib-devel压缩 RRD 数据系统自带版本够用一般不用动freetype / freetype-devel图表字体渲染缺了图能出但文字全是方块libart_lgpl-devel1.4 系列的绘图库新版系统源里可能已移除cairo / cairo-devel可选部分绘图后端不装也能编但建议装上pango / pango-devel文字布局和 freetype 一起决定中文/特殊字符显示gcc / make编译工具链最小化安装的系统经常缺提示libart_lgpl-devel 是 1.4 系列的关键依赖很多新系统的默认源里已经没有了需要单独找老版本的 rpm 或 deb 包补上这一步是编译失败的高发点。2.3 系统环境与编译参数预判装之前先确认三件事系统架构uname -m、glibc 版本ldd --version、以及是否已有旧版 rrdtoolrpm -qa | grep rrdtool或dpkg -l | grep rrdtool。如果系统里已经有包管理器装的 rrdtool建议先卸掉或者用--prefix装到独立目录避免库文件冲突。我一般会把 rrdtool 装到/usr/local/rrdtool-1.4.7这种带版本号的目录然后用软链接指到/usr/local/rrdtool。好处是以后要换版本直接改软链接不用动监控系统的配置。编译参数上--prefix指定安装路径--disable-perl-site-install避免 Perl 模块装到系统目录污染环境这两个是我每次都会带的。3. 源码编译安装从解包到 make install 的完整命令链3.1 解包与 configure 参数逐项说明拿到 rrdtool-1.4.7.tar.gz 之后先校验包完整性再解包。我习惯在/usr/local/src下操作编译产物和源码分开后面清理方便。# 进入源码目录解包 cd /usr/local/src tar -zxvf rrdtool-1.4.7.tar.gz cd rrdtool-1.4.7 # 配置编译参数 ./configure \ --prefix/usr/local/rrdtool-1.4.7 \ --disable-perl-site-install \ --with-perl-optionsINSTALLDIRSvendor这段 configure 里几个参数值得说清楚。--prefix决定最终安装路径我选带版本号的目录是为了多版本共存--disable-perl-site-install阻止 Perl 绑定模块装进系统 site_perl老系统上这个目录经常被其他应用依赖污染了很难排查--with-perl-optionsINSTALLDIRSvendor让 Perl 模块走 vendor 目录和系统包管理的路径隔离。如果你的监控系统不需要 Perl 绑定smokeping 是 Perl 写的通常需要可以加--disable-perl省掉这块。configure 跑完会输出一份依赖检查摘要重点看 png、freetype、libart 这几项是不是yes。有no的回到 2.2 的依赖表补包别急着 make。3.2 make 与 make install 的执行细节configure 通过后编译本身不复杂但老机器上要注意并行编译的核数别把采集机跑满影响监控采集。# 编译-j2 控制并行度老机器别开太高 make -j2 # 安装到 prefix 指定目录 make install # 建立版本无关的软链接方便监控系统引用 ln -sfn /usr/local/rrdtool-1.4.7 /usr/local/rrdtoolmake -j2里的数字按机器核数来采集机一般负载不低我倾向保守一点。make install之后二进制在/usr/local/rrdtool-1.4.7/bin下库文件在lib下。软链接这一步很关键监控系统的配置文件里通常写死/usr/local/rrdtool/bin/rrdtool这种路径用软链接指过去以后升级只改链接目标配置文件不用动。装完先别急着配监控系统直接跑一下rrdtool --version确认二进制能起来、依赖库都能找到。如果报error while loading shared libraries说明库路径没配好下一步处理。3.3 库路径与命令别名的收尾配置源码装到非标准路径最常见的后续问题是运行时找不到.so库。两个办法配ld.so.conf或者设LD_LIBRARY_PATH。我倾向配ld.so.conf全局生效不用每个服务单独设环境变量。# 把 rrdtool 的库目录加入系统库搜索路径 echo /usr/local/rrdtool-1.4.7/lib /etc/ld.so.conf.d/rrdtool.conf ldconfig # 验证库能被找到 ldd /usr/local/rrdtool-1.4.7/bin/rrdtool | grep -i not foundldconfig刷新缓存后ldd输出里不应该有not found。如果有检查路径写对没有、库文件是不是真的装到了那个目录。另外如果监控系统是以某个专用用户跑的比如 smokeping 用户要确认这个用户对 rrdtool 目录有读和执行权限否则采集时会报权限错误。命令别名这块我一般会在/etc/profile.d/rrdtool.sh里加 PATH方便手工调试时直接敲rrdtool# /etc/profile.d/rrdtool.sh export PATH/usr/local/rrdtool-1.4.7/bin:$PATH改完source /etc/profile.d/rrdtool.sh生效。注意这只影响交互式 shell服务进程的 PATH 要在服务自己的启动脚本或 systemd unit 里单独配。4. 对接 smokeping、cacti、mrtg配置项怎么改才不翻车4.1 smokeping 的 rrdtool 路径与采集参数smokeping 是 Perl 写的配置在config文件里rrdtool 相关的核心是二进制路径和步长step。老版本 smokeping 默认找/usr/local/rrdtool/bin/rrdtool和我们建的软链接正好对上。# smokeping config 片段 *** General *** # rrdtool 二进制路径指向软链接 binpath /usr/local/rrdtool/bin/rrdtool *** Database *** # 采集步长单位秒要和 Targets 里的 pings 间隔匹配 step 300 pings 20step 300表示每 5 分钟一个数据点pings 20是每轮发 20 个探测包。这两个值要和 RRD 文件的创建参数一致smokeping 首次启动时会按这个 step 建 RRD 文件后面改配置不会自动改已有文件的 step硬改会导致数据点错位。我见过有人把 step 从 300 改成 60结果老 RRD 文件写入报illegal attempt to update using time就是步长不匹配。改完配置重启 smokeping 前先手工验证 rrdtool 能正常建文件# 手工建一个测试 RRD验证 rrdtool 和参数都正常 /usr/local/rrdtool/bin/rrdtool create /tmp/test.rrd \ --step 300 \ DS:median:GAUGE:600:U:U \ RRA:AVERAGE:0.5:1:600这条命令建一个 300 秒步长、存 600 个平均值的 RRD 文件。能建成功说明 rrdtool 二进制和库都没问题再回去重启 smokeping。4.2 cacti 的 rrdtool 版本声明与路径cacti 在include/global.php或后台设置里声明 rrdtool 路径和版本。老版本 cacti 对 rrdtool 版本有硬判断版本号对不上会拒绝出图。// cacti 配置里 rrdtool 相关项后台 Settings - Paths // rrdtool 二进制路径 $config[rrdtool_path] /usr/local/rrdtool/bin/rrdtool; // 版本号要和实际二进制一致cacti 会做兼容判断 $config[rrdtool_version] 1.4.7;rrdtool_version这个值必须和rrdtool --version输出一致cacti 用它决定调用哪些绘图参数。填错版本号cacti 可能按高版本参数调用1.4.7 不认图就出不来。改完在 cacti 后台的「Utilities - Technical Support」里能看到 rrdtool 版本检测结果确认显示 1.4.7 再继续。4.3 mrtg 的绘图后端切换mrtg 默认用自带的绘图要出 RRD 图需要配LogFormat: rrdtool并指定 rrdtool 路径。# mrtg 配置文件片段 LogFormat: rrdtool PathAdd: /usr/local/rrdtool/bin LibAdd: /usr/local/rrdtool-1.4.7/libPathAdd让 mrtg 找到 rrdtool 二进制LibAdd补上库路径。mrtg 是 Perl 脚本LibAdd对应 Perl 的-I参数指向 rrdtool 的 Perl 绑定模块目录。如果 mrtg 报Cant locate RRDs.pm就是LibAdd路径不对去/usr/local/rrdtool-1.4.7/lib/perl下确认RRDs.pm的实际位置再改。5. 避坑与排查rrdtool 编译安装最常见的五个翻车点5.1 configure 报 png.h not found现象configure 阶段直接退出提示checking for png.h... no后面跟着一串 png 相关检查失败。原因系统只装了 libpng 运行库没装libpng-develDebian 系是libpng-dev。老系统最小化安装经常只带运行库。解决补装 devel 包。CentOS 6/7 用yum install libpng-develDebian 老版本用apt-get install libpng-dev。装完重新跑 configure别在旧缓存上继续。5.2 make 阶段报 libart 相关符号未定义现象编译到绘图模块时链接失败报undefined reference to Art_SVP_...之类的符号。原因libart_lgpl-devel没装或者版本不对。1.4 系列依赖 libart_lgpl 的特定 API新版系统源里这个包可能已经移除。解决找对应系统的老版本包手工装。装完用pkg-config --modversion libart-2.0确认版本再重新 configure。这一步是 1.4.7 在新系统上编译的最大障碍绕不过去。5.3 运行时报 error while loading shared libraries现象rrdtool --version能跑但监控系统调用时报error while loading shared libraries: librrd.so.4: cannot open shared object file。原因库路径没进系统缓存或者服务进程的环境里没有LD_LIBRARY_PATH。解决按 3.3 配/etc/ld.so.conf.d/rrdtool.conf并ldconfig。如果服务是以专用用户跑的确认该用户能读库目录。临时排查可以用LD_LIBRARY_PATH/usr/local/rrdtool-1.4.7/lib rrdtool --version验证是不是路径问题。5.4 图表能出但文字全是方块现象RRD 文件正常写入图也生成了但坐标轴和图例的文字全是方块或乱码。原因freetype 或字体配置缺失rrdtool 找不到可用字体。1.4 系列默认字体路径在编译时确定老系统上字体目录可能和编译时预期不一致。解决确认freetype-devel装了然后在绘图命令里显式指定字体比如--font DEFAULT:0:/usr/share/fonts/xxx.ttf。smokeping 和 cacti 的绘图参数里都能加字体配置找到对应配置项补上。5.5 升级后历史 RRD 文件写入报错现象换了 rrdtool 版本后rrdtool update报illegal attempt to update using time或者数据点错位。原因新旧版本对 RRD 文件格式的兼容性有差异或者 step 参数和已有文件不一致。1.4.7 写出来的文件更高版本读一般没问题但反过来或者 step 改了就会出问题。解决升级前先备份 RRD 目录用rrdtool dump导出老文件确认格式。如果只是 step 不匹配不要硬改已有文件新建 RRD 文件重新采集老数据用rrdtool dump/restore迁移。我一般会在升级前把整个 rrd 数据目录打包留一份这是唯一的后悔药。6. 装完怎么验证三条命令确认 rrdtool 真的跑通了装完不验证等于没装。我每次部署完 rrdtool都会走一遍「建文件、写数据、出图」这条最小闭环三条命令跑通才敢去动监控系统的配置。第一条建一个测试 RRD 文件验证二进制和参数解析/usr/local/rrdtool/bin/rrdtool create /tmp/verify.rrd \ --step 60 \ DS:value:GAUGE:120:U:U \ RRA:AVERAGE:0.5:1:60--step 60是一分钟一个点DS:value:GAUGE:120:U:U定义一个 GAUGE 类型的数据源心跳 120 秒最小最大不限。RRA:AVERAGE:0.5:1:60存 60 个平均值。这条能成功说明 rrdtool 核心功能正常。第二条写几个数据点进去验证 update 路径# 写入当前时间的数据点值随便给 /usr/local/rrdtool/bin/rrdtool update /tmp/verify.rrd N:42 /usr/local/rrdtool/bin/rrdtool update /tmp/verify.rrd N:55N表示当前时间冒号后面是数据源的值。如果报错重点看时间戳和 step 是否对齐以及数据源名字有没有写错。第三条出图验证绘图链路和字体/usr/local/rrdtool/bin/rrdtool graph /tmp/verify.png \ --start -300 --end now \ --width 400 --height 150 \ DEF:v/tmp/verify.rrd:value:AVERAGE \ LINE1:v#00FF00:test--start -300是画最近 5 分钟DEF把数据源映射成变量vLINE1画一条绿线。图能生成、打开能看到线和文字说明绘图、字体、PNG 输出全链路正常。如果图是空的检查数据点时间是不是落在--start到--end范围内如果文字是方块回到 5.4 补字体。三条命令都过了再去改 smokeping、cacti、mrtg 的配置出问题的概率会低很多。我还会顺手把这三条命令存成一个verify_rrdtool.sh脚本每次换机器或者升级版本都跑一遍比凭感觉靠谱。从那以后我每次装完 rrdtool不管多急都强制走一遍这三条验证命令尤其是给老监控系统换版本的时候——图出不来事小历史数据写坏了才是真的麻烦。希望帮到你。本文还有配套的精品资源点击获取