<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<channel>
	<title>flyinweb's blog - 技术文摘</title>
	<link>http://www.517sou.net/Folder/techdigest/Index.aspx</link>
	<language>zh-CN</language>
	<webMaster>shanyiwan@msn.com(flyinweb)</webMaster>
	<pubDate>Mon, 15 Jun 2009 19:31:16 GMT</pubDate>
	<copyright>Copyright 2007-2009. All rights reserved.</copyright>
	<generator>Bitrac Free Version</generator>
	<description>桃李无言，下自成蹊</description>
	<image>
		<title>flyinweb&apos;s blog</title>
		<url>http://www.517sou.net/Client/Banner.gif</url>
		<link>http://www.517sou.net/</link>
		<description>桃李无言，下自成蹊</description>
	</image>
	<item>
		<link>http://www.517sou.net/Article/wireshark-packet-capture-user-manual.aspx</link>
		<title>Wireshark抓包工具使用手册</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Mon, 06 Sep 2010 02:04:53 GMT</pubDate>
		<description>&lt;div&gt;&lt;p jquery1268231027671=&quot;9&quot;&gt;&lt;b&gt;一、Wireshark简介&lt;br /&gt;&lt;/b&gt;Wireshark是一个有名的网络端口探测器，是可以在Windows、Unix等各种平台运行的网络监听软件，它主要是针对TCP/IP协议的不安全性对运行该协议的机器进行监听。其功能相当于Windows下的Sniffer，都是在一个共享的网络环境下对数据包进行捕捉和分析，而且还能够自由地为其增加某些插件以实现额外功能。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Ethernet网络监测工具可在实时模式或离线模式中用来捕获和分析网络通信。下面是使用Wireshark 可以完成的几个工作：&lt;br /&gt;&amp;nbsp;&lt;br /&gt;l 网络管理员使用它去帮助解决网络问题&lt;br /&gt;l 网络安全工程师用它去测试安全问题&lt;br /&gt;l 开发人员用它是调试协议的实现过程&lt;br /&gt;l 用它还可以帮助人员深入的学习网络协议&lt;br /&gt;l 支持UNIX 平台和Windows 平台。&lt;br /&gt;l 从网络接口上捕获实时数据包&lt;br /&gt;l 以非常详细的协议方式显示数据包&lt;br /&gt;l 可以打开或者存贮捕获的数据包&lt;br /&gt;l 导入/导出数据包，从/到其它的捕获程序&lt;br /&gt;l 按多种方式过滤数据包&lt;br /&gt;l 按多种方式查找数据包&lt;br /&gt;l 根据过滤条件，以不同的颜色显示数据包&lt;br /&gt;l 可以建立多种统计数据&lt;br /&gt;&amp;nbsp;&lt;br /&gt;其最常用的功能是被攻击者用来检测被攻击电脑通过23（telnet）和110（pop3）端口进行的一些明文传输数据，以轻松得到用户的登录口令和邮件账号密码。对于网络管理员来说，也可以通过抓包分析，来确定一些异常的流量和局域网内部的非正常用户与外界的通信，比如说对于现在比较占用网络带宽的诸如Bit Torrent等P2P应用软件流量，通过使用该软件确定这些流量，网络管理员就可以使用流量控制（TC）的方法来规范、合理的分配带宽资源，提高网络的利用率。&amp;nbsp;&lt;br /&gt;&lt;b&gt;二、下载安装Wireshark&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Wireshark可以在&lt;a href=&quot;http://www.wireshark.org/download/&quot; target=&quot;_blank&quot;&gt;http://www.wireshark.org/download/&lt;/a&gt; 上下载，该软件有极其方便和友好的图形用户界面，并且能够使得用户通过图形界面的配置和选择，针对多块网卡、多个协议进行显示，效果非常好。目前最新版本为：Wireshark 0.99。&lt;/p&gt;&lt;p jquery1268231027671=&quot;9&quot;&gt;Wireshark安装后自动安装winpcap 4.0 ，Winpcap是UNIX下的libpcap移植到windows下的产物,他是一个GPL项目。Winpcap工作于驱动(Driver)层，所以能以很高的效率进行网络操作。 Winpcap提供了以下强大的功能： &lt;br /&gt;1．捕获原始的数据包 ；&lt;br /&gt;2．设置filter,只捕获自己敢兴趣的数据包 ；&lt;br /&gt;3．方便的把捕获的数据包输出到文件和从文件输入 ；&lt;br /&gt;4．发送原始的数据包 ；&lt;br /&gt;5．统计网络流量。&lt;/p&gt;&lt;p jquery1268231027671=&quot;9&quot;&gt;&lt;br /&gt;&lt;b&gt;三、使用Wireshark &lt;/b&gt;&lt;/p&gt;&lt;p jquery1268231027671=&quot;9&quot;&gt;当编译并安装好Wireshark后，就可以执行“Wireshark”命令来启动Wireshark。在用Wireshark截获数据包之前，应该为其设置相应的过滤规则，可以只捕获感兴趣的数据包。Wireshark使用与Tcpdump相似的过滤规则，并且可以很方便地存储已经设置好的过滤规则。 &lt;br /&gt;◆Wireshark主窗口有很多的GUI程序组成。&lt;br /&gt;(1) File(文件)：这个菜单包含：打开文件、合并文件、保存/打印/导出整个或部分捕获文件、退出。&lt;br /&gt;(2) Edit(编辑)这个菜单包括：查找包、时间参照、标记一个或多个包、设置参数、(剪切、复制、粘贴)。&lt;br /&gt;(3) View(查看)：这个菜单控制捕获数据的显示，包括：给定特定的一类包标以不同的颜色、字体缩放、在一个新窗口中显示一个包、展开&amp;amp;折叠详细信息面板的树状结构。&lt;br /&gt;(4) Go：这个菜单实现转到一个特定包。.&lt;br /&gt;(5) apture(捕获)：这个菜单实现开始、停止捕获，编辑捕获过滤条件的功能。&lt;br /&gt;(6) Analyze(分析)：这个菜单包含编辑显示过滤、enable(开)或disable(关)协议解码器、配置用户指定的解码方法、追踪一个TCP 流。&lt;br /&gt;(7) Statistics(统计)：该菜单完成统计功能。包括捕获的包的一个摘要、基于协议的包的数量等树状统计图等许多功&lt;br /&gt;(8) Help(帮助)这个菜单包含了一些对用户有用的信息。比如基本帮助、支持的协议列表、手册页、在线访问到网站等等。&lt;br /&gt;◆ Wireshark界面结构&lt;br /&gt;该工具提供一个强健的GUI界面，用来整理网络数据的捕获以及随后的网络通信浏览。主窗口包括一组菜单项，界面结构如图1。许多菜单从名字上看一目了然，这里不再阐述。第一个面板包含所有捕获报文的摘要。该面板包含报文号、时间戳、源、目的、协议以及信息域。这些域是可定制的，并且用户可删掉或加入其他的报文字段信息。&amp;nbsp; &lt;br /&gt;图 3 Wireshark界面结构&lt;/p&gt;&lt;p jquery1268231027671=&quot;9&quot;&gt;图注：&lt;br /&gt;1. 控制面板和主菜单；&lt;br /&gt;2. 报文摘要窗口；&lt;br /&gt;3. 过滤器。&lt;br /&gt;4. 报文细节窗口；&lt;/p&gt;&lt;p jquery1268231027671=&quot;9&quot;&gt;说起Wireshark就不得不提Ethereal了，Ethereal和在Windows系统中常用的sniffer pro并称网络嗅探工具双雄，不过和sniffer pro不同的是Ethereal在Linux类系统中应用更为广泛。而Wireshark软件则是Ethereal的后续版本，他是2006年在Ethereal被收购后推出的最新网络嗅探软件，在功能上比前身更加强大。官方主页： &lt;a href=&quot;http://www.wireshark.org/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#1848b5&quot;&gt;http://www.wireshark.org/&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;&lt;font color=&quot;#1848b5&quot;&gt;&lt;img border=&quot;0&quot; width=&quot;1002&quot; height=&quot;747&quot; class=&quot;Image&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1009/xytdyk_2516696_1.png&quot; /&gt;&lt;/font&gt;&lt;p jquery1268231027671=&quot;10&quot;&gt;Wireshark是功能强大的网络数据捕获工具，他可以帮助我们分析网络数据流量，在第一时间发现蠕虫病毒，木马程序以及ARP欺骗等问题的根源。&lt;/p&gt;&lt;p jquery1268231027671=&quot;11&quot;&gt;这个软件是开源代码的。可以在linux和windows下使用，在windows下编译需要安装cygwin。&lt;/p&gt;&lt;p jquery1268231027671=&quot;12&quot;&gt;&lt;strong&gt;四、简单使用教程&lt;/strong&gt;&lt;/p&gt;&lt;p jquery1268231027671=&quot;13&quot;&gt;使用Wireshark时最常见的问题，是当您使用默认设置时，会得到大量冗余信息，以至于很难找到自己需要的部分。&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;14&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;◆设置Wireshark的过滤规则&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;16&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;在用Wireshark截获数据包之前，应该为其设置相应的过滤规则，可以只捕获感兴趣的数据包。Wireshark使用与Tcpdump相似的过滤规则，并且可以很方便地存储已经设置好的过滤规则。要为Wireshark配置过滤规则，首先单击“Capture”选单，然后选择“Capture Filters...”菜单项，打开“Wireshark ：Capture Filter”对话框。因为此时还没有添加任何过滤规则，因而该对话框右侧的列表框是空的(如图2所示)。在Wireshark中添加过滤器时，需要为该过滤器指定名字及规则。 &lt;table class=&quot;t_table&quot; cellspacing=&quot;0&quot; width=&quot;98%&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img style=&quot;cursor: pointer&quot; title=&quot;点击图片可在新窗口打开&quot; border=&quot;0&quot; width=&quot;643&quot; height=&quot;488&quot; class=&quot;Image&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1009/v09kan_2516696_2.jpg&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;图 4 &lt;font face=&quot;宋体&quot;&gt;为Wireshark添加一个过滤器&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;17&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;18&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;例如，&lt;/strong&gt;要在主机192.168.0.3和192.168.0.11间创建过滤器，可以在“Filter name”编辑框内输入过滤器名字“cjh”，在“Filter string”编辑框内输入过滤规则“host 192.168.0.3 and 192.168.0.11”，然后单击“新建”按钮即可。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;19&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;20&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;在 Wireshark中使用的过滤规则和Tcpdump几乎完全一致，这是因为两者都基于pcap库的缘故。Wireshark能够同时维护很多个过滤器。网络管理员可以根据实际需要选用不同的过滤器，这在很多情况下是非常有用的。例如，一个过滤器可能用于截获两个主机间的数据包，而另一个则可能用于截获 ICMP包来诊断网络故障。单击“保存”按钮，会到对话框。单击“关闭”按钮完成设置。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;21&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;1. 指定过滤器&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;22&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;23&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;要将过滤器应用于嗅探过程，需要在截获数据包之前或之后指定过滤器。要为嗅探过程指定过滤器，并开始截获数据包，可以单击“Capture”选单，选择 “Start...”选单项，打开“iterface”对话框，单击该对话框中的“Filter:”按钮，然后选择要使用的网络接口，如图5所示。 &lt;table class=&quot;t_table&quot; cellspacing=&quot;0&quot; width=&quot;98%&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img style=&quot;cursor: pointer&quot; title=&quot;点击图片可在新窗口打开&quot; border=&quot;0&quot; width=&quot;671&quot; height=&quot;204&quot; class=&quot;Image&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1009/s23wl3_2516696_3.jpg&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;图 5 &lt;font face=&quot;宋体&quot;&gt;为Wireshark指定网络接口&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;24&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;25&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Wingdings&quot;&gt;l&lt;/font&gt;&lt;strong&gt;注意：&lt;/strong&gt;在“Capture Options”对话框中，“Update list of packets in real time”复选框被选中了。这样可以使每个数据包在被截获时就实时显示出来，而不是在嗅探过程结束之后才显示所有截获的数据包。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;26&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;27&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;在选择了所需要的过滤器后，单击“确定”按钮，整个嗅探过程就开始了。Wireshark可以实时显示截获的数据包，因此能够帮助网络管理员及时了解网络的运行状况，从而使其对网络性能和流量能有一个比较准确的把握。如图6 。 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;28&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;29&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;&amp;nbsp; &lt;table class=&quot;t_table&quot; cellspacing=&quot;0&quot; width=&quot;98%&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img style=&quot;cursor: pointer&quot; title=&quot;点击图片可在新窗口打开&quot; border=&quot;0&quot; width=&quot;644&quot; height=&quot;491&quot; class=&quot;Image&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1009/bnlkvs_2516696_4.jpg&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;30&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;31&quot;&gt;图 6 &lt;font face=&quot;宋体&quot;&gt;Wireshark实时显示截获的数据包&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;32&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;Capture Options其他选项：&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;33&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;34&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;Interface（接口）&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;36&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;这个字段指定在哪个接口进行捕获。这是一个下拉字段，只能从中选择Wireshark 识别出来的接口，默认是第一块支持捕获的非loopback 接口卡。如果没有接口卡，那么第一个默认就是第一块loopback 接口卡。在某些系统中，loopback 接口卡不能用来捕获（loopback 接口卡在Windows平台是不可用的）。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;38&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Wingdings&quot;&gt;l&lt;/font&gt;IP address（IP 地址）&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;40&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;所选接口卡的IP 地址。如果不能解析出IP 地址，则显示&amp;quot;unknown&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;42&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Wingdings&quot;&gt;l&lt;/font&gt;Link-layer header type（链路层头类型）&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;44&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;除非你在极个别的情况下可能用到这个字段，大多数情况下保持默认值。具体的描述，见”&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;46&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Wingdings&quot;&gt;l&lt;/font&gt;Buffer size: n megabyte(s) （缓冲区大小：n 兆）&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;48&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;输入捕获时使用的buffer 的大小。这是核心buffer 的大小，捕获的数据首先保存在这里，直到写入磁盘。如果遇到包丢失的情况，增加这个值可能解决问题。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;50&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Wingdings&quot;&gt;l&lt;/font&gt;Capture packets in promiscuous mode （在混杂模式捕获包）&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;52&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;这个选项允许设置是否将网卡设置在混杂模式。如果不指定，Wireshark 仅仅捕获那些进入你的计算机的或送出你的计算机的包。(而不是LAN 网段上的所有包).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;54&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Wingdings&quot;&gt;l&lt;/font&gt;Limit each packet to n bytes （限制每一个包为n 字节）&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;56&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;这个字段设置每一个数据包的最大捕获的数据量。有时称作snaplen 。如果disable 这个选项默认是65535, 对于大多数协议来讲中够了。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;58&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Wingdings&quot;&gt;l&lt;/font&gt;Capture Filter（捕获过滤）&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;60&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;这个字段指定一个捕获过滤。 “在捕获时进行过滤”部分进行讨论。默认是空的，即没过过滤。也可以点击标为Capture Filter 的按钮, Wireshark 将弹出Capture Filters（捕获过滤）对话框，来建立或者选择一个过滤。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p jquery1268231027671=&quot;62&quot;&gt;&lt;strong&gt;用Wireshark分析互联网数据包实例&lt;/strong&gt;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;64&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;上面基本是以局域网为例的。下面看看Wireshark对于互联网数据的分析。Wireshark和其它的图形化嗅探器使用基本类似的界面，整个窗口被分成三个部分：最上面为数据包列表，用来显示截获的每个数据包的总结性信息；中间为协议树，用来显示选定的数据包所属的协议信息；最下边是以十六进制形式表示的数据包内容，用来显示数据包在物理层上传输时的最终形式。使用Wireshark可以很方便地对截获的数据包进行分析，包括该数据包的源地址、目的地址、所属协议等。图7是在Wireshark中对一个HTTP数据包进行分析时的情形。在图最上边的数据包列表中，显示了被截获的数据包的基本信息。 &lt;table class=&quot;t_table&quot; cellspacing=&quot;0&quot; width=&quot;98%&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img style=&quot;cursor: pointer&quot; title=&quot;点击图片可在新窗口打开&quot; border=&quot;0&quot; width=&quot;673&quot; height=&quot;509&quot; class=&quot;Image&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1009/1p7686_2516696_5.jpg&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;图 7 &lt;font face=&quot;宋体&quot;&gt;用Wireshark分析互联网数据包内容&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;66&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;图 7中间是协议树，通过协议树可以得到被截获的数据包的更多信息，如主机的MAC地址(Ethernet II)、IP地址(Internet Protocol)、TCP端口号(Transmission Control Protocol)，以及HTTP协议的具体内容(Hypertext Trnasfer Protocol)。通过扩展协议树中的相应节点，可以得到该数据包中携带的更详尽的信息。 &lt;table class=&quot;t_table&quot; cellspacing=&quot;0&quot; width=&quot;98%&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img style=&quot;cursor: pointer&quot; title=&quot;点击图片可在新窗口打开&quot; border=&quot;0&quot; width=&quot;673&quot; height=&quot;441&quot; class=&quot;Image&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1009/v5gtpp_2516696_6.jpg&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;图 8 &lt;font face=&quot;宋体&quot;&gt;使用Follow TCP stearm 查看详细信息&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align=&quot;left&quot; jquery1268231027671=&quot;68&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font face=&quot;宋体&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;3&quot;&gt;图 8最下边是以十六制显示的数据包的具体内容，这是被截获的数据包在物理媒体上传输时的最终形式，当在协议树中选中某行时，与其对应的十六进制代码同样会被选中，这样就可以很方便地对各种协议的数据包进行分析。图6 是一个详细封包分析。是点击该封包选择“Mark Pactet”。从图中可以看出，当前选中数据包的源地址是221.217.132.33，目的地址为202.106.124.50，该数据包所属的协议是超文本传输协议(HTTP)。要获取更加详细信息可以是点击该封包选择“Follow TCP stearm ”。&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/p&gt;&lt;/div&gt;</description>
		<guid>http://www.517sou.net/Article/wireshark-packet-capture-user-manual.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/519/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/wireshark-packet-capture-user-manual.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/519/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/read-content-between-xml-tags.aspx</link>
		<title>获取XML标签内容</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Thu, 29 Jul 2010 02:29:34 GMT</pubDate>
		<description>&lt;p&gt;获取XML标签内容：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;# cat sample.xml&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;xml&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;version&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;catalog&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;book&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;bk101&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Gambardella,&amp;nbsp;Matthew&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;XML&amp;nbsp;Developer&apos;s&amp;nbsp;Guide&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;genre&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Computer&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;genre&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;44.95&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;publish_date&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;2000-10-01&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;publish_date&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;An&amp;nbsp;in-depth&amp;nbsp;look&amp;nbsp;at&amp;nbsp;creating&amp;nbsp;applications&amp;nbsp;with&amp;nbsp;XML.&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;book&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;book&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;bk102&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Ralls,&amp;nbsp;Kim&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Midnight&amp;nbsp;Rain&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;genre&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Fantasy&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;genre&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;5.95&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;publish_date&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;2000-12-16&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;publish_date&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;A&amp;nbsp;former&amp;nbsp;architect&amp;nbsp;battles&amp;nbsp;corporate&amp;nbsp;zombies, &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;an&amp;nbsp;evil&amp;nbsp;sorceress,&amp;nbsp;and&amp;nbsp;her&amp;nbsp;own&amp;nbsp;childhood&amp;nbsp;to&amp;nbsp;become&amp;nbsp;queen &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;of&amp;nbsp;the&amp;nbsp;world.&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;book&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;book&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;bk103&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Corets,&amp;nbsp;Eva&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Maeve&amp;nbsp;Ascendant&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;genre&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Fantasy&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;genre&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;5.95&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;publish_date&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;2000-11-17&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;publish_date&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;After&amp;nbsp;the&amp;nbsp;collapse&amp;nbsp;of&amp;nbsp;a&amp;nbsp;nanotechnology &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;society&amp;nbsp;in&amp;nbsp;England,&amp;nbsp;the&amp;nbsp;young&amp;nbsp;survivors&amp;nbsp;lay&amp;nbsp;the &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foundation&amp;nbsp;for&amp;nbsp;a&amp;nbsp;new&amp;nbsp;society.&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;book&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;book&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;bk104&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Corets,&amp;nbsp;Eva&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Oberon&apos;s&amp;nbsp;Legacy&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;genre&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Fantasy&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;genre&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;5.95&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;publish_date&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;2001-03-10&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;publish_date&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;In&amp;nbsp;post-apocalypse&amp;nbsp;England,&amp;nbsp;the&amp;nbsp;mysterious &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;agent&amp;nbsp;known&amp;nbsp;only&amp;nbsp;as&amp;nbsp;Oberon&amp;nbsp;helps&amp;nbsp;to&amp;nbsp;create&amp;nbsp;a&amp;nbsp;new&amp;nbsp;life &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;the&amp;nbsp;inhabitants&amp;nbsp;of&amp;nbsp;London.&amp;nbsp;Sequel&amp;nbsp;to&amp;nbsp;Maeve &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Ascendant.&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;book&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;book&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;bk105&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Corets,&amp;nbsp;Eva&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;The&amp;nbsp;Sundered&amp;nbsp;Grail&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;genre&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Fantasy&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;genre&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;5.95&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;publish_date&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;2001-09-10&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;publish_date&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;The&amp;nbsp;two&amp;nbsp;daughters&amp;nbsp;of&amp;nbsp;Maeve,&amp;nbsp;half-sisters, &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;battle&amp;nbsp;one&amp;nbsp;another&amp;nbsp;for&amp;nbsp;control&amp;nbsp;of&amp;nbsp;England.&amp;nbsp;Sequel&amp;nbsp;to &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Oberon&apos;s&amp;nbsp;Legacy.&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;book&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;catalog&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;You want to pick up the stuff between the &amp;quot;&amp;lt;description&amp;gt;, &amp;lt;/description&amp;gt;&amp;quot; tags.&lt;br /&gt;&lt;br /&gt;The first occurrence is on a single line. The rest of them span multiple lines and you want the newlines to be preserved. I shall assume that you want the whitespaces to be preserved as well.&lt;br /&gt;&lt;br /&gt;Here&apos;s the script -&lt;/p&gt;&lt;pre style=&quot;border-bottom: 1px inset; border-left: 1px inset; padding-bottom: 6px; margin: 0px; padding-left: 6px; padding-right: 6px; overflow: auto; border-top: 1px inset; border-right: 1px inset; padding-top: 6px&quot; class=&quot;alt2&quot;&gt;
$
$ &lt;acronym title=&quot;Practical Extraction and Report Language&quot;&gt;perl&lt;/acronym&gt; -lne &apos;BEGIN{undef $/} while (/&amp;lt;description&amp;gt;(.*?)&amp;lt;\/description&amp;gt;/sg){print $1}&apos; sample.xml
An in-depth look at creating applications with XML.
A former architect battles corporate zombies,
      an evil sorceress, and her own childhood to become queen
      of the world.
After the collapse of a nanotechnology
      society in England, the young survivors lay the
      foundation for a new society.
In post-apocalypse England, the mysterious
      agent known only as Oberon helps to create a new life
      for the inhabitants of London. Sequel to Maeve
      Ascendant.
The two daughters of Maeve, half-sisters,
      battle one another for control of England. Sequel to
      Oberon&apos;s Legacy.
$
$&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;In case you want the newlines preserved, but want to remove the whitespace at the beginning, then -&lt;/p&gt;&lt;pre style=&quot;border-bottom: 1px inset; border-left: 1px inset; padding-bottom: 6px; margin: 0px; padding-left: 6px; padding-right: 6px; overflow: auto; border-top: 1px inset; border-right: 1px inset; padding-top: 6px&quot; class=&quot;alt2&quot;&gt;
$
$ &lt;acronym title=&quot;Practical Extraction and Report Language&quot;&gt;perl&lt;/acronym&gt; -lne &apos;BEGIN{undef $/} while (/&amp;lt;description&amp;gt;(.*?)&amp;lt;\/description&amp;gt;/sg){($x = $1) =~ s/\n\s*/\n/g; print $x}&apos; sample.xml
An in-depth look at creating applications with XML.
A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.
After the collapse of a nanotechnology
society in England, the young survivors lay the
foundation for a new society.
In post-apocalypse England, the mysterious
agent known only as Oberon helps to create a new life
for the inhabitants of London. Sequel to Maeve
Ascendant.
The two daughters of Maeve, half-sisters,
battle one another for control of England. Sequel to
Oberon&apos;s Legacy.
$
$&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;And in case you want to neither the newline nor the whitespace i.e. each chunk between &amp;quot;&amp;lt;description&amp;gt;&amp;quot; tags on a single line, then -&lt;/p&gt;&lt;pre style=&quot;border-bottom: 1px inset; border-left: 1px inset; padding-bottom: 6px; margin: 0px; padding-left: 6px; padding-right: 6px; overflow: auto; border-top: 1px inset; border-right: 1px inset; padding-top: 6px&quot; class=&quot;alt2&quot;&gt;
$
$ &lt;acronym title=&quot;Practical Extraction and Report Language&quot;&gt;perl&lt;/acronym&gt; -lne &apos;BEGIN{undef $/} while (/&amp;lt;description&amp;gt;(.*?)&amp;lt;\/description&amp;gt;/sg){($x = $1) =~ s/\n\s*//g; print $x}&apos; sample.xml
An in-depth look at creating applications with XML.
A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.
After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.
In post-apocalypse England, the mysterious agent known only as Oberon helps to create a new life for the inhabitants of London. Sequel to Maeve Ascendant.
The two daughters of Maeve, half-sisters, battle one another for control of England. Sequel to Oberon&apos;s Legacy.
$
$&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/read-content-between-xml-tags.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/500/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/read-content-between-xml-tags.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/500/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/logical-volume-management.aspx</link>
		<title>逻辑卷管理</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Tue, 20 Jul 2010 02:01:42 GMT</pubDate>
		<description>&lt;blockquote&gt;卷管理在 &lt;i&gt;-ix&lt;/i&gt; 环境（UNIX®、AIX 等等）中并不是新特性。逻辑卷管理（logical volume management，LVM）在 Linux® 内核 2.4v1 和 2.6.9v2 中就已经出现了。本文讨论 LVM2 最有用的特性（LVM2 是一个相当新的用户空间工具集，它提供逻辑卷管理功能），并提供几种简化系统管理任务的方法。&lt;/blockquote&gt;&lt;p&gt;逻辑卷管理（LVM）指系统将物理卷管理抽象到更高的层次，常常会形成更简单的管理模式。通过使用 LVM，所有物理磁盘和分区，无论它们的大小和分布方式如何，都被抽象为&lt;i&gt;单一存储（single storage）&lt;/i&gt;源。例如，在图 1 所示的物理到逻辑映射布局中，最大的磁盘是 80GB 的，那么用户如何创建更大（比如 150GB）的文件系统呢？&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;fig1&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;图 1. 物理到逻辑的映射&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;img alt=&quot;物理到逻辑的映射&quot; width=&quot;572&quot; height=&quot;112&quot; class=&quot;Image&quot; src=&quot;http://www.517sou.net/Attach/month_1007/figure1.gif&quot; /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;LVM 可以将分区和磁盘聚合成一个&lt;i&gt;虚拟磁盘（virtual disk）&lt;/i&gt;，从而用小的存储空间组成一个统一的大空间。这个虚拟磁盘在 LVM 术语中称为&lt;i&gt;卷组（volume group）&lt;/i&gt;。&lt;/p&gt;&lt;p&gt;建立比最大的磁盘还大的文件系统并不是这种高级存储管理方法的惟一用途。还可以使用 LVM 完成以下任务：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;在磁盘池中添加磁盘和分区，对现有的文件系统进行在线扩展&lt;/li&gt;&lt;li&gt;用一个 160GB 磁盘替换两个 80GB 磁盘，而不需要让系统离线，也不需要在磁盘之间手工转移数据&lt;/li&gt;&lt;li&gt;当存储空间超过所需的空间量时，从池中去除磁盘，从而缩小文件系统&lt;/li&gt;&lt;li&gt;使用&lt;i&gt;快照（snapshot）&lt;/i&gt;执行一致的备份（本文后面会进一步讨论）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;i&gt;LVM2&lt;/i&gt; 是一个新的用户空间工具集，它为 Linux 提供逻辑卷管理功能。它完全向后兼容原来的 LVM 工具集。在本文中，将介绍 LVM2 最有用的特性以及几种简化系统管理任务的方法。（随便说一句，如果您正在寻找关于 LVM 的基本指南，那么可以看看 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/linux/l-lvm2/#resources&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;参考资料&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 中列出的 LVM HowTo。）&lt;/p&gt;&lt;p&gt;我们来看看 LVM 的结构是什么样子的。&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;N10096&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;LVM 的结构&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;LVM 被组织为三种元素：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;卷（Volume）：&lt;i&gt;物理&lt;/i&gt; 和&lt;i&gt;逻辑卷&lt;/i&gt; 和&lt;i&gt;卷组&lt;/i&gt;&lt;/li&gt;&lt;li&gt;区段（Extent）：&lt;i&gt;物理&lt;/i&gt; 和&lt;i&gt;逻辑区段&lt;/i&gt;&lt;/li&gt;&lt;li&gt;设备映射器（Device mapper）：Linux 内核模块&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a name=&quot;N100BA&quot;&gt;&lt;b&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;卷&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Linux LVM 组织为物理卷（PV）、卷组（VG）和逻辑卷（LV）。&lt;i&gt;物理卷&lt;/i&gt; 是物理磁盘或物理磁盘分区（比如 /dev/hda 或 /dev/hdb1）。&lt;i&gt;卷组&lt;/i&gt; 是物理卷的集合。&lt;i&gt;卷组&lt;/i&gt; 可以在逻辑上划分成多个逻辑卷。&lt;/p&gt;&lt;p&gt;图 2 显示一个三个磁盘构成的布局。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;fig2&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;图 2. 物理到逻辑卷的映射&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;img alt=&quot;物理到逻辑卷的映射&quot; width=&quot;572&quot; height=&quot;113&quot; class=&quot;Image&quot; src=&quot;http://www.517sou.net/Attach/month_1007/figure2.gif&quot; /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;物理磁盘 0 上的所有四个分区（/dev/hda[1-4]）以及完整的物理磁盘 1（/dev/hdb）和物理磁盘 2（/dev/hdd）作为物理卷添加到卷组 VG0 中。&lt;/p&gt;&lt;p&gt;卷组是实现 &lt;i&gt;n-to-m&lt;/i&gt; 映射的关键（也就是，将 &lt;i&gt;n&lt;/i&gt; 个 PV 看作 &lt;i&gt;m&lt;/i&gt; 个 LV）。在将 PV 分配给卷组之后， 就可以创建任意大小的&lt;i&gt;逻辑卷&lt;/i&gt;（只要不超过 VG 的大小）。在图 2 的示例中，创建了一个称为 LV0 的卷组，并给其他 LV 留下了一些空间（这些空间也可以用来应付 LV0 以后的增长）。&lt;/p&gt;&lt;p&gt;LVM 中的逻辑卷就相当于物理磁盘分区；在实际使用中，它们&lt;i&gt;就是&lt;/i&gt; 物理磁盘分区。&lt;/p&gt;&lt;p&gt;在创建 LV 之后，可以使用任何文件系统对它进行格式化并将它挂载在某个挂载点上，然后就可以开始使用它了。图 3 显示一个经过格式化的逻辑卷 LV0 被挂载在 /var。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;fig3&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;图 3. 物理卷到文件系统的映射&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;img alt=&quot;物理卷到文件系统的映射&quot; width=&quot;572&quot; height=&quot;166&quot; class=&quot;Image&quot; src=&quot;http://www.517sou.net/Attach/month_1007/figure3.gif&quot; /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;N10108&quot;&gt;&lt;b&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;区段&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;为了实现 &lt;i&gt;n-to-m&lt;/i&gt; 物理到逻辑卷映射，PV 和 VG 的基本块必须具有相同的大小；这些基本块称为&lt;i&gt;物理区段（PE）&lt;/i&gt;和&lt;i&gt;逻辑区段（LE）&lt;/i&gt;。尽管 n 个物理卷映射到 m 个逻辑卷，但是 PE 和 LE 总是一对一映射的。&lt;/p&gt;&lt;p&gt;在使用 LVM2 时，对于每个 PV/LV 的最大区段数量并没有限制。默认的区段大小是 4MB，对于大多数配置不需要修改这个设置，因为区段的大小并不影响 I/O 性能。但是，区段数量太多会降低 LVM 工具的效率，所以可以使用比较大的区段，从而降低区段数量。但是注意，在一个 VG 中不能混用不同的区段大小，而且用 LVM 修改区段大小是一种不安全的操作，会破坏数据。所以建议在初始设置时选择一个区段大小，以后不再修改。&lt;/p&gt;&lt;p&gt;不同的区段大小意味着不同的 VG 粒度。例如，如果选择的区段大小是 4GB，那么只能以 4GB 的整数倍缩小或扩展 LV。&lt;/p&gt;&lt;p&gt;图 4 用 PE 和 LE 显示与前一个示例相同的布局（VG0 中的空闲空间也由空闲 LE 组成，尽管图中没有显示它们）。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;fig4&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;图 4. 物理到逻辑区段的映射&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;img alt=&quot;物理到逻辑区段的映射&quot; width=&quot;572&quot; height=&quot;202&quot; class=&quot;Image&quot; src=&quot;http://www.517sou.net/Attach/month_1007/figure4.gif&quot; /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;另外，请注意图 4 中的区段分配策略。LVM2 并非总是连续分配 PE；细节参见关于 lvm 的 Linux 手册页（见 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/linux/l-lvm2/#resources&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;参考资料&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 中的链接）。系统管理员可以设置不同的分配策略，但是一般不需要这么做，因为默认策略（名为&lt;i&gt;一般分配策略（normal allocation policy）&lt;/i&gt;）使用符合常规的规则，比如不把并行的条带放在同一物理卷上。&lt;/p&gt;&lt;p&gt;如果决定创建第二个 LV（LV1），那么最终的 PE 布局可能像图 5 这样。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;fig5&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;图 5. 物理到逻辑区段的映射&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;img alt=&quot;物理到逻辑区段的映射&quot; width=&quot;572&quot; height=&quot;240&quot; class=&quot;Image&quot; src=&quot;http://www.517sou.net/Attach/month_1007/figure5.gif&quot; /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;N1014E&quot;&gt;&lt;b&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;设备映射器&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;设备映射器（也称为 &lt;code&gt;dm_mod&lt;/code&gt;）是一个 Linux 内核模块（也可以是内置的），最早出现在 2.6.9 内核中。它的作用是对设备进行映射 —— LVM2 必须使用这个模块。&lt;/p&gt;&lt;p&gt;在大多数主流发行版中，设备映射器会被默认安装，常常会在引导时或者在安装或启用 LVM2/EVMS 包时自动装载（EVMS 是一种替代 LVM 的工具，更多信息见 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/linux/l-lvm2/#resources&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;参考资料&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;）。如果没有启用这个模块，那么对 &lt;code&gt;dm_mod&lt;/code&gt; 执行 &lt;code&gt;modprobe&lt;/code&gt; 命令，在发行版的文档中查找在引导时启用它的方法：&lt;code&gt;modprobe dm_mod&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;在创建 VG 和 LV 时， 可以给它们起一个有意义的名称（而不是像前面的示例那样使用 VG0、LV0 和 LV1 等名称）。设备映射器的作用就是将这些名称正确地映射到物理设备。对于前面的示例，设备映射器会在 /dev 文件系统中创建下面的设备节点：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;/dev/mapper/VG0-LV0 &lt;ul&gt;&lt;li&gt;/dev/VG0/LV0 是以上节点的链接&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;/dev/mapper/VG0-LV1 &lt;ul&gt;&lt;li&gt;/dev/VG0/LV1 是以上节点的链接&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;（注意名称的格式标准：/dev/{vg_name}/{lv_name} -&amp;gt; /dev/mapper/{vg_name}{lv_name}）。&lt;/p&gt;&lt;p&gt;与物理磁盘相反，无法直接访问卷组（这意味着没有 /dev/mapper/VG0 这样的文件，也不能执行 &lt;code&gt;dd if=/dev/VG0 of=dev/VG1&lt;/code&gt;）。常常使用 &lt;code&gt;lvm(8)&lt;/code&gt; 命令访问卷组。&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;N10194&quot;&gt;&lt;b&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;常见任务&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在使用 LVM2 时常常执行的任务包括系统检验（是否安装了 LVM2）以及创建、扩展和管理卷。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.ibm.com/i/v14/rules/blue_rule.gif&quot; width=&quot;100%&quot; height=&quot;1&quot; /&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; alt=&quot;&quot; src=&quot;http://www.ibm.com/i/c.gif&quot; width=&quot;8&quot; height=&quot;6&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;N1019D&quot;&gt;&lt;b&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;系统准备好运行 LVM2 了吗？&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;检查您的 Linux 发行版是否安装了 LVM2 软件包。如果还没有，就安装它（最好安装发行版附带的软件包）。&lt;/p&gt;&lt;p&gt;设备映射器模块必须在系统启动时装载。用 &lt;code&gt;lsmod | grep dm_mod&lt;/code&gt; 命令检查当前是否装载了这个模块。如果没有装载，那么可能需要安装并配置更多的软件包（文档会说明如何启用 LVM2）。&lt;/p&gt;&lt;p&gt;如果只是想测试一下（或者挽救某个系统），那么可以使用以下命令启动 LVM2：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing1&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 1. 启动 LVM2 的基本命令&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
#this should load the Device-mapper module
modprobe dm_mod
#this should find all the PVs in your physical disks
pvscan
#this should activete all the Volume Groups
vgchange -ay
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;如果打算将根文件系统放在一个 LVM LV 中，那么还要注意 initial-ramdisk 映像。同样，发行版常常会负责处理这个问题 —— 在安装 LVM2 包时，它们常常会重新构建或更新 initrd 映像，在其中添加适当的内核模块和启动脚本。但是，可能需要查看发行版的文档，确保系统支持 LVM2 根文件系统。&lt;/p&gt;&lt;p&gt;注意，通常只有当探测到根文件系统在一个 VG 中时，initial-ramdisk 映像才会启用 LVM。这种探测常常是通过分析 &lt;code&gt;root=&lt;/code&gt; 内核参数执行的。不同的发行版以不同的方式判断根文件系统是否在卷组中。细节参见发行版的文档。如果不确定的话，就需要检查 initrd 或 initramdisk 的配置。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.ibm.com/i/v14/rules/blue_rule.gif&quot; width=&quot;100%&quot; height=&quot;1&quot; /&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; alt=&quot;&quot; src=&quot;http://www.ibm.com/i/c.gif&quot; width=&quot;8&quot; height=&quot;6&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class=&quot;no-print&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; align=&quot;right&quot;&gt;&lt;tbody&gt;&lt;tr align=&quot;right&quot;&gt;&lt;td&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.ibm.com/i/c.gif&quot; width=&quot;100%&quot; height=&quot;4&quot; /&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;a name=&quot;N101C4&quot;&gt;&lt;b&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;创建新的卷&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;使用您喜欢的分区工具（比如 fdisk、parted 或 gparted），创建一个供 LVM 使用的新分区。尽管 LVM 支持在整个磁盘上使用 LVM，但是&lt;i&gt;不&lt;/i&gt; 建议这么做：其他操作系统可能认为这个磁盘&lt;i&gt;没有初始化&lt;/i&gt;，可能会破坏它！更好的方法是创建一个覆盖整个磁盘的分区。&lt;/p&gt;&lt;p&gt;大多数分区工具常常默认使用分区 ID 0x83（或 Linux）来创建新分区。可以使用这个默认 ID，但是为了便于组织，最好将它改为 0x8e（或 Linux LVM）。&lt;/p&gt;&lt;p&gt;在创建分区之后，应该会在分区表中看到一个（或多个）Linux LVM 分区：&lt;/p&gt;&lt;p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
root@klausk:/tmp/a# fdisk -l
Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1        1623    13036716    7  HPFS/NTFS
/dev/hda2            1624        2103     3855600   8e  Linux LVM
/dev/hda3            2104        2740     5116702+  83  Linux
/dev/hda4            3000        9729    54058725    5  Extended
/dev/hda5            9569        9729     1293232+  82  Linux swap / Solaris
/dev/hda6            3000        4274    10241374+  83  Linux
/dev/hda7            4275        5549    10241406   83  Linux
/dev/hda8            5550        6824    10241406   83  Linux
/dev/hda9            6825        8099    10241406   83  Linux
/dev/hda10           8100        9568    11799711   8e  Linux LVM
Partition table entries are not in disk order
root@klausk:/tmp/a#
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;现在用 &lt;code&gt;pvcreate&lt;/code&gt; 对每个分区进行初始化：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing2&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 2. 分区初始化&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
root@klausk:/tmp/a# pvcreate /dev/hda2 /dev/hda10
  Physical volume &amp;quot;/dev/hda2&amp;quot; successfully created
  Physical volume &amp;quot;/dev/hda10&amp;quot; successfully created
root@klausk:/tmp/a#
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在一个步骤中同时创建 PV 和 VG：&lt;code&gt;vgcreate&lt;/code&gt;：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing3&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 3. 创建 PV 和 VG&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
root@klausk:~# vgcreate test-volume /dev/hda2 /dev/hda10
  Volume group &amp;quot;test-volume&amp;quot; successfully created
root@klausk:~#
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;上面的命令创建一个称为 &lt;i&gt;test-volume&lt;/i&gt; 的逻辑卷，它使用 /dev/hda2 和 /dev/hda10 作为最初的 PV。&lt;/p&gt;&lt;p&gt;在创建 VG test-volume 之后，使用 &lt;code&gt;vgdisplay&lt;/code&gt; 命令查看刚创建的 VG 的基本信息：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing4&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 4. 查看刚创建的 VG 的基本信息&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
root@klausk:/dev# vgdisplay -v test-volume
    Using volume group(s) on command line
    Finding volume group &amp;quot;test-volume&amp;quot;
  --- Volume group ---
  VG Name               test-volume
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               14.93 GB
  PE Size               4.00 MB
  Total PE              3821
  Alloc PE / Size       0 / 0   
  Free  PE / Size       3821 / 14.93 GB
  VG UUID               lk8oco-ndQA-yIMZ-ZWhu-LtYX-T2D7-7sGKaV
   
  --- Physical volumes ---
  PV Name               /dev/hda2     
  PV UUID               8LTWlw-p1OJ-dF6w-ZfMI-PCuo-8CiU-CT4Oc6
  PV Status             allocatable
  Total PE / Free PE    941 / 941
   
  PV Name               /dev/hda10     
  PV UUID               vC9Lwb-wvgU-UZnF-0YcE-KMBb-rCmU-x1G3hw
  PV Status             allocatable
  Total PE / Free PE    2880 / 2880
   
root@klausk:/dev# 
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在清单 4 中，可以看到有两个 PV 被分配给这个 VG，总大小为 14.93GB，有 3,821 个 4MB 的 PE，这些 PE 都是空闲的！&lt;/p&gt;&lt;p&gt;既然卷组已经准备好了，就可以像使用磁盘一样用它创建分区（LV）、删除分区和重新设置分区大小 —— 注意，卷组是一个抽象实体，只有 LVM 工具集能够看到它们。使用 &lt;code&gt;lvcreate&lt;/code&gt; 创建一个新的逻辑卷：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing5&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 5. 创建新的逻辑卷（分区）&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
root@klausk:/# lvcreate -L 5G -n data test-volume
  Logical volume &amp;quot;data&amp;quot; created
root@klausk:/#
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;清单 5 创建一个名为 &lt;i&gt;data&lt;/i&gt; 的 5GB LV。创建这个 LV 之后，可以检查它的设备节点：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing6&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 6. 检查 LV 的设备节点&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
root@klausk:/# ls -l /dev/mapper/test--volume-data 
brw-rw---- 1 root disk 253, 4 2006-11-28 17:48 /dev/mapper/test--volume-data
root@klausk:/# ls -l /dev/test-volume/data 
lrwxrwxrwx 1 root root 29 2006-11-28 17:48 /dev/test-volume/data -&amp;gt; 
/dev/mapper/test--volume-data
root@klausk:/# 
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;还可以用 &lt;code&gt;lvdisplay&lt;/code&gt; 命令查看 LV 的属性：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing7&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 7. 查看 LV 的属性&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
root@klausk:~# lvdisplay /dev/test-volume/data 
  --- Logical volume ---
  LV Name                /dev/test-volume/data
  VG Name                test-volume
  LV UUID                FZK4le-RzHx-VfLz-tLjK-0xXH-mOML-lfucOH
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                5.00 GB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           253:4
   
root@klausk:~#
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在这里可以看到，在实际使用时 LV 的名称/路径是 /dev/{VG_name}/{LV_name}，比如 /dev/test-volume/data。除了用作 /dev/{VG_name}/{LV_name} 链接的目标之外，不应该在其他地方使用 /dev/mapper/{VG_name}-{LV_name} 文件。大多数 LVM 命令要求以 /dev/{vg-name}/{lv-name} 格式指定操作的目标。&lt;/p&gt;&lt;p&gt;建立逻辑卷之后，可以使用任何文件系统对它进行格式化，然后将它挂载在某个挂载点上：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing8&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 8. 挂载 LV&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
root@klausk:~# mkfs.reiserfs /dev/test-volume/data 
root@klausk:~# mkdir /data
root@klausk:~# mount -t reiserfs /dev/test-volume/data /data/
root@klausk:~# df -h /data
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/test--volume-data
                      5.0G   33M  5.0G   1% /data
root@klausk:~# 
      &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;还可以编辑 &lt;code&gt;fstab(5)&lt;/code&gt; 文件，从而在引导时自动挂载这个文件系统：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing9&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 9. 自动挂载 LV&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
#mount Logical Volume &apos;data&apos; under /data
/dev/test-volume/data   /data   reiserfs        defaults        0 2
 &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在实际使用中，逻辑卷的表现就像一个块设备，比如可以将它用作数据库的原始分区。实际上，如果希望对数据库执行一致的备份，那么使用 LVM 快照是标准的最佳实践。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.ibm.com/i/v14/rules/blue_rule.gif&quot; width=&quot;100%&quot; height=&quot;1&quot; /&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; alt=&quot;&quot; src=&quot;http://www.ibm.com/i/c.gif&quot; width=&quot;8&quot; height=&quot;6&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;a name=&quot;N10270&quot;&gt;&lt;b&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;扩展卷&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;扩展卷是非常容易的。如果卷组中有足够的空闲空间，那么只需使用 &lt;code&gt;lvextend&lt;/code&gt; 来扩展卷，不需要卸载它。然后，还要扩展逻辑卷中的文件系统（请记住，它们是两回事儿）。根据所用文件系统的不同，也可以进行在线扩展（即在挂载状态下进行扩展）。&lt;/p&gt;&lt;p&gt;如果 VG 中没有足够的空间，那么首先需要添加更多的物理磁盘。步骤如下：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;使用一个物理磁盘创建一个分区。建议将分区类型改为 0x8e（Linux LVM），这样便于识别 LVM 分区/磁盘。使用 &lt;code&gt;pvcreate&lt;/code&gt; 对物理磁盘进行初始化：&lt;code&gt;pvcreate /dev/hda3&lt;/code&gt;。&lt;/li&gt;&lt;li&gt;然后，使用 &lt;code&gt;vgextend&lt;/code&gt; 将它添加到现有的 VG 中：&lt;code&gt;vgextend test-volume /dev/hda2&lt;/code&gt;。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;还可以同时创建或添加多个物理磁盘：&lt;/p&gt;&lt;p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
pvcreate /dev/hda2 /dev/hda3 /dev/hda5
vgextend test-volume /dev/hda2 /dev/hda3 /dev/hda5
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;添加了 PV 之后，就有了足以扩展逻辑卷的空间，就可以使用 &lt;code&gt;lvextend&lt;/code&gt; 扩展逻辑卷了：&lt;code&gt;lvextend -L 8G /dev/test-volume/data&lt;/code&gt;。这个命令将 /dev/test-volume/data LV 的大小扩展到 8GB。&lt;/p&gt;&lt;p&gt;&lt;code&gt;lvextend&lt;/code&gt; 有一些有用的参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;如果希望让 LV 增加 5GB，那么可以使用 &lt;code&gt;-L +5G&lt;/code&gt;。&lt;/li&gt;&lt;li&gt;可以指定扩展部分的位置（也就是，用哪些 PV 提供新的空间）；只需将希望使用的 PV 附加在命令后面。&lt;/li&gt;&lt;li&gt;还可以以 PE 为单位指定绝对/相对扩展大小。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;细节参见 &lt;code&gt;lvextend(8)&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;在扩展 LV 之后，不要忘记扩展文件系统（这样才能实际使用增加的空间）。根据文件系统类型，这个操作可以在文件系统挂载状态下在线执行。&lt;/p&gt;&lt;p&gt;清单 10 是一个用 &lt;code&gt;resize_reiserfs&lt;/code&gt; 重新设置 LV 大小的示例（随便说一句，可以在挂载的文件系统上使用这个命令）：&lt;code&gt;resize_reiserfs /dev/test-volume/data&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.ibm.com/i/v14/rules/blue_rule.gif&quot; width=&quot;100%&quot; height=&quot;1&quot; /&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; alt=&quot;&quot; src=&quot;http://www.ibm.com/i/c.gif&quot; width=&quot;8&quot; height=&quot;6&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;a name=&quot;N102D8&quot;&gt;&lt;b&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;管理卷&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;为了管理卷，需要知道如何减小 LV 和删除 PV。&lt;/p&gt;&lt;p&gt;&lt;b&gt;减小逻辑卷&lt;/b&gt;&lt;br /&gt;可以按照扩展 LV 的方式使用 &lt;code&gt;lvreduce&lt;/code&gt; 命令减小 LV。从 LVM 的角度来说，这个操作可以在卷在线的情况下执行；但是，大多数文件系统不支持缩小在线文件系统。清单 10 给出这个过程的示例：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing10&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 10. 减小 LV&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
#unmount LV
umount /path/to/mounted-volume
#shrink filesystem to 4G
resize_reiserfs -s 4G /dev/test-volume/data
#reduce LV
lvreduce -L 4G /dev/vg00/test
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;请注意大小和单位：文件系统不应该比 LV 大！&lt;/p&gt;&lt;p&gt;&lt;b&gt;删除物理卷&lt;/b&gt;&lt;br /&gt;假设出现了以下情况：一个卷组包含两个 80GB 的磁盘，希望将它们替换为 160GB 的磁盘。在使用 LVM 时，可以按照添加 PV 的方式从 VG 中删除 PV（即在在线情况下执行删除）。但是注意，不能删除 LV 中正在使用的 PV。对于这些情况，可以使用 &lt;code&gt;pvmove&lt;/code&gt;，它可以释放在线的 PV，这样就可以轻松地替换它们。在热交换环境中，甚至可以交换所有磁盘，而根本不需要停机！&lt;/p&gt;&lt;p&gt;&lt;code&gt;pvmove&lt;/code&gt; 的惟一要求是，VG 中连续空闲区段的数量必须等于要从 PV 中删除的区段数量。没有直接判断连续空闲 PE 的最大数量的简便方法，但是可以使用 &lt;code&gt;pvdisplay -m&lt;/code&gt; 显示 PV 分配图：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing11&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 11. 显示 PV 分配图&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
#shows the allocation map
pvdisplay -m
  --- Physical volume ---
  PV Name               /dev/hda6
  VG Name               test-volume
  PV Size               4.91 GB / not usable 1.34 MB
  Allocatable           yes (but full)
  PE Size (KByte)       4096
  Total PE              1200
  Free PE               0
  Allocated PE          1200
  PV UUID               BA99ay-tOcn-Atmd-LTCZ-2KQr-b4Z0-CJ0FjO
  --- Physical Segments ---
  Physical extent 0 to 2367:
    Logical volume      /dev/test-volume/data
    Logical extents     5692 to 8059
  Physical extent 2368 to 2499:
    Logical volume      /dev/test-volume/data
    Logical extents     5560 to 5691
  --- Physical volume ---
  PV Name               /dev/hda7
  VG Name               test-volume
  PV Size               9.77 GB / not usable 1.37 MB
  Allocatable           yes
  PE Size (KByte)       4096
  Total PE              2500
  Free PE               1220
  Allocated PE          1280
  PV UUID               Es9jwb-IjiL-jtd5-TgBx-XSxK-Xshj-Wxnjni
  --- Physical Segments ---
  Physical extent 0 to 1279:
    Logical volume      /dev/test-volume/LV0
    Logical extents     0 to 1279
  Physical extent 1280 to 2499:
    FREE
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;清单 11 显示有 2,499-1,280 = 1,219 个连续空闲区段，这表示最多能够将 1,219 个区段从另一个 PV 转移到 /dev/hda7。&lt;/p&gt;&lt;p&gt;如果希望释放一个 PV 以便进行替换，那么最好禁止它的分配，这样就可以在从卷组中删除它之前确保它一直是空闲的。在转移数据&lt;i&gt;之前&lt;/i&gt;，执行以下命令：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing12&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 12. 在释放之前禁止 PV 的分配&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
#Disable /dev/hda6 allocation
pvchange -xn /dev/hda6
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;释放之后，PV /dev/hda6 的大小为 1,200 个区段，没有空闲区段了。使用以下命令将数据转移出这个 PV：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing13&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 13. 从释放的 PV 移出数据&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
#Move allocated extents out of /dev/hda6
pvmove -i 10 /dev/hda6
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;清单 13 中的 &lt;code&gt;-i 10&lt;/code&gt; 参数指示 &lt;code&gt;pvmove&lt;/code&gt; 每 10 秒报告一次状态。根据要转移的数据量，这个操作可能要花费几分钟（甚至几小时）。还可以使用 &lt;code&gt;-b&lt;/code&gt; 参数将这个操作转到后台执行。在后台执行的情况下，状态报告会发送到系统日志。&lt;/p&gt;&lt;p&gt;如果没有足以进行 &lt;code&gt;pvmove&lt;/code&gt; 操作的连续空闲区段，那么可以在 VG 中&lt;i&gt;添加&lt;/i&gt; 一个或多个磁盘/分区，从而形成 &lt;code&gt;pvmove&lt;/code&gt; 所需的连续空间。&lt;/p&gt;&lt;p&gt;&lt;b&gt;其他有用的 LVM 操作&lt;/b&gt;&lt;br /&gt;关于下面这些 LVM 操作的细节，请查阅手册页：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;pvresize&lt;/code&gt;：如果底层分区也已经扩展了，那么可以用这个操作扩展 PV；如果分配图允许的话，它也可以缩小 PV。&lt;/li&gt;&lt;li&gt;&lt;code&gt;pvremove&lt;/code&gt;：销毁 PV（清空它的元数据）。只有在用 &lt;code&gt;vgreduce&lt;/code&gt; 从 VG 中删除 PV &lt;i&gt;之后&lt;/i&gt;，才能使用这个操作。&lt;/li&gt;&lt;li&gt;&lt;code&gt;vgreduce&lt;/code&gt;：从卷组中删除未分配的 PV，这会减小 VG。&lt;/li&gt;&lt;li&gt;&lt;code&gt;vgmerge&lt;/code&gt;：将两个 VG 合并成一个。目标 VG 可以是在线的！&lt;/li&gt;&lt;li&gt;&lt;code&gt;vgsplit&lt;/code&gt;：分割一个卷组。&lt;/li&gt;&lt;li&gt;&lt;code&gt;vgchange&lt;/code&gt;：修改一个 VG 的属性和权限。&lt;/li&gt;&lt;li&gt;&lt;code&gt;lvchange&lt;/code&gt;：修改一个 LV 的属性和权限。&lt;/li&gt;&lt;li&gt;&lt;code&gt;lvconvert&lt;/code&gt;：在线性卷和镜像或快照之间进行转换。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.ibm.com/i/v14/rules/blue_rule.gif&quot; width=&quot;100%&quot; height=&quot;1&quot; /&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; alt=&quot;&quot; src=&quot;http://www.ibm.com/i/c.gif&quot; width=&quot;8&quot; height=&quot;6&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;a name=&quot;N103A2&quot;&gt;&lt;b&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;用快照执行备份&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;如果在备份过程期间数据没有发生变化，那么就能够获得一致的备份。如果不在备份期间停止系统，就很难保证数据没有变化。&lt;/p&gt;&lt;p&gt;Linux LVM 实现了一种称为&lt;i&gt;快照（Snapshot）&lt;/i&gt;的特性，它的作用就像是 “拍摄” 逻辑卷在某一时刻的照片。通过使用快照， 可以获得同一 LV 的两个拷贝 —— 一个可以用于备份，另一个继续用于日常操作。&lt;/p&gt;&lt;p&gt;快照有两大优点：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;快照的创建非常快，不需要停止生产环境。&lt;/li&gt;&lt;li&gt;建立两个拷贝，但是它们的大小并不一样。快照使用的空间仅仅是存储两个 LV 之间的差异所需的空间。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;快照由一个&lt;i&gt;例外列表（exception list）&lt;/i&gt;来实现，每当 LV 之间出现差异时就会更新这个列表（正式的说法是 &lt;i&gt;CoW，Copy-on-Write&lt;/i&gt;）。&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;N103C6&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;创建新的快照&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;创建新的快照 LV 也是使用 &lt;code&gt;lvcreate&lt;/code&gt; 命令，但是要指定 &lt;code&gt;-s&lt;/code&gt; 参数和&lt;i&gt;原来的&lt;/i&gt; LV。在这种情况下，&lt;code&gt;-L size&lt;/code&gt; 指定例外列表的大小，这影响快照支持的最大差异量，如果差异超过这个量，就无法保持一致性。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing14&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 14. 建立快照&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
#create a Snapshot LV called &apos;snap&apos; from origin LV &apos;test&apos;
lvcreate -s -L 2G -n snap/dev/test-volume/test
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;可以使用 &lt;code&gt;lvdisplay&lt;/code&gt; 查询特殊信息，比如 CoW 的大小和使用情况：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing15&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 15. CoW 的大小和使用情况&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
lvdisplay /dev/vg00/snap
  --- Logical volume ---
  LV Name                /dev/vg00/snap
  VG Name                vg00
  LV UUID                QHVJYh-PR3s-A4SG-s4Aa-MyWN-Ra7a-HL47KL
  LV Write Access        read/write
  LV snapshot status     active destination for /dev/vg00/test
  LV Status              available
  # open                 0
  LV Size                4.00 GB
  Current LE             1024
  COW-table size         2.00 GB
  COW-table LE           512
  Allocated to snapshot  54.16%
  Snapshot chunk size    8.00 KB
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           254:5
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;清单 15 表明这个 CoW 的大小为 2GB，其中的 54.16 % 已经使用了。&lt;/p&gt;&lt;p&gt;对于所有日常操作，快照看起来&lt;i&gt;就是&lt;/i&gt; 原 LV 的一个拷贝。如果已经建立了文件系统的话，可以用以下命令挂载它：&lt;/p&gt;&lt;p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
#mount snapshot volume
mount -o ro /dev/test-volume/test /mnt/snap
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;在这个命令中，&lt;code&gt;ro&lt;/code&gt; 标志表示将它挂载为只读的。可以在 &lt;code&gt;lvcreate&lt;/code&gt; 命令后面加上 &lt;code&gt;-p r&lt;/code&gt;，这样就在 LVM 级将它设置为只读的。&lt;/p&gt;&lt;p&gt;挂载文件系统之后，就可以用 &lt;code&gt;tar&lt;/code&gt;、&lt;code&gt;rsync&lt;/code&gt; 或其他备份工具执行备份。如果 LV 不包含文件系统，或者需要原始备份，那么也可以在这个设备节点上直接使用 &lt;code&gt;dd&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;复制过程完成之后，就不需要快照了，这时只需用 &lt;code&gt;lvremove&lt;/code&gt; 卸载并销毁它：&lt;/p&gt;&lt;p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
#remove snapshot
lvremove /dev/test-volume/snap
 &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;如果数据库建立在 LV 上，并且需要一个一致的备份，那么一定要刷新表并在获得读取锁（read-lock）的情况下建立快照卷（见下面的伪代码）：&lt;/p&gt;&lt;p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
SQL&amp;gt; flush tables read lock
{create Snapshot}
SQL&amp;gt; release read lock
{start copy process from the snapshot LV}
 &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;N10439&quot;&gt;&lt;b&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;备份脚本示例&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;清单 16 中的脚本直接取自我的笔记本电脑，我在这个脚本中使用 &lt;code&gt;rsync&lt;/code&gt; 向一台远程服务器执行每日备份。这个脚本并不适合企业环境；在企业环境中，带历史记录的增量备份更合适，但概念是相同的。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;listing16&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;清单 16. 简单的备份脚本示例&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
                
#!/bin/sh
# we need the dm-snapshot module
modprobe dm-snapshot
if [ -e /dev/vg00/home-snap ]
then
  # remove left-overs, if any
  umount -f /mnt/home-snap &amp;amp;&amp;amp; true
  lvremove -f /dev/vg00/home-snap
fi
# create snapshot, 1GB CoW space
# that should be sufficient for accommodating changes during copy
lvcreate -vs -p r -n home-snap -L 1G /dev/vg00/home
mkdir -p /mnt/home-snap
# mount recently-created snapshot as read-only
mount -o ro /dev/vg00/home-snap /mnt/home-snap
# magical rsync command__rsync -avhzPCi --delete -e &amp;quot;ssh -i /home/klausk/.ssh/id_rsa&amp;quot; \
      --filter &apos;- .Trash/&apos; --filter &apos;- *~&apos; \
      --filter &apos;- .local/share/Trash/&apos; \
      --filter &apos;- *.mp3&apos; --filter &apos;- *Cache*&apos; --filter &apos;- *cache*&apos; \
      /mnt/home-snap/klausk klausk2@pokgsa.ibm.comThis e-mail address is being protected 
      from spam bots, you need JavaScript enabled to view it :bkp/
# unmount and scrap snapshot LV
umount /mnt/home-snap
lvremove -f /dev/vg00/home-snap
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在某些特殊情况下，无法估计备份周期或者复制过程很长，那么脚本可以用 &lt;code&gt;lvdisplay&lt;/code&gt; 查询 Snapshot CoW 的使用情况并根据需要扩展这个 LV。在极端情况下， 可以让快照与原 LV 同样大 —— 这样就不需要执行查询，因为变化量不会比整个卷更大！&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.ibm.com/i/v14/rules/blue_rule.gif&quot; width=&quot;100%&quot; height=&quot;1&quot; /&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; alt=&quot;&quot; src=&quot;http://www.ibm.com/i/c.gif&quot; width=&quot;8&quot; height=&quot;6&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class=&quot;no-print&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; align=&quot;right&quot;&gt;&lt;tbody&gt;&lt;tr align=&quot;right&quot;&gt;&lt;td&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.ibm.com/i/c.gif&quot; width=&quot;100%&quot; height=&quot;4&quot; /&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;N10457&quot;&gt;&lt;b&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;其他 LVM2 系统管理技巧&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;最后， 我要介绍一些可以用 LVM2 执行的系统管理任务，包括按需虚拟化、用镜像提高容错能力以及透明地对块设备执行加密。&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;N10460&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;快照和虚拟化&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在使用 LVM2 时，快照可以不是只读的。这意味着，在创建快照之后， 可以像常规块设备一样挂载和读写快照。&lt;/p&gt;&lt;p&gt;因为流行的虚拟化系统（比如 Xen、VMWare、Qemu 和 KVM）可以将块设备用作 guest 映像，所以可以创建这些映像的完整拷贝，并根据需要使用它们，它们就像是内存占用量很低的虚拟机。这样做的好处是部署迅速（创建快照的时间常常不超过几秒）和节省空间（guest 共享原映像的大多数数据）。&lt;/p&gt;&lt;p&gt;设置的步骤如下：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;为原映像创建一个逻辑卷。&lt;/li&gt;&lt;li&gt;使用这个 LV 作为磁盘映像安装 guest 虚拟机。&lt;/li&gt;&lt;li&gt;暂停这个虚拟机。内存映像可以是一个常规文件，所有其他快照都放在里面。&lt;/li&gt;&lt;li&gt;为原 LV 创建一个可读写的快照。&lt;/li&gt;&lt;li&gt;使用快照卷作为磁盘映像生成一个新的虚拟机。如果需要的话，要修改网络/控制台设置。&lt;/li&gt;&lt;li&gt;登录已经创建的虚拟机，修改网络设置/主机名。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;完成这些步骤之后， 就可以让用户访问刚创建的虚拟机了。如果需要另一个虚拟机，那么只需重复步骤 4 到 6（所以不需要重新安装虚拟机）。还可以用一个脚本自动执行这些步骤。&lt;/p&gt;&lt;p&gt;在使用完虚拟机之后， 可以停止虚拟机并销毁快照。&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;N1048A&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;更好的容错能力&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;最近的 LVM2 开发成果为逻辑卷提供了高可用性。逻辑卷可以有两个或更多的镜像，镜像可以放在不同的物理卷（或不同的设备）上。当在设备上发现 I/O 错误时，可以使用 &lt;code&gt;dmeventd&lt;/code&gt; 让一个 PV 离线，而不会影响服务。更多信息请参考 &lt;code&gt;lvcreate(8)&lt;/code&gt;、&lt;code&gt;lvconvert(8)&lt;/code&gt; 和 &lt;code&gt;lvchange(8)&lt;/code&gt; 手册页。&lt;/p&gt;&lt;p&gt;如果硬件能够支持的话，可以用 &lt;code&gt;dm_multipath&lt;/code&gt; 通过不同的通道访问同一设备，这样的话在一个通道发生故障时，可以转移到另一个通道。更多细节请参考 &lt;code&gt;dm_multipath&lt;/code&gt; 和 &lt;code&gt;multipathd&lt;/code&gt; 的文档。&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;N104B2&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;透明的设备加密&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;可以用 &lt;code&gt;dm_crypt&lt;/code&gt; 对块设备或逻辑卷执行透明的加密。更多信息请参考 &lt;code&gt;dm_crypt&lt;/code&gt; 的文档和 &lt;code&gt;cryptsetup(8)&lt;/code&gt; 手册页。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;resources&quot;&gt;&lt;b&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;参考资料&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;学习&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://sourceware.org/lvm2/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;LVM2 Resource Page&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 提供与 LVM2 相关的压缩文件、邮件列表、源代码、文档和聊天频道的链接。 &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://tldp.org/HOWTO/LVM-HOWTO/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;LVM HowTo&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 提供一份比较基础的 LVM 指南。 &lt;br /&gt;&lt;/li&gt;&lt;li&gt;在 &lt;a href=&quot;http://linux.die.net/man/8/lvm&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;LVM2 工具的 Linux 手册页&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 上可以找到更多细节。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;“&lt;a href=&quot;http://www.ibm.com/developerworks/linux/linux390/perf/tuning_rec_dasd_volMan.html?S_TACT=105AGX52&amp;amp;S_CMP=cn-a-l&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Linux on System z: Volume management recommendations&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;”（developerWorks，2005 年 10 月）讨论了 2.6 内核的 LVM2 方案以及 Enterprise Volume Management System（EVMS）。 &lt;br /&gt;&lt;/li&gt;&lt;li&gt;“&lt;a href=&quot;http://www.ibm.com/developerworks/linux/linux390/perf/tuning_how_dasd_volMan.html?S_TACT=105AGX52&amp;amp;S_CMP=cn-a-l&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Linux on System z: Volume management with LVM&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;”（developerWorks，2005 年 10 月）描述了在 System z 上为 Linux 定义条带状 DASD 集的基本步骤。 &lt;br /&gt;&lt;/li&gt;&lt;li&gt;“&lt;a href=&quot;http://www.ibm.com/developerworks/cn/linux/filesystem/lvm/lvm-1/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;通用线程: 学习 Linux LVM，第 1 部分&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;”（developerWorks，2001 年 3 月）和 “&lt;a href=&quot;http://www.ibm.com/developerworks/cn/linux/filesystem/lvm/lvm-2/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;通用线程：学习 Linux LVM，第 2部分&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;（developerWorks，2001 年 4 月）讨论了早期的 LVM。 &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.tldp.org/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Linux Documentation Project&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 提供许多有用的文档，尤其是它的 HOWTO。 &lt;br /&gt;&lt;/li&gt;&lt;li&gt;在 &lt;a onmouseover=&quot;linkQueryAppend(this)&quot; href=&quot;http://www.ibm.com/developerworks/cn/linux/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;developerWorks Linux 专区&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 中可以找到为 Linux 开发人员准备的更多参考资料。 &lt;br /&gt;&lt;/li&gt;&lt;li&gt;查阅 developerWorks 上的所有 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/views/linux/articles.jsp?view_by=search&amp;amp;search_by=linux+%E6%8A%80%E5%B7%A7&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Linux 技巧&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 和 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/views/linux/tutorials.jsp&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Linux 教程&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;。 &lt;br /&gt;&lt;/li&gt;&lt;li&gt;随时关注 &lt;a onmouseover=&quot;linkQueryAppend(this)&quot; href=&quot;http://www.ibm.com/developerworks/offers/techbriefings/?S_TACT=105AGX52&amp;amp;S_CMP=cn-a-l&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;developerWorks 技术活动和网络广播&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;。 &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a name=&quot;author&quot;&gt;&lt;b&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;关于作者&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan=&quot;3&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.ibm.com/i/c.gif&quot; width=&quot;100%&quot; height=&quot;5&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign=&quot;top&quot; align=&quot;left&quot;&gt;&lt;td&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.ibm.com/i/c.gif&quot; width=&quot;4&quot; height=&quot;5&quot; /&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;p&gt;Klaus Heinrich Kiwi 于 2004 年从 Unicamp 毕业，获得计算机工程学位，之后一直从事 UNIX 环境中的系统开发和网络管理部署。从 2006 年开始，他在 IBM Linux Technology Center 的 Security Development 团队中担任软件工程师。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;出处：&lt;a href=&quot;http://www.ibm.com/developerworks/cn/linux/l-lvm2/&quot; target=&quot;_blank&quot;&gt;http://www.ibm.com/developerworks/cn/linux/l-lvm2/&lt;/a&gt;&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/logical-volume-management.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/476/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/logical-volume-management.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/476/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/dell-server-cd-boot-and-driver-loading.aspx</link>
		<title>DELL服务器光盘引导及驱动加载</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Wed, 14 Jul 2010 02:12:55 GMT</pubDate>
		<description>&lt;p&gt;刻录注意选择从光盘镜像到光盘的模式刻录，不要刻录成数据光盘了。&lt;br /&gt;另外注意几个方法的注意事项：&lt;/p&gt;&lt;p&gt;方法一：DELL引导光盘引导安装&lt;br /&gt;注意：采用DOSA光盘引导和安装服务器系统，将使您服务器硬盘上的所有数据丢失，因此此方法仅供全新的服务器和确认数据有备份前提下的服务器安装&lt;br /&gt;要求windows2003&amp;nbsp;SP2单一版本或windows2000&amp;nbsp;SP4（9GIII代以后的机器不支持windows2000）。&lt;br /&gt;具体方法链接：DOSA6.X&amp;nbsp;&lt;a href=&quot;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=265300&amp;amp;msg=1121977&amp;amp;hl=#1121977&amp;nbsp;&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=265300&amp;amp;msg=1121977&amp;amp;hl=#1121977&amp;nbsp;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DOSA5.4/5.5&amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=162508&amp;nbsp;&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=162508&amp;nbsp;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DOSA5.3/5.2/5.1/5.0&amp;nbsp;&lt;a href=&quot;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=162548&amp;amp;type=email_tool&amp;nbsp;&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=162548&amp;amp;type=email_tool&amp;nbsp;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DOSA4.X&amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=23709&amp;amp;type=server&amp;nbsp;&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=23709&amp;amp;type=server&amp;nbsp;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;;&lt;br /&gt;一般情况会自动将DELL设备安装好驱动。&lt;/p&gt;&lt;p&gt;方法二：软盘加载硬盘控制卡驱动&lt;br /&gt;注意：确认软驱能正常使用，软盘一定要完全格式化（取消快速格式化）确认没有坏道，驱动程序要解压缩到软盘根目录。&lt;br /&gt;8G以后的机器要求windows2003&amp;nbsp;SP2单一版本或windows2000&amp;nbsp;SP4（9GIII代以后的机器不支持windows2000）&lt;br /&gt;具体方法链接参考：&lt;br /&gt;windows2003：&amp;nbsp;&lt;a href=&quot;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=19553&amp;amp;type=email_tool&amp;nbsp;&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=19553&amp;amp;type=email_tool&amp;nbsp;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;;（不同机型方法一样）&lt;br /&gt;Widnwos2000:&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=20503&amp;amp;type=email_tool&amp;nbsp;&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=20503&amp;amp;type=email_tool&amp;nbsp;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;;（不同机型方法一样）&lt;br /&gt;安装完成后可能需要加载的驱动见邮件后面链接。&lt;/p&gt;&lt;p&gt;方法三：U盘加载硬盘控制卡驱动&lt;br /&gt;注意：U盘方法存在少量的兼容性问题，如果有兼容性问题，建议其他品牌的U盘测试（测试kingston各个容量都是没有问题的）。其他注意事项请仔细阅读链接文档中的详细描述.&amp;nbsp;只适用于windows2003&lt;br /&gt;分区格式化完成后,准备拷贝光盘文件时候,如果再次提示插入软盘，按照下面说明操作&lt;br /&gt;安装时，有两种情况：一：需要按F6,并且按三次&amp;nbsp;S&amp;nbsp;及&amp;nbsp;回车确认.直到看到S=Use&amp;nbsp;the&amp;nbsp;driver&amp;nbsp;on&amp;nbsp;floppy&amp;nbsp;按S&amp;nbsp;才是确认加载.&lt;br /&gt;情况二：不需要按F6.&amp;nbsp;只需要插上U盘,正常安装.会自动加载U盘中的驱动.（如果遇到情况一的情况不能继续，可以尝试情况二）。&lt;/p&gt;&lt;p&gt;具体方法链接：&lt;a href=&quot;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=229817&amp;amp;msg=1010132&amp;amp;hl=#1010132&amp;nbsp;&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=229817&amp;amp;msg=1010132&amp;amp;hl=#1010132&amp;nbsp;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;;&lt;br /&gt;安装完成后可能需要加载的驱动见邮件后面链接。&lt;/p&gt;&lt;p&gt;方法四：3M&amp;nbsp;ISO光盘加载硬盘控制卡驱动&lt;br /&gt;要求IDE接口的光驱，SATA光驱和USB光驱不适用。只适用于要求windows2003&amp;nbsp;SP2单一版本。&lt;br /&gt;具体方法链接:&amp;nbsp;&lt;a href=&quot;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=163999&amp;amp;type=email_tool&amp;nbsp;&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=163999&amp;amp;type=email_tool&amp;nbsp;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;;&lt;br /&gt;安装完成后可能需要加载的驱动见邮件后面链接。&lt;/p&gt;&lt;p&gt;方法五：nLite&amp;nbsp;工具集成硬盘控制卡驱动到Windows安装光盘&lt;br /&gt;要求单一版本的Windows&amp;nbsp;SP2安装光盘或windows2000&amp;nbsp;SP4安装光盘（9GIII代以后的机器不支持windows2000）。严格按照文档中每个界面中的选项操作。PERC4，PERC6阵列卡在windows2000下不适用。&lt;br /&gt;具体方法链接：&lt;a href=&quot;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=259430&amp;nbsp;&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=259430&amp;nbsp;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;;&lt;br /&gt;安装完成后可能需要加载的驱动见邮件后面链接。&lt;/p&gt;&lt;p&gt;方法六：USC工具安装操作系统&amp;nbsp;&lt;br /&gt;只有11G以上的服务器有此功能。安装时，USC程序会自动创建临时分区来存放驱动文件等，注意重启后分区的时候，创建系统盘时，盘符要是C，如果不是参照文档方法。&lt;br /&gt;具体方法链接：&lt;a href=&quot;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=232371&amp;nbsp;&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=232371&amp;nbsp;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;;&lt;br /&gt;一般情况会自动将DELL设备安装好驱动。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=15&amp;amp;tid=261838&amp;amp;hls=&amp;amp;page=1&quot; target=&quot;_blank&quot;&gt;DELL服务器引导光盘图片及下载链接&lt;/a&gt;&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/dell-server-cd-boot-and-driver-loading.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/471/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/dell-server-cd-boot-and-driver-loading.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/471/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/nagios_configuration_guide.aspx</link>
		<title>nagios监控系统配置指南</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Mon, 31 May 2010 02:55:13 GMT</pubDate>
		<description>&lt;p&gt;&lt;b&gt;一、nagios监控系统配置过程&lt;/b&gt;&lt;/p&gt;&lt;p&gt;实验&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%BB%B7%BE%B3&quot;&gt;环境&lt;/span&gt;：&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=nagios&quot;&gt;nagios&lt;/span&gt;监控&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B7%FE%CE%F1%C6%F7&quot;&gt;服务器&lt;/span&gt;为192.168.1.240&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 主机名为nagios&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; nagios被监控&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B7%FE%CE%F1&quot;&gt;服务&lt;/span&gt;器为192.168.1.208&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 主机名为apache&lt;br /&gt;用到的&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%C8%ED%BC%FE&quot;&gt;软件&lt;/span&gt;包：httpd-2.2.6.tar.gz、imagepak-base.tar.gz、&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=mysql&quot;&gt;mysql&lt;/span&gt;-5.1.22-rc-&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=linux&quot;&gt;linux&lt;/span&gt;-i686-icc-glibc23.tar.gz、nagios-2.9.tar.gz、nagios-plugins-1.4.9.tar.gz、nrpe-2.12.tar.gz、&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=perl&quot;&gt;perl&lt;/span&gt;-stable.tar.gz、&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=php&quot;&gt;php&lt;/span&gt;-5.2.4.tar.bz2、pnp-latest.tar.gz、rrdtool-1.0.50.tar.gz&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;在监控服务器上进行下面的操作：&lt;br /&gt;&lt;b&gt;1.安装nagios主&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B3%CC%D0%F2&quot;&gt;程序&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;1）解压缩：&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;tar&amp;nbsp;-zxvf&amp;nbsp;nagios-2.9.tar.gz&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;cd&amp;nbsp;nagios-2.9&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;./configure&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;--prefix&lt;/span&gt;&lt;span&gt;=/usr/local/nagios&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;--with-gd-lib&lt;/span&gt;&lt;span&gt;=/usr/local/lib&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;--with-gd-inc&lt;/span&gt;&lt;span&gt;=/usr/local/include&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;2）创建用户并且设定权限：&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-other&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;groupadd&amp;nbsp;nagios&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;useradd&amp;nbsp;-g&amp;nbsp;nagios&amp;nbsp;nagios&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;mkdir&amp;nbsp;/usr/local/nagios&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;chown&amp;nbsp;-R&amp;nbsp;nagios.nagios&amp;nbsp;/usr/local/nagios&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;make all &lt;br /&gt;make install&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//来安装主程序,CGI和HTML&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%CE%C4%BC%FE&quot;&gt;文件&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;make install-init&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;//在/etc/rc.d/init.d安装启动&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%BD%C5%B1%BE&quot;&gt;脚本&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;make install-command&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=mod&quot;&gt;mod&lt;/span&gt;e&amp;nbsp; &amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//来配置目录权限&lt;/font&gt;&lt;br /&gt;make install-config &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//来安装示例配置文件,安装的路径是/usr/local/nagios/etc&lt;/font&gt;. &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;3）验证是否安装成功：&lt;br /&gt;验证程序是否被正确安装。切换目录到安装路径（这里是/usr/local/nagios）,看是否存在 etc、bin、 sbin、 share、 var这五个目录，如果存在则可以表明程序被正确的安装到&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%CF%B5%CD%B3&quot;&gt;系统&lt;/span&gt;了。后表是五个目录&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B9%A6%C4%DC&quot;&gt;功能&lt;/span&gt;的简要说明： &lt;br /&gt;bin&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Nagios执行程序所在目录，nagios文件即为主程序&lt;br /&gt;etc&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Nagios配置文件位置，初始安装完后，只有几个*.cfg-sample文件&lt;br /&gt;sbin&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Nagios Cgi文件所在目录，也就是执行外部&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%C3%FC%C1%EE&quot;&gt;命令&lt;/span&gt;所需文件所在的目录&lt;br /&gt;&lt;br /&gt;share&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Nagios网页文件所在的目录&lt;br /&gt;var&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Nagios&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%C8%D5%D6%BE&quot;&gt;日志&lt;/span&gt;文件、spid 等文件所在的目录&lt;br /&gt;&lt;br /&gt;var/archives&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Empty directory for the archived logs&lt;br /&gt;/var/rw&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;Empty directory for the external command file&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.安装&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B2%E5%BC%FE&quot;&gt;插件&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;1）解压缩:&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;tar&amp;nbsp;-zxvf&amp;nbsp;nagios-plugins-1.4.9.tar.gz&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;cd&amp;nbsp;nagios-plugins-1.4.9&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;./configure&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;--prefix&lt;/span&gt;&lt;span&gt;=/usr/local/nagios/&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;make&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;make install&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;ls /usr/local/nagios/libexec/&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;(在&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=redhat&quot;&gt;redhat&lt;/span&gt;系统上面安装可能出现configure时，到这里checking for redhat spopen problem...就不动了，所以需要在configure时再加上--enable-redhat-pthread-workaround )&lt;/font&gt;&lt;br /&gt;&lt;span&gt;ls /usr/local/nagios/libexec/ &lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;&lt;span&gt;&lt;font color=&quot;#000000&quot;&gt;#会显示安装的插件文件,即所有的插件都安装在libexec这个目录下&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;注意：要是没有这个插件目录需要用下面的命令把插件复制过来&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;cp&amp;nbsp;/usr/local/nagios-plugins/libexec&amp;nbsp;/usr/local/nagios/&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;2)将apache的&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%D4%CB%D0%D0&quot;&gt;运行&lt;/span&gt;用户加到nagios组里面 ：&lt;br /&gt;从httpd.conf中过滤出当前的apache运行用户 &lt;br /&gt;grep ^User /usr/local/apache2/conf/httpd.conf &lt;br /&gt;&lt;br /&gt;我的是daemon，下面将这个用户加入nagios组 &lt;br /&gt;usermod -G nagios daemon &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;3)修改apache配置: &lt;br /&gt;修改apache的配置文件,增加nagios的目录,并且&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B7%C3%CE%CA&quot;&gt;访问&lt;/span&gt;此目录需要进行身份验证 &lt;br /&gt;vi /usr/local/apache2/conf/httpd.conf,在最后增加如下内容 :&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;ScriptAlias&amp;nbsp;/nagios/cgi-bin&amp;nbsp;/usr/local/nagios/sbin&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;Directory&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;quot;/usr/local/nagios/sbin&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Options&amp;nbsp;ExecCGI&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AllowOverride&amp;nbsp;None&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Order&amp;nbsp;allow,deny&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Allow&amp;nbsp;from&amp;nbsp;all&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AuthName&amp;nbsp;&amp;quot;Nagios&amp;nbsp;Access&amp;quot;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AuthType&amp;nbsp;Basic&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;AuthUserFile&amp;nbsp;/usr/local/nagios/etc/htpasswd&amp;nbsp;&amp;nbsp;&amp;nbsp;//用于此目录访问身份验证的文件&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Require&amp;nbsp;valid-user&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;Directory&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;Alias&amp;nbsp;/nagios&amp;nbsp;/usr/local/nagios/share&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;Directory&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;quot;/usr/local/nagios/share&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Options&amp;nbsp;None&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AllowOverride&amp;nbsp;None&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Order&amp;nbsp;allow,deny&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Allow&amp;nbsp;from&amp;nbsp;all&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AuthName&amp;nbsp;&amp;quot;Nagios&amp;nbsp;Access&amp;quot;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AuthType&amp;nbsp;Basic&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;AuthUserFile&amp;nbsp;/usr/local/nagios/etc/htpasswd&amp;nbsp;&amp;nbsp;//用于此目录访问身份验证的文件&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Require&amp;nbsp;valid-user&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;Directory&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;4)增加验证用户：&lt;br /&gt;也就是通过&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=web&quot;&gt;web&lt;/span&gt;访问nagios的时候,必须要用这个用户登陆.在这里我们增加用户test:&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%C3%DC%C2%EB&quot;&gt;密码&lt;/span&gt;为123456 &lt;br /&gt;# /usr/local/apache2/bin/htpasswd -c /usr/local/nagios/etc/htpasswd test&amp;nbsp; &amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//用户名&lt;/font&gt;&lt;br /&gt;New password: //(输入123456) &lt;br /&gt;Re-type new password: (再输入一次密码) &lt;br /&gt;Adding password for user test &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;5)查看认证文件的内容:&lt;br /&gt;[root@localhost conf]# less /usr/local/nagios/etc/htpasswd &lt;br /&gt;test:OmWGEsBnoGpIc&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt; //前半部分是用户名test,后面是加密后的密码 &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;到这里nagios的安装也就基本完成了,你可以通过web来访问了. &lt;br /&gt;&lt;a href=&quot;http://192.168.1.240/nagios&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;u&gt;http://192.168.1.240/nagios&lt;/u&gt;&lt;/font&gt;&lt;/a&gt; 会弹出对话框要求输入用户名密码 &lt;br /&gt;输入test,密码123456,就可以进入nagios的主页面了 &lt;br /&gt;但是可以发现什么也点不开,因为nagios还没启动呢!下面的工作就是修改配置文件,增加要监控的主机和服务 &lt;br /&gt;&lt;br /&gt;3.典型配置 &lt;br /&gt;nagios要用起来,就必须修改配置文件,增加要监控的主机和服务才行.在具体做这个动作之前,下面的概念必须要了解. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;1)预备知识 :&lt;br /&gt;在Nagios里面定义了一些基本的对象,一般用到的有: &lt;br /&gt;联系人&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;contact&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;出了问题向谁报告?一般当然是系统&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B9%DC%C0%ED&quot;&gt;管理&lt;/span&gt;员了&lt;br /&gt;监控时间段&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;timeperiod&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;7X24小时不间断还是周一至周五,或是自定义的其他时间段&lt;br /&gt;被监控主机&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Host&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;所需要监控的服务器,当然可以是监控机自己&lt;br /&gt;监控命令&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;command&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;nagios发出的哪个指令来执行某个监控,这也是自己定义的&lt;br /&gt;被监控的服务 Service&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;例如主机是否存活,80&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B6%CB%BF%DA&quot;&gt;端口&lt;/span&gt;是否开,磁盘使用情况或者自定义的服务等&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;注意：多个被监控主机可以定义为一个主机组,多个联系人可以被定义为一个联系人组&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;2)将示例配置文件复制为真实配置文件名：&lt;br /&gt;&lt;br /&gt;cd /usr/local/nagios/etc &lt;br /&gt;把这里.cfg-sample文件配置文件模板，全部重命名为.cfg&lt;br /&gt;&lt;br /&gt;3)修改配置文件： &lt;br /&gt;修改nagios的主配置文件nagios.cfg &lt;br /&gt;vi nagios.cfg &lt;br /&gt;cfg_file=/usr/local/nagios/etc/localhost.cfg&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//在前面加#&lt;/font&gt;&lt;br /&gt;cfg_file=/usr/local/nagios/etc/contacts.cfg&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//联系人配置文件路径&lt;/font&gt;&lt;br /&gt;cfg_file=/usr/local/nagios/etc/contactgroups.cfg &lt;font color=&quot;#ff0000&quot;&gt;//联系人组配置文件路径&lt;/font&gt;&lt;br /&gt;cfg_file=/usr/local/nagios/etc/commands.cfg&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//命令配置文件路径&lt;/font&gt;&lt;br /&gt;cfg_file=/usr/local/nagios/etc/host.cfg&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt; //主机配置文件路径 &lt;/font&gt;&lt;br /&gt;cfg_file=/usr/local/nagios/etc/hostgroups.cfg&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;//服务器组配置文件&lt;/font&gt;&lt;br /&gt;cfg_file=/usr/local/nagios/etc/templates.cfg&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//模板配置文件路径&lt;/font&gt;&lt;br /&gt;cfg_file=/usr/local/nagios/etc/timeperiods.cfg&amp;nbsp; &amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//监视时段配置文件路径&lt;/font&gt;&lt;br /&gt;cfg_file=/usr/local/nagios/etc/services.cfg&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//服务配置文件&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;其他配置文件以实际情况来进行配置&lt;br /&gt;&lt;br /&gt;改check_external_commands=0为check_external_commands=1 .这行的作用是允许在web界面下执行重启nagios、停止主机/服务检查等操作。 &lt;br /&gt;&lt;br /&gt;把command_check_interval的值从默认的1改成command_check_interval=10s（根据自己的情况定这个命令检查时间间隔，不要太长也不要太短）。 &lt;br /&gt;主配置文件要改的基本上就是这些，通过上面的修改，发现/usr/local/nagios/etc并没有文件hosts.cfg等一干文件，怎么办？稍后手动创建它们。&lt;br /&gt;&lt;br /&gt;4)然后检查配置文件是否出错 &lt;br /&gt;/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg&lt;br /&gt;&lt;br /&gt;出现Total Warnings: 0&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Total Errors:&amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//这样表示配置文件没有错误&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;5)修改CGI脚本控制文件cgi.cfg &lt;br /&gt;&lt;br /&gt;#vi cgi.cfg &lt;br /&gt;第二个要修改的配置文件是cgi.cfg,它的作用是控制相关cgi脚本。先确保use_authentication=1。接下来修改default_user_name=test(前面创建的用户名) ,再后面的修改在下表列出： &lt;br /&gt;authorized_for_system_information=nagiosadmin,mandahang，test&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//后面跟的都是用户名&lt;/font&gt;&lt;br /&gt;authorized_for_configuration_information=nagiosadmin,mandahang，test&lt;br /&gt;authorized_for_system_commands=mandahang,test authorized_for_all_services=nagiosadmin,mandahang,test &lt;br /&gt;authorized_for_all_hosts=nagiosadmin,mandahang,test&lt;br /&gt;authorized_for_all_service_commands=nagiosadmin,mandahang,test&lt;br /&gt;authorized_for_all_host_commands=nagiosadmin,mandahang,test&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;注意：在上面的配置文件里面加上新加的用户test&lt;/font&gt;&lt;br /&gt;那么上述用户名打那里来的呢？是执行命令 /usr/local/apache2/bin/htpasswd -c /usr/local/nagios/etc/htpasswd test（用户名test） 所生成的 &lt;br /&gt;&lt;br /&gt;6)配置各种配置文件&lt;br /&gt;&lt;br /&gt;定义监控时间段,创建配置文件timeperiods.cfg ：&lt;br /&gt;# vi timeperiods.cfg &lt;br /&gt;define timeperiod{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;timeperiod_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;24x7&amp;nbsp; &amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//时间段的名称,这个地方不要有空格&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;alias&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 24 Hours A Day,7Days A Week &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sunday&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;00:00-24:00 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;monday&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;00:00-24:00 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;tuesday&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;00:00-24:00 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;wednesday&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;00:00-24:00 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;thursday&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 00:00-24:00 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;friday&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;00:00-24:00 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;saturday&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 00:00-24:00 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;定义了一个监控时间段,它的名称是24x7,监控的时间是每天全天24小时： &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;定义联系人,创建配置文件contacts.cfg &lt;br /&gt;# vi contacts.cfg &lt;br /&gt;define contact{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;contact_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;test&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;//联系人的名称,这个地方不要有空格 &lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;alias&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;sys admin &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;service_notification_period&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;24x7 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;host_notification_period&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;24x7 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;service_notification_options&amp;nbsp; &amp;nbsp; w,u,c,r &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;host_notification_options&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; d,u,r &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;service_notification_commands&amp;nbsp; &amp;nbsp;notify-by-email &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;host_notification_commands&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;host-notify-by-email&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;email&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;a href=&quot;mailto:tfhudong@sohu.com&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;u&gt;tfhudong@sohu.com&lt;/u&gt;&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;pager&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1391119xxxx &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;创建了一个名为test的联系人,下面列出其中重要的几个选项做说明：&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;service_notification_period&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;24x7 &lt;br /&gt;服务出了状况通知的时间段,这个时间段就是上面在timeperiods.cfg中定义的. &lt;br /&gt;&lt;br /&gt;host_notification_period&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;24x7 &lt;br /&gt;主机出了状况通知的时间段, 这个时间段就是上面在timeperiods.cfg中定义的 &lt;br /&gt;&lt;br /&gt;service_notification_options&amp;nbsp; &amp;nbsp; w,u,c,r &lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;当服务出现w—&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B1%A8%BE%AF&quot;&gt;报警&lt;/span&gt;(warning),u—未知(unkown),c—严重(critical),或者r—从异常情况恢复正常,在这四种情况下通知联系人. &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;host_notification_options&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; d,u,r &lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;当主机出现d&amp;nbsp; &amp;nbsp; —当机(down),u—返回不可达(unreachable),r—从异常情况恢复正常,在这3种情况下通知联系人 &lt;/font&gt;&lt;br /&gt;service_notification_commands&amp;nbsp; &amp;nbsp;notify-by-email &lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;服务出问题通知采用的命令notify-by-email,这个命令是在commands.cfg中定义的,作用是给联系人发&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%D3%CA%BC%FE&quot;&gt;邮件&lt;/span&gt;&lt;/font&gt;. &lt;br /&gt;&lt;br /&gt;host_notification_commands&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;host-notify-by-email&lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;同上,主机出问题时采用的也是发邮件的方式通知联系人 &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;email&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;a href=&quot;mailto:yahoon@test.com&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;u&gt;yahoon@test.com&lt;/u&gt;&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;很明显,联系的人email地址 &lt;/font&gt;&lt;br /&gt;Pager&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;137xxxxxxxxxxxxxx&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//电话&lt;/font&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;下面就可以将多个联系人组成一个联系人组,创建文件contactgroups.cfg ：&lt;br /&gt;&lt;br /&gt;# vi contactgroups.cfg &lt;br /&gt;define contactgroup{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;contactgroup_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; sagroup&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;//联系人组的名称,同样不能空格 &lt;/font&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;alias&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;System Administrators&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//别名 &lt;/font&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;members&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;test &lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;//组的成员,来自于上面定义的contacts.cfg,如果有多个联系人则以逗号相隔 &lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;定义被监控主机,创建文件hosts.cfg :&lt;br /&gt;# vi hosts.cfg &lt;br /&gt;define host{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;host_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;nagios&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt; //被监控主机的名称,最好别带空格&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;alias&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;nagios&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;//别名 &lt;/font&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; address&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;192.168.1.240&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;//被监控主机的IP地址&lt;/font&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; check_command&amp;nbsp; &amp;nbsp; check-host-alive &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//监控的命令check-host-alive,这个命令来自commands.cfg,用来监控主机是否存活&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;max_check_attempts&amp;nbsp; &amp;nbsp; 5&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//检查失败后重试的次数&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check_period&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 24x7 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;//检查的时间段24x7,同样来自于我们之前在timeperiods.cfg中定义的 &lt;/font&gt;&lt;br /&gt;contact_groups&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sagroup &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;//联系人组,上面在contactgroups.cfg中定义的sagroup &lt;/font&gt;&lt;br /&gt;notification_interval&amp;nbsp;&amp;nbsp;10 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//提醒的间隔,每隔10秒提醒一次 &lt;/font&gt;&lt;br /&gt;notification_period&amp;nbsp; &amp;nbsp;24x7 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//提醒的周期, 24x7,同样来自于我们之前在timeperiods.cfg中定义的 &lt;/font&gt;&lt;br /&gt;notification_options&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;d,u,r &lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;//指定什么情况下提醒&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;通过简单的复制修改就可以定义多个主机了.我们在这加上另外一台机器&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;与联系人可以组成联系人组一样,多个主机也可以组成主机组:&lt;br /&gt;主机名为：apache&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;ip：192.168.1.208&lt;br /&gt;&lt;br /&gt;创建文件hostgrops.cfg &lt;br /&gt;# vi hostgroups.cfg &lt;br /&gt;define hostgroup{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;hostgroup_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; linux-servers&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//主机组名称 &lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;alias&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; linux-servers&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//别名 &lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;members&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;nagios,apache&lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;//组的成员主机,多个主机以逗号相隔,必须是上面hosts.cfg中定义的&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;下面是最关键的了,用nagios主要是监控一台主机的各种信息,包括本机资源,对外的服务等等.这些在nagios里面都是被定义为一个个的项目(nagios称之为服务,为了与主机提供的服务相区别,我这里用项目这个词),而实现每个监控项目,则需要通过commands.cfg文件中定义的命令. &lt;br /&gt;例如我们现在有一个监控项目是监控一台机器的web服务是否正常, 我们需要哪些元素呢?最重要的有下面三点:首先是监控哪台机,然后是这个监控要用什么命令实现,最后就是出了问题的时候要通知哪个联系人? &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;定义监控的项目,也叫服务,创建services.cfg :&lt;br /&gt;&lt;br /&gt;# vi services.cfg &lt;br /&gt;define service{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;host_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;nagios &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;//被监控的主机,hosts.cfg中定义的&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;service_description&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check-host-alive &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;//这个监控项目的描述,这个会在web页面中出现&lt;/font&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check_command&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check-host-alive &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//所用的命令,是commands.cfg中定义的 &lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;max_check_attempts&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;5&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;//重试的次数&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;normal_check_interval&amp;nbsp; &amp;nbsp;3&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;//循环检查的间隔时间&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;retry_check_interval&amp;nbsp; &amp;nbsp; 2&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check_period&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;24x7 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//监控的时间段,是timeperiods.cfg中定义的&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;notification_interval&amp;nbsp; &amp;nbsp;10 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;notification_period&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;24x7 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//通知的时间段 &lt;/font&gt;&lt;br /&gt;notification_options&amp;nbsp; &amp;nbsp; w,u,c,r &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//在监控的结果是wucr时通知联系人 &lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;contact_groups&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; sagroup &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//联系人组,是contactgroups.cfg中定义的 &lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;这样整个的配置过程就结束了.虽然功能很简单,但是已经为以后扩展打下了良好的&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%BB%F9%B4%A1&quot;&gt;基础&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;在运行nagios之前首先做测试 &lt;br /&gt;&lt;br /&gt;/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg &lt;br /&gt;看到下面这些信息就说明没问题了 &lt;br /&gt;&lt;br /&gt;Total Warnings: 0 &lt;br /&gt;Total Errors:&amp;nbsp; &amp;nbsp;0 &lt;br /&gt;&lt;br /&gt;作为守护&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%BD%F8%B3%CC&quot;&gt;进程&lt;/span&gt;后台启动nagios &lt;br /&gt;/usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;登陆&lt;a href=&quot;http://192.168.1.240/nagios/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;u&gt;http://192.168.1.240/nagios/&lt;/u&gt;&lt;/font&gt;&lt;/a&gt;来查看吧.点左边的Host Detail4. 使用命令和插件监控更多信息 &lt;br /&gt;&lt;br /&gt;我们已经增加了二个监控项目,分别监控nagios,apache这二台主机是否存活.&lt;br /&gt;nagios本身并没有监控的功能,所有的监控是由插件完成的,插件将监控的结果返回给nagios,nagios分析这些结果,以web的方式展现给我们,同时提供相应的报警功能(这个报警的功能也是由插件完成的) &lt;br /&gt;所有的这些插件是一些实现特定功能的可执行程序,默认安装的路径是/usr/local/nagios/libexec &lt;br /&gt;&lt;br /&gt;这些程序都是可以独立执行的,使用方法可以通过”命令名 –h”来查看 &lt;br /&gt;&lt;br /&gt;例如,我们查看check_disk这个插件的用法则可以使用check_disk –h &lt;br /&gt;# ./check_disk -h &lt;br /&gt;check_disk (nagios-plugins 1.4.9) 1.91 &lt;br /&gt;Copyright (c) 1999 Ethan Galstad &amp;lt;&lt;a href=&quot;mailto:nagios@nagios.org&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;u&gt;nagios@nagios.org&lt;/u&gt;&lt;/font&gt;&lt;/a&gt;&amp;gt; &lt;br /&gt;Copyright (c) 1999-2006 Nagios Plugin Development Team &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;a href=&quot;mailto:devel@lists.sourceforge.net&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;devel@lists.sourceforge.net&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;[/email]&amp;gt; &lt;br /&gt;This plugin checks the amount of used disk space on a mounted file system &lt;br /&gt;and generates an alert if free space is less than one of the threshold values &lt;br /&gt;Usage: check_disk -w limit -c limit [-p path | -x device] [-t timeout][-m] [-e] [-W limit] [-K limit] [-v] [-q] [-E] &lt;br /&gt;&lt;br /&gt;输出的资料十分详细给出了这个插件的功能,使用方法,参数意义等,对于每一个插件都是这样.所以当你不懂某个插件怎么使用时就好好读读吧.从上面的输出可以看到check_disk这个插件是用来检查磁盘使用情况的. &lt;br /&gt;我现在来独立执行它,例如查看根分区的使用情况,执行 &lt;br /&gt;# ./check_disk -w 10% -c 5% / &lt;br /&gt;命令的含义是检查分区/的使用情况,若剩余10%以下,为警告状态(warning),5%以下为严重状态(critical), &lt;br /&gt;&lt;br /&gt;执行后我们会看到下面这条信息 &lt;br /&gt;DISK WARNING - free space: / 487 MB (6% inode=78%);| /=7449MB;7524;7942;0;8361 &lt;br /&gt;说明当前是warning的状态,空闲空间只有6%了.如果nagios收到这些状态结果就会采取报警等措施了 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;我们在定义某个监控项目时,所用的监控命令都是来自commands.cfg的,这和这些插件有什么关系?想到了吧,commands.cfg中定义的监控命令就是使用的这些插件.举个例子,之前我们已经不止一次用到了check-host-alive这个命令,打开commands.cfg就可以看到这个命令的定义,如下: &lt;br /&gt;define command{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;command_name&amp;nbsp; &amp;nbsp; check-host-alive &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;command_line&amp;nbsp; &amp;nbsp; $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 1 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;command_name&amp;nbsp; &amp;nbsp; check-host-alive &lt;br /&gt;这句话的意思是定义的命令名是check-host-alive,也就是我们在services.cfg中使用的名称 &lt;br /&gt;执行的操作是 &lt;br /&gt;$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 1 &lt;br /&gt;其中$USER1$是在resource.cfg文件中定义的,代表插件的安装路径.就如我们上面看到的那样$USER1$=/usr/local/nagios/libexec,至于$HOSTADDRESS$,则默认被定义为监控主机的地址. &lt;br /&gt;简单的说,我们在services.cfg中定义了对dbpi执行check-host-alive命令,实际上就是执行了 &lt;br /&gt;/usr/local/nagios/libexec/ check_ping -H dbpi的ip地址 -w 3000.0,80% -c 5000.0,100% -p 1 &lt;br /&gt;实际上check-host-alive只是这一长串命令的简称而已,而在services.cfg中都是使用简称的. &lt;br /&gt;在commands.cfg中定义了很多这样的命令简称.基本上我们常用的监控项目都包含了,例如ftp,http,本地的磁盘,负载等等. &lt;br /&gt;我们再看一个命令,check_local_disk定义如下 &lt;br /&gt;define command{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;command_name&amp;nbsp; &amp;nbsp; check_local_disk &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;command_line&amp;nbsp; &amp;nbsp; $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;check_local_disk实际上是执行的check_disk插件.这里的$ARG1$, $ARG2$, $ARG3$是什么意思呢?在之前我们已经提到了这个check_disk这个插件的用法,-w的参数指定磁盘剩了多少是警告状态,-c的参数指定剩多少是严重状态,-p用来指定路径. &lt;br /&gt;在使用check-host-alive的时候,只需要在services.cfg中直接写上这个命令名check-host-alive.后面没任何的参数.而使用check_local_disk则不同,在services.cfg中这要这么写 &lt;br /&gt;check_local_disk!10%!5%!/ &lt;br /&gt;在命令名后面用!分隔出了3个参数,10%是$ARG1$的值,5%是$ARG2$的值,/ 是$ARG3$的值, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;简单的一句话就是 &lt;br /&gt;services.cfg定义监控项目用某个命令 &lt;br /&gt;↓ &lt;br /&gt;这个命令必须在commands.cfg中定义 &lt;br /&gt;↓ &lt;br /&gt;定义这个命令时使用了libexec下的插件 &lt;br /&gt;&lt;br /&gt;如果命令不带$ARG1$就可以在services.cfg中直接使用,如果带了使用时就带上参数,以!相隔 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;1).监控nagios的ftp &lt;br /&gt;编辑services.cfg 增加下面的内容,基本上就是copy上节我们定义监控主机存活的代码. &lt;br /&gt;define service{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;host_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;nagios &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;//要监控的机器,给出机器名,注意必须是hosts.cfg中定义的 &lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;service_description&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check ftp &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt; //给这个监控项目起个名字吧,任意起,你自己懂就行&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check_command&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check_ftp &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;max_check_attempts&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;5 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;normal_check_interval&amp;nbsp; &amp;nbsp;3 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;retry_check_interval&amp;nbsp; &amp;nbsp; 2 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check_period&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;24x7 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;notification_interval&amp;nbsp; &amp;nbsp;10 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;notification_period&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;24x7 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;notification_options&amp;nbsp; &amp;nbsp; w,u,c,r &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;contact_groups&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; sagroup &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;修改了配置文件,当然就要重新启动了,简单的方法杀掉nagios进程,然后重新启动 &lt;br /&gt;/usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg &lt;br /&gt;&lt;br /&gt;这里只能监控监控服务器的本地信息，需要监控被监控服务器的信息，就需要下面的操作。&lt;br /&gt;&lt;br /&gt;5.用NRPE监控LINUX上的”本地信息”&lt;br /&gt;本节的目的,对系统为linux的主机apcahe进行如下监控:磁盘容量,登陆用户数，http,ftp,mysql的状况,其他功能自己可以自定义配置&lt;br /&gt;&lt;br /&gt;对于像磁盘容量,cpu负载这样的”本地信息”,nagios只能监测自己所在的主机,而对其他的机器则显得有点无能为力.毕竟没得到被控主机的适当权限是不可能得到这些信息的.为了解决这个问题,nagios有这样一个附加组件----NRPE.用它就可以完成对linux类型主机”本地信息”的监控. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;所以我们按照图示在监控主机(nagios)和被监控主机上安装相应的软件 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;在被监控主机上 &lt;br /&gt;&lt;br /&gt;1)增加用户 &lt;br /&gt;useradd nagios &lt;br /&gt;&lt;br /&gt;设置密码&lt;br /&gt;# passwd nagios &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;2)安装nagios插件 &lt;br /&gt;tar -zxvf nagios-plugins-1.4.9.tar.gz &lt;br /&gt;cd nagios-plugins-1.4.9 &lt;br /&gt;编译安装 &lt;br /&gt;./configure --enable-redhat-pthread-workaround&lt;br /&gt;make &lt;br /&gt;make install &lt;br /&gt;这一步完成后会在/usr/local/nagios/下生成两个目录libexec和share &lt;br /&gt;# ls /usr/local/nagios/ &lt;br /&gt;libexec&amp;nbsp;&amp;nbsp;share &lt;br /&gt;&lt;br /&gt;修改目录权限 &lt;br /&gt;# chown nagios.nagios /usr/local/nagios &lt;br /&gt;# chown -R nagios.nagios /usr/local/nagios/libexec &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;3)安装nrpe &lt;br /&gt;解压缩 &lt;br /&gt;tar -zxvf nrpe-2.8.1.tar.gz &lt;br /&gt;cd nrpe-2.8.1 &lt;br /&gt;编译 &lt;br /&gt;./configure &lt;br /&gt;NRPE的端口是5666 &lt;br /&gt;make all &lt;br /&gt;接下来安装NPRE插件,daemon和示例配置文件 &lt;br /&gt;&lt;br /&gt;安装check_nrpe这个插件 &lt;br /&gt;make install-plugin &lt;br /&gt;之前说过监控机需要安装check_nrpe这个插件,被监控机并不需要,我们在这里安装它是为了测试的目的 &lt;br /&gt;&lt;br /&gt;安装deamon &lt;br /&gt;make install-daemon&lt;br /&gt;&lt;br /&gt;安装配置文件 &lt;br /&gt;make install-daemon-config &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;现在再查看nagios目录就会发现有4个目录了 &lt;br /&gt;# ls /usr/local/nagios/ &lt;br /&gt;bin&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;etc&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;libexec&amp;nbsp;&amp;nbsp;share &lt;br /&gt;将NRPE deamon作为xinetd下的一个服务运行的.在这样的情况下xinetd就必须要先安装好,不过一般系统已经默认装了 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;4)安装xinetd脚本 &lt;br /&gt;# make install-xinetd &lt;br /&gt;输出如下 &lt;br /&gt;/usr/bin/install -c -m 644 sample-config/nrpe.xinetd /etc/xinetd.d/nrpe &lt;br /&gt;&lt;br /&gt;可以看到创建了这个文件/etc/xinetd.d/nrpe &lt;br /&gt;编辑这个脚本 &lt;br /&gt;vi /etc/xinetd.d/nrpe &lt;br /&gt;# default: on &lt;br /&gt;# description: NRPE (Nagios Remote Plugin Executor) &lt;br /&gt;service nrpe &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;flags&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;= REUSE &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;socket_type&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;= stream &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;port&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;= 5666 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;wait&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;= no &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;user&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;= nagios &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;group&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;= nagios &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;server&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; = /usr/local/nagios/bin/nrpe &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;server_args&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;= -c /usr/local/nagios/etc/nrpe.cfg --inetd &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;log_on_failure&amp;nbsp;&amp;nbsp;+= USERID &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;disable&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;= no &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;only_from&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; = 127.0.0.1&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;在后面增加监控主机的地址192.168.1.240,以空格间隔 &lt;/font&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;改后 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;only_from&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; = 127.0.0.1 192.168.1.240&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;编辑/etc/services文件,增加NRPE服务 &lt;br /&gt;vi /etc/services &lt;br /&gt;&lt;br /&gt;增加如下 &lt;br /&gt;# Local services &lt;br /&gt;nrpe&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;5666/tcp&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;# nrpe &lt;br /&gt;&lt;br /&gt;重启xinetd服务 &lt;br /&gt;# service xinetd restart &lt;br /&gt;&lt;br /&gt;查看NRPE是否已经启动 &lt;br /&gt;# netstat -at|grep nrpe &lt;br /&gt;tcp&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0 *:nrpe&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;*:*&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;LISTEN&amp;nbsp; &amp;nbsp; &lt;br /&gt;# netstat -an|grep 5666 &lt;br /&gt;tcp&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0 0.0.0.0:5666&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0.0.0.0:*&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;LISTEN&amp;nbsp; &amp;nbsp;&lt;br /&gt;可以看到5666端口已经在监听了 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;5)测试NRPE是否则正常工作 &lt;br /&gt;&lt;br /&gt;之前安装了check_nrpe这个插件用于测试,现在就是用的时候.执行 &lt;br /&gt;/usr/local/nagios/libexec/check_nrpe -H localhost &lt;br /&gt;会返回当前NRPE的版本 &lt;br /&gt;# /usr/local/nagios/libexec/check_nrpe -H localhost &lt;br /&gt;NRPE v2.8.1 &lt;br /&gt;&lt;br /&gt;也就是在本地用check_nrpe连接nrpe daemon是正常的 &lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;注:为了后面工作的顺利进行,注意本地防火墙要打开5666能让外部的监控机访问 &lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;/usr/local/nagios/libexec/check_nrpe –h查看这个命令的用法 &lt;br /&gt;可以看到用法是check_nrpe –H 被监控的主机 -c要执行的监控命令 &lt;br /&gt;注意:-c后面接的监控命令必须是nrpe.cfg文件中定义的.也就是NRPE daemon只运行nrpe.cfg中所定义的命令 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;查看NRPE的监控命令 &lt;br /&gt;cd /usr/local/nagios/etc &lt;br /&gt;vi nrpe.cfg &lt;br /&gt;&lt;br /&gt;# The following examples use hardcoded command arguments... &lt;br /&gt;command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10 &lt;br /&gt;command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20 &lt;br /&gt;command[check_hda1]=/usr/local/nagios/libexec/check_disk -w 20 -c 10 -p /dev/hda1 &lt;br /&gt;command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z &lt;br /&gt;command[check_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200 &lt;br /&gt;&lt;br /&gt;注意：其他命令需要自行添加&lt;br /&gt;&lt;br /&gt;也就是check_nrpe 的-c参数可以接的内容,等号=后面是实际执行的插件程序(只这与commands.cfg中定义命令的形式十分相似,不过是写在了一行).也就是说check_users就是等号后面/usr/local/nagios/libexec/check_users -w 5 -c 10的简称. &lt;br /&gt;我们可以很容易知道上面这5行定义的命令分别是检测登陆用户数,cpu负载,hda1的容量,僵尸进程,总进程数.各条命令具体的含义见插件用法(执行”插件程序名 –h”) &lt;br /&gt;由于-c后面只能接nrpe.cfg中定义的命令,也就是说现在我们只能用上面定义的这五条命令.我们可以在本机实验一下.执行 &lt;br /&gt;/usr/local/nagios/libexec/check_nrpe -H localhost -c check_users &lt;br /&gt;&lt;br /&gt;/usr/local/nagios/libexec/check_nrpe -H localhost -c check_load &lt;br /&gt;&lt;br /&gt;/usr/local/nagios/libexec/check_nrpe -H localhost -c check_hda1 &lt;br /&gt;&lt;br /&gt;/usr/local/nagios/libexec/check_nrpe -H localhost -c check_zombie_procs &lt;br /&gt;&lt;br /&gt;/usr/local/nagios/libexec/check_nrpe -H localhost -c check_total_procs &lt;br /&gt;&lt;br /&gt;在运行nagios的监控主机上 &lt;br /&gt;&lt;br /&gt;之前已经将nagios运行起来了,现在要做的事情是: &lt;br /&gt;– 安装check_nrpe插件 &lt;br /&gt;– 在commands.cfg中创建check_nrpe的命令定义,因为只有在commands.cfg中定义过的命令才能在services.cfg中使用 &lt;br /&gt;&lt;br /&gt;创建对被监控主机的监控项目 &lt;br /&gt;&lt;br /&gt;安装check_nrpe插件 &lt;br /&gt;# tar -zxvf nrpe-2.8.1.tar.gz &lt;br /&gt;# cd nrpe-2.8.1 &lt;br /&gt;# ./configure &lt;br /&gt;# make all &lt;br /&gt;# make install-plugin &lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;只运行这一步就行了,因为只需要check_nrpe插件 &lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;在apache刚装好了nrpe,现在我们测试一下监控机使用check_nrpe与被监控机运行的nrpedaemon之间的通信. &lt;br /&gt;&lt;br /&gt;# /usr/local/nagios/libexec/check_nrpe -H 192.168.1.208&lt;br /&gt;NRPE v2.8.1 &lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;看到已经正确返回了NRPE的版本信息,说明一切正常.&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;在commands.cfg中增加对check_nrpe的定义 &lt;br /&gt;vi /usr/local/nagios/etc/commands.cfg &lt;br /&gt;在最后面增加如下内容 &lt;br /&gt;######################################################################## &lt;br /&gt;# &lt;br /&gt;# 2007.9.5 add by yahoon &lt;br /&gt;# NRPE COMMAND &lt;br /&gt;# &lt;br /&gt;######################################################################## &lt;br /&gt;# &apos;check_nrpe &apos; command definition &lt;br /&gt;define command{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;command_name check_nrpe &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;意义如下 &lt;br /&gt;command_name check_nrpe &lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;定义命令名称为check_nrpe,在services.cfg中要使用这个名称. &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ &lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;这是定义实际运行的插件程序.这个命令行的书写要完全按照check_nrpe这个命令的用法.不知道用法的就用check_nrpe –h查看 &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;-c后面带的$ARG1$参数是传给nrpe daemon执行的检测命令,之前说过了它必须是nrpe.cfg中所定义的那5条命令中的其中一条.在services.cfg中使用check_nrpe的时候要用!带上这个参数 &lt;br /&gt;&lt;br /&gt;下面就可以在services.cfg中定义对apache主机磁盘容量的监控 &lt;br /&gt;define service{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;host_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;apache &lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;被监控的主机名,这里注意必须是linux且运行着nrpe,而且必须是hosts.cfg中定义的 &lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;service_description&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check-disk &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;监控项目的名称 &lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check_command&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check_nrpe!check_disk &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;监控命令是check_nrpe,是在commands.cfg中定义的,带的参数是check_disk,是在nrpe.cfg中定义的&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;max_check_attempts&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;5 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;normal_check_interval&amp;nbsp; &amp;nbsp;3 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;retry_check_interval&amp;nbsp; &amp;nbsp; 2 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;check_period&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;24x7 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;notification_interval&amp;nbsp; &amp;nbsp;10 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;notification_period&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;24x7 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;notification_options&amp;nbsp; &amp;nbsp; w,u,c,r &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;contact_groups&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; sagroup &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;像这样将其余几个监控项目加进来.&lt;br /&gt;&lt;br /&gt;6.Nagios的性能分析图表(此安装在监控机上进行)&lt;br /&gt;Nagios监控的侧重点在“此时”服务是否正常，是一个瞬时状态。通过对这个状态的监控和告警，管理员可以第一时间对主机或者服务的故障做处理。但是我 们往往也非常关心主机的性能以及服务的响应时间等情况，这些情况是一个持续的变化曲线，并非一个实时的值，如果通过查看日志数据来分析的话，既繁琐有抽 象，所以，我们希望Nagios可以帮我们做这份工作，然后将报表提交给我们，这样就非常方便了。这就是今天需要用到的Nagios的相关开源项目—— PNP&lt;br /&gt;&lt;br /&gt;PNP是一个小巧的开源软件包，它是基于PHP和PERL，利用rrdtool将Nagios采集的数据绘制成图表。如果你要安装PNP，那么准备工作有如下3项：&lt;br /&gt;1、整合Apache和PHP&lt;br /&gt;2、安装rrdtools &lt;br /&gt;3、安装Perl &lt;br /&gt;1）安装php&lt;br /&gt;./configure \&lt;br /&gt;--prefix=/usr/local/php \&lt;br /&gt;--with-mysql=/usr/local/mysql \&lt;br /&gt;--with-apxs2=/usr/local/apache2/bin/apxs \&lt;br /&gt;--with-gd --with-jpeg-dir=/usr/lib --enable-gd-native-ttf \&lt;br /&gt;--with-zlib-dir=/usr/lib --with-png-dir=/usr/lib \&lt;br /&gt;--with-freetype-dir=/usr/include/freetype2 --with-ttf \&lt;br /&gt;--enable-sockets --enable-ftp --enable-mbstring &lt;br /&gt;&lt;br /&gt;make &amp;amp;&amp;amp; make install&lt;br /&gt;&lt;br /&gt;#在httpd配置文件里加入，使apache支持php&lt;br /&gt;AddType application/x-httpd-php .php .phtml&lt;br /&gt;AddType application/x-httpd-php-source .phps&lt;br /&gt;&lt;br /&gt;#拷贝php配置文件到指定位置&lt;br /&gt;cp php.ini-dist /usr/local/php/lib/php.ini&lt;br /&gt;&lt;br /&gt;2）安装rrdtools&lt;br /&gt;./configure &lt;br /&gt;make&amp;amp;&amp;amp;make install&lt;br /&gt;&lt;br /&gt;3) 安装Perl&lt;br /&gt;rm -f config.sh Policy.sh&lt;br /&gt;sh Configure -de&lt;br /&gt;make&lt;br /&gt;make test&lt;br /&gt;make install&lt;br /&gt;&lt;br /&gt;要介绍PNP工作原理，首先要说明一下Nagios提供的数据接口，也就是PNP的数据来源。在定义host或service 中都有一个定义项，名为process_perf_data，其值可以定义为0或1，其作用是是否启用Nagios的数据输出功能。如果你将此项赋值为 1，那么Nagios就会将收集的数据写入到某个文件中，以备提取。所以，如果你想让Nagios将数据输出的话，首先要将Nagios的主配置文件 nagios.cfg中相关的配置修改：&lt;br /&gt;&lt;br /&gt;process_performance_data=1&lt;br /&gt;service_perfdata_command=process-service-perfdata&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;#默认此句被注释掉了，在这里去掉前面的#&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;如果想要对某个监控对象做数据图表，则需在所对应的host或者service定义中（一般写在hosts.cfg或者services.cfg文件中），包含如下的定义：&lt;br /&gt;&lt;br /&gt;process_perf_data&amp;nbsp; &amp;nbsp;1&lt;br /&gt;&lt;br /&gt;这 样，Nagios就会调用相应的命令来输出数据了。Nagios的command.cfg定义中默认有一项“process-service- perfdata”，该命令声明了Nagios输出哪些值到输出的文件中。不过其定义相对简单，PNP提供了一个perl脚本，更详尽的定义了一个输出数 据的方法。如果要使用PNP的话，我们需要在command.cfg的定义中，将“process-service-perfdata”命令对应的执行命令行的内 容替换成该脚本：&lt;br /&gt;&lt;br /&gt;define command{&lt;br /&gt;command_name process-service-perfdata&lt;br /&gt;command_line /usr/local/nagios/libexec/process_perfdata.pl&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;这样设置了之后，Nagios就会利用PNP提供的脚本进行相关的工作了。&lt;br /&gt;刚刚定义命令时用到的脚本“process_perfdata.pl”现在还不存在。我们现在就来安装，也就PNP的软件包 安装方法很简单，过程也很顺利&lt;br /&gt;&lt;br /&gt;./configure --with-rrdtool=/usr/local/rrdtool-1.0.50/bin/rrdtool --with-perfdata-dir=/usr/local/nagios/share/perfdata/&lt;br /&gt;make all&lt;br /&gt;make install&lt;br /&gt;&lt;br /&gt;安装结束之后，再去检查一下Nagios的插件目录（libexec），就会发现多了一个名为“process_perfdata.pl”的脚本。&lt;br /&gt;&lt;br /&gt;ok，现在执行一下Nagios配置检查命令&lt;br /&gt;/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg&lt;br /&gt;如果没有什么错误，那么我们重新启动Nagios。&lt;br /&gt;/etc/init.d/nagios restart&lt;br /&gt;验收一下成果，在浏览器的地址栏中输入：&lt;br /&gt;&lt;br /&gt;http://IP/nagios/pnp/index.php&lt;/p&gt;&lt;p&gt;基本上nagios的主要功能就有这些,nagios的使用关键在于如何活用那些丰富的插件.nagios可以说是一个对于linux/unix环境支持十分好的程序.&lt;br /&gt;&lt;br /&gt;之前我说重启nagios的时候都是用的杀进程的方式,其实也可以不这么做.如果在安装nagios的时候安装了启动脚本就可以使用/etc/init.d/nagios restart 还可以带的参数有stop, start,status &lt;br /&gt;如果报错了,有可能是脚本里面的路径设置错误,解决办法 &lt;br /&gt;vi /etc/init.d/nagios &lt;br /&gt;将prefix=/usr/local/nagiosaa改为安装的目录/etc/init.d/nagios &lt;br /&gt;&lt;br /&gt;注:在nagios安装的时候说是将脚本安装到了/etc/rc.d/init.d,其实这和/etc/init.d是一个目录&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、为Nagios编写自己的插件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Nagios (&lt;a href=&quot;http://www.nagios.org/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=nagios&quot;&gt;nagios&lt;/span&gt;.org/&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;)是一个开放源代码的主机、&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B7%FE%CE%F1&quot;&gt;服务&lt;/span&gt;和&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%CD%F8%C2%E7&quot;&gt;网络&lt;/span&gt;的监控&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%C6%BD%CC%A8&quot;&gt;平台&lt;/span&gt;。它被广泛使用在企业的IT部门中，负责企业核心&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%CF%B5%CD%B3&quot;&gt;系统&lt;/span&gt;营运情况的监控工作。&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; CIC对网络口碑的研究涉及了部分类似“云运算”的&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%BC%BC%CA%F5&quot;&gt;技术&lt;/span&gt;，需要有大量机器不间断的在进行工作.因而需要搭建一套能够24小时监控机器上&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%D4%CB%D0%D0&quot;&gt;运行&lt;/span&gt;的服务和其&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%D0%D4%C4%DC&quot;&gt;性能&lt;/span&gt;情况的平台,来帮助我们记录并分析机器运行状态,以及提前预警。这次我对Nagios的研究目的在于,除了常用的指标（&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=CPU&quot;&gt;CPU&lt;/span&gt;，ping,DISK...）,我们要求Nagios能够监控更多更细致更及时的指标，比如一些表示状态的&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%CA%FD%BE%DD&quot;&gt;数据&lt;/span&gt;等等，这就需要我们自己编写一些&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B2%E5%BC%FE&quot;&gt;插件&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;所幸Nagios可以很轻松的支持自定义插件，只要你满足他规定的一些简单的原则：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%BD%C5%B1%BE&quot;&gt;脚本&lt;/span&gt;输出原则&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;状态代码原则&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; 脚本输出原则&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;Nagios可以根据符号：“｜” 把插件输出的数据分割成performance data 和 Status Information,其中performance data可以交给pnp来通过图表的方式显示，Status Information主要是表示当前数据的一些状态&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;下面是一个插件输出结果的示例：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;One line of output (text and perfdata)&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;A plugin can return optional performance data for use by external applications. To do&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;this, the performance data must be separated from the text output with a pipe (|)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;symbol like such:&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;DISK OK - free space: / 3326 MB (56%);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;|&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;/=2643MB;5948;5958;0;5968&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;The final contents of each macro are listed below:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Macro&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Value&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;$SERVICEOUTPUT$&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;DISK OK - free space: / 3326 MB (56%);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;$SERVICEPERFDATA$&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;/=2643MB;5948;5958;0;5968&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;通过这样的一个符号“｜”就可以很简单的把我们要显示出来的数据分离出来交给nagios。是不是很简单？&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;状态代码原则：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;退出状态代码的含义如下所示：&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; *&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;OK —退出代码 0—表示服务正常地工作。&lt;br /&gt;&amp;nbsp; &amp;nbsp; *&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;WARNING —退出代码 1—表示服务处于警告状态。&lt;br /&gt;&amp;nbsp; &amp;nbsp; *&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;CRITICAL —退出代码 2—表示服务处于危险状态。&lt;br /&gt;&amp;nbsp; &amp;nbsp; *&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;UNKNOWN —退出代码 3—表示服务处于未知状态。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;最后一种状态通常表示该插件无法确定服务的状态。例如，可能出现了内部错误。&lt;br /&gt;&amp;nbsp;&amp;nbsp;所有这些代码都是告知nagios，你所编写的插件目前的一个状态，nagios得到这些状态后就可以自动做出相应的操作，如发&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%D3%CA%BC%FE&quot;&gt;邮件&lt;/span&gt;通知，短信提醒，或者亮起绿灯表示插件运行一切正常.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;下面是一个简单的&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=python&quot;&gt;python&lt;/span&gt;插件脚本：&lt;br /&gt;urlItem = urllib.urlopen(&amp;quot;http://XXX:XXX/XXXX/&amp;quot;)&lt;br /&gt;htmSource = urlItem.read()#读取页面内容&lt;br /&gt;urlItem.close()&lt;br /&gt;item=0&lt;br /&gt;def getValue(displayName):&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;for data in htmSource.split(&amp;quot;|&amp;quot;):&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if data.find(&amp;quot;:&amp;quot;)!=-1:&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;strD=data.split(&amp;quot;:&amp;quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;name=strD[0]?&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;item += int(strD[2])&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;print name&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if item:&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sys.exit(3)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;print &amp;quot;| item=&amp;quot;+str(item)+&amp;quot;c&amp;quot;&amp;nbsp;&amp;nbsp;#SERVICEPERFDATA&amp;nbsp;&amp;nbsp;nagios显示的数据&lt;br /&gt;&lt;br /&gt;getValue(&amp;quot;item&amp;quot;)&lt;br /&gt;&lt;br /&gt;编写完插件,将其在nagios配置后实际显示的效果：&lt;br /&gt;&lt;span style=&quot;position: absolute; display: none&quot; id=&quot;attach_141&quot; onmouseover=&quot;showMenu({&apos;ctrlid&apos;:this.id,&apos;pos&apos;:&apos;13&apos;})&quot;&gt;&lt;img border=&quot;0&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1005/dw6gep_104833_1.gif&quot; /&gt;&lt;/span&gt;&lt;strong&gt;&lt;img id=&quot;aimg_141&quot; alt=&quot;o_nagios.png&quot; src=&quot;http://www.517sou.net/Attach/month_1005/tbevxe_104834_2.png&quot; width=&quot;400&quot; height=&quot;433&quot; unselectable=&quot;true&quot; status=&quot;2&quot; file=&quot;attachments/day_080829/20080829_9d6bffecd3a4e550b2b14zrowa69q3ND.png&quot; outfunc=&quot;null&quot; initialized=&quot;true&quot; thumbimg=&quot;1&quot; /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nagios自定义插件的编写规范&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Nagios&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B2%E5%BC%FE&quot;&gt;插件&lt;/span&gt;是可执行的&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%BD%C5%B1%BE&quot;&gt;脚本&lt;/span&gt;或者&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B3%CC%D0%F2&quot;&gt;程序&lt;/span&gt;，插件必须完成以下两个&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B9%A6%C4%DC&quot;&gt;功能&lt;/span&gt;：&lt;br /&gt;&lt;br /&gt;1、返回几个可能返回值中的一个&lt;br /&gt;2、至少返回一行文本输出&lt;br /&gt;&lt;br /&gt;Nagios并不关心插件的内部细节，你可以根据需要监控的情况，是TCP&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B7%FE%CE%F1&quot;&gt;服务&lt;/span&gt;，&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%CA%FD%BE%DD%BF%E2&quot;&gt;数据库&lt;/span&gt;，或者硬盘空间等等，等等来编写插件的代码。&lt;br /&gt;&lt;br /&gt;插件的返回值：&lt;br /&gt;&lt;br /&gt;Plugin Return Code &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Service State &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Host State&lt;br /&gt;0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; OK &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UP&lt;br /&gt;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WARNING &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UP or DOWN/UNREACHABLE*&lt;br /&gt;2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CRITICAL &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DOWN/UNREACHABLE&lt;br /&gt;3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UNKNOWN &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DOWN/UNREACHABLE&lt;br /&gt;&lt;br /&gt;插件的输出规范：&lt;br /&gt;&lt;br /&gt;插件至少返回一行文本，从Nagios 3开始，插件可以返回多行&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%CA%FD%BE%DD&quot;&gt;数据&lt;/span&gt;了，同时也可以返回一些&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%D0%D4%C4%DC&quot;&gt;性能&lt;/span&gt;数据。性能数据必须与其他的文本输出用&amp;quot;|&amp;quot;隔开。&lt;br /&gt;&lt;br /&gt;例子：&lt;br /&gt;&lt;br /&gt;DISK OK - free space: / 3326 MB (56%);&lt;br /&gt;&lt;br /&gt;如果用来检查一个service，这些将保存在$SERVICEOUTPUT$宏&lt;br /&gt;&lt;br /&gt;DISK OK - free space: / 3326 MB (56%); | /=2643MB;5948;5958;0;5968&lt;br /&gt;&lt;br /&gt;$SERVICEOUTPUT$将保存DISK OK - free space: / 3326 MB (56%); 而性能数据将保存在 $SERVICEPERFDATA$宏中。&lt;br /&gt;&lt;br /&gt;Nagios仅仅读取前4K字节的返回数据，如果你需要改变这个限制，要修改源代码中的include/&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=nagios&quot;&gt;nagios&lt;/span&gt;.h.in 中的MAX_PLUGIN_OUTPUT_LENGTH数值。&lt;/p&gt;&lt;p&gt;&lt;b&gt;三、配置 Nagios 监控 Oracle 服务器&lt;/b&gt;&lt;/p&gt;&lt;p&gt;配置 Nagios 监控 Oracle &lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B7%FE%CE%F1%C6%F7&quot;&gt;服务器&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%BB%B7%BE%B3&quot;&gt;环境&lt;/span&gt;：Oracle 10g&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; CentOS 5.2 x86_64&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;一、在 Oracle 所在&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B7%FE%CE%F1&quot;&gt;服务&lt;/span&gt;器上安装 NRPE&lt;/strong&gt;&lt;br /&gt;安装过程参考 Nagios NRPE 文档。&lt;br /&gt;&lt;br /&gt;注意点：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1.由于 nagios &lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%BD%C5%B1%BE&quot;&gt;脚本&lt;/span&gt;需要读取 oracle 相关&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%CE%C4%BC%FE&quot;&gt;文件&lt;/span&gt;。所以&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%D4%CB%D0%D0&quot;&gt;运行&lt;/span&gt; nagios 的用户需要定义为 oracle 服务用户。并且修改 /etc/xinted.d/nrpe 中的配置。&lt;/p&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div id=&quot;code0&quot;&gt;service nrpe&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;flags&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;= REUSE&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;socket_type&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;= stream&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;port&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;= 5666&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;wait&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;= no&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;user&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;= oracle&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;group&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;= nagios&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;server&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; = /usr/local/nagios/bin/nrpe&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;server_args&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;= -c /usr/local/nagios/etc/nrpe.cfg --inetd&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;log_on_failure&amp;nbsp;&amp;nbsp;+= USERID&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;disable&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;= no&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;only_from&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; = 192.168.100.62&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;2.给 oracle 用户在 ORACLE_HOME 目录下执行权限。&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0000&quot;&gt;ch&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=mod&quot;&gt;mod&lt;/span&gt; –Rf 740 $ ORACLE_HOME/*&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;3.修改 check_oracle 脚本。将 $ORACLE_HOME 以及 $PATH 手动加入，避免出现问题。&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;ORACLE_HOME=/u01/oracle/product/10.2.0/db_1&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;PATH=$PATH: /u01/oracle/product/10.2.0/db_1/bin&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;这么做是为了确保脚本可以正常执行 sqlplus 以及 tnsping 等&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%C3%FC%C1%EE&quot;&gt;命令&lt;/span&gt;。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;二、配置 nrpe 服务&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;修改 /usr/local/nagios/etc/nrpe.cfg 文件。加入以下内容：&lt;/p&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div id=&quot;code1&quot;&gt;#Check Oracle&lt;br /&gt;command[check_oracle_tns]=/usr/local/nagios/libexec/check_oracle --tns orcl&lt;br /&gt;command[check_oracle_db]=/usr/local/nagios/libexec/check_oracle --db orcl&lt;br /&gt;command[check_oracle_login]=/usr/local/nagios/libexec/check_oracle --login orcl&lt;br /&gt;command[check_oracle_&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=cache&quot;&gt;cache&lt;/span&gt;]=/usr/local/nagios/libexec/check_oracle --cache orcl system lkjsdf 80 90&lt;br /&gt;command[check_oracle_tablespace]=/usr/local/nagios/libexec/check_oracle --tablespace orcl system lkjsdf tab 90 80&lt;/div&gt;&lt;/div&gt;&lt;p&gt;具体参数写法请参考 check_oracle --help。&lt;br /&gt;&lt;br /&gt;配置完成后，重启 xinetd 服务。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;三、配置 Nagios 服务端&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;1.安装 nrpe 脚本支持。---参考官方文档。&lt;br /&gt;2.添加 nrpe 命令配置。修改 nagios/etc/objects/command.cfg 文件：&lt;/p&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div id=&quot;code2&quot;&gt;define command {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;command_name check_nrpe&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;3.在 nagios/etc/objects 添加oracle 主机配置文件。oracle.cfg 。&lt;/p&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div id=&quot;code3&quot;&gt;define host {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;use&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=linux&quot;&gt;linux&lt;/span&gt;-server&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;host_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; oracle&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;alias&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Oracle 10g&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;address&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;192.168.100.63&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;define service {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;use&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; generic-service&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;host_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; oracle&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;service_description&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;TNS Check&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;check_command&amp;nbsp; &amp;nbsp;check_nrpe!check_oracle_tns&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;define service {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;use&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; generic-service&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;host_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; oracle&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;service_description&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;DB Check&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;check_command&amp;nbsp; &amp;nbsp;check_nrpe!check_oracle_db&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;define service {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;use&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; generic-service&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;host_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; oracle&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;service_description&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Login Check&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;check_command&amp;nbsp; &amp;nbsp;check_nrpe!check_oracle_login&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;define service {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;use&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; generic-service&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;host_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; oracle&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;service_description&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Cache Check&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;check_command&amp;nbsp; &amp;nbsp;check_nrpe!check_oracle_cache&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;define service {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;use&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; generic-service&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;host_name&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; oracle&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;service_description&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Tablespace Check&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;check_command&amp;nbsp; &amp;nbsp;check_nrpe!check_oracle_tablespace&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4．验证配置文件无误后重启 nagios 服务。&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;./bin/nagios -v etc/nagios.cfg&lt;br /&gt;service nagios restart&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;效果图：&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.517sou.net/Attach/month_1005/x2q5bg_104836_3.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1005/jpm353_104840_4.png&quot; width=&quot;400&quot; height=&quot;249&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NRPE 以及 Nagios-Plugin 安装文件见附件包内。NRPE 官方文档也包含在附件包呢。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;备注：&lt;/strong&gt;&lt;br /&gt;图中 Tablespace check 还没有细调，用了错误的 table 名。&lt;br /&gt;通过修改脚本还可以监视临时表空间。&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=Google&quot;&gt;Google&lt;/span&gt; Doc 共享&lt;br /&gt;&lt;a href=&quot;http://docs.google.com/Doc?id=dfg4v6m3_104gf3bjfjx&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://docs.google.com/Doc?id=dfg4v6m3_104gf3bjfjx&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/nagios_configuration_guide.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/455/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/nagios_configuration_guide.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/455/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/perl_module_installation_and_common_module.aspx</link>
		<title>perl--模块安装方法和常用模块</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Tue, 25 May 2010 08:18:40 GMT</pubDate>
		<description>&lt;p&gt;perl--模块安装方法和常用模块&lt;br /&gt;&amp;nbsp;&lt;br /&gt;CPAN（Comprehensive　Perl　Archive　Network）是internet上Perl模块最大的集散地，包含了现今公布的几乎所有的perl模块。网址：&lt;a href=&quot;http://www.cpan.org/&quot; target=&quot;_blank&quot;&gt;http://www.cpan.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://search.cpan.org/&quot; target=&quot;_blank&quot;&gt;http://search.cpan.org/&lt;/a&gt;，可以查找任何一个模块并提供下载&lt;/p&gt;&lt;p&gt;Linux/Unix---perl模块的安装方法&lt;/p&gt;&lt;p&gt;Linux/Unix下安装Perl模块有两种方法：手工安装和自动安装。第一种方法是从CPAN上下载您需要的模块，手工编译、安装。第二种方法是联上internet，使用一个叫做CPAN的模块自动完成下载、编译、安装的全过程。&lt;/p&gt;&lt;p&gt;&lt;b&gt;A.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 手工安装&lt;/b&gt;&lt;/p&gt;&lt;p&gt;从CPAN下载了安装模块的压缩文件，假设放在/usr/local/src（一般需要编译安装的软件，都放在此目录下安装）。　&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;#&amp;nbsp;cd　/usr/local/src　&amp;nbsp;　&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;#&amp;nbsp;tar　xvzf　x.x.tar.gz　&amp;nbsp;　&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;#&amp;nbsp;cd　x.x&amp;nbsp;　&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;#&amp;nbsp;perl　Makefile.PL&amp;nbsp;(生成makefile)&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;#&amp;nbsp;make&amp;nbsp;#(建立模块)&amp;amp;&amp;amp;&amp;nbsp;make　test&amp;nbsp;(测试模块)&amp;nbsp;&amp;nbsp;如果测试结果报告“all　test　ok”，您就可以放心地安装编译好的模块了。　&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;#&amp;nbsp;make　install　&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;注意：上述步骤适合于Linux/Unix下绝大多数的Perl模块。可能还有少数模块的安装方法略有差别，安装前，先看一下目录里的README或INSTALL。&lt;/p&gt;&lt;p&gt;&lt;b&gt;B.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 自动安装：&lt;/b&gt;&lt;br /&gt;安装前需要先联上线，并且您需要取得root权限。　 &lt;br /&gt;perl　-MCPAN　-e　shell　 &lt;br /&gt;初次运行CPAN时需要做一些设置，如果您的机器是直接与internet相联（拨号上网、专线，etc.），那么一路回车就行了，只需要在最后选一个离您最近的CPAN镜像站点。　 &lt;br /&gt;cpan&amp;gt;h&amp;nbsp; （获得帮助）　&amp;nbsp; &lt;br /&gt;cpan&amp;gt;m （列出CPAN上所有模块的列表）　 &lt;br /&gt;cpan&amp;gt;install　module_name　（自动完成从下载到安装的全过程。）　&amp;nbsp; &lt;br /&gt;cpan&amp;gt;q　（安装完，后退出）&lt;/p&gt;&lt;p&gt;常用模块：&lt;/p&gt;&lt;p&gt;(1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Net::FTP &lt;br /&gt;(2) Net::Telnet &lt;br /&gt;(3) LWP::Simple, get() &lt;br /&gt;(4) Expect &lt;br /&gt;(5) XML::Simple, XMLin() &lt;br /&gt;(6) Data::Dumper, Dumper() &lt;br /&gt;(7) IO::Socket &lt;br /&gt;(8) Date::Manip, DateCalc(), UnixDate() &lt;br /&gt;(9) Date::Manip, Date_Cmp() &lt;br /&gt;(10) File::Find, find() &lt;br /&gt;(11) ExtUtils::Installed, new(), modules(), version() &lt;br /&gt;(12) DBI, connect(), prepare(), execute(), fetchrow_array() &lt;br /&gt;(13) Getopt::Std &lt;br /&gt;(14) Proc::ProcessTable &lt;br /&gt;(15) Shell &lt;br /&gt;(16) Time::HiRes, sleep(), time() &lt;br /&gt;(17) HTML::LinkExtor, links(), parse_file() &lt;br /&gt;(18) Net::Telnet, open(), print(), getline() &lt;br /&gt;(19) Compress::Zlib, gzopen(), gzreadline(), gzclose() &lt;br /&gt;(20) Net::POP3, login(), list(), get() &lt;br /&gt;(21) Term::ANSIColor &lt;br /&gt;(22) Date::Calc Calendar(), Today() &lt;br /&gt;(23) Term::Cap, Tgetend(), Tgoto, Tputs() &lt;br /&gt;(24) HTTPD::Log::Filter &lt;br /&gt;(25) Net::LDAP &lt;br /&gt;(26) Net::SMTP mail(), to(), data(), datasend(), auth() &lt;br /&gt;(27) MIME::Base64, encode_base64(), decode_base64() &lt;br /&gt;(28) Net::IMAP::Simple, login(), mailboxes(), select(), get()... &lt;br /&gt;(29) Bio::DB::GenBank, Bio::SeqIO &lt;br /&gt;(30) Spreadsheet::ParseExcel &lt;br /&gt;(31) Text::CSV_XS, parse(), fields(), error_input() &lt;br /&gt;(32) Benchmark&lt;/p&gt;&lt;p&gt;了解这些模块功能以及具体使用方法，可以去&lt;a href=&quot;http://search.cpan.org/&quot; target=&quot;_blank&quot;&gt;http://search.cpan.org/&lt;/a&gt; 查看。&lt;br /&gt;&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/perl_module_installation_and_common_module.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/449/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/perl_module_installation_and_common_module.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/449/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/socks5_installation_and_configuration.aspx</link>
		<title>安装配置 Socks5 服务</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Fri, 21 May 2010 02:48:43 GMT</pubDate>
		<description>&lt;p&gt;&lt;strong&gt;&lt;font color=&quot;#00ccff&quot;&gt;1. 配置 Socks5 编译环境&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;yum -y install gcc automake autoconf libtool make&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;font color=&quot;#00ccff&quot;&gt;2. 安装 Socks5 必要的包&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;yum -y install pam-devel openldap-devel cyrus-sasl-devel&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;font color=&quot;#00ccff&quot;&gt;&lt;strong&gt;3.下载，编译安装 Socks5 &lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;到此下载 http://sourceforge.net/projects/ss5/files/&lt;/p&gt;&lt;p&gt;http://ss5.sourceforge.net/&lt;/p&gt;&lt;p&gt;官方实例&lt;/p&gt;&lt;p&gt;http://ss5.sourceforge.net/examples.htm&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color=&quot;#00ccff&quot;&gt;请安装 ss5-3.6.4-3.tar.gz 而不要安装新版，不然会有严重错误！=&amp;gt;?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;wget -c http://downloads.sourceforge.net/project/ss5/ss5/3.6.4-3/ss5-3.6.4-3.tar.gz&lt;br /&gt;tar zxvf ss5-3.6.4-3.tar.gz&lt;br /&gt;cd ss5-3.6.4&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;make install&lt;/div&gt;&lt;/div&gt;&lt;p&gt;有点 BUG 需要我们手工修正一下&lt;br /&gt;&lt;strong&gt;&lt;font color=&quot;#00ccff&quot;&gt;# vi /etc/rc.d/init.d/ss5&lt;/font&gt;&lt;/strong&gt; 找到38行&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;/usr/local/sbin/ss5&lt;/div&gt;&lt;/div&gt;&lt;p&gt;改为&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;/usr/sbin/ss5&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;font color=&quot;#00ccff&quot;&gt;# vi /etc/rc.d/init.d/ss5&lt;/font&gt;&lt;/strong&gt; 找到40行&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;echo &amp;quot;done&amp;quot;&lt;br /&gt;;;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;改成&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;echo &amp;quot;done&amp;quot;&lt;br /&gt;fi&lt;br /&gt;;;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;看下我修改后的对比&lt;br /&gt;&lt;a class=&quot;lightbox&quot; href=&quot;http://www.517sou.net/Attach/month_1005/z57ha2_105014_1.png&quot; jquery1267716250509=&quot;2&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-1706&quot; title=&quot;centos5_ss5_1&quot; alt=&quot;CentOS 5 安装配置 Socks5 服务 centos5 ss5 1&quot; src=&quot;http://www.517sou.net/Attach/month_1005/z57ha2_105014_1.png&quot; width=&quot;562&quot; height=&quot;362&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a class=&quot;lightbox&quot; href=&quot;http://www.517sou.net/Attach/month_1005/gdcdyg_105014_2.png&quot; jquery1267716250509=&quot;3&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-1707&quot; title=&quot;centos5_ss5_2&quot; alt=&quot;CentOS 5 安装配置 Socks5 服务 centos5 ss5 2&quot; src=&quot;http://www.517sou.net/Attach/month_1005/gdcdyg_105014_2.png&quot; width=&quot;562&quot; height=&quot;362&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color=&quot;#00ccff&quot;&gt;4. 启动ss5服务&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;/etc/init.d/ss5 start&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;font color=&quot;#00ccff&quot;&gt;5. 添加 ss5 到服务中，并随机启动&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;chkconfig --add ss5&lt;br /&gt;chkconfig ss5 on&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;font color=&quot;#00ccff&quot;&gt;&lt;strong&gt;6. 刪除Socks V4模块&lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;改名为 mod_socks4.so.bk&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mv /usr/lib/ss5/mod_socks4.so /usr/lib/ss5/mod_socks4.so.bk&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;font color=&quot;#00ccff&quot;&gt;&lt;strong&gt;7. 添加 SS5 用户&lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;ss5 默认使用1080端口，并允许任何人使用。&lt;br /&gt;我们可以修改 &lt;strong&gt;&lt;font color=&quot;#00ccff&quot;&gt;/etc/opt/ss5/ss5.conf&lt;/font&gt;&lt;/strong&gt; 中的&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;# SHost SPort Authentication&lt;br /&gt;#&lt;br /&gt;auth 0.0.0.0/0 - -&lt;/div&gt;&lt;/div&gt;&lt;p&gt;为&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;# SHost SPort Authentication&lt;br /&gt;#&lt;br /&gt;auth 0.0.0.0/0 - u&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在 &lt;strong&gt;&lt;font color=&quot;#00ccff&quot;&gt;/etc/opt/ss5/ss5.passwd&lt;/font&gt;&lt;/strong&gt; 中添加 用户名和密码 如：&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;test test&lt;/div&gt;&lt;/div&gt;&lt;p&gt;使用用户验证，重启ss5服务&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;/etc/init.d/ss5 restart&lt;/div&gt;&lt;/div&gt;&lt;p&gt;修改启动文件，改日志不保存&lt;br /&gt;在ss5启动时添加一个-m的参数，这个参数使系统不再记录ss5的日志。&lt;br /&gt;改ss5端口，格式为-b ip地址:端口&lt;/p&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;vi /etc/rc.d/init.d/ss5&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;&lt;p&gt;start)&lt;br /&gt;&amp;nbsp;&amp;nbsp; # Start daemon.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; echo -n &amp;quot;Starting ss5... &amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if [ $OS = &amp;quot;Linux&amp;quot; ] || [ $OS = &amp;quot;SunOS&amp;quot; ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp; /usr/sbin/ss5 -m -t -b 91.207.192.35:2080&lt;br /&gt;&amp;nbsp;&amp;nbsp; touch /var/lock/subsys/ss5&lt;br /&gt;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp; /usr/local/sbin/ss5 -m -t -b 91.207.192.35:2080&lt;br /&gt;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;&amp;nbsp;&amp;nbsp; echo &amp;quot;done&amp;quot;&lt;/p&gt;&lt;p&gt;有不少安装配置sock5服务器的的需求, 那就开始准备安装吧&lt;/p&gt;&lt;p&gt;首先到http://ss5.sourceforge.net/software.htm去下载最新的for linux版本&lt;br /&gt;目前是:ss5-3.6.4-3.tar.gz&lt;br /&gt;# tar xvf ss5-3.6.4-3.tar.gz&lt;br /&gt;# cd ss5-3.6.4&lt;br /&gt;# ./configure&lt;br /&gt;结果可能看到错误, 因为我就碰到了&lt;br /&gt;&lt;br /&gt;checking security/pam_misc.h usability... no&lt;br /&gt;checking security/pam_misc.h presence... no&lt;br /&gt;checking for security/pam_misc.h... no&lt;br /&gt;configure: error: *** Some of the headers weren&apos;t found ***&lt;br /&gt;缺某些库文件, 我看到和pam有关的, 是pam-devel包&lt;br /&gt;# yum -y install pam-devel&lt;br /&gt;# make&lt;br /&gt;# make install&lt;br /&gt;make install之后没有任何显示, 这其实已经安装完毕了, 不必疑惑&lt;br /&gt;修改配置文件:&lt;br /&gt;/etc/opt/ss5/ss5.conf&lt;br /&gt;修改这行:&lt;br /&gt;auth 0.0.0.0/0 - -&lt;br /&gt;改成:&lt;br /&gt;auth 0.0.0.0/0 - u&lt;br /&gt;然后在/etc/opt/ss5/ss5.passwd中, 一行一个用户+密码&lt;br /&gt;# cat ss5.passwd&lt;br /&gt;hao32 123456&lt;/p&gt;&lt;p&gt;# /etc/rc.d/init.d/ss5 start&lt;br /&gt;报错&lt;br /&gt;/etc/rc.d/init.d/ss5: line 41: syntax error near unexpected token `;;&apos;&lt;br /&gt;/etc/rc.d/init.d/ss5: line 41: ` ;;&apos;&lt;br /&gt;vi下看看41行, 在;;之前少了结束fi&lt;/p&gt;&lt;p&gt;38 /usr/local/sbin/ss5 -t&lt;br /&gt;39 fi&lt;br /&gt;40 echo &amp;quot;done&amp;quot;&lt;br /&gt;41 fi&lt;br /&gt;42 ;;&lt;/p&gt;&lt;p&gt;继续# /etc/rc.d/init.d/ss5 start&lt;br /&gt;38行又报错... 说没有这个目录或者文件:/usr/local/sbin/ss5 -_-! 开始对ss5的开发者有点意见, 但是人家也那么辛苦, 就立即打消了此等想法, 并且内心抽了自己几巴掌&lt;br /&gt;把/usr/local/sbin/ss5换成了/usr/sbin/ss5&lt;/p&gt;&lt;p&gt;# /etc/rc.d/init.d/ss5 start&lt;br /&gt;doneting ss5... [ OK ]&lt;/p&gt;&lt;p&gt;再重启下看看:&lt;br /&gt;# /etc/rc.d/init.d/ss5 restart&lt;br /&gt;Restarting ss5... Shutting down ss5...&lt;br /&gt;done [ OK ]&lt;br /&gt;doneting ss5... [ OK ]&lt;/p&gt;&lt;p&gt;看来没啥问题, 过了, 现在你就可以使用服务器的IP, 端口1080, 用户hao32, 密码123456来测试你的socks5服务器了, 更多高级应用, 就参加ss5.conf, 里面有详细的说明.&lt;/p&gt;&lt;p&gt;为了使用Cute-FTP,除了IP伪装的方法外，就要使用Socks代理，现在让我们来看看配置Socks5的过程：&lt;/p&gt;&lt;p&gt;1. 下载文件&lt;br /&gt;&amp;nbsp;&amp;nbsp; 从&lt;a href=&quot;http://www.socks.nec.com/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;www.socks.nec.com&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;下载最新版的socks5源文件到/tmp目录下。socks5-v1.0r11.tgz&lt;/p&gt;&lt;p&gt;2. 在防火墙上编译并安装（该防火墙应直接连至internet,是安装了两块网卡的双宿主机，假设内部网段为192.168.0.0/24)&lt;/p&gt;&lt;p&gt;cd /tmp&lt;br /&gt;tar -xvfz socks5-v1.0r11.tgz&lt;/p&gt;&lt;p&gt;cd /tmp/socks5-v1.0r11&lt;br /&gt;./configure --with-threads&lt;br /&gt;make&lt;br /&gt;make install&lt;/p&gt;&lt;p&gt;3. 配置文件/etc/socks5.conf&lt;/p&gt;&lt;p&gt;# /etc/socks5.conf&lt;br /&gt;set SOCKS5_MAXCHILD 3&lt;br /&gt;set SOCKS5_NOIDENT&lt;br /&gt;set SOCKS5_TIMEOUT 5&lt;/p&gt;&lt;p&gt;interface 192.168.0. - eth1&lt;br /&gt;auth 192.168.0. - u&lt;br /&gt;permit u - 192.168.0. - - - jephe&lt;br /&gt;permit u - 192.168.0. - - - jack&lt;br /&gt;deny - - - - - - -&lt;/p&gt;&lt;p&gt;4. 配置文件/etc/socks5.passwd&lt;/p&gt;&lt;p&gt;# /etc/socks5.passwd&lt;br /&gt;jephe password_of_jephe_is_here&lt;br /&gt;jack password_of_jephe_is_here&lt;/p&gt;&lt;p&gt;5.开始测试&lt;br /&gt;/usr/local/bin/socks5 -f -s&lt;br /&gt;&amp;nbsp;&amp;nbsp; 如果出现下面的信息表示测试成功。&lt;br /&gt;18210: Socks5 starting at Mon Dec 14 18:23:45 1998 in normal mode&lt;/p&gt;&lt;p&gt;然后退出socks5,开始正式运行它在背景模式：&lt;/p&gt;&lt;p&gt;6. 正式运行&lt;/p&gt;&lt;p&gt;/usr/local/bin/socks5 -t -s 2&amp;gt; /var/log/socks5&lt;/p&gt;&lt;p&gt;7. 最后，加到/etc/rc.d/rc.local&lt;br /&gt;echo &amp;quot;/usr/local/bin/socks5 -t -s 2&amp;gt; /var/log/socks5&amp;quot; &lt;br /&gt;&amp;gt;&amp;gt; /etc/rc.d/rc.local&lt;/p&gt;&lt;p&gt;Sock5代理服务端软件，socks5-v1.0r11.tar.gz，socks5-v1.0r11-patched.tar.gz，N久前下的，以前也试着装了，后来没怎么用也就忘了到底用哪个了。&lt;/p&gt;&lt;p&gt;使用后者估计好一点。有个下载地址&lt;a href=&quot;http://ftp.lwfs.net/pub/src/socks5-v1.0r11.patched.tar.gz&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://ftp.lwfs.net/pub/src/socks5-v1.0r11.patched.tar.gz&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;先是安装，一路下来,&lt;/p&gt;&lt;p&gt;./configure 默认装到/usr/local下面&lt;/p&gt;&lt;p&gt;make&lt;/p&gt;&lt;p&gt;make install&lt;/p&gt;&lt;p&gt;make clean&lt;/p&gt;&lt;p&gt;make distclean&lt;/p&gt;&lt;p&gt;安装好后，usr/local/bin下面有个socks5程序，运行这个就是运行socks5服务端了。&lt;/p&gt;&lt;p&gt;下面开始配置，配置文件放在/etc/下，叫做socks5.conf，如果没有，需要自己建一个。&lt;/p&gt;&lt;p&gt;安装包中带有examples，比较简单，解释也少。还是需要上网google一把。&lt;/p&gt;&lt;p&gt;典型配置（有用户认证，可控制用户访问IP或网段，单跳代理）：&lt;/p&gt;&lt;p&gt;socks5.conf的配置：&lt;/p&gt;&lt;p&gt;# A Socks5 Config file for a normal , single homed server&lt;/p&gt;&lt;p&gt;# 支持用户权限认证，访问需要用户名口令。&lt;/p&gt;&lt;p&gt;auth - - u&lt;/p&gt;&lt;p&gt;# 控制用户访问网段，下面的的意思是满足192.168.1.*的用户都可以访问&lt;/p&gt;&lt;p&gt;permit u - 192.168.1. - - -&lt;/p&gt;&lt;p&gt;用户名和口令配置文件：&lt;/p&gt;&lt;p&gt;/etc/socks5.passwd&lt;/p&gt;&lt;p&gt;username1 passwd1&lt;/p&gt;&lt;p&gt;username2 passwd2&lt;/p&gt;&lt;p&gt;简单配置完成。&lt;/p&gt;&lt;p&gt;启动sock5服务器，运行：/usr/local/bin/socks5 –t&lt;/p&gt;&lt;p&gt;默认为1080端口，如果要指定端口，那么运行 /usr/local/bin/socks5 –b 2007 –t&lt;/p&gt;&lt;p&gt;(注意是b，不是p。)&lt;/p&gt;&lt;p&gt;关闭socks5服务进程，运行：/usr/local/bin/stopsocks –KILL&lt;/p&gt;&lt;p&gt;关闭的是使用默认端口的启动方法，如果是指定端口的启动，那么同样需要指定端口关闭。&lt;/p&gt;&lt;p&gt;/usr/local/bin/stopsocks –p 2007 –KILL&lt;/p&gt;&lt;p&gt;连接socks服务器使用sockscap，访问站点&lt;a href=&quot;http://www.socks.nec.com/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.socks.nec.com/&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;，这个网址不知道还有没有得下了，总之这是很老很有名的软件了。&lt;/p&gt;&lt;p&gt;填写socks服务器IP和端口后，在设置中选择socks版本5，域名解析看情况，一般本地解析会好一点，速度快，但是对于一些连接域名都找不到的只好尝试远程解析，不确定的可以选先尝试由本地端再由远端解析。支持用户名/密码。打上勾。有用户名密码设置中输入后确认。&lt;/p&gt;&lt;p&gt;然后点一下新建，在命令行中浏览要运行的文件名，工作目录最好也设进去，标识项名称吗随便填什么都行，只要自己知道。添加后在面板区出现运行文件的图标，选中点运行或双击就可以了。&lt;/p&gt;&lt;p&gt;socks5还有很多配置方式，帖上来慢慢研究。&lt;/p&gt;&lt;p&gt;如果你不想把密码文件存在默认的/etc/socks5.passwd里。想存在自定义的文件，比如/etc/qq.passwd&lt;/p&gt;&lt;p&gt;那就得修改/etc/socks5.conf.添加一项参数&lt;/p&gt;&lt;p&gt;set SOCKS5_PWDFILE /etc/qq.passwd&lt;/p&gt;&lt;p&gt;&lt;br /&gt;ok！重启一下服务，这时如果不输入正确的用户名和密码是使用不了socks5代理服务器的，输入正确的用户名和密码便可使用。&lt;/p&gt;&lt;p&gt;以上说的参数，大家可以结合使用，比如限制某个IP段使用socks5服务，而且要使用用户名验证&lt;/p&gt;&lt;p&gt;另外针对/etc/socks5.conf还有一些参数，大家就自己去研究吧&lt;/p&gt;&lt;p&gt;set SOCKS5_BINDINFC 192.168.0.8:1080&lt;/p&gt;&lt;p&gt;忽略ident请求。当客户机没有运行identd时，使用SOCKS5_NOIDENT将降低超时值 &lt;br /&gt;set SOCKS5_NOIDENT&lt;/p&gt;&lt;p&gt;指定连接停顿最长时间。超过最大值后，socks5断开连接 &lt;br /&gt;set SOCKS5_TIMEOUT 15&lt;/p&gt;&lt;p&gt;socks5将接受SOCKS V4 协议的请求,默认不接受 &lt;br /&gt;set SOCKS5_V4SUPPORT&lt;/p&gt;&lt;p&gt;指定同时存在的最大子进程数,Socks5预设为64 &lt;br /&gt;set SOCKS5_MAXCHILD 4&lt;/p&gt;&lt;p&gt;Socks5.conf – socks5 daemon 的配置文件&lt;/p&gt;&lt;p&gt;SYNOPSIS &lt;br /&gt;Socks5 daemon通常从/etc/socks5.conf读配置文件。但如果你编译socks5时用了 –with-srvconffile=filename参数，你可以改变文件目录。如果系统是FreeBSD，配置文件缺省是 /usr/local/etc/socks5.conf。&lt;/p&gt;&lt;p&gt;DESCRIPTION &lt;br /&gt;Socks5 daemon 启动时或收到一个HUP信号时，都读此配置文件。配置文件保存以下信息： &lt;br /&gt;- 连接地址的接口。 &lt;br /&gt;- 什么情况下服务器直接连接到一个地址。 &lt;br /&gt;- 什么情况下服务器使用另一个代理服务器。 &lt;br /&gt;- 请求一个代理连接的必要要求。 &lt;br /&gt;配置文件分成六部分： &lt;br /&gt;- ban host &lt;br /&gt;- authentication &lt;br /&gt;- interfaces &lt;br /&gt;- variables and flags &lt;br /&gt;- proxies &lt;br /&gt;- access control&lt;/p&gt;&lt;p&gt;在每部分中，socks5 daemon 顺序的读每一行，直到遇到了匹配行。各部分的顺序和各部分中行的顺序是非常重要的。一行中的每个条目都必须匹配。&lt;/p&gt;&lt;p&gt;BAN HOST ENTRIES &lt;br /&gt;Ban host entries 使用如下语法识别socks5 daemon 不允许连接的主机： &lt;br /&gt;ban source-host source-port &lt;br /&gt;ban 不允许授权。 &lt;br /&gt;source-host 必须是一个有效的hostpattern。 &lt;br /&gt;source-port 必须是一个有效的portpattern。 &lt;br /&gt;socks5 daemon 拒绝从source-host 的source-port发起的连接。&lt;/p&gt;&lt;p&gt;AUTHENTICATION ENTRIES &lt;br /&gt;Authentication entries 确定socks5 daemon的身份验证方式。使用如下语法： &lt;br /&gt;auth source-host source-port auth-methods &lt;br /&gt;auth 指出此条目是一条身份验证条目。 &lt;br /&gt;source-host 必须是一个有效的hostpattern。 &lt;br /&gt;source-port 必须是一个有效的portpattern。 &lt;br /&gt;auth-methods 必须是一种有效的authpattern。 &lt;br /&gt;socks5 daemon 使用auth-methods 验证source-host 的 source-port 的连接请求。&lt;/p&gt;&lt;p&gt;配置文件没有auth项时，任何身份认证都可以工作。忽略auth项等效于指定认 证方式为auth – (任意认证方式)。如果使用auth项，不匹配的客户将被拒绝。 &lt;br /&gt;Socks5 daemon 不要求身份认证时，它收不到用户信息，除非socks5配置为要求ident 响应。使用SOCKS5_DEMAND_IDENT环境变量要求ident响应。请参考socks5(1)得到完全的socks5环境变量的列表。 &lt;br /&gt;如果socks5 daemon 要使用Username/Password身份认证，并且有socks4客户要使用此服务器，设置授权顺序为n,u。对于socks5的客户端，socks5 daemon 先使用 Username/Password 身份认证。 &lt;br /&gt;Socks5 daemon 以逆序检查auth-methods子段。从最后一个auth-method开始。&lt;/p&gt;&lt;p&gt;INTERFACE ENTRIES &lt;br /&gt;如果一台机器有多个接口，多个IP地址，多数情况下，管理员使socks5使用特定的接口和特定的地址。通过指定内部主机使用向内的接口，外部主机使用向 外的接口，可以防止外部主机冒充内部主机。同时要求socks5决定当接受一个bind或发送一个sendto时，使用哪一个接口去bind。当 socks5在配置文件中没有发现匹配项时，它使用INADDR_ANY 去bind,这意味着在任意接口接受连接。Single-homed（单宿）主机不要求interface项。只有多接口主机才要求有interface 项。interface 项使用如下格式：&lt;/p&gt;&lt;p&gt;interface hostpattern portpattern interface-address &lt;br /&gt;I &lt;br /&gt;interface 标志一个interface项 &lt;br /&gt;hostpattern 指定可以连接的源或目标主机 &lt;br /&gt;portpattern 指定可以连接的源或目标端口 &lt;br /&gt;interface-address 标志IP地址或接口名，例如：eth0&lt;/p&gt;&lt;p&gt;interface项代替以前版本的route项。当前版本两者等价。在将来的版本，route项将不被支持。&lt;/p&gt;&lt;p&gt;VARIABLE ENTRIES&lt;/p&gt;&lt;p&gt;variables 和 flags 控制系统纪录文件的数量和类型。语法如下： &lt;br /&gt;set variable value &lt;br /&gt;set 指定内部使用的初始环境变量。请参考socks5(1) ENVIRONMENT部分。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;PROXY ENTRIES &lt;br /&gt;Proxy 项指定daemon通过socks server 连接到特定主机。配置文件没有此项的话，daemon将直接连接到特定主机。语法如下： &lt;br /&gt;proxy-type dest-host dest-port proxy-list&lt;/p&gt;&lt;p&gt;proxy-type 指定proxy server类型。有效值如下： &lt;br /&gt;socks5 SOCKSv5 &lt;br /&gt;socks4 SOCKS version 4 &lt;br /&gt;noproxy 直接连接&lt;/p&gt;&lt;p&gt;dest-host 必须是有效的hostpattern &lt;br /&gt;dest-port 必须是有效的portpattern &lt;br /&gt;proxy-list 必须是有效的proxypattern&lt;/p&gt;&lt;p&gt;daemon使用proxy-list中的server连接到dest-host的dest-port。Proxy-list中的server必须符合proxy-type.。&lt;/p&gt;&lt;p&gt;ACCESS CONTROL ENTRIES &lt;br /&gt;access control 部分决定daemon允许或拒绝连接请求。如果是access control项不匹配的连接请求，即使是已授权主机也不能建立连接。语法如下： &lt;br /&gt;permit auth cmd src-host dest-host src-port dest-port [usr-list] &lt;br /&gt;deny auth cmd src-host dest-host src-port dest-port [user-list]&lt;/p&gt;&lt;p&gt;auth 必须是有效的authpattern并且指定授权方式列表。 &lt;br /&gt;cmd 必须是有效的authpattern，指定src-host上的客户可以在dest-host上执行的命令。 &lt;br /&gt;src-port 必须是有效的portpattern &lt;br /&gt;dest-port 必须是有效的portpattern &lt;br /&gt;user-list 必须是有效的userpattern&lt;/p&gt;&lt;p&gt;&lt;br /&gt;PATTERNS&lt;/p&gt;&lt;p&gt;hostpattern &lt;br /&gt;socks5使用ip地址和掩码的方式，格式如下： &lt;br /&gt;hostip/mask 标准ip加掩码方式 &lt;br /&gt;- 匹配所有主机 &lt;br /&gt;n1. 等价于n1.0.0.0/255.0.0.0 &lt;br /&gt;ni.n2. 等价于ni.n2.0.0/255.255.0.0 &lt;br /&gt;n1.n2.n3. 等价于ni.n2.n3.0/255.255.255.0 &lt;br /&gt;.domain.name 主机名必须以.domain.name结尾 &lt;br /&gt;a.host.name 主机名必须为a.host.name &lt;br /&gt;如果使用域名，SOCKS5_REVERSEMAP必须被设置。因为hostnames和domains依赖于DNS,所以推荐使用ip地址加掩码的方式。有很多种情况会导致逆向DNS查询工作不正常。 &lt;br /&gt;socks5.conf也支持老的hostpattern语法，我们推荐使用新的语法，新的语法可读性强。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;portpattern &lt;br /&gt;用服务名，数字或范围指定端口。中括号包括边界，圆括号不包括边界。指定范围用两个数字或服务名，中间用逗号隔开，没有空格。语法如下： &lt;br /&gt;tftp tftp的服务端口，通常是69 &lt;br /&gt;80 端口80 &lt;br /&gt;- 所有端口 &lt;br /&gt;[100，1000] 端口100到1000 &lt;br /&gt;（100，1000） 端口101到999 &lt;br /&gt;(100,1000) 端口101到1000&lt;/p&gt;&lt;p&gt;&lt;br /&gt;authpattern &lt;br /&gt;指定认证类型，socks5 daemon用逆序检查授权方式。语法如下： &lt;br /&gt;n 没有认证 &lt;br /&gt;u Username/Password &lt;br /&gt;k Kerberos 5(GSS-API) &lt;br /&gt;- 任何认证方式 &lt;br /&gt;后面的认证方式优先级比前面的高，如果你输入： &lt;br /&gt;n,u,k &lt;br /&gt;server 先请求Kerberos认证，如果socks5 client没有安装使用Kerberos,server使用Username/Password 认证。因为SOCKS4 client 不能使用Kerberos 或Username/Password 认证方式。Serverz对SOCKS4 client不要求认证。&lt;/p&gt;&lt;p&gt;如果输入：n,k,u &lt;br /&gt;server先请求Username/Password认证。&lt;/p&gt;&lt;p&gt;commandpattern &lt;br /&gt;指定命令，可用逗号分开，中间没有空格。Socks5.conf识别如下命令： &lt;br /&gt;c connect &lt;br /&gt;b bind &lt;br /&gt;u UDP &lt;br /&gt;p ping &lt;br /&gt;t traceroute &lt;br /&gt;- 所有命令&lt;/p&gt;&lt;p&gt;userpattern &lt;br /&gt;可用逗号隔开指定多个用户，用户类型必须匹配认证方式。例如，如果你使用Username/Password认证，socks5 daemon认为你是socks5用户，如果你使用Kerberos 认证，socks5 daemon 认为你是Kerberos 用户。一个短横线，“-”，匹配所有用户。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;proxypattern &lt;br /&gt;顺序指定服务器，用逗号分开。只有当前面的server无效时，客户才使用后面的server。&lt;/p&gt;&lt;p&gt;EXAMPLES &lt;br /&gt;请参考examples目录获得更多的信息。 &lt;br /&gt;auth - - k &lt;br /&gt;permit k – 111.111.111. - - - &lt;br /&gt;只有Kerberos认证的C网111.111.111.0用户能使用这个server。&lt;/p&gt;&lt;p&gt;socks5 - - s5srv1,s5srv2 &lt;br /&gt;permit - - .mydomain.com - - - &lt;br /&gt;所有的socks5连接请求都通过s5srv1。如果s5srv1不可用，所有的socks5连接请求通过s5srv2。只有.mydomain.com的客户可使用此服务器。 &lt;br /&gt;auth otherserver – k &lt;br /&gt;noproxy .internal.net.com – &lt;br /&gt;socks5 - - otherserver &lt;br /&gt;permit - - .internal.net.com - - - &lt;br /&gt;permit k – otherserver - - - &lt;br /&gt;.internal.net.com的客户可使用server,不要求Kerberos认证。Socks5 server可以直接连接到 .internal.net.com。并且为其它主机通过otherserver代理。otherserver也是socks5 server，要使用此代理，必须使用Kerberos认证。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;POOR CONFIGURATIONS &lt;br /&gt;如同其它软件的情况一样，处于安全的理由，适当的配置是必须的。如下行： &lt;br /&gt;permit - - - - - - &lt;br /&gt;是不应该使用的。如果使用这样的设置，怀有恶意的用户可以使用这个socks5 server作为他们的跳板去攻击别的系统。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;SEE ALSO &lt;br /&gt;Socks5(1),libsocks5.conf(5),sockd4_to_5.pl(1)&lt;/p&gt;&lt;p&gt;AUTHORS &lt;br /&gt;NWSL SOCKS5 Development Team&lt;/p&gt;&lt;p&gt;Send comments to &lt;a href=&quot;mailto:socks5-comments@socks.nec.com&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;socks5-comments@socks.nec.com&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</description>
		<guid>http://www.517sou.net/Article/socks5_installation_and_configuration.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/447/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/socks5_installation_and_configuration.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/447/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/windows_phone_7_serial.aspx</link>
		<title>Windows Phone 7应用程序系列教程</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Mon, 17 May 2010 01:03:13 GMT</pubDate>
		<description>&lt;p&gt;新浪围脖@&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=WPMind&quot;&gt;WPMind&lt;/span&gt;.com v0.1是由&lt;a href=&quot;http://www.wpmind.com/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;WPMind.com&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%E5%BC%80%E5%8F%91&quot;&gt;开发&lt;/span&gt;的第一个&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=Windows&quot;&gt;Windows&lt;/span&gt; Phone 7上的软件作品，即新浪微博客户端。它也应该是国内第一款&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=Windows%20Phone&quot;&gt;Windows Phone&lt;/span&gt; 7上的新浪微博客户端。在接下来的一系列文章中，我将带领大家探讨探讨该软件开发过程中遇到的各种问题。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size=&quot;6&quot;&gt;&lt;font color=&quot;#2e8b57&quot;&gt;(1) 环境准备&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;作为一个开发人员，我很高兴的看到了微软这次对于Windows Phone 7所做的各种努力。其中当然不得不提的就是微软对于&lt;a href=&quot;http://www.wpmind.com/news/2010/03/23/windows-phone-7-developer-tools-download.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Windows Phone Developer Tools的免费发行&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;。&lt;br /&gt;安装Windows Phone Developer Tools的系统需求为：&lt;br /&gt;&lt;strong&gt;支持的操作系统&lt;/strong&gt;: Windows 7，Windows Vista&lt;br /&gt;&amp;nbsp; &amp;nbsp; * Windows® Vista® (x86 and x64) ENU with Service Pack 2 – 除了Starter之外的任何版本&lt;br /&gt;&amp;nbsp; &amp;nbsp; * Windows 7 (x86 and x64) ENU（当然，中文的Win7上也能正常安装） – 除了Starter之外的任何版本&lt;br /&gt;&lt;strong&gt;需要的硬件配置&lt;/strong&gt;：&lt;br /&gt;&amp;nbsp; &amp;nbsp; * Installation requires 3 GB of free disk space on the system drive.&lt;br /&gt;&amp;nbsp; &amp;nbsp; * 2 GB RAM&lt;br /&gt;&amp;nbsp; &amp;nbsp; * DirectX 10 capable graphics card with a WDDM 1.1 driver&lt;br /&gt;&lt;br /&gt;除了Windows Phone Developer Tools之外，我还强烈建议安装&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=6f014e07-0053-4aca-84a7-cd82f9aa989f&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Express Blend 4 Beta&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;版，以及对应Windows Phone 7开发所需要的&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=47f5c718-9dec-4557-9687-619c0fdd3d4f&amp;amp;displaylang=en&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Expression Blend Add-in for Windows Phone&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;和&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=86370108-4c14-42ee-8855-226e5dd9b85b&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Expression Blend SDK for Windows Phone&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;.&lt;br /&gt;Expression Blend 是微软的 Expression Studio套件中的很重要的一个部分，它是用来做&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=Silverlight&quot;&gt;Silverlight&lt;/span&gt;设计的。通常是由UI设计师来使用它完成界面的布局以及各种动态/动画效果的实现。不过我还是建议开发人员也都安装上它，毕竟我相信很多时候你的身边并没有专门的UI设计师，这一切还都得要我们自己动手完成。&lt;br /&gt;&lt;br /&gt;安装完Windows Phone Developer tools，我们会发现他已经安装好Visual Studio 2010 Express for Windows Phone，其中包含Windows Phone 7的模拟器和Silverlight for Windows Phone 以及&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=Game&quot;&gt;Game&lt;/span&gt; Studio 4.0.&lt;br /&gt;&lt;br /&gt;接下来打开Visual Studio 2010,工程类型里面有了Silverlight for Windows Phone和Game Studio 4.0的工程模板，这时候准备工作已经完成了。&lt;br /&gt;&lt;img style=&quot;cursor: pointer&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1005/3zg5ki_091805_1.png&quot; width=&quot;600&quot; height=&quot;291&quot; /&gt;&lt;br /&gt;&lt;br /&gt;参考：&lt;a href=&quot;http://www.wpmind.com/dev/2010/03/29/what-you-should-know-for-windows-phone-7-development.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.wpmind.com/dev/2010/03/29/what-you-should-know-for-windows-phone-7-development.html&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#2e8b57&quot; size=&quot;6&quot;&gt;(2)Hello World! - 初识开发环境&lt;br /&gt;&lt;/font&gt;在&lt;a href=&quot;http://bbs.wpmind.com/thread-92-1-1.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#800080&quot;&gt;上一小节&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;中，我们讲到了要开发Windows Phone 7的&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%E5%BA%94%E7%94%A8&quot;&gt;应用&lt;/span&gt;程序需要安装的工具。那么今天这一小节，我们就来看看怎样用这些工具来开发Windows Phone 7的应用程序。&lt;br /&gt;&lt;br /&gt;首先，我们打开Visual Studio 2010 Express for Windows Phone。在工程模板里面我们会看到针对&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=Silverlight&quot;&gt;Silverlight&lt;/span&gt; for Windows Phone 有3种开发类型如下图所示：&lt;br /&gt;&lt;img style=&quot;cursor: pointer&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1005/3zg5ki_091805_1.png&quot; width=&quot;600&quot; height=&quot;291&quot; /&gt;&lt;br /&gt;第一种“Windows Phone Application”就是很普通的一个Windows Phone的Silverlight应用程序。而第二种“Windows Phone List Appliation”则给出一个简单的列表型窗体的示例工程。第三种“Windows Phone Class Library”则是一个普通的类库工程。&lt;br /&gt;&lt;br /&gt;现在我们先输入工程名称建立一个普通的“Windows Phone Application”，则系统自动建立起该工程所需要的一些文件并打开默认的窗体设计器如下图所示：&lt;br /&gt;&lt;br /&gt;左侧的ToolBox和我们以前常规的WinForm或者说.NET CF开发工具栏比较类似，都是一些常规的控件。右侧的上方是Solution Explorer，可以在里面管理工程中的文件，而右侧下方则是属性窗口，用来显示当前选中的控件属性（以及事件）。而窗体的中间部位则分为左右两栏左侧是所见即所得的窗体设计器，而右侧则为XAML文件编辑器。&lt;br /&gt;&lt;br /&gt;请尝试着从左侧工具箱里面拖拽一个Button到窗体中间，然后双击这个“Button”则自动跳转到代码编辑器中生成的代码。那么还等待什么？请做一件任何一个程序员都会尝试的第一个程序吧，输入：&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;MessageBox.Show(&amp;quot;Hello&amp;nbsp;world!&amp;quot;);&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;然后按下F5键，则Visual Studio 2010会自动调用起Windows Phone 7的模拟器并将程序部署上去运行。点击模拟器中你的程序窗体上的Button，然后就得到了你的Windows Phone 7上的第一个Hello World程序。&lt;br /&gt;好了，下来请在Visual Studio 2010中按下Shift+F5停止程序的运行回到编辑状态。让我们回过头来仔细看看Windows Phone 7的Hello World程序和普通的.NET Compact Framework程序都有什么不同吧。&lt;br /&gt;首先是工程文件结构的不同，如下图所示：&lt;br /&gt;&lt;br /&gt;对于VS2008中我们的.NET CF应用程序来说，每一个窗体由两个文件构成。一个普通的cs文件（例如Form1.cs）再加上一个Designer文件（例如Form1.Designer.cs）。这两个文件都是C#的代码文件，而且这两个C#文件其实是通过partial类技术来描述的同一个class。所不同的是，第一个cs文件里面通常放置界面上的一些逻辑处理，而第二个（Designer文件）里面放置的是窗体设计器上的布局的C#代码表现。&lt;br /&gt;对于&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=VS2010&quot;&gt;VS2010&lt;/span&gt;来说，每一个窗体也都是两个文件构成。但是第一个文件是一个普通的xaml文件，第二个是一个同名的.xaml.cs文件。第一个xaml文件里面都是界面布局（以及一些资源，动画等等）的定义，而cs文件里面放置的是你的逻辑的C#代码。&lt;br /&gt;&lt;br /&gt;对于同样的一个Button的Click事件的处理，他们的方式也不同。对于.NET CF来说，它是通过常规的事件来处理，所以在代码中可以看到形如：&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;this.button1.Click&amp;nbsp;+=&amp;nbsp;new&amp;nbsp;System.EventHandler(this.button1_Click);&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;这样的事件注册代码。而对于VS2010中的XAML来说，他只是简单的在xaml中定义如下：&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;Button&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Content&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;Button&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Click&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;button1_Click&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;则在后端对应的cs文件中即可使用该click事件。&lt;br /&gt;&lt;br /&gt;最后不得不提的是，由于Windows Phone 7使用的Silverlight来开发应用程序，所以很多控件也有了变化。下图为VS2008中一个.NET CF 3.5的工程中可用的控件和VS2010中的Windows Phone 7的控件对比列表：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;怎么样，Windows Phone 7和以前的.NET Compact Framework的开发完全不一样了吧。 ：）&lt;br /&gt;今天的内容就先到这里，快点动手去写你自己的&amp;quot;Hello World&amp;quot;哦！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#2e8b57&quot; size=&quot;6&quot;&gt;（3）Hello Sina!&lt;br /&gt;&lt;/font&gt;在&lt;a href=&quot;http://bbs.wpmind.com/thread-113-1-1.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#800080&quot;&gt;上一小节&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;中，我们讲解了Windows Phone 7的开发环境的一些基本支持。在本节内容中，我们将讲解如何通过新浪微博的API来获取微博信息，同时学会在&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=Silverlight&quot;&gt;Silverlight&lt;/span&gt;中控件的数据绑定。&lt;br /&gt;要开发新浪微博&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%E5%BA%94%E7%94%A8&quot;&gt;应用&lt;/span&gt;程序，要做的第一步首先是去&lt;a href=&quot;http://open.t.sina.com.cn/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;新浪微博开放平台&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;申请一个APP Key。只有有了APP Key，你才能直接调用新浪微博API的各种接口。&lt;br /&gt;今天首先要用到的是获取所有关注对象的微博信息列表的方法，它的地址是：&lt;a href=&quot;http://api.t.sina.com.cn/statuses/friends_timeline.xml&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://api.t.sina.com.cn/statuses/friends_timeline.xml&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;（或者&lt;a href=&quot;http://api.t.sina.com.cn/statuses/friends_timeline.json&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://api.t.sina.com.cn/statuses/friends_timeline.json&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;），它将返回一个XML格式的数据列表。具体格式参见：&lt;a href=&quot;http://open.t.sina.com.cn/wiki/index.php/Statuses/friends_timeline&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://open.t.sina.com.cn/wiki/i ... es/friends_timeline&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;首先，请打开Visual Studio 2010 Express for Windows Phone这个开发工具，并建立一个普通的&amp;quot;Windows Phone Application&amp;quot;。然后修改textBlockListTitle这个文本块的内容和字体大小来设定你的应用程序的标题。&lt;br /&gt;接下来在该工程中添加一个Tools.cs类文件，里面我们会防止一些需要经常复用的工具方法类，代码如下：&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;//&amp;nbsp;Please&amp;nbsp;use&amp;nbsp;your&amp;nbsp;sina&amp;nbsp;AppKey&amp;nbsp;and&amp;nbsp;your&amp;nbsp;sina&amp;nbsp;micro&amp;nbsp;blog&amp;nbsp;username/password&amp;nbsp;here. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;const&amp;nbsp;string&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;appKey&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;//请填写你的新浪APP&amp;nbsp;Key &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;const&amp;nbsp;string&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;username&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp;//请填写你的新浪微博账号 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;const&amp;nbsp;string&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;password&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp;//请填写你的新浪微博密码 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;string&amp;nbsp;GetAppKey() &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;appKey; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;string&amp;nbsp;GetUserName() &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;username; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;string&amp;nbsp;GetPassword() &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;password; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;InitWebClient(ref&amp;nbsp;WebClient&amp;nbsp;wc) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;wc&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;WebClient(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;username&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;GetUserName&lt;/span&gt;&lt;span&gt;(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;password&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;GetPassword&lt;/span&gt;&lt;span&gt;(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;usernamePassword&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;username&amp;nbsp;+&amp;nbsp;&amp;quot;:&amp;quot;&amp;nbsp;+&amp;nbsp;password; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;wc.Credentials&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;NetworkCredential(username,&amp;nbsp;password); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wc.Headers[&amp;quot;Authorization&amp;quot;]&amp;nbsp;=&amp;nbsp;&amp;quot;Basic&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(usernamePassword)); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;对于最后一个方法InitWebClient，它是用来初始化我们的WebClient对象（用来做网络访问）。由于Sina的微博接口要求通过基本身份验证，所以通过该方法我们可以初始化一个基本身份验证的请求。即在Credentials里面添加用户名和密码，然后Header里面的Authorization里面加上经过Base64编码过后的用户密码信息。&lt;br /&gt;&lt;br /&gt;然后添加一个MessageItem类，用于存放从服务器端获取的消息对象：&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;public&amp;nbsp;class&amp;nbsp;MessageItem &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;string&amp;nbsp;UserName&amp;nbsp;{&amp;nbsp;get;&amp;nbsp;set;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;string&amp;nbsp;Message&amp;nbsp;{&amp;nbsp;get;&amp;nbsp;set;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;string&amp;nbsp;ImageSource&amp;nbsp;{&amp;nbsp;get;&amp;nbsp;set;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;string&amp;nbsp;Time&amp;nbsp;{&amp;nbsp;get;&amp;nbsp;set;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;接下来在主窗体（MainPage.xaml）里面添加一个ListBox放置在窗体中间，拖拽大小填充满整个主窗体的下半部分。然后在xaml代码部分修改这个ListBox的代码如下：&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;ListBox&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;651&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;HorizontalAlignment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;Left&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Margin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;0,6,0,0&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;listMain&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;VerticalAlignment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;Top&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;474&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;DataTemplate&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;StackPanel&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Orientation&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;Horizontal&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Background&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;{StaticResource&amp;nbsp;TransparentBrush}&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Margin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;0,5&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;Image&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Source&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;{Binding&amp;nbsp;ImageSource}&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;73&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;73&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;VerticalAlignment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;Top&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Margin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;8&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;StackPanel&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;360&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;TextBlock&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Text&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;{Binding&amp;nbsp;UserName}&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Foreground&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;#FFED5A13&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;FontSize&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;28&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;TextBlock&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Text&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;{Binding&amp;nbsp;Message}&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;TextWrapping&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;Wrap&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;FontSize&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;24&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Foreground&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;White&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;TextBlock&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Text&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;{Binding&amp;nbsp;Time}&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Foreground&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;#FF1851C6&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;FontSize&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;20&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;StackPanel&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;StackPanel&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;DataTemplate&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;ListBox&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;不同与以前我们开发WinForm应用程序里面的ListBox或者ListView,我们看到这里ListBox的元素可以完全自定义。这里我们使用了ListBox.ItemTemplate，表明ListBox中的项目要通过模板来填充。而下面的&amp;lt;DataTemplate&amp;gt;则定义了每一个项目的表现形式。在这里，我们通过&amp;lt;StackPanel&amp;gt;来布局每个项目中的元素，即左侧是一个图片，用来绑定用户的头像，而右侧从上往下依次是用户名，发送的消息，以及发送消息的时间。&lt;br /&gt;&lt;br /&gt;下面，我们将工程添加对于System.XML.Linq的引用以便使用LINQ来查询XML数据。然后在MainPage.xaml.cs中添加对于System.XML和System.XML.Linq的using.&lt;br /&gt;然后修改MainPage.xaml.cs文件中的代码如下：&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;private&amp;nbsp;WebClient&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;wcRefreshMyHome&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;null&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;private&amp;nbsp;string&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;sinaAppKey&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;Tools&lt;/span&gt;&lt;span&gt;.GetAppKey(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;private&amp;nbsp;const&amp;nbsp;int&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;MaxMessageRecord&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;20&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;private&amp;nbsp;const&amp;nbsp;string&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;RefreshHomeURL&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;http://api.t.sina.com.cn/statuses/friends_timeline.xml&amp;quot;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;public&amp;nbsp;MainPage() &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitializeComponent(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;SupportedOrientations&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;SupportedPageOrientation&lt;/span&gt;&lt;span&gt;.Portrait&amp;nbsp;|&amp;nbsp;SupportedPageOrientation.Landscape; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Tools.InitWebClient(ref&amp;nbsp;wcRefreshMyHome); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wcRefreshMyHome.DownloadStringCompleted&amp;nbsp;+=&amp;nbsp;new&amp;nbsp;DownloadStringCompletedEventHandler(RefreshCompleted); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;private&amp;nbsp;void&amp;nbsp;PhoneApplicationPage_Loaded(object&amp;nbsp;sender,&amp;nbsp;RoutedEventArgs&amp;nbsp;e) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RefreshMyHomeList(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;void&amp;nbsp;RefreshCompleted(object&amp;nbsp;sender,&amp;nbsp;DownloadStringCompletedEventArgs&amp;nbsp;e) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(e.Error&amp;nbsp;!=&amp;nbsp;null) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(e.Error.Message,&amp;nbsp;&amp;quot;Error&amp;quot;,&amp;nbsp;MessageBoxButton.OK); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XElement&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;xmlSina&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;XElement&lt;/span&gt;&lt;span&gt;.Parse(e.Result); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;listMain.ItemsSource&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;from&lt;/span&gt;&lt;span&gt;&amp;nbsp;sina&amp;nbsp;in&amp;nbsp;xmlSina.Elements(&amp;quot;status&amp;quot;) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;new&amp;nbsp;MessageItem &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;ImageSource&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;sina&lt;/span&gt;&lt;span&gt;.Element(&amp;quot;user&amp;quot;).Element(&amp;quot;profile_image_url&amp;quot;).Value, &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;UserName&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;sina&lt;/span&gt;&lt;span&gt;.Element(&amp;quot;user&amp;quot;).Element(&amp;quot;screen_name&amp;quot;).Value, &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Message&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;sina&lt;/span&gt;&lt;span&gt;.Element(&amp;quot;text&amp;quot;).Value, &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Time&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;GetTime&lt;/span&gt;&lt;span&gt;(sina.Element(&amp;quot;created_at&amp;quot;).Value) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;private&amp;nbsp;string&amp;nbsp;GetTime(string&amp;nbsp;sinaFormat) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;result&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string[]&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;strTemps&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;sinaFormat&lt;/span&gt;&lt;span&gt;.Split(&apos;&amp;nbsp;&apos;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strTemps[4]&amp;nbsp;=&amp;nbsp;&amp;quot;+01:00&amp;quot;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;result&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;String&lt;/span&gt;&lt;span&gt;.Join(&amp;quot;&amp;nbsp;&amp;quot;,&amp;nbsp;strTemps); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DateTime&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;dt&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;DateTime&lt;/span&gt;&lt;span&gt;.ParseExact(result,&amp;nbsp;&amp;quot;ddd&amp;nbsp;MMM&amp;nbsp;dd&amp;nbsp;HH:mm:ff&amp;nbsp;zzz&amp;nbsp;yyyy&amp;quot;,&amp;nbsp;System.Threading.Thread.CurrentThread.CurrentCulture); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;result&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;dt&lt;/span&gt;&lt;span&gt;.ToString(&amp;quot;G&amp;quot;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;private&amp;nbsp;void&amp;nbsp;RefreshMyHomeList() &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(wcRefreshMyHome.IsBusy) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wcRefreshMyHome.CancelAsync(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wcRefreshMyHome.DownloadStringAsync(new&amp;nbsp;Uri(RefreshHomeURL&amp;nbsp;+&amp;nbsp;&amp;quot;?&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;count&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;MaxMessageRecord.ToString()&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;source&lt;/span&gt;&lt;span&gt;=&amp;quot;&amp;nbsp;+&amp;nbsp;sinaAppKey),&amp;nbsp;RefreshHomeURL); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;你会看到，我使用了一个WebClient对象wcRefreshMyHome，它将是我们用来访问Web服务器的主要对象。该对象只能采用异步模式来&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%E4%B8%8B%E8%BD%BD&quot;&gt;下载&lt;/span&gt;或者上传数据。所以，在MianPage的构造函数中我们通过该对象的DownloadStringCompletedEventHandler事件来添加对于下载结束的处理代码（即RefreshCompleted方法）。&lt;br /&gt;而在RefreshCompleted中我的处理也很简单，只是简单的判断如果没有错误，则通过LINQ将数据填充到ListBox的数据源中。在这里需要注意的是，由于sina返回的数据中时间字段我们无法直接解析，所以我做了一些处理后得到正确的时间(GetTime方法)。&lt;br /&gt;&lt;br /&gt;最终，我们在 PhoneApplicationPage_Loaded方法中加上RefreshMyHomeList的调用，即先判断当前的WebClient是否在下载，如果正在运行则取消之前的操作，然后重新进行异步下载。&lt;br /&gt;&lt;br /&gt;好了，代码就到这里，按下F5试试看，你的程序已经正常的运行起来，并且成功的将你的新浪微博的好友信息下载了下来。：）&lt;br /&gt;&lt;br /&gt;今天的这节内容就到这里，示例代码请参考附件中的demo2工程。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#2e8b57&quot; size=&quot;6&quot;&gt;（4）使用&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=AppBar&quot;&gt;AppBar&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;在&lt;a href=&quot;http://bbs.wpmind.com/thread-117-1-1.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#800080&quot;&gt;上一小节&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;中，我们试着开发了新浪围脖客户端的最基本的功能 -- 列表关注对象的围脖消息。在今天的小节中，我们来看看在Windows Phone 7的&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%E5%BA%94%E7%94%A8&quot;&gt;应用&lt;/span&gt;程序中怎么样使用AppBar，即Windows Phone 7上最新的菜单系统。&lt;br /&gt;首先我们来聊一聊Windows Phone发展史上的菜单系统的改变吧，下面这张图是早期的Pocket PC时期的经典的菜单样式（图片来自网络，如有侵权请通知我以便替换）：&lt;br /&gt;&lt;br /&gt;即屏幕的下方有一个菜单栏，在菜单栏上可以弹出多个菜单项，然后还可以有多个图标，点击图标也可以弹出子菜单。在菜单栏的最右侧是输入法切换图标。因为早期Pocket PC的设计中，微软几乎是按照普通的PC的用户体验来设计界面的。所以我们看到这种导航方式和PC的应用程序很类似，但是非常不适合手持设备来使用。尤其是菜单太密，要想精确点击，只能使用触笔而无法单手操作。&lt;br /&gt;&lt;br /&gt;所以，到了Windows &lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=Mobile&quot;&gt;Mobile&lt;/span&gt; 5的时代，菜单做了点改变。菜单栏上的菜单只能放置两个，分别对应左软键和右软键，将输入法切换图标放在了两个软键菜单之间，这时候的用户体验略微好了一点点：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=Windows%20Mobile&quot;&gt;Windows Mobile&lt;/span&gt; 5的这种菜单风格一直用到了Windows Phone 6.5的时代。直到&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=HTC&quot;&gt;HTC&lt;/span&gt;在自家的HTC Sense界面中做了改变。HTC直接替换了系统的菜单系统，将不管是左软键还是右软键的菜单都统统拉升基本占满了整个屏幕的宽度，这样很大程度上便于了单手操作：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果您细心的话，就会发现微软在Windows Phone 6.5的Internet Explorer中的菜单系统也做了点小小的改变，已经类似于Windows Phone 6.5.3版本中出现的菜单系统了。即，将原来左上角一直有的那个开始按钮放到了左下角，而将原来右上角的那个”X“或者”OK“按钮放到了窗体的右下角。然后将原来的左软键或者右软键菜单缩小为两个圆形的按钮（也可以是图片按钮或者文字按钮），中间仍然保持输入法切换按钮。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;到了Windows Phone 7的时代，菜单系统延续了这种将用户操作全部放在了下方的设计，在窗体的下方区域称之为”App Bar“，在这里可以最多放置4个（在目前CTP版本中可以放置5个，但是经过用户反馈意见，在正式版本中将最多允许4个）按钮用来让用户执行最常用的操作。如果操作项不够的话，App Bar区域可以向上扩展，然后弹出更多的命令内容。如下图所示，放置了4个按钮，然后还可以弹出一些菜单项来。同时您应该注意到，这里的AppBar是可以设置透明度的。用户体验就好了很多。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在Windows Phone 7中要使用App Bar很容易。首先将工程中引用”Microsoft.Phone.Shell“。&lt;br /&gt;然后在要加入AppBar的窗体中的XAML文件中加入形如下面的代码：&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;phoneNavigation:PhoneApplicationPage.ApplicationBar&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;shell:ApplicationBar&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Visible&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;IsMenuEnabled&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;ForegroundColor&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;Black&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Opacity&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;0.5&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;shell:ApplicationBar.Buttons&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;shell:ApplicationBarIconButton&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;x:Name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;RefreshButton&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;IconUri&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;/Images/appbar.sync.rest.png&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Click&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;ApplicationBarIconButton_Click&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;shell:ApplicationBarIconButton&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;x:Name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;SayButton&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;IconUri&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;/Images/Say.png&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Click&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;SayButton_Click&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;shell:ApplicationBarIconButton&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;x:Name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;AtButton&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;IconUri&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;/Images/At.png&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Click&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;AtButton_Click&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;shell:ApplicationBarIconButton&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;x:Name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;ForwordButton&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;IconUri&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;/Images/Forword.png&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Click&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;ForwordButton_Click&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;shell:ApplicationBar.Buttons&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;shell:ApplicationBar.MenuItems&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;shell:ApplicationBarMenuItem&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Text&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;About&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;x:Name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;AboutMenu&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;Click&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;AboutMenu_Click&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;shell:ApplicationBar.MenuItems&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;shell:ApplicationBar&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;phoneNavigation:PhoneApplicationPage.ApplicationBar&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;其中&amp;lt;shell:ApplicationBar&amp;gt;的Opacity属性用来设置AppBar的透明度，IsMenuEnabled属性用来设置是否需要附加的菜单项。&lt;br /&gt;在&amp;lt;shell:ApplicationBar.Buttons&amp;gt;中来定义Button，而通过&amp;lt;shell:ApplicationBar.MenuItems&amp;gt;来定义附加的菜单项。&lt;br /&gt;只要给Buton设置好IconUri图像属性，然后分别给它们设置Click属性即定义事件代码就好了。&lt;br /&gt;用起来很简单不是么？&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ff431786(VS.92).aspx&quot; target=&quot;_blank&quot;&gt;How to: Add an Application Bar to Your Application for Windows Phone&lt;/a&gt;&lt;/p&gt;&lt;div id=&quot;mainSection&quot;&gt;&lt;div id=&quot;mainBody&quot;&gt;&lt;p&gt;[Note: This topic is pre-release documentation and is subject to change in future releases. Blank topics are included as placeholders.]&lt;/p&gt;4/22/2010 &lt;div class=&quot;introduction&quot;&gt;&lt;p&gt;This topic shows how you can add an Application Bar to your Windows&amp;nbsp;Phone application in XAML and in C#. To read about and download a sample application that uses the Application Bar, see &lt;span&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ff431744(v=VS.92).aspx&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#960bb4&quot;&gt;Code Samples for Windows Phone&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;LW_CollapsibleArea_Container&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CollapsibleArea_TitleDiv&quot;&gt;&lt;span class=&quot;LW_CollapsibleArea_Title&quot;&gt;Adding a Reference to the Application Bar Assembly&lt;/span&gt;&lt;div class=&quot;LW_CollapsibleArea_HrDiv&quot;&gt;&lt;hr class=&quot;LW_CollapsibleArea_Hr&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;p xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;Before you can use the Application Bar in your application, you must add a reference to the correct assembly in your Windows&amp;nbsp;Phone project.&lt;/p&gt;&lt;h3 class=&quot;procedureSubHeading&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;To add a reference to the Application Bar dll&lt;/h3&gt;&lt;div class=&quot;subSection&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;ol xmlns=&quot;&quot;&gt;&lt;li&gt;&lt;p&gt;Open a new or existing Windows&amp;nbsp;Phone solution in Visual Studio.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;From the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Project&lt;/span&gt;&lt;/span&gt; menu, select &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Add Reference…&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;.NET&lt;/span&gt;&lt;/span&gt; tab, select the component name “Microsoft.Phone.Shell” and click &lt;span&gt;&lt;span class=&quot;input&quot;&gt;OK&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;LW_CollapsibleArea_Container&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CollapsibleArea_TitleDiv&quot;&gt;&lt;span class=&quot;LW_CollapsibleArea_Title&quot;&gt;Adding Icon Button Images to Your Windows Phone Project&lt;/span&gt;&lt;div class=&quot;LW_CollapsibleArea_HrDiv&quot;&gt;&lt;hr class=&quot;LW_CollapsibleArea_Hr&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;p xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;Before you can use images for icon buttons in the Application Bar, you must add them to your project in Visual Studio.&lt;/p&gt;&lt;h3 class=&quot;procedureSubHeading&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;To add icon button images to your project&lt;/h3&gt;&lt;div class=&quot;subSection&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;ol xmlns=&quot;&quot;&gt;&lt;li&gt;&lt;p&gt;To create a subdirectory for your image files, in Solution Explorer, right-click the icon for your project and select &lt;strong&gt;Add&lt;/strong&gt; and then &lt;strong&gt;New Folder&lt;/strong&gt;. Rename the folder to “Images”.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;In Windows Explorer, copy your icon images into the Images folder under the directory from your project. For design guidelines about creating Application Bar icon images, see &lt;span&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ff431806(v=VS.92).aspx&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#1364c4&quot;&gt;Application Bar Best Practices for Windows Phone&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;In Solution Explorer in Visual Studio right-click on the Images folder and select &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Add&lt;/span&gt;&lt;/span&gt; and then &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Existing Item…&lt;/span&gt;&lt;/span&gt;. Select one of your images or hold down Ctrl and select multiple images and then click &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Add&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;For each of your images, right-click the image in Solution Explorer and select &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Properties&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Set the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Build Action&lt;/span&gt;&lt;/span&gt; property to “Content” and set the &lt;strong&gt;Copy to Output&lt;/strong&gt; property to “Copy always”.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;LW_CollapsibleArea_Container&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CollapsibleArea_TitleDiv&quot;&gt;&lt;span class=&quot;LW_CollapsibleArea_Title&quot;&gt;Creating an Application Bar in XAML&lt;/span&gt;&lt;div class=&quot;LW_CollapsibleArea_HrDiv&quot;&gt;&lt;hr class=&quot;LW_CollapsibleArea_Hr&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;p xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;You can create an Application Bar, assign it to a page, and set event handlers for icon buttons and menu items by adding a few elements to the XAML for your page. These steps assume that the page you are editing was generated using the default template by Visual Studio. The namespace prefixes associated with some of the elements may be different if you are using XAML from another source.&lt;/p&gt;&lt;h3 class=&quot;procedureSubHeading&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;To create an Application Bar in XAML&lt;/h3&gt;&lt;div class=&quot;subSection&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;ol xmlns=&quot;&quot;&gt;&lt;li&gt;&lt;p&gt;Open the XAML file for the page to which you will add the application bar. In Solution Explorer, right-click on the .xaml file for the page (by default, the main page for a new application is called “MainPage.xaml”) and select &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Open&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Add a namespace declaration to set the namespace prefix for the Windows.Phone.Shell assembly to “shell:” by adding the following line to the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;phoneNavigation:PhoneApplicationPage&lt;/span&gt;&lt;/span&gt; element in the XAML.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode0&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
xmlns:shell=&amp;quot;clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone.Shell&amp;quot;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Add a &lt;span&gt;&lt;span class=&quot;input&quot;&gt;phoneNavigation:PhoneApplicationPage.ApplicationBar&lt;/span&gt;&lt;/span&gt; element inside the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;phoneNavigation:PhoneApplicationPage&lt;/span&gt;&lt;/span&gt; element. The phone application page object has a built-in ApplicationBar property and the contents of this element will define the Application Bar for this page.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode1&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
&amp;lt;phoneNavigation:PhoneApplicationPage.ApplicationBar&amp;gt;
&amp;lt;/phoneNavigation:PhoneApplicationPage.ApplicationBar&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Inside the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;phoneNavigation:PhoneApplicationPage.ApplicationBar&lt;/span&gt;&lt;/span&gt; element, add a &lt;span&gt;&lt;span class=&quot;input&quot;&gt;shell:ApplicationBar&lt;/span&gt;&lt;/span&gt; element. You can set any of the properties of the Application Bar in this element, but this example sets the visibility to &lt;span&gt;&lt;span class=&quot;input&quot;&gt;True&lt;/span&gt;&lt;/span&gt; and the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;IsMenuEnabled&lt;/span&gt;&lt;/span&gt; property to &lt;span&gt;&lt;span class=&quot;input&quot;&gt;True&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode2&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
&amp;lt;shell:ApplicationBar IsVisible=&amp;quot;True&amp;quot; IsMenuEnabled=&amp;quot;True&amp;quot;&amp;gt;
&amp;lt;/shell:ApplicationBar&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Add a &lt;span&gt;&lt;span class=&quot;input&quot;&gt;shell:ApplicationBar.Buttons&lt;/span&gt;&lt;/span&gt; element to the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;shell:ApplicationBar&lt;/span&gt;&lt;/span&gt; element. This element will contain the definitions for the Application Bar’s icon buttons.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode3&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
&amp;lt;shell:ApplicationBar.Buttons&amp;gt;
&amp;lt;/shell:ApplicationBar.Buttons&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Now, add one or more &lt;span&gt;&lt;span class=&quot;input&quot;&gt;shell:ApplicationBarIconButton&lt;/span&gt;&lt;/span&gt; elements to the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;shell:ApplicationBar.Buttons&lt;/span&gt;&lt;/span&gt; element. This represents the icon button. You will need to provide a URI to the image file for the icon button. If you placed your images in the folder specified previously in this topic, the paths in this example will be correct. Add a click handler by setting the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Click&lt;/span&gt;&lt;/span&gt; attribute of the element. Visual Studio will display a context menu containing the text “&amp;lt;New Event Handler&amp;gt;” after you have typed “Click”. If you select this item, the tools will generate an event handler in the .cs file for this page. If you copy and paste the code, you will need to create the event handlers manually.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode4&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
&amp;lt;shell:ApplicationBarIconButton Click=&amp;quot;ApplicationBarIconButton_Click&amp;quot; IconUri=&amp;quot;/Images/button1.png&amp;quot;&amp;gt;&amp;lt;/shell:ApplicationBarIconButton&amp;gt;
&amp;lt;shell:ApplicationBarIconButton Click=&amp;quot;ApplicationBarIconButton_Click_1&amp;quot; IconUri=&amp;quot;/Images/button2.png&amp;quot;&amp;gt;&amp;lt;/shell:ApplicationBarIconButton&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Add a &lt;span&gt;&lt;span class=&quot;input&quot;&gt;shell.ApplicationBar.MenuItems&lt;/span&gt;&lt;/span&gt; element as a child of the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;shell.ApplicationBar&lt;/span&gt;&lt;/span&gt; element. This element will contain the definitions for the Application Bar’s menu items.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode5&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
&amp;lt;shell:ApplicationBar.MenuItems&amp;gt;
&amp;lt;/shell:ApplicationBar.MenuItems&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Now, add one or more &lt;span&gt;&lt;span class=&quot;input&quot;&gt;shell:ApplicationBarMenuItem&lt;/span&gt;&lt;/span&gt; elements to the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;shell.ApplicationBar.MenuItems&lt;/span&gt;&lt;/span&gt; element. The &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Text&lt;/span&gt;&lt;/span&gt; attribute specifies the text that will be displayed in the menu. The click handler is set the same as for the icon buttons.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode6&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
&amp;lt;shell:ApplicationBarMenuItem Click=&amp;quot;ApplicationBarMenuItem_Click&amp;quot; Text=&amp;quot;MenuItem 1&amp;quot;&amp;gt;&amp;lt;/shell:ApplicationBarMenuItem&amp;gt;
&amp;lt;shell:ApplicationBarMenuItem Click=&amp;quot;ApplicationBarMenuItem_Click_1&amp;quot; Text=&amp;quot;MenuItem 2&amp;quot;&amp;gt;&amp;lt;/shell:ApplicationBarMenuItem&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;Now, when you run your application, the Application Bar will be displayed. The only thing left to do is implement your event handlers to take some action when the user taps on one of the icon buttons or menu items. The following code snippet shows the whole XAML element for the Application Bar. Remember that if you copy and paste this code, you will need to update the event handler declarations because the handler methods will not be autogenerated by Visual Studio.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode7&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
&amp;lt;phoneNavigation:PhoneApplicationPage.ApplicationBar&amp;gt;
  &amp;lt;shell:ApplicationBar IsVisible=&amp;quot;True&amp;quot; IsMenuEnabled=&amp;quot;True&amp;quot;&amp;gt;
    &amp;lt;shell:ApplicationBar.Buttons&amp;gt;
      &amp;lt;shell:ApplicationBarIconButton x:Name=”button1” Click=&amp;quot;button1_Click&amp;quot; IconUri=&amp;quot;/Images/button1.png&amp;quot;&amp;gt;&amp;lt;/shell:ApplicationBarIconButton&amp;gt;
      &amp;lt;shell:ApplicationBarIconButton x:Name=”button2” Click=&amp;quot;button2_Click&amp;quot; IconUri=&amp;quot;/Images/button2.png&amp;quot;&amp;gt;&amp;lt;/shell:ApplicationBarIconButton&amp;gt;
    &amp;lt;/shell:ApplicationBar.Buttons&amp;gt;
    &amp;lt;shell:ApplicationBar.MenuItems&amp;gt;
      &amp;lt;shell:ApplicationBarMenuItem x:Name=”menuItem1” Click=&amp;quot;menuItem1_Click&amp;quot; Text=&amp;quot;MenuItem 1&amp;quot;&amp;gt;&amp;lt;/shell:ApplicationBarMenuItem&amp;gt;
      &amp;lt;shell:ApplicationBarMenuItem x:Name=”menuItem2” Click=&amp;quot;menuItem2_Click&amp;quot; Text=&amp;quot;MenuItem 2&amp;quot;&amp;gt;&amp;lt;/shell:ApplicationBarMenuItem&amp;gt;
    &amp;lt;/shell:ApplicationBar.MenuItems&amp;gt;
  &amp;lt;/shell:ApplicationBar&amp;gt;
&amp;lt;/phoneNavigation:PhoneApplicationPage.ApplicationBar&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;The following code shows the format of the event handler for button or menu item Click events.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode8&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
private void button1_Click(object sender, EventArgs e)
{
  // TODO: Add code that is run when the button is clicked.
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;LW_CollapsibleArea_Container&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CollapsibleArea_TitleDiv&quot;&gt;&lt;span class=&quot;LW_CollapsibleArea_Title&quot;&gt;Creating an Application Bar in C#&lt;/span&gt;&lt;div class=&quot;LW_CollapsibleArea_HrDiv&quot;&gt;&lt;hr class=&quot;LW_CollapsibleArea_Hr&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;p xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;If you are more comfortable writing code in C# than working with XAML, you can add an Application Bar to your application entirely in C# without editing the XAML file at all.&lt;/p&gt;&lt;h3 class=&quot;procedureSubHeading&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;To create an Application Bar in C#&lt;/h3&gt;&lt;div class=&quot;subSection&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;ol xmlns=&quot;&quot;&gt;&lt;li&gt;&lt;p&gt;Open the C# file for the page to which you will add the application bar. In Solution Explorer, expand the node for the .xaml file for the page, right-click on the .xaml.cs file underneath the .xaml file and select &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Open&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Add a &lt;span&gt;&lt;span class=&quot;input&quot;&gt;using&lt;/span&gt;&lt;/span&gt; directive to the top of the .xaml.cs file and provide the name of the assembly that includes the Application Bar.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode9&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
using Microsoft.Phone.Shell;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;In the constructor for the page, initialize a new instance of the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;ApplicationBar&lt;/span&gt;&lt;/span&gt; property for the page.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode10&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
public MainPage()
{
  InitializeComponent();
  ApplicationBar = new ApplicationBar();
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Set the &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Visible&lt;/span&gt;&lt;/span&gt; and &lt;span&gt;&lt;span class=&quot;input&quot;&gt;IsMenuEnabled&lt;/span&gt;&lt;/span&gt; properties to True so that the Application Bar is visible and the menu is enabled when the page loads.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode11&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
  ApplicationBar.IsVisible = true;
  ApplicationBar.IsMenuEnabled = true;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Create one or more &lt;span&gt;&lt;span class=&quot;input&quot;&gt;ApplicationBarIconButton&lt;/span&gt;&lt;/span&gt; objects. The constructor has a single argument, the Uri to the image for the icon button. Assign an event handler for the button’s &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Click&lt;/span&gt;&lt;/span&gt; event.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode12&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
  ApplicationBarIconButton button1 = new ApplicationBarIconButton(new Uri(&amp;quot;/Images/button1.png&amp;quot;, UriKind.Relative));
  button1.Click += new EventHandler(button1_Click);
  ApplicationBarIconButton button2 = new ApplicationBarIconButton(new Uri(&amp;quot;/Images/button2.png&amp;quot;, UriKind.Relative));
  button2.Click += new EventHandler(button2_Click);
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Now, add the icon buttons to the Application Bar’s &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Buttons&lt;/span&gt;&lt;/span&gt; collection.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode13&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
  ApplicationBar.Buttons.Add(button1);
  ApplicationBar.Buttons.Add(button2);
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Create one or more &lt;span&gt;&lt;span class=&quot;input&quot;&gt;ApplicationBarMenuItem&lt;/span&gt;&lt;/span&gt; objects. The constructor has a single argument, the string displayed on the menu item. Assign an event handler for the menu item’s &lt;span&gt;&lt;span class=&quot;input&quot;&gt;Click&lt;/span&gt;&lt;/span&gt; event.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode14&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
  ApplicationBarMenuItem menuItem1 = new ApplicationBarMenuItem(&amp;quot;MenuItem 1&amp;quot;);
  menuItem1.Click += new EventHandler(menuItem1_Click);
  ApplicationBarMenuItem menuItem2 = new ApplicationBarMenuItem(&amp;quot;MenuItem 2&amp;quot;);
  menuItem2.Click += new EventHandler(menuItem2_Click);
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Now, add the menu items to the Application Bar’s &lt;span&gt;&lt;span class=&quot;input&quot;&gt;MenuItems&lt;/span&gt;&lt;/span&gt; collection.&lt;/p&gt;&lt;div class=&quot;LW_CodeSnippetContainer&quot; xmlns=&quot;&quot;&gt;&lt;div class=&quot;LW_CodeSnippetContainerCodeCollection&quot;&gt;&lt;div id=&quot;CodeSnippetContainerCode15&quot; class=&quot;LW_CodeSnippetContainerCode&quot;&gt;&lt;div style=&quot;color: black&quot;&gt;&lt;pre&gt;
    ApplicationBar.MenuItems.Add(menuItem1);
  ApplicationBar.MenuItems.Add(menuItem2);
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;Now, your C# implementation of the Application Bar is complete. You will, however, need to write code in the Click event handlers for the icon buttons and menu items.&lt;/p&gt;&lt;p xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;a href=&quot;http://developer.windowsphone.com/&quot; xmlns=&quot;&quot; target=&quot;_blank&quot;&gt;http://developer.windowsphone.com/&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
		<guid>http://www.517sou.net/Article/windows_phone_7_serial.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/444/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/windows_phone_7_serial.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/444/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/DRBD_Heartbeat_and_HA_NFS.aspx</link>
		<title>DRBD+Heartbeat 架设HA NFS Server</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Thu, 13 May 2010 04:47:20 GMT</pubDate>
		<description>&lt;div class=&quot;post-240 post type-post hentry category-uncategorized&quot;&gt;&lt;div class=&quot;entry&quot;&gt;&lt;div class=&quot;snap_preview&quot;&gt;&lt;p&gt;DRBD（Distributed Replicated Block Device）:分布式复制块设备&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.drbd.org/&quot; target=&quot;_blank&quot;&gt;http://www.drbd.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/DRBD&quot; target=&quot;_blank&quot;&gt;http://en.wikipedia.org/wiki/DRBD&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;DRBD&lt;/strong&gt;，分布式复制块设备，是一种通过TCP/IP网络实现块设备数据实时镜像的方案。利用这种方案，单一主节点模式（single primary mode）双机系统能够实时地将业务数据保存在主备节点的磁盘中，正常情况下两个节点的数据是一模一样的。&lt;img class=&quot;Image&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1005/hhg6ex_150526_1.png&quot; /&gt;&lt;/p&gt;&lt;p&gt;DRBD&apos;s authors originally submitted the software to the Linux kernel community in July 2007, for possible future inclusion of DRBD into the &amp;quot;vanilla&amp;quot; (standard, without modifications) Linux kernel.&lt;sup id=&quot;cite_ref-2&quot; class=&quot;reference&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/DRBD#cite_note-2&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#002bb8&quot;&gt;&lt;span&gt;[&lt;/span&gt;3&lt;span&gt;]&lt;/span&gt;&lt;/font&gt;&lt;/a&gt;&lt;/sup&gt; After a long time of review and several discussions, &lt;a title=&quot;Linus Torvalds&quot; href=&quot;http://en.wikipedia.org/wiki/Linus_Torvalds&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#002bb8&quot;&gt;Linus Torvalds&lt;/font&gt;&lt;/a&gt; finally agreed to have DRBD as part of the official Linux kernel. DRBD got merged on 8 December 2009 during the &amp;quot;merge window&amp;quot; for Linux kernel version 2.6.33.&lt;br /&gt;&lt;br /&gt;一旦主节点发生故障(比如磁盘写失败、断电之类)，双机管理系统就将业务倒换到备节点，从外部看来，数据还是完整无缺。所以理论上来讲，DRBD这一方面相比于商业应用中的共享磁盘阵列方案，避免了共享磁阵潜在的单点故障风险。而DRBD另一个吸引某些人的地方是，其开发商（&lt;a href=&quot;http://www.linbit.com/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;www.linbit.com&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;）提供商业版本DRBD服务和开源DRBD源代码，所以成了Linux系统下构建低成本高可用(high availability)双机系统的可选组件。&lt;br /&gt;&lt;br /&gt;不过DRBD由于通过网络来写数据，一方面网络传输引起的延迟显然要远远大于共享磁阵，另一方面网络带宽的限制也拖了后腿，所以对于目前的DRBD来说，可能比较适用于业务数据量较低的应用。对于这种应用场景，相比于使用磁盘阵列，成本更低而增加市场竞争力。&lt;/p&gt;&lt;p&gt;&lt;b&gt;一、DRBD+Heartbeat 架設 HA NFS Server on CentOS 5&lt;/b&gt;&lt;/p&gt;&lt;p&gt;目標 : 由於 NFS Server 在公司非常重要，如果不能服務將會造成許多人無法工作，所以利用 DRBD 與 Heartbeat 來做出可以在NFS 主機當機時， NFS Server 會自動切換到備用機，來達成不停止服務的目標&lt;br /&gt;目前這個方案的缺點是無法兩台同時服務，下次的目標是做出可以同時服務的 Cluster。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;0. 環境&lt;/strong&gt;&lt;br /&gt;兩台主機 node1, node2, 虛擬 ip (vip) 為 172.16.1.10&lt;br /&gt;node1 172.16.1.11&lt;br /&gt;node2 172.16.1.12&lt;br /&gt;vip 172.16.1.10&lt;br /&gt;兩台均有兩顆硬碟, /dev/sda 作 OS 使用, 而 /dev/sdb 作 data 使用&lt;/p&gt;&lt;p&gt;在兩台主機&lt;br /&gt;vi /etc/hosts&lt;br /&gt;172.16.1.11 node1&lt;br /&gt;172.16.1.12 node2&lt;/p&gt;&lt;p&gt;注意 主機名稱需與 /etc/sysconfig/network 的 HOSTNAME 相符&lt;br /&gt;若有帶網域名稱, 則 /etc/hosts 也要使用網域名稱&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 安裝套件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;[node01],[node02] 皆執行&lt;br /&gt;# yum -y install drbd83 kmod-drbd83 portmap nfs-utils heartbeat&lt;/p&gt;&lt;p&gt;NFS Service:&lt;br /&gt;請設定 portmap 預測啟動,　nfs 則可以不用 , Heartbeat 會自行啟動&lt;br /&gt;[node01],[node02] 皆執行&lt;br /&gt;chkconfig portmap on&lt;br /&gt;service portmap start&lt;br /&gt;service nfs on&lt;/p&gt;&lt;p&gt;NFS 分享設定: 分享 /data&lt;br /&gt;[node01],[node02] 皆執行&lt;br /&gt;vim /etc/exports&lt;br /&gt;/data 172.16.1.0/255.255.255.0(rw,no_root_squash,no_all_squash,sync)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. DRBD&lt;/strong&gt;&lt;br /&gt;分顆硬碟:&lt;br /&gt;fdisk /dev/sdb -&amp;gt; 整顆切一塊為 /dev/sdb1&lt;br /&gt;並會將 /dev/sdb1 在 drbd 指定為 r0 , 如下&lt;/p&gt;&lt;p&gt;設定 drbd.conf:&lt;br /&gt;[node01],[node02] 皆執行&lt;br /&gt;vim /etc/drbd.conf&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;global&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;usage-count&amp;nbsp;yes; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;common&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;syncer&amp;nbsp;{&amp;nbsp;rate&amp;nbsp;100M;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;resource&amp;nbsp;r0&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;protocol&amp;nbsp;C; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;startup&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;wfc-timeout&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;degr-wfc-timeout&amp;nbsp;120; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;disk&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;on-io-error&amp;nbsp;detach; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;#&amp;nbsp;no-disk-flushes; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;#&amp;nbsp;no-md-flushes &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;#&amp;nbsp;size&amp;nbsp;1G; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;net&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;on&amp;nbsp;node01&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;device&amp;nbsp;/dev/drbd0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;disk&amp;nbsp;/dev/sdb1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;address&amp;nbsp;172.16.1.12:7788; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;meta-disk&amp;nbsp;internal; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;on&amp;nbsp;node02&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;device&amp;nbsp;/dev/drbd0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;disk&amp;nbsp;/dev/sdb1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;address&amp;nbsp;172.16.1.12:7788; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;meta-disk&amp;nbsp;internal; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;初始化 drbd :&lt;br /&gt;node01, node02 兩台都執行以下指令&lt;/p&gt;&lt;p&gt;drbdadm create-md r0&lt;br /&gt;chkconfig drbd on&lt;/p&gt;&lt;p&gt;service drbd start&lt;br /&gt;Starting DRBD resources: [ d(r0) s(r0) n(r0) ].&lt;/p&gt;&lt;p&gt;查看 drbd 狀態, 一開始 node01, node02 都會是 Secondary 的狀態&lt;br /&gt;cat /proc/drbd&lt;br /&gt;version: 8.3.2 (api:88/proto:86-90)&lt;br /&gt;GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:02:24&lt;br /&gt;0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r—-&lt;br /&gt;ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:1044124&lt;/p&gt;&lt;p&gt;等 drbd 作完後, 把 node01 的 drbd 設為 primary&lt;br /&gt;[node01]# drbdadm primary r0&lt;/p&gt;&lt;p&gt;作完後,開始格式化&lt;br /&gt;[node01]# mkfs.ext3 /dev/drbd0&lt;br /&gt;[node01]# mount /dev/drbd0 /data&lt;/p&gt;&lt;p&gt;注意: 若此時要變更 primary 由 node01 到 node02, 最安全的方法&lt;br /&gt;先將 node01 變成 secondary, 即兩台都是 secodary&lt;br /&gt;[node01]# umount /data&lt;br /&gt;[node01]# drbdadm secondary r0&lt;br /&gt;此時才把 node01 提升為 primary&lt;br /&gt;[node02]# drbdadm primary r0&lt;br /&gt;[node02]# mount /data&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. HA 的部分&lt;/strong&gt;&lt;br /&gt;[node01], [node02] 兩台設定均同&lt;/p&gt;&lt;p&gt;vim /etc/ha.d/ha.cf&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;#debugfile&amp;nbsp;/var/log/ha-debug.log &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;logfile&amp;nbsp;/var/log/ha-log &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;logfacility&amp;nbsp;local0 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;keepalive&amp;nbsp;2&amp;nbsp;#設定心跳(監測)時間時間為2秒 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;warntime&amp;nbsp;5 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;deadtime&amp;nbsp;20 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;initdead&amp;nbsp;120 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;#hopfudge&amp;nbsp;1 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;udpport&amp;nbsp;694&amp;nbsp;#使用&amp;nbsp;UDP&amp;nbsp;Port&amp;nbsp;694&amp;nbsp;進行心跳監測 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;auto_failback&amp;nbsp;off&amp;nbsp;#如果主要伺服器故障後修復完成，另一台伺服器是否該放棄資源 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;#baud&amp;nbsp;19200 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;bcast&amp;nbsp;eth0&amp;nbsp;#使用eth0做心跳監測&amp;nbsp;(注意：如果電腦只有&amp;nbsp;eth0,&amp;nbsp;請改成&amp;nbsp;eth0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;#ucast&amp;nbsp;eth0&amp;nbsp;172.16.1.11 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;#watchdog&amp;nbsp;/dev/watchdog &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;#crm&amp;nbsp;on &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;node&amp;nbsp;node01&amp;nbsp;#節點1，必須要與&amp;nbsp;hostname&amp;nbsp;或&amp;nbsp;uname&amp;nbsp;-n&amp;nbsp;顯示的主機名稱相符合才可以，此處也可以寫為&amp;nbsp;node01 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;node&amp;nbsp;node02&amp;nbsp;#節點2，此處也可以寫為&amp;nbsp;node02 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;ping&amp;nbsp;172.16.1.254&amp;nbsp;#使用&amp;nbsp;ping&amp;nbsp;Gateway&amp;nbsp;當成檢查主要主機是否仍在運作&amp;nbsp;(心跳是否正常) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;#ping&amp;nbsp;172.16.1.11&amp;nbsp;172.16.1.12&amp;nbsp;172.16.1.10 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;#deadping&amp;nbsp;5 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;#ping_group&amp;nbsp;lbgroup&amp;nbsp;10.0.0.101&amp;nbsp;10.0.0.102 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;#ping_group&amp;nbsp;lbgroup&amp;nbsp;172.16.1.11&amp;nbsp;172.16.1.12 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;#設定和&amp;nbsp;heartbeat&amp;nbsp;一起啟動、關閉的進程 &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;respawn&amp;nbsp;hacluster&amp;nbsp;/usr/lib/heartbeat/ipfail &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;apiauth&amp;nbsp;ipfail&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;gid&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;haclient&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;uid&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;hacluster&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;# vim /etc/ha.d/authkeys&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;auth&amp;nbsp;1 &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;1&amp;nbsp;crc&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;# chmod 600 /etc/ha.d/authkeys&lt;/p&gt;&lt;p&gt;# vim /etc/ha.d/haresources&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;node01&amp;nbsp;IPaddr::172.16.1.10/24/eth0&amp;nbsp;drbddisk::r0&amp;nbsp;Filesystem::/dev/drbd0::/data::ext3&amp;nbsp;nfs&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;# vim /etc/ha.d/resource.d/nfs&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;killall&amp;nbsp;-9&amp;nbsp;nfsd;&amp;nbsp;/etc/init.d/nfs&amp;nbsp;restart;&amp;nbsp;exit&amp;nbsp;0&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;以上參考所實作，&lt;/p&gt;&lt;p&gt;http://forum.icst.org.tw/phpbb/viewtopic.php?f=10&amp;amp;t=17893&amp;amp;start=0&lt;/p&gt;&lt;p&gt;啟動與測試:&lt;/p&gt;&lt;p&gt;假設 node01 是主結點, node02 為副節點，所以請在 [node01] 執行後, 再到 [node02] 執行&lt;br /&gt;[node01]# service heartbeat start&lt;br /&gt;[node01]# /etc/init.d/heartbeat start&lt;br /&gt;[node02]# service heartbeat start&lt;br /&gt;[node02]# /etc/init.d/heartbeat start&lt;/p&gt;&lt;p&gt;Case01, 假設 node01 死掉, 切到 node02&lt;br /&gt;[node01]# /etc/init.d/heartbeat stop&lt;br /&gt;將會把 VIP (172.16.1.10) 切到 node02&lt;/p&gt;&lt;p&gt;建議, 若 node01 若恢復正常, 請將 heartbeat 切回去&lt;br /&gt;[node01]# /etc/init.d/heartbeat start&lt;br /&gt;[node02]# /etc/init.d/heartbeat stop&lt;br /&gt;[node01]# /etc/init.d/heartbeat start&lt;/p&gt;&lt;p&gt;Case02: 若在切回至 node01 , 相當於假設 node02 死掉　&lt;br /&gt;要先讓 node01 的 heartbeat 為啟動狀態, 才能從 node02 接手過來&lt;br /&gt;[node01]# /etc/init.d/heartbeat start&lt;br /&gt;[node02]# /etc/init.d/heartbeat stop&lt;br /&gt;等 node02 恢復&lt;br /&gt;[node02]# /etc/init.d/heartbeat start&lt;br /&gt;此時 VIP 仍在 node01&lt;/p&gt;&lt;p&gt;ps.&lt;br /&gt;原有兩個錯誤&lt;br /&gt;1. /etc/ha.d/haresources 內容為,&lt;br /&gt;centos1.lu.idv.tw IPaddr::192.168.128.100/22/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/d::ext3 nfs&lt;br /&gt;遮罩應為 24， 才能順利啟動 heartbeat&lt;/p&gt;&lt;p&gt;2. /etc/ha.d/resource.d/killnfsd, 根據 haresources 設定名稱應為 /etc/ha.d/resource.d/nfs,&lt;br /&gt;否則 heartbeat 會找不到 /etc/ha.d/resource.d/nfs, 而無法順利啟動 nfs service&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;************************************************&lt;/p&gt;&lt;p&gt;heartbeat + drbd 分布式系统的master&lt;br /&gt;&lt;br /&gt;下图是drbd主页上一个结构图，感觉这才是冗余的，单个盘柜根本就是单点。&lt;br /&gt;&lt;br /&gt;&lt;img title=&quot;Heartbeat drbd Nfs - Homer - notnumb的博客&quot; alt=&quot;Heartbeat drbd Nfs - Homer - notnumb的博客&quot; src=&quot;http://www.517sou.net/Attach/month_1005/oaysve_125030_1.gif&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;通过163的yum源安装heartbeat和drbd&lt;br /&gt;# rpm -qa | grep drbd&lt;br /&gt;drbd83-8.3.2-6.el5_3&lt;br /&gt;kmod-drbd83-8.3.2-6.el5_3&lt;br /&gt;&lt;br /&gt;CentOS5-1&amp;nbsp; 192.168.170.51&lt;br /&gt;CentOS5-2&amp;nbsp; 192.168.170.52&lt;br /&gt;floating ip 192.168.170.50&lt;br /&gt;&lt;br /&gt;cat hosts&lt;br /&gt;192.168.170.50&amp;nbsp; CentOS5&lt;br /&gt;192.168.170.51&amp;nbsp; CentOS5-1&lt;br /&gt;192.168.170.52&amp;nbsp; CentOS5-2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;配置51,52两个节点的nfs服务&lt;br /&gt;cat /etc/exports&lt;br /&gt;/da&lt;wbr /&gt;ta/drbd 192.168.170.0/24(rw,sync)&lt;br /&gt;&lt;br /&gt;配置drbd&lt;br /&gt;先在两台机器上创建lvm分区&lt;br /&gt;&lt;br /&gt;我是建立在lvm上面的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pvcreate /dev/sdc1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vgcreate vg_drbd /dev/sdc1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvcreate -l 1010M -n lv_drbd vg_drbd&lt;br /&gt;&lt;br /&gt;lvs显示&lt;br /&gt;&amp;nbsp; LV&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp; LSize&amp;nbsp;&amp;nbsp;&amp;nbsp; Origin Snap%&amp;nbsp; Move Log Copy%&amp;nbsp; Convert&lt;br /&gt;&amp;nbsp; lv_drbd vg_drbd -wi-ao 1012.00M&lt;br /&gt;&lt;br /&gt;分别在两台机器上启用drbd模块&lt;br /&gt;#modprobe drbd&lt;br /&gt;或者&lt;br /&gt;#insmod /lib/modules/2.6.18-128.7.1.el5/extra/drbd83/drbd.ko&lt;br /&gt;&lt;br /&gt;# lsmod | grep drbd&lt;br /&gt;drbd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 220440&amp;nbsp; 4&lt;br /&gt;&lt;br /&gt;写两台机器的配置文件/etc/drbd.conf&lt;br /&gt;global {&lt;br /&gt;&amp;nbsp; usage-count yes;&lt;br /&gt;}&lt;br /&gt;common {&lt;br /&gt;&amp;nbsp; syncer { rate 100M; }&lt;br /&gt;}&lt;br /&gt;resource r0 {&lt;br /&gt;&amp;nbsp; protocol C;&lt;br /&gt;&amp;nbsp; disk {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; on-io-error detach;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; net {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cram-hmac-alg sha1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; shared-secret &amp;quot;ztpztp&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; on CentOS5-1 {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; device&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /dev/drbd0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; disk&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /dev/vg_drbd/lv_drbd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address&amp;nbsp;&amp;nbsp;&amp;nbsp; 192.168.170.51:7788;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meta-disk&amp;nbsp; internal;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; on CentOS5-2 {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; device&amp;nbsp;&amp;nbsp;&amp;nbsp; /dev/drbd0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; disk&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /dev/vg_drbd/lv_drbd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address&amp;nbsp;&amp;nbsp; 192.168.170.52:7788;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meta-disk internal;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在两台机器上分别创建drbd的meta-da&lt;wbr /&gt;ta&lt;br /&gt;&lt;br /&gt;# drbdadm create-md r0&lt;br /&gt;&lt;br /&gt;md_offset 4294963200&lt;br /&gt;al_offset 4294930432&lt;br /&gt;bm_offset 4294799360&lt;br /&gt;&lt;br /&gt;Found some da&lt;wbr /&gt;ta&lt;br /&gt;&amp;nbsp;==&amp;gt; This might destroy existing da&lt;wbr /&gt;ta! &amp;lt;==&lt;br /&gt;&lt;br /&gt;Do you want to proceed?&lt;br /&gt;[need to type &apos;yes&apos; to confirm] yes&lt;br /&gt;&lt;br /&gt;Writing meta da&lt;wbr /&gt;ta...&lt;br /&gt;initializing activity log&lt;br /&gt;NOT initialized bitmap&lt;br /&gt;New drbd meta da&lt;wbr /&gt;ta block successfully created.&lt;br /&gt;&lt;br /&gt;分别启动drbd服务&lt;br /&gt;/etc/init.d/drbd start&lt;br /&gt;&amp;nbsp;&lt;br /&gt;查看状态&lt;br /&gt;&lt;br /&gt;# /etc/init.d/drbd status&lt;br /&gt;drbd driver loaded OK; device status:&lt;br /&gt;version: 8.3.2 (api:88/proto:86-90)&lt;br /&gt;GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:02:24&lt;br /&gt;m:res&amp;nbsp; cs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ro&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ds&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p&amp;nbsp; mounted&amp;nbsp; fstype&lt;br /&gt;0:r0&amp;nbsp;&amp;nbsp; Connected&amp;nbsp; Secondary/Secondary&amp;nbsp; UpToDate/UpToDate&amp;nbsp; C&lt;br /&gt;&lt;br /&gt;在任一一台上执行&lt;br /&gt;# drbdsetup /dev/drbd0 primary -o&lt;br /&gt;&lt;br /&gt;# cat /proc/drbd&lt;br /&gt;GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34&lt;br /&gt;&amp;nbsp;0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns:1588972 nr:0 dw:0 dr:1597120 al:0 bm:96 lo:2 pe:19 ua:256 ap:0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [======&amp;gt;.............] sync&apos;ed: 37.9% (2605756/4194140)K&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finish: 0:01:42 speed: 25,384 (24,064) K/sec&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resync: used:2/61 hits:99450 misses:98 starving:0 dirty:0 changed:98&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DL380G5 实际测试了下4块146GB RAID1+0 10000转SAS&lt;br /&gt;同步速度&lt;br /&gt;cat /proc/drbd &lt;br /&gt;version: 8.3.2 (api:88/proto:86-90)&lt;br /&gt;GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55&lt;br /&gt;&amp;nbsp;0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r----&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns:0 nr:42637888 dw:42637632 dr:0 al:0 bm:2602 lo:9 pe:4598 ua:8 ap:0 ep:1 wo:b oos:244037380&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [=&amp;gt;..................] sync&apos;ed: 14.9% (238316/279956)M&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; finish: 0:36:40 speed: 110,856 (102,248) K/sec&lt;br /&gt;&lt;br /&gt;平均100MB左右的传输速度，同步完成273.4GB差不多。&lt;br /&gt;4块刚好1Gb够用。&lt;br /&gt;间接证明我bond失败，要更新驱动再看看。&lt;br /&gt;&lt;br /&gt;primary&lt;br /&gt;Device:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rrqm/s&amp;nbsp;&amp;nbsp; wrqm/s&amp;nbsp;&amp;nbsp; r/s&amp;nbsp;&amp;nbsp; w/s&amp;nbsp;&amp;nbsp; rsec/s&amp;nbsp;&amp;nbsp; wsec/s avgrq-sz avgqu-sz&amp;nbsp;&amp;nbsp; await&amp;nbsp; svctm&amp;nbsp; %util&lt;br /&gt;cciss/c0d1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1689.50&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.00 1516.50&amp;nbsp; 6.50 205408.00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6.50&amp;nbsp;&amp;nbsp; 134.87&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8.24&amp;nbsp;&amp;nbsp;&amp;nbsp; 5.42&amp;nbsp;&amp;nbsp; 0.58&amp;nbsp; 89.05&lt;br /&gt;&lt;br /&gt;slave&lt;br /&gt;cciss/c0d1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.00&amp;nbsp; 1687.00&amp;nbsp; 0.00 1523.00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.00 205606.00&amp;nbsp;&amp;nbsp; 135.00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.00&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.31&amp;nbsp;&amp;nbsp; 0.59&amp;nbsp; 89.75&lt;br /&gt;&lt;br /&gt;完成&lt;br /&gt;# cat /proc/drbd&lt;br /&gt;GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34&lt;br /&gt;&amp;nbsp;0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r---&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns:4194140 nr:0 dw:0 dr:4194140 al:0 bm:256 lo:0 pe:0 ua:0 ap:0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resync: used:0/61 hits:261878 misses:256 starving:0 dirty:0 changed:256&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0&lt;br /&gt;&lt;br /&gt;格式化 mkfs.ext3 /dev/drbd0之后，就可以做块设备使用了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;分别在两台机器上配置heartbeat&lt;br /&gt;#yum install heartbeat watchdog&lt;br /&gt;#rpm -qa | egrep &apos;watchdog|heartbeat&apos;&lt;br /&gt;heartbeat-pils-2.1.3-3.el5.centos&lt;br /&gt;watchdog-5.6-1.el5&lt;br /&gt;heartbeat-2.1.3-3.el5.centos&lt;br /&gt;heartbeat-stonith-2.1.3-3.el5.centos&lt;br /&gt;&lt;br /&gt;ldmod检查softdog模块是否加载&lt;br /&gt;&lt;br /&gt;# cat /etc/ha.d/authkeys&lt;br /&gt;auth 1&lt;br /&gt;1 crc&lt;br /&gt;&lt;br /&gt;# cat /etc/ha.d/haresources&lt;br /&gt;CentOS5-1 IPaddr::192.168.170.50/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/da&lt;wbr /&gt;ta/drbd::ext3 portmap killnfsd &lt;br /&gt;&lt;br /&gt;# cat /etc/ha.d/resource.d/killnfsd&lt;br /&gt;pkill -9 nfsd ; /etc/init.d/nfs restart ; exit 0&lt;br /&gt;&lt;br /&gt;# cat /etc/ha.d/ha.cf&lt;br /&gt;watchdog /dev/watchdog&lt;br /&gt;logfile /var/log/ha-log&lt;br /&gt;bcast eth1&lt;br /&gt;keepalive 2&lt;br /&gt;warntime 5&lt;br /&gt;deadtime 15&lt;br /&gt;initdead 30&lt;br /&gt;udpport 694&lt;br /&gt;auto_failback off&lt;br /&gt;node CentOS5-1 CentOS5-2&lt;br /&gt;ping 192.168.170.1&lt;br /&gt;respawn hacluster /usr/lib/heartbeat/ipfail&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;分别启动&lt;br /&gt;#/etc/init.d/heartbeat start&lt;br /&gt;可以从日志体现出来&lt;br /&gt;&lt;br /&gt;[root@CentOS5-1 ~]# cat /proc/drbd&lt;br /&gt;version: 8.3.2 (api:88/proto:86-90)&lt;br /&gt;GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:02:24&lt;br /&gt;&amp;nbsp;0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns:32 nr:8 dw:1215004 dr:123197 al:21 bm:27 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0&lt;br /&gt;&lt;br /&gt;过一会之后&lt;br /&gt;[root@CentOS5-1 ~]# cat /proc/drbd&lt;br /&gt;version: 8.3.2 (api:88/proto:86-90)&lt;br /&gt;GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:02:24&lt;br /&gt;&amp;nbsp;0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns:36 nr:8 dw:1215008 dr:123214 al:21 bm:27 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;自动挂载/dev/drbd0 到/da&lt;wbr /&gt;ta/drbd&lt;br /&gt;/dev/drbd0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 997M&amp;nbsp;&amp;nbsp; 22M&amp;nbsp; 924M&amp;nbsp;&amp;nbsp; 3% /da&lt;wbr /&gt;ta/drbd&lt;br /&gt;&lt;br /&gt;[root@CentOS5-1 ~]# ifconfig eth0:0&lt;br /&gt;eth0:0&amp;nbsp;&amp;nbsp;&amp;nbsp; Link encap:Ethernet&amp;nbsp; HWaddr 08:00:27:62:6A:05&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet addr:192.168.170.50&amp;nbsp; Bcast:192.168.170.255&amp;nbsp; Mask:255.255.255.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UP BROADCAST RUNNING MULTICAST&amp;nbsp; MTU:1500&amp;nbsp; Metric:1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interrupt:11 Base address:0xd020&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;nfs共享分区下测试脚本&lt;br /&gt;#!/bin/bash&lt;br /&gt;while true&lt;br /&gt;do&lt;br /&gt;&amp;nbsp; echo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ---\&amp;gt; trying dd file.img : `date`&lt;br /&gt;&amp;nbsp; dd if=/dev/zero of=file.img count=1024 bs=4k&lt;br /&gt;&amp;nbsp; echo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&amp;lt;----- done dd file.img : `date`&lt;br /&gt;&amp;nbsp; echo&lt;br /&gt;&amp;nbsp; sleep 2&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;在客户端上运行，测试切换是否影响服务。会中断一会。不会stale nfs handle&lt;br /&gt;直接关闭CentOS5-1的电源, 或者kill heartbeat nfsd的进程，watchdog则会生效，自动重启CentOS5-1&lt;br /&gt;相当于是一个软的fence设备，只要内核没挂，其他情况都能生效。&lt;br /&gt;&lt;br /&gt;CentOS5-2上&lt;br /&gt;drbd自动切换，floating ip，nfs服务&lt;br /&gt;#cat /proc/drbd&lt;br /&gt;[root@CentOS5-2 ~]# cat /proc/drbd&lt;br /&gt;primary/unknow&lt;br /&gt;&lt;br /&gt;CentOS5-1重启之后&lt;br /&gt;0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----&lt;br /&gt;&lt;br /&gt;重启CentOS5-1之后&lt;br /&gt;[root@CentOS5-1 ~]# cat /proc/drbd&lt;br /&gt;version: 8.3.2 (api:88/proto:86-90)&lt;br /&gt;GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:02:24&lt;br /&gt;&lt;br /&gt;可以看到client端的脚本没有中断，继续执行，当前挂载的目录也是可用的&lt;br /&gt;&amp;nbsp;0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns:0 nr:86016 dw:86016 dr:0 al:0 bm:12 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0&lt;br /&gt;&lt;br /&gt;drbd除了性能上被网络打了折扣，其他都还好。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;切换drbd到不同状态 drbdadm primary/secondary r0&lt;br /&gt;在线修改配置后&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; drbdadm adjust r0&lt;br /&gt;&lt;br /&gt;之前在网上看篇帖子，要先格式化磁盘，再初始化drbd，我这里先格式化之后总是出问题。&lt;br /&gt;&lt;font size=&quot;+0&quot;&gt;执行命令&amp;nbsp;drbdadm&amp;nbsp;create-md&amp;nbsp;r0&amp;nbsp;&amp;nbsp;&amp;nbsp;出错！ &lt;br /&gt;&lt;br /&gt;[root@centos1&amp;nbsp;~]#&amp;nbsp;drbdadm&amp;nbsp;create-md&amp;nbsp;r0 &lt;br /&gt;md_offset&amp;nbsp;1069248512 &lt;br /&gt;al_offset&amp;nbsp;1069215744 &lt;br /&gt;bm_offset&amp;nbsp;1069182976 &lt;br /&gt;&lt;br /&gt;Found&amp;nbsp;ext3&amp;nbsp;filesystem&amp;nbsp;which&amp;nbsp;uses&amp;nbsp;1044192&amp;nbsp;kB &lt;br /&gt;current&amp;nbsp;configuration&amp;nbsp;leaves&amp;nbsp;usable&amp;nbsp;1044124&amp;nbsp;kB &lt;br /&gt;&lt;br /&gt;Device&amp;nbsp;size&amp;nbsp;would&amp;nbsp;be&amp;nbsp;truncated,&amp;nbsp;which &lt;br /&gt;would&amp;nbsp;corrupt&amp;nbsp;da&lt;wbr /&gt;ta&amp;nbsp;and&amp;nbsp;result&amp;nbsp;in &lt;br /&gt;&apos;access&amp;nbsp;beyond&amp;nbsp;end&amp;nbsp;of&amp;nbsp;device&apos;&amp;nbsp;errors. &lt;br /&gt;You&amp;nbsp;need&amp;nbsp;to&amp;nbsp;either &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;use&amp;nbsp;external&amp;nbsp;meta&amp;nbsp;da&lt;wbr /&gt;ta&amp;nbsp;(recommended) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;shrink&amp;nbsp;that&amp;nbsp;filesystem&amp;nbsp;first &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;zero&amp;nbsp;out&amp;nbsp;the&amp;nbsp;device&amp;nbsp;(destroy&amp;nbsp;the&amp;nbsp;filesystem) &lt;br /&gt;Operation&amp;nbsp;refused. &lt;br /&gt;&lt;br /&gt;Command&amp;nbsp;&apos;drbdmeta&amp;nbsp;/dev/drbd1&amp;nbsp;v08&amp;nbsp;/dev/sdb1&amp;nbsp;internal&amp;nbsp;create-md&apos;&amp;nbsp;terminated&amp;nbsp;with&amp;nbsp;exit&amp;nbsp;co&lt;wbr /&gt;de&amp;nbsp;40 &lt;br /&gt;drbdadm&amp;nbsp;create-md&amp;nbsp;r0:&amp;nbsp;exited&amp;nbsp;with&amp;nbsp;co&lt;wbr /&gt;de&amp;nbsp;40&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;错误解决方案&lt;br /&gt;# which means&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * you created your filesystem before you created your DRBD resource, or&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * you created your filesystem on your backing device, rather than your DRBD,&lt;br /&gt;&lt;br /&gt;# neither of which is a problem by itself, except - as the error message tries to hint - you need to enlarge the device (e.g. lvextend), shrink the filesystem (e.g. resize2fs), &lt;br /&gt;&lt;br /&gt;or place the DRBD metadata somewhere else (external meta da&lt;wbr /&gt;ta).&lt;br /&gt;# DRBD tries to detect an existing use of the block device in question. E.g. if it detects an existing file system that uses all the available space (as is default for most &lt;br /&gt;&lt;br /&gt;filesystems), and you try to use DRBD with internal meta da&lt;wbr /&gt;ta, there is no room for the internal meata da&lt;wbr /&gt;ta - creating that would corrupt the last few MiB of the existing file &lt;br /&gt;&lt;br /&gt;system.&lt;br /&gt;# If re-creating the filesystem on the DRBD is an option, on&lt;wbr /&gt;e way to &amp;quot;zero out the device (destroy the filesystem)&amp;quot;, and then recreate it on the DRBD is&lt;br /&gt;&lt;br /&gt;dd if=/dev/zero bs=1M count=1 of=/dev/sdc1; sync&lt;br /&gt;drbdadm create-md $r&lt;br /&gt;/etc/init.d/drbd start&lt;br /&gt;primary机器上执行&lt;br /&gt;drbdadm -- -o primary $r 开始同步&lt;br /&gt;mkfs /dev/drbdY&lt;br /&gt;&lt;br /&gt;# If drbdadm would not refuse, you would soon be back reading the next answer.&lt;br /&gt;&lt;br /&gt;清空了磁盘格式化信息，在初始化meta-da&lt;wbr /&gt;ta，同步后在格式化块设备。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果出现primany/unknow和secondary/unknow 的状况&lt;br /&gt;&lt;br /&gt;通过查看/proc/drbd可以查看所有drbd资源当前的状态.&lt;br /&gt;[root@oem3 ~]# cat /proc/drbd&lt;br /&gt;version: 8.2.6 (api:88/proto:86-88)&lt;br /&gt;GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17&lt;br /&gt;0: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r---&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns:0 nr:811016 dw:811016 dr:0 al:0 bm:61 lo:0 pe:0 ua:0 ap:0 oos:0&lt;br /&gt;1: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r---&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns:0 nr:8 dw:8 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 oos:0&lt;br /&gt;其中cs表示连接的状态, 常见的状态有,StandAlone,WFConnection,Connected等, Connected表示该resource的节点已经建立连接, WFConnection表示在等待连接, 常在启动过程中, 或者另外一方运行&lt;br /&gt;&lt;br /&gt;disconnect后出现, StandAlone表示没有可用的网络配置, 常在运行disconnect后出现.&lt;br /&gt;ds表示磁盘的状态,常见的状态有UpToDate, Unknown等, UpToDate表示表示数据是最新的,这一状态为正常状态, Unknow表示对方状态是未知的, 网络断开后, 对方节点的磁盘状态常变为Unknown.&lt;br /&gt;drbd kernel module 会写一些日志到系统日志中, 可以通过dmesg查看&lt;br /&gt;mirrorview的fracture/synchronize过程模拟如下:&lt;br /&gt;1 在2个节点上attatch, connect resource,&lt;br /&gt;2 检查磁盘状态为UpToDate/UptoDate, 连接状态为Connected, 状态为Primary/Secondary&lt;br /&gt;3 在2个节点上disconnect resource, 此时连接状态应变为StandAlone, 状态变为Primary/Unknown(第1个节点)或Secondary/Unknown, 磁盘状态变为UpToDate/DUnknown&lt;br /&gt;drbdadm disconnect resource&lt;br /&gt;4 在第2个节点上将resource置为primary, 状态变为Primary/Unknown&lt;br /&gt;drbdadm primary resource&lt;br /&gt;5 在第2个节点上对resource对应的逻辑设备进行操作, 比如挂载文件系统, 备份等.&lt;br /&gt;6 操作结束后, 停止对resource对应的逻辑设备的访问, 卸载文件系统&lt;br /&gt;7 在第2个节点上,　将resorce置为Secondary&lt;br /&gt;drbdadm secondary resource&lt;br /&gt;8 在第1个节点上连接资源&lt;br /&gt;drbdadm connect resource&lt;br /&gt;9 在第2个节点上忽略数据变化, 同步数据,&lt;br /&gt;drbdadm -- --discard-my-da&lt;wbr /&gt;ta connect resource&lt;br /&gt;如果使用了普通的connect数据, 则一个节点处于WFconenct, 一个节点处于Standalone状态, dmesg信息中显示&lt;br /&gt;drbd0: Split-Brain detected, dropping connection!&lt;br /&gt;drbd0: self BF739B73E097B05E:D3B06FBE563C5580:7D4CAACF55C1C208:A625E780FF79A3B7&lt;br /&gt;drbd0: peer 2FE125710E63486F:D3B06FBE563C5581:7D4CAACF55C1C208:A625E780FF79A3B7&lt;br /&gt;drbd0: helper command: /sbin/drbdadm split-brain&lt;br /&gt;drbd0: conn( WFReportParams -&amp;gt; Disconnecting )&lt;br /&gt;此时只需要执行步骤8和9即可.&lt;br /&gt;10 通过/proc/drbd检查同步状态, 直到磁盘状态变为UpToDate/UptoDate&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在线扩展drbd，先扩展lvm，再使用drbd的resize就行了。&lt;br /&gt;drbdadm primary r0&lt;br /&gt;vgextend vg_drbd /dev/sdd1&lt;br /&gt;lvextend -L +1010M /dev/vg_drbd/lv_drbd&lt;br /&gt;cat /proc/drbd &lt;br /&gt;drbdadm resize r0&lt;br /&gt;cat /proc/drbd&lt;br /&gt;&lt;/p&gt;&lt;p&gt;***********************************************************************&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、heartbeat+drbd&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果主服务器宕机，造成的损失是不可估量的。要保证主服务器不间断服务，就需要对服务器实现冗余。在众多的实现服务器冗余的解决方案中，heartbeat为我们提供了廉价的、可伸缩的高可用集群方案。我们通过heartbeat+drbd在Linux下创建一个高可用(HA)的集群服务器。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DRBD是一种块设备，可以被用于高可用(HA)之中。它类似于一个网络RAID-1功能。当你将数据写入本地文件系统时，数据还将会被发送到网络中另一台主机上。以相同的形式记录在一个文件系统中。本地(主节点)与远程主机(备节点)的数据可以保证实时同步。当本地系统出现故障时，远程主机上还会保留有一份相同的数据，可以继续使用。在高可用(HA)中使用DRBD功能，可以代替使用一个共享盘阵。因为数据同时存在于本地主机和远程主机上。切换时，远程主机只要使用它上面的那份备份数据，就可以继续进行服务了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;安装heartbeat&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;[root@manager src]# rpm -ivh e2fsprogs-1.35-7.1.i386.rpm&lt;br /&gt;[root@manager src]# tar zxvf libnet.tar.gz&lt;br /&gt;[root@manager libnet]# ./configure&lt;br /&gt;[root@manager libnet]# make&lt;br /&gt;[root@manager libnet]# make install&lt;br /&gt;[root@manager src]# tar zxvf heartbeat-2.1.2.tar.tar&lt;br /&gt;[root@manager src]# cd heartbeat-2.1.2&lt;br /&gt;[root@manager heartbeat-2.1.2]# ./ConfigureMe configure&lt;br /&gt;[root@manager heartbeat-2.1.2]# make&lt;br /&gt;[root@manager heartbeat-2.1.2]# make install&lt;br /&gt;[root@manager heartbeat-2.1.2]# cp doc/ha.cf /etc/ha.d/&lt;br /&gt;[root@manager heartbeat-2.1.2]# cp doc/haresources /etc/ha.d/&lt;br /&gt;[root@manager heartbeat-2.1.2]# cp doc/authkeys /etc/ha.d/&lt;br /&gt;[root@manager heartbeat-2.1.2]# cd /etc/ha.d/&lt;br /&gt;开始编辑配置文件（两台机器上都需要安装和配置）&lt;br /&gt;(heartbeat的配置比较简单，网上也有很多例子，这里就不多废话了)&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.517sou.net/Attach/month_1005/ovo2q6_125032_2.gif&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image001&quot; src=&quot;http://www.517sou.net/Attach/month_1005/yylqnh_125032_3.gif&quot; width=&quot;545&quot; height=&quot;481&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;开始编译安装DRBD&lt;/em&gt;&lt;/p&gt;&lt;p&gt;[root@manager root]# cp drbd-8.2.1.tar.tar /usr/src/&lt;br /&gt;[root@manager root]# cd /usr/src/&lt;br /&gt;[root@manager src]# tar zxvf drbd-8.2.1.tar.tar&lt;br /&gt;[root@manager src]# cd drbd-8.2.1&lt;br /&gt;[root@manager src]# make KERNVER=2.6.17.11 KDIR=/usr/src/linux-2.6.17.11&lt;/p&gt;&lt;p&gt;如果编译顺利可以看到Module build was successful.&lt;br /&gt;[root@manager drbd-8.2.1]# make install&lt;/p&gt;&lt;p&gt;&lt;em&gt;可以编辑配置文件了&lt;/em&gt;&lt;/p&gt;&lt;p&gt;[root@manager drbd-8.2.1]# vi /etc/drbd.conf &lt;br /&gt;在manager和manage_bak上都需要安装drbd服务。&lt;br /&gt;分别在两台机器上配置好/etc/drbd.conf &lt;br /&gt;[root@manager_bak root]# grep -v &amp;quot;#&amp;quot; /etc/drbd.conf &lt;br /&gt;global {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usage-count yes;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （是否参加使用者统计，yes为参加）&lt;br /&gt;}&lt;br /&gt;common {&lt;br /&gt;&amp;nbsp; syncer { rate 300M; }&lt;br /&gt;}&lt;br /&gt;resource r0 {&lt;br /&gt;&amp;nbsp; protocol C;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （数据同步协议，C为收到数据并写入后返回，确认成功）&lt;br /&gt;&amp;nbsp; disk {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; on-io-error&amp;nbsp;&amp;nbsp; detach;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size 100G;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （由于实验环境下两台服务器硬盘大小不同，所以需要设置drbd的大小）&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; net {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; after-sb-0pri disconnect;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rr-conflict disconnect;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; syncer {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rate 300M;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （设置网络同步速率）&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; al-extents 257;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; on manager_bak {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; device&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /dev/drbd0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; disk&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /dev/sda3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address&amp;nbsp;&amp;nbsp;&amp;nbsp; 192.168.0.2:7788;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meta-disk&amp;nbsp; internal;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; on manager {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; device&amp;nbsp;&amp;nbsp;&amp;nbsp; /dev/drbd0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; disk&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /dev/sdc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address&amp;nbsp;&amp;nbsp; 192.168.0.1:7788;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meta-disk internal;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;在启动DRBD之前，需要创建供DRBD记录信息的数据块.分别在两台主机上执行：&lt;/p&gt;&lt;p&gt;[root@manager ha.d]# drbdadm create-md r0&lt;br /&gt;[root@manager ha.d]#mknod /dev/drbd0 b 147 0&lt;br /&gt;[root@manager ha.d]# /etc/init.d/drbd srart&lt;/p&gt;&lt;p&gt;现在两台主机都是备机状态，都是”不一致”状态，这是由于DRBD无法判断哪一方为主机，以哪一方的磁盘数据作为标准数据。所以我们需要初始化，在manager上执行：&lt;/p&gt;&lt;p&gt;[root@manager /]#drbdsetup /dev/drbd0 primary –o&lt;/p&gt;&lt;p&gt;现在数据开始同步，可以用cat /proc/drbd查看数据同步的进度&lt;br /&gt;等数据同步完查看DRBD的状态&lt;/p&gt;&lt;p&gt;[root@manager /]# cat /proc/drbd &lt;br /&gt;version: 8.2.1 (api:86/proto:86-87)&lt;br /&gt;GIT-hash: 318925802fc2638479ad090b73d7af45503dd184 build by root@manager, 2007-12-05 16:40:14&lt;br /&gt;0: cs:Connected st Primary/Secondary ds:UpToDate/UpToDate C r---&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns:1514 nr:1110 dw:2616 dr:2259 al:0 bm:482 lo:0 pe:0 ua:0 ap:0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resync: used:0/31 hits:2 misses:2 starving:0 dirty:0 changed:2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; act_log: used:0/257 hits:202 misses:0 starving:0 dirty:0 changed:0&lt;br /&gt;磁盘状态都是”实时”，表示数据同步完成了。&lt;/p&gt;&lt;p&gt;[root@manager /]# mkfs.xfs /dev/drbd0&lt;/p&gt;&lt;p&gt;现在可以把manager上的DRBD设备挂载到/export目录上进行使用。备机的DRBD设备无法被挂载，因为它是用来接收主机数据的，由DRBD负责操作。&lt;/p&gt;&lt;p&gt;[root@manager /]# mount /dev/drbd0 /export&lt;br /&gt;[root@manager /]# df&lt;br /&gt;Filesystem&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1K-blocks&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Used Available Use% Mounted on&lt;br /&gt;/dev/sda1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10229696&amp;nbsp;&amp;nbsp; 3019636&amp;nbsp;&amp;nbsp; 7210060&amp;nbsp; 30% /&lt;br /&gt;/dev/drbd0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 104806400&amp;nbsp;&amp;nbsp; 3046752 101759648&amp;nbsp;&amp;nbsp; 3% /export&lt;/p&gt;&lt;p&gt;现在把之前备份的/export中的所有内容再恢复回去。&lt;br /&gt;如果不使用heartbeat的情况下，DRBD只能手工切换主从关系&lt;br /&gt;现在修改heartbeat的配置文件，使DRBD可以通过heartbeat自动切换&lt;/p&gt;&lt;p&gt;[root@manager /]# vi /etc/ha.d/haresources&lt;br /&gt;manager 192.168.0.3 drbddisk::r0 Filesystem::/dev/drbd0::/export::xfs&amp;nbsp; dhcpd xinetd portmap nfs&lt;/p&gt;&lt;p&gt;注释：上面那行&lt;br /&gt;manager&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 定义manager为heartbeat的主机&lt;br /&gt;192.168.0.3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 定义对外服务的IP地址，这个IP自动在主从机之间切换&lt;br /&gt;drbddisk::r0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 定义使用的drbd资源&lt;br /&gt;Filesystem::/dev/drbd0::/export::xfs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 定义挂载文件系统&lt;br /&gt;dhcpd xinetd portmap nfs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 定义其他需要切换的服务（用空格隔开）&lt;/p&gt;&lt;p&gt;&lt;em&gt;现在我们可以测试一下了&lt;/em&gt;&lt;/p&gt;&lt;p&gt;（dhcpd portmap nfs等需要切换的服务，应该先在两台服务器上都配置好）&lt;/p&gt;&lt;p&gt;[root@manager root]# chkconfig –list&lt;/p&gt;&lt;p&gt;确定heartbeat和DRBD开机自启动&lt;br /&gt;确定需要由heartbeat切换的服务，开机不自启动（由heartbeat来启用相关的服务）&lt;br /&gt;给gg1接通电源，通过pxe启动系统(gg1是一组服务器中的一台，是一台无盘服务器，启动后挂载在manager上保存的系统)&lt;br /&gt;在manager上ssh gg1&lt;/p&gt;&lt;p&gt;[root@manager root]# ssh gg1&lt;br /&gt;-bash-2.05b#&lt;br /&gt;-bash-2.05b# arp -a&lt;br /&gt;? (192.168.0.3) at 00:19:B9:E4:7D:22 [ether] on eth0&lt;br /&gt;-bash-2.05b# ls&lt;br /&gt;-bash-2.05b# touch test&lt;br /&gt;-bash-2.05b# ls&lt;br /&gt;test&lt;/p&gt;&lt;p&gt;现在在manager上关机或停止heartbeat服务&lt;br /&gt;[root@manager root]# /etc/init.d/heartbeat stop&lt;br /&gt;Stopping High-Availability services:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&amp;nbsp; OK&amp;nbsp; ]&lt;/p&gt;&lt;p&gt;到manager_bak上ifconfig &lt;br /&gt;[root@manager_bak root]# ifconfig &lt;br /&gt;可以看到eth1:0起来了，IP地址是192.168.0.3&lt;/p&gt;&lt;p&gt;[root@manager_bak root]# ssh gg1&lt;br /&gt;-bash-2.05b#&lt;br /&gt;-bash-2.05b# arp -a&lt;br /&gt;? (192.168.0.3) at 00:19:B9:E5:3B:FC [ether] on eth0 （可以看到192.168.0.3的mac地址变了）&lt;br /&gt;-bash-2.05b# ls&lt;br /&gt;test&lt;/p&gt;&lt;p&gt;可以看到在manager上ssh上gg1后建立的test文件 &lt;br /&gt;-bash-2.05b# echo &amp;quot;this is test&amp;quot; &amp;gt; test &lt;br /&gt;-bash-2.05b# cat test &lt;br /&gt;this is test&lt;/p&gt;&lt;p&gt;可以看到现在gg1可以正常读写manager_bak上nfs出来的磁盘&lt;br /&gt;现在把manager上的heartbeat服务启动起来&lt;/p&gt;&lt;p&gt;[root@manager root]# /etc/init.d/heartbeat start&lt;br /&gt;Starting High-Availability services: &lt;br /&gt;2007/12/06_12:46:08 INFO:&amp;nbsp; Resource is stopped&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&amp;nbsp; OK&amp;nbsp; ]&lt;br /&gt;-bash-2.05b# cat test &lt;br /&gt;this is test&lt;/p&gt;&lt;p&gt;现在终于大功告成了，之前在不使用drbd的情况下，heartbeat也可以切换apache、dhcpd、portmap、nfs等等服务，但是 nfs服务切换后，必须重新mount一下nfs共享出来的目录，否则会报 Stale NFS file handle 的错误。现在heartbeat+drbd配合使用后，nfs等等服务可以无缝切换，不必再重新mount一下nfs目录了。&lt;/p&gt;&lt;p&gt;***************************************************************&lt;/p&gt;&lt;p&gt;&lt;b&gt;三、openSUSE10.2系统中编译、安装、配置和调试DRBD的一次实践&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1、编译&lt;br /&gt;&lt;/strong&gt;下载源代码：&lt;a href=&quot;http://oss.linbit.com/drbd/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://oss.linbit.com/drbd/&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;。我选择drbd-0.7.25版本，支持linux内核2.6.XX。在这个页面，我们还可以找到DRBD各个发布版本的日志链接。阅读这些log，特别是我们要的目标版本，很有帮助。&lt;br /&gt;&lt;br /&gt;以下所做的，基本上都可以按照&lt;a href=&quot;http://www.drbd.org/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;www.drbd.org&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;上面提供的manual来进行，见&amp;quot;&lt;strong&gt;Chapter 4 Building and installing DRBD from source&lt;/strong&gt;&amp;quot;。唯一需要注意的是，这个manual针对的是8.0版本以后的DRBD，有些操作可能不适用于DRBD8.0.xx以前的版本。而另一个重要参考材料是源代码包中的INSTALL文件，这个是绝对没错的。需要看多几次，或者同时搜索一下别人安装DRBD的经验文档，结合来看就明了。&lt;br /&gt;&lt;br /&gt;我下载到&lt;strong&gt;/home/download&lt;/strong&gt;目录下，然后&lt;strong&gt;cd /usr/src&lt;/strong&gt;，计划把解包后的DRBD源代码可以放在这里，执行：&lt;br /&gt;&lt;strong&gt;tar -xzf /home/download/drbd-0.7.25.tar.gz ./&lt;br /&gt;&lt;/strong&gt;完成后得到&lt;strong&gt;/usr/src/drbd-0.7.25&lt;/strong&gt;目录。&lt;br /&gt;&lt;br /&gt;###################################################&lt;br /&gt;在编译之前，首先要确认系统中已经安装了gcc, make, glibc库, flex scanner generator和bison等工具，其中gcc的版本必须和编译当前linux内核所用的gcc是相同版本的。&lt;br /&gt;查看gcc版本的命令：&lt;strong&gt;gcc -v&lt;/strong&gt;&lt;br /&gt;查看当前linux内核对应gcc版本的命令：&lt;strong&gt;cat /proc/version&lt;/strong&gt;&lt;br /&gt;##################################################&lt;br /&gt;&lt;br /&gt;##################################################&lt;br /&gt;DRBD会被编译内核模块，其中需要用到若干内核头文件、内核源码等等，所以需要做点准备。详细阅读源代码目录中的INSTALL就了解，准备工作分两种情况：&lt;br /&gt;(I) 当前系统使用的是发行版本(openSUSE, Fedora, ubuntu等等)编译好的内核（称为stock kernel），则可以检查一下系统/usr/src等目录。（关于内核模块的做法，可以找其它资料参考参考。）如果没有安装这些文件，那么就安装盘，通过安装包管理工具安装到文件系统中就是。&lt;br /&gt;(II) 当前系统使用的不是发行版本编译好的内核，比如自己编译的、或者去&lt;a href=&quot;http://www.kernel.org/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;www.kernel.org&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;下载的。这种情况，就要去下载对应内核版本的源文件包进行安装。不过具体我还是没做过，呵呵。&lt;br /&gt;&lt;br /&gt;本文基于第(1)种情况，在安装openSUSE时选择安装包时特意选择了对应的源文件包。&lt;br /&gt;##################################################&lt;br /&gt;&lt;br /&gt;以下开始正式的编译程序啦。&lt;br /&gt;(1) 执行&lt;strong&gt;cd /usr/src/linux&lt;/strong&gt;，进入linux目录；&lt;br /&gt;(2) [可选] 执行&lt;strong&gt;make mrproper&lt;/strong&gt;， 此举将内核源码树配置恢复到原始状态，删除早期构建版本或者运行时配置的多余内容；&lt;br /&gt;(3) 执行&lt;strong&gt;make cloneconfig&lt;/strong&gt;，此举将当前运行的kernel配置文件克隆到内核源码树；&lt;br /&gt;(4) 执行&lt;strong&gt;cd /usr/src/drbd-0.7.25/drbd, &lt;/strong&gt;进入&lt;strong&gt;drbd&lt;/strong&gt;目录&lt;strong&gt;；&lt;br /&gt;&lt;/strong&gt;(5) 执行make clean all，这将编译得到&lt;strong&gt;/usr/src/drbd-0.7.25/drbd/drbd.ko&lt;/strong&gt;目标文件；此时执行&lt;strong&gt;/sbin/modinfo drbd.ko&lt;/strong&gt;可以查询该文件信息，以后使用&lt;strong&gt;insmod&lt;/strong&gt;或者&lt;strong&gt;modprobe&lt;/strong&gt;命令就可以把drbd模块加载到系统内核中。&lt;br /&gt;(6) 执行&lt;strong&gt;cd ..&lt;/strong&gt;, 进入&lt;strong&gt;drbd-0.7.25&lt;/strong&gt;目录；&lt;br /&gt;(7) 执行&lt;strong&gt;make tools&lt;/strong&gt;，此举将编译DRBD用户空间工具drbdadm, drbdsetup等程序, 检查&lt;strong&gt;/usr/src/drbd-0.7.25/user&lt;/strong&gt;目录可见这些可执行文件; 安装了DRBD之后，用户可以通过drbdadm或者drbdsetup工具进行维护工作。&lt;br /&gt;----- 执行编译已经完成。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2、安装&lt;br /&gt;&lt;/strong&gt;编译操作可以说是简单，也可以说复杂；Linux系统下的许多事情，如果你熟悉了之后就非常简单，不熟悉的话摸索一天两夜也许还是焦头烂额。谁叫微软的产品做的那么易用呢？！呵呵。&lt;br /&gt;不过安装还是蛮简单的：&lt;br /&gt;(1) 执行&lt;strong&gt;cd /usr/src/drbd-0.7.25&lt;/strong&gt;， 进入drbd-0.7.25目录；&lt;br /&gt;(2) 执行&lt;strong&gt;make install&lt;/strong&gt;，此举做一些drbd.ko安装工作；&lt;br /&gt;(3) 执行&lt;strong&gt;make install-tools&lt;/strong&gt;，或者进入/usr/src/drbd-0.7.25/user目录执行make install-tools，将用户空间工具安装到/sbin目录中。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3、配置&lt;br /&gt;&lt;/strong&gt;安装之后，要使得DRBD运行起来，还是要配置哦。因为DRBD运行于双机之上，需要配置才能明确相关参数。&lt;br /&gt;配置文件是/etc/drbd.conf，双机两个节点的配置文件是一模一样的。DRBD源码目录下有个样本，里面说得比较详细。下面是我自己的配置：&lt;br /&gt;******************************************************************************************************&lt;br /&gt;global { &lt;br /&gt;#usage-count yes;&lt;br /&gt;minor-count 1; &lt;br /&gt;}&lt;/p&gt;&lt;p&gt;resource r0 {&lt;br /&gt;protocol C;&lt;br /&gt;incon-degr-cmd &amp;quot;echo &apos;!DRBD! pri on incon-degr&apos; | wall ; sleep 60 ; halt -f&amp;quot;;&lt;br /&gt;startup { wfc-timeout 0; degr-wfc-timeout 120; }&lt;br /&gt;disk { on-io-error detach; }&lt;br /&gt;syncer {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rate 1M;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #group 3;&amp;nbsp;&amp;nbsp; # sync when r2 is finished syncing.&lt;br /&gt;}&lt;br /&gt;on yls0 {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; device /dev/drbd0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; disk /dev/sda9;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address 192.168.2.100:7789;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meta-disk internal;&lt;br /&gt;}&lt;br /&gt;on yls02 {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; device&amp;nbsp;&amp;nbsp;&amp;nbsp; /dev/drbd0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; disk&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /dev/hda7;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address&amp;nbsp;&amp;nbsp; 192.168.2.101:7789;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meta-disk internal;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;******************************************************************************************************&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4、启动&lt;br /&gt;&lt;/strong&gt;启动操作需要在双机两个节点上都独立执行，首先将DRBD模块加载到系统中, 然后启动DRBD：&lt;br /&gt;(1) 执行&lt;strong&gt;cd /usr/src/drbd-0.7.25/drbd&lt;/strong&gt;，进入drbd目录，&lt;br /&gt;(2) 执行&lt;strong&gt;modprobe drbd&lt;/strong&gt;， 将drbd模块加载到内核空间&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 此时使用&lt;strong&gt;lsmod | grep drbd&lt;/strong&gt;命令, 如果得到类似于“drbd 143088 0”的信息，表明加载成功。&lt;br /&gt;(3) 执行&lt;strong&gt;drbdadm up all&lt;/strong&gt;， 此举将DRBD运行起来。&lt;br /&gt;(4) 执行cat /proc/drbd可以观察到当前DRBD运行状态信息，此时两个节点的DRBD都处于secondary状态。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;5、激活主节点DRBD&lt;br /&gt;&lt;/strong&gt;虽然DRBD配置没有固定主备节点的区别，激活节点一般处于DRBD主状态，去激活节点一般处于DRBD备状态。所以，我们首先确定哪个节点是激活的，然后在激活节点执行：&lt;br /&gt;(1) 执行&lt;strong&gt;drbdadm primary all&lt;/strong&gt;， 或者&lt;strong&gt;drbdadm --do-what-I-say primary all&lt;/strong&gt;，此举将在激活节点的DRBD置&lt;strong&gt;primary&lt;/strong&gt;状态，而去激活节点的DRBD还是处于&lt;strong&gt;secondary&lt;/strong&gt;状态。&lt;br /&gt;(2) 执行&lt;strong&gt;cat /proc/drbd&lt;/strong&gt;，检查当前主备节点DRBD运行状态，连接状态、磁盘状态等等。&lt;br /&gt;(3) 执行ll /dev/drbd*， 可以得到相关drbd设备文件信息。如果drbd.conf只配置一个资源，则此时得到drbd0设备文件的相关信息。&lt;br /&gt;(4) 如果此时显示连接状态不是connected的，则说明有异常。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先检查drbd.conf, 其次检查双机的网络链路设置(物理链路、系统防火墙等等)，如果这些检查点都无异常，那么就是&lt;strong&gt;dmesg&lt;/strong&gt;命令来看看模块启动过程中的历史信息，从中或者可以找到一些蛛丝马迹哦。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果还是没有办法，那记得去官方网站看看DRBD版本更新日志，搜索一下drbd-user mail的信息吧，有时候还是蛮有帮助的。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;6、[全新安装]创建DRBD文件系统&lt;/strong&gt;&lt;br /&gt;/dev/drbd0是DRBD模块运行时创建的，它只是一个虚拟块设备文件或者说是虚拟块设备驱动程序，底层支持块设备由drbd.conf的disk参数制定。&lt;br /&gt;&lt;br /&gt;在全新安装情况下，DRBD还没有创建文件系统，所以到目前为止我们无法在文件系统下对DRBD设备进行文件操作(当然直接块读写还是可以的，这种情况下就把DRBD视作raw device裸设备啦)。文件系统的功用是什么？主要是按照人类的思维习惯来组织数据。下面可以在drbd设备中创建文件系统，以EXT3文件系统为例：&lt;br /&gt;(1) 执行&lt;strong&gt;mkfs.ext3 -j /dev/drbd0&lt;/strong&gt;，成功后，&lt;br /&gt;(2) 执行&lt;strong&gt;mkdir /mnt/drbd0&lt;/strong&gt;, 成功后，&lt;br /&gt;(3) 执行&lt;strong&gt;mount -t ext3 rw /dev/drbd0 /mnt/drbd0&lt;/strong&gt;，即将DRBD设备上文件系统安装到/mnt/drbd0挂载点上，此后可以在该挂载点中读写数据。&lt;br /&gt;* 注意：以上操作只需在主DRBD上执行，备DRBD会实时同步过去。&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/DRBD_Heartbeat_and_HA_NFS.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/443/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/DRBD_Heartbeat_and_HA_NFS.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/443/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/Pacemaker_Install_and_Initial_Configuration.aspx</link>
		<title>Pacemaker &apos;s Install &amp; Initial Configuration</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Mon, 10 May 2010 06:47:38 GMT</pubDate>
		<description>&lt;h1 id=&quot;firstHeading&quot; class=&quot;firstHeading&quot;&gt;Install&lt;/h1&gt;&lt;div id=&quot;bodyContent&quot;&gt;&lt;h3 id=&quot;siteSub&quot;&gt;From ClusterLabs&lt;/h3&gt;&lt;table id=&quot;toc&quot; class=&quot;toc&quot; summary=&quot;Contents&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div id=&quot;toctitle&quot;&gt;&lt;h2&gt;Contents&lt;/h2&gt;&lt;/div&gt;&lt;ul&gt;&lt;li class=&quot;toclevel-1&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#READ_ME_FIRST&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;READ ME FIRST&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-1&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Versions_and_Compatibilty&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Versions and Compatibilty&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;ul&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Supported_Branches&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;2.1&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Supported Branches&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Deprecated_Branches&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;2.2&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Deprecated Branches&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-1&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Binary_Packages&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Binary Packages&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;ul&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#RPM&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;3.1&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;RPM&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;ul&gt;&lt;li class=&quot;toclevel-3&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Installing_on_Fedora&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;3.1.1&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Installing on Fedora&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-3&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Installing_on_EPEL_Compatible_Distributions:_RHEL.2C_CentOS.2C_etc&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;3.1.2&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Installing on EPEL Compatible Distributions: RHEL, CentOS, etc&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-3&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Installing_on_openSUSE&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;3.1.3&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Installing on openSUSE&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-3&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Intra-Stack_Package_Dependancies&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;3.1.4&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Intra-Stack Package Dependancies&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-3&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Single_Stack_Configurations_.28RPM_only.29&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;3.1.5&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Single Stack Configurations (RPM only)&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-3&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Re-Building_RPMs_for_Other_Architectures&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;3.1.6&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Re-Building RPMs for Other Architectures&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Debian&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;3.2&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Debian&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;ul&gt;&lt;li class=&quot;toclevel-3&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Building_from_Source&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;3.2.1&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Building from Source&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Ubuntu&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;3.3&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Ubuntu&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-1&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Darwin.2FMacOS_X&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Darwin/MacOS X&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-1&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#From_Source&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;From Source&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;ul&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#First_Steps&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;5.1&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;First Steps&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Cluster_Glue&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;5.2&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Cluster Glue&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Resource_Agents&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;5.3&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Resource Agents&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Heartbeat.2A&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;5.4&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Heartbeat*&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#CoroSync.2A&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;5.5&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;CoroSync*&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#OpenAIS.2A&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;5.6&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;OpenAIS*&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Pacemaker&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;5.7&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Pacemaker&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#GUI&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;5.8&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;GUI&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-1&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install#Next_Steps&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Next Steps&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;h2&gt;&lt;span class=&quot;mw-headline&quot;&gt;READ ME FIRST &lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Please do not attempt to install Pacemaker with anything less than Heartbeat 3.0.0&lt;/p&gt;&lt;p&gt;Since Pacemaker was originally part of Heartbeat, it naturally includes many of the files contained in Heartbeat 2.x Most package managers including YUM, RPM and DEB will complain extremely loudly if you try this.&lt;/p&gt;&lt;h2&gt;&lt;span class=&quot;mw-headline&quot;&gt;Versions and Compatibilty &lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The list of current and supported versions of Pacemaker are available at the &lt;a title=&quot;Releases&quot; href=&quot;http://www.clusterlabs.org/wiki/Releases&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Releases&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; page. If you already have Pacemaker installed, please read the documentation on &lt;b&gt;&lt;a title=&quot;Upgrade&quot; href=&quot;http://www.clusterlabs.org/wiki/Upgrade&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;upgrading Pacemaker&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/b&gt; before following any of the instructions here.&lt;/p&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;Supported Branches &lt;table style=&quot;border-bottom: medium none; border-left: medium none; width: 100%; border-collapse: collapse; border-top: medium none; border-right: medium none; mso-border-alt: solid black 1.5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .75pt solid black; mso-border-insidev: .75pt solid black&quot; class=&quot;MsoTableGrid5&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr style=&quot;mso-yfti-irow: 0; mso-yfti-firstrow: yes&quot;&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: black 1.5pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: black 1.5pt solid; border-right: black 1pt solid; padding-top: 0cm; mso-border-top-alt: 1.5pt; mso-border-left-alt: 1.5pt; mso-border-bottom-alt: .75pt; mso-border-right-alt: .75pt; mso-border-color-alt: black; mso-border-style-alt: solid&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Version &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: black 1.5pt solid; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Current Release &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: black 1.5pt solid; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Tested w/ Glue &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: black 1.5pt solid; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Tested w/ Corosync &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: black 1.5pt solid; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Tested w/ Heartbeat &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: black 1.5pt solid; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;First Released &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: black 1.5pt solid; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;This Release &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: black 1.5pt solid; border-right: black 1.5pt solid; padding-top: 0cm; mso-border-top-alt: 1.5pt; mso-border-left-alt: .75pt; mso-border-bottom-alt: .75pt; mso-border-right-alt: 1.5pt; mso-border-color-alt: black; mso-border-style-alt: solid&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Supported Until &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;mso-yfti-irow: 1&quot;&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: black 1.5pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black 1.5pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;1.1 &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;NA &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;st1:chsdate year=&quot;1899&quot; month=&quot;12&quot; day=&quot;30&quot; islunardate=&quot;False&quot; isrocdate=&quot;False&quot; w:st=&quot;on&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;1.0.5&lt;/span&gt;&lt;/st1:chsdate&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;st1:chsdate year=&quot;1899&quot; month=&quot;12&quot; day=&quot;30&quot; islunardate=&quot;False&quot; isrocdate=&quot;False&quot; w:st=&quot;on&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;1.2.1&lt;/span&gt;&lt;/st1:chsdate&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;st1:chsdate year=&quot;1899&quot; month=&quot;12&quot; day=&quot;30&quot; islunardate=&quot;False&quot; isrocdate=&quot;False&quot; w:st=&quot;on&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;3.0.3&lt;/span&gt;&lt;/st1:chsdate&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;-- &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;-- &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1.5pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt; mso-border-right-alt: solid black 1.5pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Q4 2010 &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;mso-yfti-irow: 2; mso-yfti-lastrow: yes&quot;&gt;&lt;td style=&quot;border-bottom: black 1.5pt solid; border-left: black 1.5pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-top-alt: .75pt; mso-border-left-alt: 1.5pt; mso-border-bottom-alt: 1.5pt; mso-border-right-alt: .75pt; mso-border-color-alt: black; mso-border-style-alt: solid&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;1.0 &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1.5pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt; mso-border-bottom-alt: solid black 1.5pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;st1:chsdate year=&quot;1899&quot; month=&quot;12&quot; day=&quot;30&quot; islunardate=&quot;False&quot; isrocdate=&quot;False&quot; w:st=&quot;on&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;1.0.8&lt;/span&gt;&lt;/st1:chsdate&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1.5pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt; mso-border-bottom-alt: solid black 1.5pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;st1:chsdate year=&quot;1899&quot; month=&quot;12&quot; day=&quot;30&quot; islunardate=&quot;False&quot; isrocdate=&quot;False&quot; w:st=&quot;on&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;1.0.3&lt;/span&gt;&lt;/st1:chsdate&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1.5pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt; mso-border-bottom-alt: solid black 1.5pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;st1:chsdate year=&quot;1899&quot; month=&quot;12&quot; day=&quot;30&quot; islunardate=&quot;False&quot; isrocdate=&quot;False&quot; w:st=&quot;on&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;1.2.1&lt;/span&gt;&lt;/st1:chsdate&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1.5pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt; mso-border-bottom-alt: solid black 1.5pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;st1:chsdate year=&quot;1899&quot; month=&quot;12&quot; day=&quot;30&quot; islunardate=&quot;False&quot; isrocdate=&quot;False&quot; w:st=&quot;on&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;3.0.3&lt;/span&gt;&lt;/st1:chsdate&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1.5pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt; mso-border-bottom-alt: solid black 1.5pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Oct 9, 2008 &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1.5pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt; mso-border-bottom-alt: solid black 1.5pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Mar 16, 2010 &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1.5pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1.5pt solid; padding-top: 0cm; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Q4 2011 (at least) &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;Deprecated Branches &lt;table style=&quot;border-bottom: medium none; border-left: medium none; width: 100%; border-collapse: collapse; border-top: medium none; border-right: medium none; mso-border-alt: solid black 1.5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .75pt solid black; mso-border-insidev: .75pt solid black&quot; class=&quot;MsoTableGrid5&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr style=&quot;mso-yfti-irow: 0; mso-yfti-firstrow: yes&quot;&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: black 1.5pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: black 1.5pt solid; border-right: black 1pt solid; padding-top: 0cm; mso-border-top-alt: 1.5pt; mso-border-left-alt: 1.5pt; mso-border-bottom-alt: .75pt; mso-border-right-alt: .75pt; mso-border-color-alt: black; mso-border-style-alt: solid&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Version &amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install##&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;text-decoration: none; text-underline: none&quot;&gt;&lt;v:shapetype id=&quot;_x0000_t75&quot; coordsize=&quot;21600,21600&quot; o:spt=&quot;75&quot; o:preferrelative=&quot;t&quot; path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; filled=&quot;f&quot; stroked=&quot;f&quot;&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;/font&gt;&lt;/v:shapetype&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: black 1.5pt solid; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Last Release &amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install##&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;text-decoration: none; text-underline: none&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: black 1.5pt solid; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;First Released &amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install##&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;text-decoration: none; text-underline: none&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: black 1.5pt solid; border-right: black 1.5pt solid; padding-top: 0cm; mso-border-top-alt: 1.5pt; mso-border-left-alt: .75pt; mso-border-bottom-alt: .75pt; mso-border-right-alt: 1.5pt; mso-border-color-alt: black; mso-border-style-alt: solid&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Last Released &amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Install##&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;text-decoration: none; text-underline: none&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;mso-yfti-irow: 1&quot;&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: black 1.5pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black 1.5pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;0.7 &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;st1:chsdate year=&quot;1899&quot; month=&quot;12&quot; day=&quot;30&quot; islunardate=&quot;False&quot; isrocdate=&quot;False&quot; w:st=&quot;on&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;0.7.3&lt;/span&gt;&lt;/st1:chsdate&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;June 25, 2008 &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1.5pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt; mso-border-right-alt: solid black 1.5pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Sep 22, 2008 &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;mso-yfti-irow: 2; mso-yfti-lastrow: yes&quot;&gt;&lt;td style=&quot;border-bottom: black 1.5pt solid; border-left: black 1.5pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-top-alt: .75pt; mso-border-left-alt: 1.5pt; mso-border-bottom-alt: 1.5pt; mso-border-right-alt: .75pt; mso-border-color-alt: black; mso-border-style-alt: solid&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;0.6 &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1.5pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt; mso-border-bottom-alt: solid black 1.5pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;st1:chsdate year=&quot;1899&quot; month=&quot;12&quot; day=&quot;30&quot; islunardate=&quot;False&quot; isrocdate=&quot;False&quot; w:st=&quot;on&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;0.6.7&lt;/span&gt;&lt;/st1:chsdate&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1.5pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm; mso-border-alt: solid black .75pt; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt; mso-border-bottom-alt: solid black 1.5pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Jan 16, 2008 &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: black 1.5pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1.5pt solid; padding-top: 0cm; mso-border-top-alt: solid black .75pt; mso-border-left-alt: solid black .75pt&quot; valign=&quot;top&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan&quot; class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体; font-size: 9pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体&quot; lang=&quot;EN-US&quot;&gt;Dec 15, 2008 &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h2&gt;&lt;span class=&quot;mw-headline&quot;&gt;Binary Packages &lt;/span&gt;&lt;/h2&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;RPM &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Binary packages for current &lt;a class=&quot;external text&quot; title=&quot;http://fedoraproject.org/&quot; href=&quot;http://fedoraproject.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Fedora&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;, &lt;a class=&quot;external text&quot; title=&quot;http://opensuse.org&quot; href=&quot;http://opensuse.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;OpenSUSE&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; and &lt;a class=&quot;external text&quot; title=&quot;http://fedoraproject.org/wiki/EPEL&quot; href=&quot;http://fedoraproject.org/wiki/EPEL&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;EPEL&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; compatible distributions (eg. &lt;a class=&quot;external text&quot; title=&quot;http://fedoraproject.org/wiki/Red_Hat_Enterprise_Linux&quot; href=&quot;http://fedoraproject.org/wiki/Red_Hat_Enterprise_Linux&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;RHEL&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;, &lt;a class=&quot;external text&quot; title=&quot;http://www.centos.org/&quot; href=&quot;http://www.centos.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;CentOS&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; and Scientific Linux) releases can be found at:&lt;/p&gt;&lt;pre&gt;&lt;a class=&quot;external free&quot; title=&quot;http://www.clusterlabs.org/rpm/&quot; href=&quot;http://www.clusterlabs.org/rpm/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.clusterlabs.org/rpm/&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/pre&gt;&lt;p&gt;Simply browse for your distribution and download the relevant packages.&lt;/p&gt;&lt;p&gt;Once installed, you can decide which cluster stack to use at runtime simply by starting either &lt;i&gt;/etc/init.d/heartbeat&lt;/i&gt; or &lt;i&gt;/etc/init.d/corosync&lt;/i&gt;. You can also choose not to install whichever stack you don&apos;t wish to use.&lt;/p&gt;&lt;h4&gt;&lt;span class=&quot;mw-headline&quot;&gt;Installing on Fedora &lt;/span&gt;&lt;/h4&gt;&lt;p&gt;For Fedora-11, installation is as simple as:&lt;/p&gt;&lt;pre&gt;
 wget -O /etc/yum.repos.d/pacemaker.repo &lt;a class=&quot;external free&quot; title=&quot;http://clusterlabs.org/rpm/fedora-11/clusterlabs.repo&quot; href=&quot;http://clusterlabs.org/rpm/fedora-11/clusterlabs.repo&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://clusterlabs.org/rpm/fedora-11/clusterlabs.repo&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 
 yum install -y pacemaker corosync heartbeat
&lt;/pre&gt;&lt;p&gt;As of Fedora-12, Pacemaker is part of the distribution and updates are usually quickly available via the regular channels. There is nothing extra to download, just run:&lt;/p&gt;&lt;pre&gt;
 yum install -y pacemaker corosync heartbeat
&lt;/pre&gt;&lt;h4&gt;&lt;span class=&quot;mw-headline&quot;&gt;Installing on EPEL Compatible Distributions: RHEL, CentOS, etc &lt;/span&gt;&lt;/h4&gt;&lt;p&gt;The Pacemaker packages in the EPEL directories build against some additional packages that don&apos;t exist on vanilla RHEL/CentOS installs. For more information on EPEL, see &lt;a class=&quot;external free&quot; title=&quot;http://fedoraproject.org/wiki/EPEL/FAQ&quot; href=&quot;http://fedoraproject.org/wiki/EPEL/FAQ&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://fedoraproject.org/wiki/EPEL/FAQ&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;So before installing Pacemaker, you will first need to tell the machine how to find the EPEL packages Pacemaker depends on. To do this, download and install the EPEL package that matches your RHEL/CentOS version.&lt;/p&gt;&lt;p&gt;For example to install on RHEL5.3 for i386, you&apos;d run:&lt;/p&gt;&lt;pre&gt;
 su -c &apos;rpm -Uvh &lt;a class=&quot;external free&quot; title=&quot;http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm&apos;&quot; href=&quot;http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm&apos;&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm&apos;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/pre&gt;&lt;p&gt;Now add the Cluster Labs repo:&lt;/p&gt;&lt;pre&gt;
 wget -O /etc/yum.repos.d/pacemaker.repo &lt;a class=&quot;external free&quot; title=&quot;http://clusterlabs.org/rpm/epel-5/clusterlabs.repo&quot; href=&quot;http://clusterlabs.org/rpm/epel-5/clusterlabs.repo&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://clusterlabs.org/rpm/epel-5/clusterlabs.repo&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/pre&gt;&lt;p&gt;And finally, install Pacemaker:&lt;/p&gt;&lt;pre&gt;
 yum install -y pacemaker corosync heartbeat
&lt;/pre&gt;&lt;h4&gt;&lt;span class=&quot;mw-headline&quot;&gt;Installing on openSUSE &lt;/span&gt;&lt;/h4&gt;&lt;p&gt;openSUSE uses &lt;b&gt;zypper&lt;/b&gt; instead of &lt;b&gt;yum&lt;/b&gt;, but the procedure is much the same:&lt;/p&gt;&lt;pre&gt;
 zypper ar &lt;a class=&quot;external free&quot; title=&quot;http://clusterlabs.org/rpm/opensuse-11.1/clusterlabs.repo&quot; href=&quot;http://clusterlabs.org/rpm/opensuse-11.1/clusterlabs.repo&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://clusterlabs.org/rpm/opensuse-11.1/clusterlabs.repo&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;
 zypper refresh
 zypper in pacemaker corosync heartbeat
&lt;/pre&gt;&lt;h4&gt;&lt;span class=&quot;mw-headline&quot;&gt;Intra-Stack Package Dependancies &lt;/span&gt;&lt;/h4&gt;&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;thumb tnone&quot;&gt;&lt;div style=&quot;width: 402px&quot; class=&quot;thumbinner&quot;&gt;&lt;a class=&quot;image&quot; title=&quot;Installation Dependencies&quot; href=&quot;http://www.517sou.net/Attach/month_1005/qitxjo_145138_2.png&quot;&gt;&lt;img class=&quot;thumbimage&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1005/9xxn18_145139_3.png&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;div class=&quot;thumbcaption&quot;&gt;&lt;div class=&quot;magnify&quot;&gt;&lt;a class=&quot;internal&quot; title=&quot;Enlarge&quot; href=&quot;http://www.517sou.net/Attach/month_1005/qitxjo_145138_2.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1005/uhgbp9_145143_4.png&quot; width=&quot;15&quot; height=&quot;11&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Installation Dependencies&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4&gt;&lt;span class=&quot;mw-headline&quot;&gt;Single Stack Configurations (RPM only) &lt;/span&gt;&lt;/h4&gt;&lt;p&gt;For those that refuse to install the libraries of whichever stack you wont be using, you can rebuild the published rpms to meet your needs. To do this:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Download the src.rpm&lt;br /&gt;Browse to &lt;a class=&quot;external free&quot; title=&quot;http://clusterlabs.org/rpm/&quot; href=&quot;http://clusterlabs.org/rpm/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://clusterlabs.org/rpm/&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;Look for the &lt;i&gt;src&lt;/i&gt; directory &lt;b&gt;underneath the one for your distro&lt;/b&gt; (eg. fedora-11/src) and download the most recent version of Pacemaker.&lt;/li&gt;&lt;li&gt;Tell RPM to rebuild the package &lt;ol&gt;&lt;li&gt;rpmbuild --rebuild --without heartbeat pacemaker-[0-9].*.src.rpm&lt;br /&gt;or&lt;/li&gt;&lt;li&gt;rpmbuild --rebuild --without ais pacemaker-[0-9].*.src.rpm&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Install the result&lt;br /&gt;rpm -Uvh /usr/src/packages/RPMS/i586/pacemaker-[0-9]*.rpm&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;&lt;span class=&quot;mw-headline&quot;&gt;Re-Building RPMs for Other Architectures &lt;/span&gt;&lt;/h4&gt;&lt;p&gt;If your packages are not available for your distro/version, you can rebuild the published rpms to meet your needs. To do this:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Download the src.rpm&lt;br /&gt;Browse to &lt;a class=&quot;external free&quot; title=&quot;http://clusterlabs.org/rpm/fedora-11/src/&quot; href=&quot;http://clusterlabs.org/rpm/fedora-11/src/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://clusterlabs.org/rpm/fedora-11/src/&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; and download the most recent version of Pacemaker.&lt;/li&gt;&lt;li&gt;Tell RPM to rebuild the package&lt;br /&gt;rpmbuild --rebuild pacemaker-[0-9].*.src.rpm&lt;/li&gt;&lt;li&gt;Install the result&lt;br /&gt;rpm -Uvh /usr/src/packages/RPMS/i586/pacemaker-[0-9]*.rpm&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;Debian &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;a class=&quot;new&quot; title=&quot;Martin Loschwitz (page does not exist)&quot; href=&quot;http://www.clusterlabs.org/mwiki/index.php?title=Martin_Loschwitz&amp;amp;action=edit&amp;amp;redlink=1&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Martin Loschwitz&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; from &lt;a class=&quot;external text&quot; title=&quot;http://www.linbit.com/&quot; href=&quot;http://www.linbit.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;LINBIT&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; does the official builds for Pacemaker (and any other required parts of the stack). &amp;quot;Official&amp;quot; in this sense means that the packages are endorsed by &lt;a title=&quot;Andrew Beekhof&quot; href=&quot;http://www.clusterlabs.org/wiki/Andrew_Beekhof&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Andrew&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; and the Pacemaker maintainers. These builds have been merged into &lt;a class=&quot;external text&quot; title=&quot;http://www.debian.org&quot; href=&quot;http://www.debian.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Debian GNU/Linux Unstable&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; proper as of 2010-04-06.&lt;/p&gt;&lt;p&gt;Please note that the repository URLs changed between Pacemaker releases 1.0.4 and 1.0.5. This is due to the fact that the 1.0.5 packages are integrated with Corosync, which the 1.0.4 packages were not -- this required a makeover to the package build layout.&lt;/p&gt;&lt;p&gt;For detailed installation instructions, refer to the &lt;a title=&quot;Debian Lenny HowTo&quot; href=&quot;http://www.clusterlabs.org/wiki/Debian_Lenny_HowTo&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Debian Lenny HowTo&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;. If you run into any issues installing, updating, or using these packages, please let us know on &lt;a class=&quot;external text&quot; title=&quot;http://oss.clusterlabs.org/mailman/listinfo/pacemaker&quot; href=&quot;http://oss.clusterlabs.org/mailman/listinfo/pacemaker&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;the mailing list&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Use your favorite editor to add one of the following to &lt;i&gt;/etc/apt/sources.list&lt;/i&gt;&lt;/p&gt;&lt;p&gt;For Debian 5.0 (&lt;i&gt;lenny&lt;/i&gt;):&lt;/p&gt;&lt;pre&gt;
 deb &lt;a class=&quot;external free&quot; title=&quot;http://people.debian.org/~madkiss/ha&quot; href=&quot;http://people.debian.org/~madkiss/ha&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://people.debian.org/~madkiss/ha&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; lenny main
&lt;/pre&gt;&lt;p&gt;For Debian unstable (&lt;i&gt;sid&lt;/i&gt;):&lt;/p&gt;&lt;pre&gt;
 deb &lt;a class=&quot;external free&quot; title=&quot;http://people.debian.org/~madkiss/ha&quot; href=&quot;http://people.debian.org/~madkiss/ha&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://people.debian.org/~madkiss/ha&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; sid main
&lt;/pre&gt;&lt;p&gt;Once this has been completed, run:&lt;/p&gt;&lt;pre&gt;
 apt-get update
&lt;/pre&gt;&lt;p&gt;Finally, to install Pacemaker simply decide which stack you wish to use and run&lt;/p&gt;&lt;pre&gt;
 apt-get install pacemaker corosync
&lt;/pre&gt;&lt;p&gt;or&lt;/p&gt;&lt;pre&gt;
 apt-get install pacemaker heartbeat
&lt;/pre&gt;&lt;p&gt;Please note: currently, no direct, &amp;quot;rolling upgrade&amp;quot; path exists for Debian users to move from the woefully outdated Heartbeat 2.1.3 with built-in CRM that continues to be part of the official Debian package repositories. Providing this upgrade path is something that Martin has on his to-do list, but it&apos;s a little more challenging than it looks to an observer.&lt;/p&gt;&lt;h4&gt;&lt;span class=&quot;mw-headline&quot;&gt;Building from Source &lt;/span&gt;&lt;/h4&gt;&lt;p&gt;To obtain the latest bug fixes, you may wish to build debian packages from source. To do so:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Download the Pacemaker source tarball&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;
 apt-get source pacemaker
&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Install the build-time dependancies&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;
 apt-get build-dep pacemaker
&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Build the .deb&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;
 cd pacemaker-{someversion}
 dpkg-buildpackage -rfakeroot -uc -us
&lt;/pre&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;Ubuntu &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;As of Ubuntu 10.4 (Lucid Lynx), Pacemaker and all its dependancies are part of the distribution. Simply run:&lt;/p&gt;&lt;pre&gt;
 aptitude install corosync pacemaker
&lt;/pre&gt;&lt;p&gt;or&lt;/p&gt;&lt;pre&gt;
 aptitude install heartbeat pacemaker
&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;Users of Ubuntu versions prior to 10.4 can either install the Debian packages, or try the ones from &lt;a class=&quot;external text&quot; title=&quot;https://launchpad.net/~ubuntu-ha/+archive/ppa&quot; href=&quot;https://launchpad.net/~ubuntu-ha/+archive/ppa&quot; rel=&quot;nofollow&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;LaunchPad&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; by adding&lt;/p&gt;&lt;pre&gt;
 deb &lt;a class=&quot;external free&quot; title=&quot;http://ppa.launchpad.net/ubuntu-ha/ppa/ubuntu&quot; href=&quot;http://ppa.launchpad.net/ubuntu-ha/ppa/ubuntu&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://ppa.launchpad.net/ubuntu-ha/ppa/ubuntu&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; karmic main 
 deb-src &lt;a class=&quot;external free&quot; title=&quot;http://ppa.launchpad.net/ubuntu-ha/ppa/ubuntu&quot; href=&quot;http://ppa.launchpad.net/ubuntu-ha/ppa/ubuntu&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://ppa.launchpad.net/ubuntu-ha/ppa/ubuntu&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; karmic main
&lt;/pre&gt;&lt;p&gt;to &lt;i&gt;/etc/apt/sources.list&lt;/i&gt; before running the same aptitude command above.&lt;/p&gt;&lt;h2&gt;&lt;span class=&quot;mw-headline&quot;&gt;Darwin/MacOS X &lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Follow the &lt;a title=&quot;&quot; href=&quot;http://www.clusterlabs.org/wiki/Install#From_Source&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;source based installation&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; instructions below after having installed &lt;a class=&quot;external text&quot; title=&quot;http://www.macports.org/&quot; href=&quot;http://www.macports.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;MacPorts&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; and installing the following pre-requisites:&lt;/p&gt;&lt;pre&gt;
 sudo port install pkgconfig glib2 help2man
&lt;/pre&gt;&lt;p&gt;And make sure the default &lt;i&gt;autoconf&lt;/i&gt; installation understands the &lt;i&gt;pkg-config&lt;/i&gt; macros:&lt;/p&gt;&lt;pre&gt;
 sudo ln -s /opt/local/share/aclocal/pkg.m4 /usr/share/aclocal/
&lt;/pre&gt;&lt;h2&gt;&lt;span class=&quot;mw-headline&quot;&gt;From Source &lt;/span&gt;&lt;/h2&gt;&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;thumb tnone&quot;&gt;&lt;div style=&quot;width: 402px&quot; class=&quot;thumbinner&quot;&gt;&lt;a class=&quot;image&quot; title=&quot;Build Dependencies&quot; href=&quot;http://www.517sou.net/Attach/month_1005/p4ebrr_145144_5.png&quot;&gt;&lt;img class=&quot;thumbimage&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1005/mkowei_145145_6.png&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;div class=&quot;thumbcaption&quot;&gt;&lt;div class=&quot;magnify&quot;&gt;&lt;a class=&quot;internal&quot; title=&quot;Enlarge&quot; href=&quot;http://www.517sou.net/Attach/month_1005/p4ebrr_145144_5.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1005/uhgbp9_145143_4.png&quot; width=&quot;15&quot; height=&quot;11&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Build Dependencies&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;First Steps &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Setup a number of variables that we&apos;ll use throughout the build process. Adjust them to your needs.&lt;/p&gt;&lt;pre&gt;
 export PREFIX=/usr
 export LCRSODIR=$PREFIX/libexec/lcrso 
 export CLUSTER_USER=hacluster
 export CLUSTER_GROUP=haclient
&lt;/pre&gt;&lt;p&gt;Create a user and group for the cluster&lt;/p&gt;&lt;pre&gt;
 getent group ${CLUSTER_GROUP} &amp;gt;/dev/null || groupadd -r ${CLUSTER_GROUP}
 getent passwd ${CLUSTER_USER} &amp;gt;/dev/null || useradd -r -g ${CLUSTER_GROUP} -d /var/lib/heartbeat/cores/hacluster -s /sbin/nologin -c &amp;quot;cluster user&amp;quot; ${CLUSTER_USER}
&lt;/pre&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;Cluster Glue &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Obtain the latest Cluster Glue sources, then create and initialize the build directory&lt;/p&gt;&lt;pre&gt;
 wget -O cluster-glue.tar.bz2 &lt;a class=&quot;external free&quot; title=&quot;http://hg.linux-ha.org/glue/archive/tip.tar.bz2&quot; href=&quot;http://hg.linux-ha.org/glue/archive/tip.tar.bz2&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://hg.linux-ha.org/glue/archive/tip.tar.bz2&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;
 tar jxvf cluster-glue.tar.bz2
 cd Reusable-Cluster-Components-*
&lt;/pre&gt;&lt;p&gt;Or, if you want to fetch Cluster Glue directly from the Mercurial repository:&lt;/p&gt;&lt;pre&gt;
 hg clone &lt;a class=&quot;external free&quot; title=&quot;http://hg.linux-ha.org/glue&quot; href=&quot;http://hg.linux-ha.org/glue&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://hg.linux-ha.org/glue&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;
 cd glue
&lt;/pre&gt;&lt;p&gt;Teach Cluster Glue about the machine it will run on&lt;/p&gt;&lt;pre&gt;
 ./autogen.sh &amp;amp;&amp;amp; ./configure --prefix=$PREFIX  --with-daemon-user=${CLUSTER_USER} --with-daemon-group=${CLUSTER_GROUP}
&lt;/pre&gt;&lt;p&gt;Once configure reports success, simply execute&lt;/p&gt;&lt;pre&gt;
 make
 sudo make install
&lt;/pre&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;Resource Agents &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Obtain the latest sources:&lt;/p&gt;&lt;pre&gt;
  wget -O resource-agents.tar.bz2 &lt;a class=&quot;external free&quot; title=&quot;http://hg.linux-ha.org/agents/archive/tip.tar.bz2&quot; href=&quot;http://hg.linux-ha.org/agents/archive/tip.tar.bz2&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://hg.linux-ha.org/agents/archive/tip.tar.bz2&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/pre&gt;&lt;p&gt;Create and initialize the build directory&lt;/p&gt;&lt;pre&gt;
 tar jxvf resource-agents.tar.bz2
 cd Cluster-Resource-Agents-*
&lt;/pre&gt;&lt;p&gt;Teach Agents about the machine it will run on&lt;/p&gt;&lt;pre&gt;
 ./autogen.sh &amp;amp;&amp;amp; ./configure --prefix=$PREFIX
&lt;/pre&gt;&lt;p&gt;Once configure reports success, simply execute&lt;/p&gt;&lt;pre&gt;
 make
 sudo make install
&lt;/pre&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;Heartbeat* &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;i&gt;* You can skip this step if you prefer to use the OpenAIS/Corosync cluster stack.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Obtain the latest Heartbeat sources:&lt;/p&gt;&lt;pre&gt;
  wget -O heartbeat.tar.bz2 &lt;a class=&quot;external free&quot; title=&quot;http://hg.linux-ha.org/dev/archive/tip.tar.bz2&quot; href=&quot;http://hg.linux-ha.org/dev/archive/tip.tar.bz2&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://hg.linux-ha.org/dev/archive/tip.tar.bz2&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/pre&gt;&lt;p&gt;Create and initialize the build directory&lt;/p&gt;&lt;pre&gt;
 tar jxvf heartbeat.tar.bz2
 cd Linux-HA-Dev-*
&lt;/pre&gt;&lt;p&gt;Teach Heartbeat about the machine it will run on&lt;/p&gt;&lt;pre&gt;
 ./bootstrap &amp;amp;&amp;amp; ./configure --prefix=$PREFIX
&lt;/pre&gt;&lt;p&gt;Once configure reports success, simply execute&lt;/p&gt;&lt;pre&gt;
 make
 sudo make install
&lt;/pre&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;CoroSync* &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;i&gt;*You can skip this step if you prefer to use the Heartbeat cluster stack.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;CoroSync contains the infrastructure (such as interprocess communication and network protocols) that used to be part of OpenAIS. See the &lt;a class=&quot;external text&quot; title=&quot;http://www.corosync.org/doku.php?id=faq:why&quot; href=&quot;http://www.corosync.org/doku.php?id=faq:why&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;CoroSync FAQ entry&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; for more details.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;For the majority of Pacemaker users, it is simplest to think of CoroSync as simply a new version of OpenAIS without a bunch of stuff you weren&apos;t using anyway.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Grab the latest code from the CoroSync project which has all the required patches to support Pacemaker&lt;/p&gt;&lt;pre&gt;
  svn co &lt;a class=&quot;external free&quot; title=&quot;http://svn.fedorahosted.org/svn/corosync/branches/flatiron/&quot; href=&quot;http://svn.fedorahosted.org/svn/corosync/branches/flatiron/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://svn.fedorahosted.org/svn/corosync/branches/flatiron/&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;
  cd flatiron
&lt;/pre&gt;&lt;p&gt;Teach CoroSync about the machine it will run on&lt;/p&gt;&lt;pre&gt;
 ./autogen.sh &amp;amp;&amp;amp; ./configure --prefix=$PREFIX --with-lcrso-dir=$LCRSODIR
&lt;/pre&gt;&lt;p&gt;Once configure reports success, simply execute&lt;/p&gt;&lt;pre&gt;
 make
 sudo make install
&lt;/pre&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;OpenAIS* &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;i&gt;*You can skip this step if you prefer to use the Heartbeat cluster stack or don&apos;t plan on using GFS2 or OCFS2.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Although Pacemaker doesn&apos;t require the full OpenAIS stack (just CoroSync is sufficient), some cluster services do. These include:&lt;/p&gt;&lt;pre&gt;
* OCFS2
* GFS2
* cLVM 
&lt;/pre&gt;&lt;p&gt;In order to use any of the above services in a Pacemaker cluster, you&apos;ll need to install OpenAIS.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Grab the latest code from the OpenAIS project&lt;/p&gt;&lt;pre&gt;
 svn co &lt;a class=&quot;external free&quot; title=&quot;http://svn.fedorahosted.org/svn/openais/branches/wilson&quot; href=&quot;http://svn.fedorahosted.org/svn/openais/branches/wilson&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://svn.fedorahosted.org/svn/openais/branches/wilson&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;
 cd wilson
&lt;/pre&gt;&lt;pre&gt;
Teach OpenAIS about the machine it will run on
 ./autogen.sh &amp;amp;&amp;amp; ./configure --prefix=$PREFIX --with-lcrso-dir=$LCRSODIR
&lt;/pre&gt;&lt;p&gt;Once configure reports success, simply execute&lt;/p&gt;&lt;pre&gt;
 make
 sudo make install
&lt;/pre&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;Pacemaker &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Obtain the latest Pacemaker sources:&lt;/p&gt;&lt;pre&gt;
 wget -O pacemaker.tar.bz2 &lt;a class=&quot;external free&quot; title=&quot;http://hg.clusterlabs.org/pacemaker/stable-1.0/archive/tip.tar.bz2&quot; href=&quot;http://hg.clusterlabs.org/pacemaker/stable-1.0/archive/tip.tar.bz2&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://hg.clusterlabs.org/pacemaker/stable-1.0/archive/tip.tar.bz2&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/pre&gt;&lt;p&gt;You can obtain a specific release by substituting &lt;i&gt;tip&lt;/i&gt; with &lt;i&gt;Pacemaker-{version}&lt;/i&gt;. eg.&lt;/p&gt;&lt;pre&gt;
 wget -O pacemaker.tar.bz2 &lt;a class=&quot;external free&quot; title=&quot;http://hg.clusterlabs.org/pacemaker/stable-1.0/archive/Pacemaker-1.0.5.tar.bz2&quot; href=&quot;http://hg.clusterlabs.org/pacemaker/stable-1.0/archive/Pacemaker-1.0.5.tar.bz2&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://hg.clusterlabs.org/pacemaker/stable-1.0/archive/Pacemaker-1.0.5.tar.bz2&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/pre&gt;&lt;p&gt;Alternatively, for people that want to update regularly, clone the underlying Mercurial repository:&lt;/p&gt;&lt;pre&gt;
 hg clone &lt;a class=&quot;external free&quot; title=&quot;http://hg.clusterlabs.org/pacemaker/stable-1.0&quot; href=&quot;http://hg.clusterlabs.org/pacemaker/stable-1.0&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://hg.clusterlabs.org/pacemaker/stable-1.0&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;
 cd stable-1.0
 hg update -C stable-1.0
&lt;/pre&gt;&lt;p&gt;Create and initialize the build directory&lt;/p&gt;&lt;pre&gt;
 tar jxvf pacemaker.tar.bz2
 cd Pacemaker-1-0-*
&lt;/pre&gt;&lt;p&gt;Teach Pacemaker about the machine it will run on&lt;/p&gt;&lt;pre&gt;
 ./autogen.sh &amp;amp;&amp;amp; ./configure --prefix=$PREFIX --with-lcrso-dir=$LCRSODIR
&lt;/pre&gt;&lt;p&gt;Once configure reports success, simply execute&lt;/p&gt;&lt;pre&gt;
 make
 sudo make install
&lt;/pre&gt;&lt;p&gt;for some reason this also appears to be necessary&lt;/p&gt;&lt;pre&gt;
 sudo ldconfig -v
&lt;/pre&gt;&lt;p&gt;be sure to first update LD_LIBRARY_PATH if you installed Pacemaker (or anything else) into a non-standard location.&lt;/p&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;GUI &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Although I personally dislike the current GUI, it does appear to be getting better and many people seem to get value from it.&lt;/p&gt;&lt;p&gt;Similar to Pacemaker, you can get the latest sources from:&lt;/p&gt;&lt;pre&gt;&lt;a class=&quot;external free&quot; title=&quot;http://hg.clusterlabs.org/pacemaker/pygui/archive/tip.tar.bz2&quot; href=&quot;http://hg.clusterlabs.org/pacemaker/pygui/archive/tip.tar.bz2&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://hg.clusterlabs.org/pacemaker/pygui/archive/tip.tar.bz2&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/pre&gt;&lt;h2&gt;&lt;span class=&quot;mw-headline&quot;&gt;Initial Configuration&lt;/span&gt;&lt;/h2&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;table id=&quot;toc&quot; class=&quot;toc&quot; summary=&quot;Contents&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div id=&quot;toctitle&quot;&gt;&lt;h2&gt;Contents&lt;/h2&gt;&lt;span class=&quot;toctoggle&quot;&gt;[&lt;a id=&quot;togglelink&quot; class=&quot;internal&quot; href=&quot;javascript:toggleToc()&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;hide&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;]&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li class=&quot;toclevel-1&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Initial_Configuration#Basic_Stack_Configuration&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Basic Stack Configuration&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;ul&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Initial_Configuration#Heartbeat&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;1.1&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Heartbeat&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Initial_Configuration#CoroSync&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;1.2&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;CoroSync&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-1&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Initial_Configuration#Enabling_Pacemaker&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Enabling Pacemaker&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;ul&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Initial_Configuration#Heartbeat_2&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;2.1&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Heartbeat&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Initial_Configuration#CoroSync_2&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;2.2&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;CoroSync&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-1&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Initial_Configuration#A_Special_Note_for_People_Switching_Cluster_Stacks&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;A Special Note for People Switching Cluster Stacks&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-1&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Initial_Configuration#Starting_the_Cluster&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Starting the Cluster&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;ul&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Initial_Configuration#Heartbeat_3&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;4.1&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Heartbeat&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-2&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Initial_Configuration#CoroSync_3&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;4.2&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;CoroSync&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li class=&quot;toclevel-1&quot;&gt;&lt;a href=&quot;http://www.clusterlabs.org/wiki/Initial_Configuration#Next_Steps&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;&lt;span class=&quot;tocnumber&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;toctext&quot;&gt;Next Steps&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/p&gt;&lt;h2&gt;&lt;span class=&quot;mw-headline&quot;&gt;Basic Stack Configuration &lt;/span&gt;&lt;/h2&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;Heartbeat &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Sample &lt;i&gt;/etc/ha.d/ha.cf&lt;/i&gt; configuration file&lt;/p&gt;&lt;pre&gt;
 # Logging
 debug				1
 use_logd			false
 logfacility			daemon
 
 # Misc Options
 traditional_compression 	off
 compression			bz2
 coredumps			true
 
 # Communications
 udpport			691
 bcast				eth0
 autojoin			any
   
 # Thresholds (in seconds)
 keepalive			1
 warntime			6
 deadtime			10
 initdead			15
&lt;/pre&gt;&lt;p&gt;For more details on these and other available options, please refer to &lt;a class=&quot;external free&quot; title=&quot;http://www.linux-ha.org/ha.cf&quot; href=&quot;http://www.linux-ha.org/ha.cf&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.linux-ha.org/ha.cf&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;CoroSync &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Before starting CoroSync for the first time, you need to create the authkey-file for authentication within cluster communication.&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;Create /etc/corosync/authkey &lt;/dt&gt;&lt;/dl&gt;&lt;pre&gt;
corosync-keygen #no arguments required
&lt;/pre&gt;&lt;p&gt;Then you need to copy that file to all of your nodes and put it in /etc/corosync/ with user=root, group=root and mode 0400.&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;Example &lt;i&gt;/etc/corosync/corosync.conf&lt;/i&gt; configuration file&lt;/dt&gt;&lt;/dl&gt;&lt;pre&gt;
  totem {
 
 	version: 2
 
 	# How long before declaring a token lost (ms)
 	token:          5000
 
 	# How many token retransmits before forming a new configuration
 	token_retransmits_before_loss_const: 20
 
 	# How long to wait for join messages in the membership protocol (ms)
 	join:           1000
 
 	# How long to wait for consensus to be achieved before starting a new round of membership configuration (ms)
 	consensus:      7500
 
 	# Turn off the virtual synchrony filter
 	vsftype:        none
 
 	# Number of messages that may be sent by one processor on receipt of the token
 	max_messages:   20
 
 	# Disable encryption
 	secauth:	off
 
 	# How many threads to use for encryption/decryption
 	threads:   	0
 	
 	# Limit generated nodeids to 31-bits (positive signed integers)
 	clear_node_high_bit: yes
 	
 	# Optionally assign a fixed node id (integer)
 	# nodeid:         1234
 
 	interface {
 		ringnumber: 0
 
 		# The following three values need to be set based on your environment
 		bindnetaddr: 10.0.0.1
 		mcastaddr: 226.94.1.1
 		mcastport: 5405
 	}
 }
 
 logging {
 	fileline: off
 	to_syslog: yes
 	to_stderr: no
 	syslog_facility: daemon
 	debug: on
 	timestamp: on
 }
 
 amf {
 	mode: disabled
 }
&lt;/pre&gt;&lt;h2&gt;&lt;span class=&quot;mw-headline&quot;&gt;Enabling Pacemaker &lt;/span&gt;&lt;/h2&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;Heartbeat &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;To instruct Heartbeat to start Pacemaker, add the following to &lt;i&gt;/etc/ha.d/ha.cf&lt;/i&gt;&lt;/p&gt;&lt;pre&gt;
 crm yes
&lt;/pre&gt;&lt;p&gt;or, if you plan to enable STONITH&lt;/p&gt;&lt;pre&gt;
 crm respawn
&lt;/pre&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;CoroSync &lt;/span&gt;&lt;/h3&gt;&lt;p&gt;To instruct CoroSync to start Pacemaker, create &lt;i&gt;/etc/corosync/service.d/pcmk&lt;/i&gt; with the following fragment&lt;/p&gt;&lt;pre&gt;
 service {
 	# Load the Pacemaker Cluster Resource Manager
 	name: pacemaker
 	ver:  0
 }
&lt;/pre&gt;&lt;h2&gt;&lt;span class=&quot;mw-headline&quot;&gt;A Special Note for People Switching Cluster Stacks &lt;/span&gt;&lt;/h2&gt;&lt;p&gt;CoroSync and Heartbeat identify nodes differently. This is reflected in the value of &apos;id&apos; for &apos;node&apos; objects in the CIB.&lt;/p&gt;&lt;p&gt;Since &apos;id&apos; is the attribute by which a node is identified, this can lead to each node having duplicate entries in the CIB&apos;s &apos;nodes&apos; section and cause expected cluster behavior.&lt;/p&gt;&lt;p&gt;To prevent this, delete the contents of &apos;nodes&apos; before starting up the alternative cluster stack (and remember to zap the .sig files in the same directory after you do so).&lt;/p&gt;&lt;h2&gt;&lt;span class=&quot;mw-headline&quot;&gt;Starting the Cluster &lt;/span&gt;&lt;/h2&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;Heartbeat &lt;/span&gt;&lt;/h3&gt;&lt;pre&gt;
 /etc/init.d/heartbeat start
&lt;/pre&gt;&lt;h3&gt;&lt;span class=&quot;mw-headline&quot;&gt;CoroSync &lt;/span&gt;&lt;/h3&gt;&lt;pre&gt;
 /etc/init.d/corosync start
&lt;/pre&gt;&lt;h2&gt;&lt;span class=&quot;mw-headline&quot;&gt;Next Steps &lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;a title=&quot;Documentation&quot; href=&quot;http://www.clusterlabs.org/wiki/Documentation&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Documentation&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/Pacemaker_Install_and_Initial_Configuration.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/442/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/Pacemaker_Install_and_Initial_Configuration.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/442/Feeds.ashx</wfw:commentRss>
	</item>
</channel>
</rss>