前言
为什么要写这本书
前些年,我所在的项目组开发了一款嵌入式产品,与国内外同类产品相比,我们的产品支持SNMP(Simple Network Management Protocol,简单网络管理协议),可对系统进行监控、管理,发现问题时会主动告警,这是我们产品的一大卖点,同时也是一个亮点。
为了在挑剔的运营商中取得竞争优势,在项目正式开始之前项目组就确定了一个目标——必须实现SNMP功能!但是这时却出现了这样的场景:
“你会SNMP吗?”
“不会……”
“你呢?”
“没做过……”
项目组所有人员在回答会不会SNMP时都没有了工科人对技术的自信!在亚马逊等站点搜索相关的图书后,更是没有了底气,因为这方面的资料如此之少,而需求又如此迫切!于是我决定自学SNMP和与SNMP开发相关的内容。
SNMP是基于TCP/IP网络技术的网络管理协议,于1988年发布了第一份RFC文档,之后逐渐发展和完善,并成为Internet协议簇的一部分。Net-SNMP则是SNMP的开源实现。它的前身是卡内基梅隆大学的CMU-SNMP,在1995年重命名为UCD-SNMP,于2000年再次更名为Net-SNMP并一直沿用至今。我们知道,SNMP有着“简单”的本质,而Net-SNMP则具有完善的功能和良好的特性,同时它还可以集成到一些大型免费或开源的监控类软件(如Nagois、Zabbix、OpenNMS)中配合使用,所以不论从常规的系统指标(如CPU、内存、磁盘、网络、硬件),还是诸如日志、自开发设备的监控量,Net-SNMP都可以帮到大家,从而使得Net-SNMP几乎成为所有的类UNIX发行版本中SNMP的标准实现。这正是项目组采用Net-SNMP实现SNMP监控需求的主要原因。国内外大量的网络设备(如路由器、交换机)都支持SNMP协议,并作为一项标配。不论是监控嵌入式设备还是复杂的集群系统,有着天然分布式特性的Net-SNMP都是非常好的选择。如今,移动终端智能设备大行其道,或许在不久的将来,你可以在移动终端上通过Net-SNMP实现对周围设备的监控和管理。
Net-SNMP还在不断发展,基于Net-SNMP的开源库日益火热、支持的API种类日益众多,已逐渐发展出了像LuaSNMP这样独立开发的方式,支持或配合使用C/C++、Shell、Perl、Python等语言的开发模式;既支持代理端开发、管理端开发,也支持Trap开发。再看看开源社区计划中的“To Do list”功能项,真让人激动不已!Net-SNMP作为早期的开源项目之一,其中的软件编码技术、Linux系统构建技术都是开源中的典范,值得每一位软件工程师学习,因为它们永远也不过时。
尽管SNMP名为“简单”(的)网络管理协议,但涉及的网络知识体系庞大、条目众多,学习曲线陡峭,所以想在此基础上进行有针对性地开发,那是难上加难!关于SNMP虽然有大量的RFC文档,国内也有相关的书籍,但是专门介绍Net-SNMP开发和实践的书籍却没有。另外,随着Net-SNMP开源社区的不断发展,关于Net-SNMP的内容也日益丰富,以英语为母语的地区尚且有相关的书籍问世,而国内却少有相关的中文资料。于是我想,为什么我不把这些年的知识和经验分享给读者呢?这样就可以让读者不用再去网络汪洋中搜寻那些繁杂零碎的蛛丝马迹,不用再啃硬骨头。我希望这本书能帮助每个渴望学习和自我提升的相关人员都获得知识,取得进步!
当然,除了上面“冠冕堂皇”的理由,我还存有“私心”。早在读研期间,我就有将所做的项目写成一本书的想法,如今一晃毕业好几年了,虽说不上壮志未酬,但一直有一点星星之火。想到“有些事现在不做或许以后就再也没有机缘了”,于是写书的工作就这样开始了。
本书特色
本书是首部从实战的角度讲解Net-SNMP开发的书籍。本书从网络管理概念开始,到MIB的开发设计,最后到使用Net-SNMP开发网络管理应用,实现了由网络管理理论到实践的落地。它有以下几个特点:
·书中内容由项目而生,以一线开发工程师的视角和言语展开。
·注重实战。实战篇和高级篇的每章几乎都有完整的示例代码,部分是项目简化后的代码,参考意义非常大。
·提供了传统IT企业软件开发项目的实践方法、流程以及相关开发技术,经验总结。
·完整的监控软件的开发链,包括代理端和管理端软件的开发。
读者对象
本书覆盖了基于Net-SNMP开发监控软件所需要的SNMP、Net-SNMP、Linux系统及编程相关内容,所以本书可以帮到下列人员:
·基于Net-SNMP开发监控类软件的读者。
·希望了解、掌握SNMP协议及其开源技术的读者。
·对系统监控、网络监控感兴趣的读者(包括系统管理员)。
·Linux C/C++(网络)软件开发人员。
·大专院校计算机相关专业的学生。
如何阅读本书
本书分为三大部分:
第一部分为基础篇(第1章~第6章)。
第1章从网络管理概念和历史讲起,目的是让读者对网络管理、SNMP以及Net-SNMP有个整体的了解,这样有助于读者对后续章节的理解,建议通读。
第2章~第4章详细讲述了与MIB关联密切的SNMP框架的几大基础组件,包括MIB的语法基础ASN.1、管理信息结构SMI和管理信息库MIB。基于Net-SNMP开发网络管理程序需要对SNMP协议和SNMP软件的开发流程有一定的了解,比如开发网络管理代理的首要任务是设计和编写MIB。如果读者不熟悉这些内容,建议认真阅读。
第5章讲述了SNMP协议的传输编码以及如何抓取和分析SNMP数据包,这对深入理解SNMP协议和SNMP软件的底层调试大有裨益。
第6章过渡到了Net-SNMP的详细介绍,重点讲述了工具集的使用方法、自动生成代码框架的方法以及基于Net-SNMP的开发模式。读者可以将这一章前面部分的内容看成是工具集的参考手册。
基础篇是我们是迈入实战篇的基础,它几乎覆盖了开发SNMP应用程序的所有内容。这些内容属于SNMP协议范畴,但又不能完全涵盖SNMP协议,如果读者需要全面了解SNMP协议,则还需要阅读相关的文献。不过基础篇的内容已经足以让读者应对基于Net-SNMP进行应用程序开发。如果你已经拥有相关的知识储备可以直接进入到实战篇和高级篇。
第二部分为实战篇(第7章~第11章),是本书的重点。
第7章详细介绍了Net-SNMP中丰富而复杂的配置选项,包括如何移植到嵌入式系统的相关配置和方法;搭建了基于Net-SNMP、Cacti、MySQL、Apache等相关开源软件的企业级系统监控平台,前端以Web图形展示。
第8章介绍了Net-SNMP基础库中的API,并基于此使用C语言实现了可灵活配置的、简易的网管后台程序,在SNMP的术语里我们把它称为NMS(Network Management System,网络管理系统)。
第9章介绍了Net-SNMP代理库中的API和Net-SNMP代理框架,并基于此使用C语言实现了监控操作系统中其他进程的代理程序snmpd(包含Net-SNMP中默认的MIB)。在SNMP的术语里我们把它称为Agent(代理)。这一章完整地呈现了从MIB设计开发到Agent实现的流程和方法。
第10章介绍了Net-SNMP中的Python绑定,基于其API,使用Python语言开发了一款同第8章介绍的程序功能类似的网管程序。
第11章介绍了Net-SNMP中的Perl绑定,基于其API,使用Perl语言开发了一款监控MySQL数据库的管理软件。
本书不涉及Python和Perl基础知识,这部分内容需要读者自行学习。实战篇各个章节,除了要求先掌握第7章的Net-SNMP的安装和配置外,其他几个章节没有明显的前后依赖关系,读者可以有选择性地阅读。实战篇的内容都以工程项目为背景,提供了对应监控需求的整套方案、架构以及实现方法。这些案例都在Linux系统下开发,都比较重量级!其中涉及的内容不仅包括Net-SNMP相关的知识还包括其他的开发技术、软件、系统的集成。相对于基础篇来说,对读者的要求更高。建议读者学习并掌握相关的内容。
另外,实战篇按照传统IT企业软件项目的开发流程讲述,力求顺应软件开发人员的思维,同时为了适合书写要求,笔者提取了真实项目中核心的内容,简化或转化到适合讲解和呈现的程度。对那些简化的或转化后显得更“笨拙”的解决方法,且需要在项目中考虑和实现的内容,则在章节末尾以“优化、思考”的方式提醒读者,因为这些内容已经不是本书覆盖得到的!
第三部分为高级篇(第12章~第15章),是实战篇的延续。
第12章承接第9章的内容,首先讲述如何维护代理,并由此推演到重构和优化代理的必要性,最后给出了方案和具体的代码实现。比较有意思的是,本章还提及了代理免维护的思路和方案。应对变化最好的办法是将不变的固定而将变化的抽取出来,这可以通过代码框架的固定和配置文件的方式来实现。在这种思路下我们只需要开发代理一次,就能适应后续的需求变化,建议读者多多思考本章的思路,并自行实践。
第13章介绍了Net-SNMP中的mib2c代理(代码)框架生成工具的编程语法,并在第12章重构后的代码的基础上编写了代码框架的配置文件。基于此配置文件可以实现自动生成第12章的代码,免去繁重的代码编写工作!如果读者觉得自动生成代码是件高大上的事,就如同当年的我一样,那么你应该认真地读完本章!
第14章讲述了Net-SNMP中的高级开发技巧,包括一些实用的API、子代理模式开发代理、动态加载模式开发代理,同时对每个知识点都给出了应用示例。其中,子代理和动态加载模式是Net-SNMP实现更为灵活的监控和分布式监控的有效手段。建议读者读完本章并在实际项目中使用。
第15章讲述了Net-SNMP的测试和调试方法,这些方法能服务于实战篇和高级篇中程序的测试和调试。这一章用了较大篇幅讲述GDB及Linux网络程序的调试方法和技巧,内容都是“干货”。它们是Linux下通用的调试手段,而不仅仅是调试Net-SNMP相关的程序,建议读者通读。
以上是本书各个章节的安排情况和写作思路,希望有助于读者阅读。
勘误和支持
由于水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正,为此,我特意创建一个QQ行业交流群:203127943,欢迎大家加入。你可以将书中的错误和问题反馈给我,我将尽量在线上为你提供最满意的解答。书中的全部源文件除可以从华章网站下载外,还可以从Github网站下载,地址为https://github.com/chansonZ/Understanding-the-Net-SNMP,项目代码分别放在对应章节的目录中。我也会将相应的更新及时发布出来。如果你有更多的宝贵意见,也欢迎发送邮件至邮箱xtdwxk@gmail.com,期待能够得到你的真挚反馈。
致谢
首先要感谢创建并提供Net-SNMP源码的教育机构、世界各地开发和维护人员,以及负责这一开源项目的Wes Hardaker先生。同时感谢Wes在百忙之中回信给我,他不仅为我提供了资料还写下了他与Net-SNMP的缘分和项目历史。
感谢每一位帮助过我的老师、同事和领导,是他们让我有了学习和总结的机会。书中的知识都来自于他们的帮助和营造的氛围。也感谢华章作者群的大咖和周围的朋友们,他们有时不经意说出的一句话,或随手转发的一篇文章都让我受益匪浅。
感谢《微信公众平台应用开发实战》的作者钟志勇,因为他的引荐,本书才有机会出版。同时感谢参与本书审阅的朋友们:钟志勇、徐鑫鑫、白良浩、郑坤。他们的批改细致而严谨!
感谢机械工业出版社华章公司的编辑杨福川和孙海亮老师,在这一年多的时间中是他们始终支持我的写作,他们的鼓励和帮助引导我能顺利完成全部书稿。
最后感谢我的爸爸、妈妈和姐姐在艰苦环境下将我培养成人,并时时刻刻为我灌输爱的力量!感谢哈尔滨、深圳两地教授我太极拳的老师们,他们鼓励我锻炼,使我增强了体质,这也是一年里支撑我写作到午夜的基础,尤其感谢唐老师和吴老师对我的关心!也要感谢我未来的女朋友,她没有在这一年出现,让我有时间写作,否则我肯定会拿出不少时间陪她聊天。
谨以此书献给我最亲爱的家人和朋友,以及正在为自我实现而奋斗的、充满朝气的IT工程师们!
张春强