Traditional UNIX kernels
- 格式:ppt
- 大小:395.50 KB
- 文档页数:22


卷首语·1·本刊致谢本杂志在制作过程中得到本校三叶草工作组全体成员的支持,在此致谢。
你们对本杂志的制作及推广给予了很大的支持,尤其是三叶草小组网站(http://www.myclover. org/)的设计者李波,为了本杂志能正常下载,下了很大的功夫修改网站的一些细节问题。
得到我校技术论坛()Linux版版主城市流浪猫提供的技术支持,在此致谢。
本杂志的前两期在网上得到一些读者的评论,你们的评论,我们会认真的对待。
很感谢你们的支持及反馈。
尤其是王万清老师(初中数学教师),你的来信,非常认真的对本杂志提出了很多的不错的建议,在此一并感谢!得到本校众多的Linux爱好者的支持,在此就不写名字了,一并致谢。
最后:向阅读本杂志的人致谢,你们将会对国内Linux的推广起到更大的作用;向正在使用并坚定地使用Ubuntu的人致谢,你们的行为改变了我们;向正在使用Linux其它版本的人致谢,你们为Linux世界多元化起了不可低估的作用;向准备用Linux的人致谢,你们是未来的希望!三叶草桃源工作室版权·2·2008年9月刊总第3期本杂志基于GNU1的自由精神,你可以免费、自由地使用,并可以任意的传播、修改、及发布你的修改版本。
但是,不得用于商业用途。
本杂志基于GPL的协议发布,任何对本杂志的传播、修改及发布修改版本的时候,必须同样基于GPL的协议。
如果你转载本刊的文章,请注明原作者及出处。
本杂志大部分文章皆是原创,有的文章转载于网络和社区,为了更好地传播开源的思想,我们只是做个整理,如果侵犯了你的权益,请来信告知。
主办:成都信息工程学院桃源工作室(三叶草Linux小组)总编:任柳江(renewjoy)组织策划:叩容主编:雷宇田审稿:renewjoy、雷宇田、曾繁荣封面设计:刘臻、坦克杀手排版:高昌健技术支持:城市流浪猫网站维护:李波网站支持:ftp下载:ftp://210.41.224.194/论坛支持:/投稿邮箱:rlj linux@ lyt1231@QQ联系:(renewjoy)376549092(plain ray)85388803Powerd by L A T E X&X T E XCopyleft c 2008桃源工作室1GNU(发音:Guh-NOO)是“GNU's Not Unix”的递归缩写。
网络环境1、硬件:服务器、网络附属存储(NAS)和交换机。
3个服务器用来做web,2个服务器来做流媒体,1个服务器做LVS-DR,2个mysql服务器,一个邮件服务器,2个交换机,一个NETAPP NAS。
2、运行环境:流媒体windows,其他的都是linux。
3、逻辑结构:除数据库服务器和NETAPP存储外,其他的服务器都使用2个网络地址,一个公网地址和一个私有网络地址。
设置为公网ip的网络接口连接在一个交换机,设置为私有网络ip的网络接另外一个交换机,处于安全和网络带宽考虑,网络存储设备和数据库只使用私有网络地址。
网络拓扑图如下所示:基本原理传统模式下,用户的访问请求通过DNS服务器解析后,把服务请求转发给web服务器,取得数据后返回给用户。
这种模式有2个麻烦:同时访问的用户增加到某个程度后,服务器不能提供所需的正常访问;遇到故障,所有的访问请求都将失败。
要解决这样一个难题,LVS是上上之选。
当我们采用lvs方案之后,更改dns服务器的记录,这样用户的访问将首先到达LVS控制器所在的服务器,LVS把请求按照某种算法转发给后面真正的服务器。
那么数据的返还是怎样的一个过程呢?在采用DR方式的集群形式下,真实服务器直接把数据返还给用户而不再经过LVS控制器。
访问数据的流向在上图中用带箭头的虚线标识出来了,这样设计使得结构更简单一些,lvs控制器的压力也小很多。
根据应用的实际情况考虑,本项目采用LVS/DR方式。
技术实现先列出个相关服务器的ip地址:一、修改DNS记录www IN A 61.135.55.160media IN A 61.135.55.161修改bind完成后测试一下,看是否被正确的解析。
注意:主机记录应该解析到虚拟地址。
二、配置LVS/DRLVS/DR主要由控制器和真实服务器2部分构成,需要在控制器和真实服务器上做好配置才能提供正常的服务,下面分步来说明。
(一)安装控制器部分:安装好系统(我用的是centos 5),指定ip地址61.135.55.100/24,关闭不必要的系统/网络服务(执行ntsysv用上下键和空白键来完成)。
关于ucd-snmp软件包ucd-snmp介绍ucd-snmp源自于卡耐基.梅隆大学的SNMP软件包CMU snmp 2.1.2.1, 由加州大学Davis 分校(Universityof Califonia at Davis)开发与维护, 所以命名为ucd-snmp. 2000年11月ucd-snmp项目转到由SourceForge()管理, 并更名为net-snmp. ucd-snmp 4.2 是以ucd-snmp命名的最后的一个主要版本. 也就是说, 以后发布的ucd-snmp 4.2.x仅仅修改软件包中的Bugs; 而大的修改版本将以net-snmp命名, 并发布为5.x. ucd-snmp 4.2.1是最新的发布版本, 于2001年4月4日发布.ucd-snmp 4.2.1软件包由如下内容组成:¨一个可扩展的SNMP代理程序(snmpd);¨一个SNMP代理和管理程序开发库;¨几个用于请求或设置SNMP代理变量的工具程序(snmpget, snmpset, snmptable, snmpwalk 等);¨几个用于生成或处理SNMP陷阱(trap)的工具程序(snmptrapd和snmptrap);¨一个标准Unix命令netstat的SNMP版本(snmpnetstat);¨一个基于Tk/perl的MIB浏览器(tkmib)ucd-snmp 4.2.1的文档:¨ REAME系列¨ FAQ¨ INSTALL¨ PORTING¨关于工具程序, 配置文件, 和API的man手册¨一份关于如何扩展代理程序的指南(AGENT.txt)¨位于/tutorial的一份入门手册注意: 建议的阅读顺序, REAME----->;INSTALL------>;Tutorial. 在尝试Tutorial中的例程时, 遇到问题, 参见FAQ; 再根据FAQ指引, 参见相应的文档. (这是我熟悉这个软件包的过程. :-) ) 另外, 在软件包中有一个工具程序,FAQ2HTML, 可以将FAQ转换成HTML格式,便于浏览或查找.ucd-snmp的维护网址: . 在此网站上可以下载各个版本和各种形式的ucd-snmp软件包, 还有关于如何使用, 如何扩展开发等的相关文档. 如何订阅相关的邮件列表, 可以参见FAQ中的相关内容.ucd-snmp 4.2.1支持的操作系统(包括应用程序和代理程序, 至少部分支持):¨ HP-UX (10.20 to 9.01)¨ Ultrix (4.5 to 4.2)¨ Solaris (2.8 to 2.3) and SunOS (4.1.4 to 4.1.2)¨ OSF (4.0, 3.2)¨ NetBSD (1.5alpha to 1.0)¨ FreeBSD (4.1 to 2.2)¨ BSDi (4.0.1 to 2.1)¨ Linux (kernels 2.2 to 1.3)¨ AIX (4.1.5, 3.2.5)¨ OpenBSD (2.8, 2.6)¨ Irix (6.5 to 5.1)注意: 某些系统不支持某些功能模块,具体情况及处理方法,参见FAQ文档.ucd-snmp 4.2.1也可以运行于win32平台, 具体情况参见README.win32文档.ucd-snmp 4.2.1 支持如下SNMP协议版本:¨ SNMPv1 (RFCs 1155-1157)¨ SNMPv2c (RFCs 1901-1908)¨ SNMPv3 (RFCs 2271-2275)了解SNMP协议以及不同版本之间的区别, 可以阅读这些RFC文档和FAQ. RFC文档可以从如下网页检索并下载,/index-rfc.htm关于ucd-snmp 4.2.1的安装, 主要参见INSTALL文档. 需要注意的是, 必须还安装SNMP perl扩展模块. 因为有些工具程序是perl脚本文件, 需要这个扩展模块的支持, 如mib2c, snmpconf, FAQ2HTML等. 而tkmib工具需要Tk.pm 模块支持. 在软件包中自带SNMP perl模块, 而没有Tk.pm. 可以到如下网站下载, (关于这个网站的说明是, 几乎涵盖了所有的perl 模块).一个简单的SNMP网络管理程序下面, 让我们先应用ucd-snmp 4.2.1写一个的SNMP网络程序, 从应用程序的角度尝试一下这个软件包的使用. 这个程序是如此地简单, 不支持任何命令行参数, 仅仅从代理程序获得关于系统的描述.程序代码如下:1) /* snmpapp.c - a simple SNMP application */2) #include <ucd-snmp/ucd-snmp-config.h>;3) #include <ucd-snmp/ucd-snmp-includes.h>;4) #include <ucd-snmp/system.h>;5) int main(int argc, char * argv[])6) {7) struct snmp_session session, *ss;8) struct snmp_pdu *request, *response;9)10) oid myoid[MAX_OID_LEN];11) size_t myoid_len = MAX_OID_LEN;12) struct variable_list *vars;13) int status;14) init_snmp("snmpapp");15) snmp_sess_init( &session );16) session.version = SNMP_VERSION_1;17) session.peername = "localhost";18) munity = "public";19) munity_len = strlen(munity);20) SOCK_STARTUP;21) ss = snmp_open(&session);22) request = snmp_pdu_create(SNMP_MSG_GET);23) read_objid("system.sysDescr.0", myoid, &myoid_len);24) snmp_add_null_var(request, myoid, myoid_len);25) status = snmp_synch_response(ss, request, &response);26) if (status == STAT_SUCCESS &&27) response->;errstat == SNMP_ERR_NOERROR)28) {29) for(vars = response->;variables; vars; vars = vars->;next_variable)30) print_variable(vars->;name, vars->;name_length, vars);31) } else {32) if (status == STAT_SUCCESS)33) fprintf(stderr, "Error in packet\nReason: %s\n",34) snmp_errstring(response->;errstat));35) else36) snmp_sess_perror("snmpget", ss);37) }38) if (response)39) snmp_free_pdu(response);40) snmp_close(ss);41) SOCK_CLEANUP;42) return (0);43) }第2-4行, 必须包含的头文件, 其中<ucd-snmp/system.h>;如果在<ucd-snmp/ucd-snmp- includes.h>;中已包含, 可以省略. 不过, 在头文件中有宏保护, 所以无所谓.第7-13行, 定义程序所需要的变量.第14行, 初始化SNMP库.第15-19行, 初始化会话结构变量. 假定SNMP代理位于本机, community(如何翻译?)名public 具有可读权限.第20行和第41行, SOCK_STARTUP和SOCK_CLEANUP宏定义主要用于在win32平台初始化和清除winsock接口, 而在Unix/Linux环境不做任何事情.第21行, 打开一个snmp会话. 在下面的会话过程中使用API snmp_open()返回的指针. 关于snmp_open(), 参见相应的man手册.第22-24行, 创建一个SNMPv1 PDU, 并加入请求代码. 注意这里我们使用的是SNMP Get请求.(宏SNMP_MSG_GET表示).第25行, 与SNMP代理进行通讯. 这里使用的是同步通讯机制.第26-37行, 处理反馈. 注意消息及错误的处理方式.第38-39行, 如果通讯成功, 反馈指针response非空, 必须由程序释放API分配的内存.第40行, 关闭会话.ucd-snmp API分为如下几类:¨ snmp_api¨ snmp_sess_api¨ mib_api¨ variables¨ default_store¨ read_config¨ snmp_alarm¨ snmp_trap_api¨ anmp_agent_api上面程序用到如下API: init_snmp(), snmp_sess_init(), snmp_open(),snmp_pdu_create(), read_objid(), snmp_add_null_var(), print_variable(), snmp_errstring(), snmp_sess_perror(), snmp_pdu_free(), snmp_close().具体的API语义和语法, 参见相应的man手册或头文件.在Rad Hat Linux 6.2环境中用如下命令编译该程序:gcc -g -I/usr/local/include -o snmpapp snmpapp.c -L/usr/local/lib -lsnmp其中/usr/local为ucd-snmp 4.2.1的确省安装目录.编译通过, 运行程序获得SNMP代理运行系统的描述. (在当前情况下, 当然是本机Red Hat Linux 6.2系统的描述). 当然, 必须事先在本机运行SNMP代理:# /usr/local/sbin/snmpd (必须是root用户)一个简单的MIB模块接下来, 尝试扩展ucd-snmp代理程序snmpd的几种方式.首先编写一个需要加入的MIB模块定义文件. 编写MIB模块定义文件的语法, 由SNMP 协议中SMI部分描述. SMI所采用的是ASN.1的一个子集. 具体的描述参见相应的RFC文档. 由于我现在不是很精通如何定义MIB模块, 所以下面借用了ucd-snmp项目组的一个MIB示例文件.MIB模块定义文件如下:1) -- UCD-SNMP-TUTORIAL-MIB.txt2) UCD-SNMP-TUTORIAL-MIB DEFINITIONS ::= BEGIN3) IMPORTS4) ucdExperimental FROM UCD-SNMP-MIB,5) MODULE-IDENTITY FROM SNMPv2-SMI6) MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF;7) ucdSnmpTutorialMIB MODULE-IDENTITY8) LAST-UPDATED "0005150000Z"9) ORGANIZATION "UCDavis"10) CONTACT-INFO "11) Author: Wes Hardaker12) University of California at Davis13) postal: IT-DCAS14) UCDavis15) Davis, CA 9561616) USA17) email: wjharda...@18) phone: +1-530-754-757119) "20) DESCRIPTION "A simple mib for demonstration purposes.21) "22) ::= { ucdExperimental 4242 }23) ustMIBObjects OBJECT IDENTIFIER ::= { ucdSnmpTutorialMIB 1 }24) ustMIBConformance OBJECT IDENTIFIER ::= { ucdSnmpTutorialMIB 2 }25) ustScalarSet OBJECT IDENTIFIER ::= { ustMIBObjects 1 }26) ustSSSimpleString OBJECT-TYPE27) SYNTAX OCTET STRING28) MAX-ACCESS read-write29) STATUS current30) DESCRIPTION31) "This is a simple test string. It does nothing more than32) return its current value, and changes values only when set by33) an incoming SNMP set request."34) DEFVAL { Hello World }35) ::= { ustScalarSet 1 }36) ustSSSecondsSinceChanged OBJECT-TYPE37) SYNTAX TimeTicks38) UNITS "1/100th Seconds"39) MAX-ACCESS read-only40) STATUS current41) DESCRIPTION42) "This object indicates the number of 1/100th seconds since the43) ustSSSimpleString object has changed. If it is has never been44) modified, it will be the time passed since the start of the45) agent."46) ::= { ustScalarSet 2 }47) END该MIB定义文件在MIB树.dod.internet.private.enterprise.ucd.ucdExperimental上定义了一个子树ucdSnmpTutorialMIB, 包含一个ustScalarSet对象, 该对象包含两个变量, ustSSSimpleString 和ustSSSenconsSinceChanged. 其中ustSSSimpleString为字符串类型, 可读写. ustSSSenconsSinceChanged为时间类型, 只读, 记录ustSSSimpleString变量自上次修改到现在的时间值. 我们的目的是在代理程序中加入这个模块, 并能通过工具程序获得或设置变量的值. 首先通过工具mib2c生成C代码.mib2c工具mib2c是ucd- snmp 4.2新加入的由perl语言编写的工具程序. 该工具程序需要SNMP perl 扩展模块支持. 首先, 将上面的MIB定义文件拷贝到目录/usr/local/share/snmp/mibs下. 然后, 以如下命令运行mib2c工具: /usr/local/bin/mib2c ustScalarSetmib2c在当前目录下生成两个文件: ustScalarSet.h 和ustScalarSet.c. 文件如下. ustScalarSet.h :1) /* This file was generated by mib2c and is intended for use as amib modulefor the ucd-snmp snmpd agent. */2) #ifndef ...。