﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-无法递归的五点半-随笔分类-学习笔记</title><link>http://www.cppblog.com/lambdacpp/category/1909.html</link><description>for_each(day.begin(),day.end(),bind2nd(Add(),me))</description><language>zh-cn</language><lastBuildDate>Mon, 02 Jun 2008 09:31:55 GMT</lastBuildDate><pubDate>Mon, 02 Jun 2008 09:31:55 GMT</pubDate><ttl>60</ttl><item><title>Jazz 试用</title><link>http://www.cppblog.com/lambdacpp/archive/2008/05/28/51370.html</link><dc:creator>五点半</dc:creator><author>五点半</author><pubDate>Wed, 28 May 2008 03:37:00 GMT</pubDate><guid>http://www.cppblog.com/lambdacpp/archive/2008/05/28/51370.html</guid><wfw:comment>http://www.cppblog.com/lambdacpp/comments/51370.html</wfw:comment><comments>http://www.cppblog.com/lambdacpp/archive/2008/05/28/51370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lambdacpp/comments/commentRss/51370.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lambdacpp/services/trackbacks/51370.html</trackback:ping><description><![CDATA[最近一直在试用Jazz。IBM宣传Jazz是下一代的软件交付平台，IBM开发者网站上一大堆的文档，看来IBM对这个软件还是非常重视的。试用体会：<br>
<ol>
    <li>IBM或者说Rational对软件工程的研究是非常深入的，IBM Rational系列软件可以充分体现IBM对软件过程的理解。Jazz中集成了各种软件开发过程(时下流行的Srcum也在其中)。Jazz充分认识到了敏捷的重要性，所以敏捷的思想贯穿整个软件。</li>
    <li>虽然IBM提供的比较丰富的文档，学习曲线还是有些陡峭。特别对于没有使用过Rational软件的开发人员。推荐初学者先看看<a href="http://www.ibm.com/developerworks/cn/edu/r-dw-r-jazz-cn-rtceintro.html">这个文档</a> <br></li>
    <li>Jazz的版本控制源于CC不是很喜欢，如果可以用SVN代替就好了。</li>
    <li>Jazz的客户端是开源的，但服务端只有90天试用。具体的价格也要6月份才出来。<br></li>
</ol>
<br> <img src ="http://www.cppblog.com/lambdacpp/aggbug/51370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lambdacpp/" target="_blank">五点半</a> 2008-05-28 11:37 <a href="http://www.cppblog.com/lambdacpp/archive/2008/05/28/51370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Snmp SMI 常见数据类型</title><link>http://www.cppblog.com/lambdacpp/archive/2007/07/28/28893.html</link><dc:creator>五点半</dc:creator><author>五点半</author><pubDate>Sat, 28 Jul 2007 05:28:00 GMT</pubDate><guid>http://www.cppblog.com/lambdacpp/archive/2007/07/28/28893.html</guid><wfw:comment>http://www.cppblog.com/lambdacpp/comments/28893.html</wfw:comment><comments>http://www.cppblog.com/lambdacpp/archive/2007/07/28/28893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lambdacpp/comments/commentRss/28893.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lambdacpp/services/trackbacks/28893.html</trackback:ping><description><![CDATA[<dl class="docutils"><dt>来自网络,收集备用：</dt><dt><br></dt><dt>Integer： 有符号32位整数 </dt><dt>Integer32：与Integer相同。 </dt><dt>UInteger32：无符号32位整数 </dt><dt>Octet String：任意二进制或文本数据，通常长度限制在255个字符内。 </dt><dt>Object Identifier：An OID.&nbsp;<br> </dt><dt>Bit String：表示取名的位的枚举。这是一个无符号的数据类型。 </dt><dt>IpAddress：IP地址。 </dt><dt>Counter32：表示一个非负的整数,递增到最大值，然后恢复并从0开始递增。
</dt><dt>Counter64：与Counter32相同，最大值为64位的最大值－1。 </dt><dt>Gauge32：表示无符号整数，可增加或减少，但是不超过最大值。 </dt><dt>TimeTicks：表示代表数据的一个无符号整数，2^32取模（4294967296），两个值之间为百分之一秒。 </dt><dt>Opaque：提供向下兼容，不再使用的数据类型 </dt><dt>NsapAddress：表示一个用变长八进制字符窗表示的OSI地址。 </dt></dl><img src ="http://www.cppblog.com/lambdacpp/aggbug/28893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lambdacpp/" target="_blank">五点半</a> 2007-07-28 13:28 <a href="http://www.cppblog.com/lambdacpp/archive/2007/07/28/28893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个cut命令使用的例子</title><link>http://www.cppblog.com/lambdacpp/archive/2007/06/06/25631.html</link><dc:creator>五点半</dc:creator><author>五点半</author><pubDate>Wed, 06 Jun 2007 02:25:00 GMT</pubDate><guid>http://www.cppblog.com/lambdacpp/archive/2007/06/06/25631.html</guid><wfw:comment>http://www.cppblog.com/lambdacpp/comments/25631.html</wfw:comment><comments>http://www.cppblog.com/lambdacpp/archive/2007/06/06/25631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lambdacpp/comments/commentRss/25631.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lambdacpp/services/trackbacks/25631.html</trackback:ping><description><![CDATA[完全用sed来过滤处理文本是麻烦的。特别有时想快速的获得一个结果，构造正则表达式就会用掉很多时间。比如想看看有那些ip在访问web服务器。使用<br>root@www:~#netstat -na46<br>一大堆，不可能一个一个数吧。我只想看看80端口的连接加一个grep ,这样：<br>root@www:~#netstat -na46 | grep 192\.168\.100\.14:80<br>还是很多。加一个 wc -l有重复统计。好了，我只要第5列。cut -f5 。不起作用。原来cut是按TAB分字段。没关系使用sed替换：<br>root@www:~#netstat -na46 | grep 192\.168\.100\.14:80 | sed 's/ \{1,\}/\t/g' <br>好了终于可是使用cut 了<br>root@www:~#netstat -na46 | grep 192\.168\.100\.14:80 | sed 's/ \{1,\}/\t/g'&nbsp; | cut -f 5<br>接下来就是排序把重复的ip过滤掉：<br>root@www:~#netstat -na46 | grep 192\.168\.100\.14:80 | sed 's/ \{1,\}/\t/g'&nbsp; | cut -f 5 | sort -u<br>root@www:~#netstat -na46 | grep 192\.168\.100\.14:80 | sed 's/ \{1,\}/\t/g'&nbsp; | cut -f 5 | sort -u | wc -l<br><br>真方便！模块化的力量，中间件的力量(管道符|难道不算一个精巧的消息中间件吗)！<br>  <img src ="http://www.cppblog.com/lambdacpp/aggbug/25631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lambdacpp/" target="_blank">五点半</a> 2007-06-06 10:25 <a href="http://www.cppblog.com/lambdacpp/archive/2007/06/06/25631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源XSL C++开发包</title><link>http://www.cppblog.com/lambdacpp/archive/2007/04/29/23163.html</link><dc:creator>五点半</dc:creator><author>五点半</author><pubDate>Sun, 29 Apr 2007 03:24:00 GMT</pubDate><guid>http://www.cppblog.com/lambdacpp/archive/2007/04/29/23163.html</guid><wfw:comment>http://www.cppblog.com/lambdacpp/comments/23163.html</wfw:comment><comments>http://www.cppblog.com/lambdacpp/archive/2007/04/29/23163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lambdacpp/comments/commentRss/23163.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lambdacpp/services/trackbacks/23163.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 可能因为微软、IBM这样的商业公式和开源社区在数据表达方面的不谋而合，以及再加上W3C推波助澜XML的相关技术总是和应用结合得非常紧密。XML从产生就不乏优秀的工具。在最近一个项目中，我们就使用了原生的XML存储数据库Berkely DBXML(BDB)。 <br> 其实，DBXML使用了大量优秀的开源工具来实现，其中数据存储使用Berkely DB，XML解析使用XercesC，XPath的实现使用Pathan(2.3以前)，XQilla(2.3以后)。关于这几个库，我将官方网站的介绍摘录如下：<br>
<ol>
    <li> Xerces-C++ is a validating XML parser written in a portable subset of C++. Xerces-C++ makes it easy to give your application the ability to read and write XML data. A shared library is provided for parsing, generating, manipulating, and validating XML documents. </li>
    <li> Pathan is a open source library which allows developers using Xerces-C to parse and evaluate XPath expressions for XML node selection. </li>
    <li> XQilla is an XQuery and XPath 2 library and command line utility written in C++ , implemented on top of the Xerces-C. XQilla is originally based on an open source project called Pathan, that was hosted by Decisionsoft and implemented XPath 2. However, XQilla has been developed and improved considerably from the Pathan code base. </li>
    <li> Xalan is an XSLT processor for transforming XML documents into HTML, text, or other XML document types </li>
</ol>
&nbsp;&nbsp;&nbsp; 在接下来的工作中，我们希望把存储的XML表达出来。我们通过XSL来实现XML的表达，有趣的是XSL <br> 本身也是XML，又是一个有趣的递归。 <br> 把DBXML与XSL联系起来。我们找到了一个DBXML API中函数，他可以将XML Node 以Xerces DOMDocument 方式返回： <br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">xercesc_2_6::DOMDocument&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">XmlDocument::getContentAsDOM()&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br></span></div>
<br>&nbsp;&nbsp;&nbsp; 我们要还要引入一个库Xalan C++。Xalan C++可以将生成的结果存储在一个Xerces DOMDocument中；可以使用<a title="TransformToXercesDOM" href="http://xml.apache.org/xalan-c/samples.html#transformtoxercesdom">TransformToXercesDOM</a>将XercesDOM作为转换的源。<br><br>&nbsp;&nbsp;&nbsp; 在XML开源软件中还有一支，那就是来自MIT的xmlsoft.org。其中最著名的libxml2和基于libxml2的libxslt，均应用到gnome上。这些都是C的API包，在此基础上有C++绑定,PHP绑定，perl绑定等等。debian下的php-mod-xml就源自这里。 <br>&nbsp;&nbsp;&nbsp; openoffice的OpenDocument基于XML,xml.openoffice.org上也有一些实现，同样值得关注。 <br>
<br>  <img src ="http://www.cppblog.com/lambdacpp/aggbug/23163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lambdacpp/" target="_blank">五点半</a> 2007-04-29 11:24 <a href="http://www.cppblog.com/lambdacpp/archive/2007/04/29/23163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SUN Solstice DiskSuite 磁盘管理软件的初步使用[转]</title><link>http://www.cppblog.com/lambdacpp/archive/2006/06/19/8732.html</link><dc:creator>五点半</dc:creator><author>五点半</author><pubDate>Mon, 19 Jun 2006 15:42:00 GMT</pubDate><guid>http://www.cppblog.com/lambdacpp/archive/2006/06/19/8732.html</guid><wfw:comment>http://www.cppblog.com/lambdacpp/comments/8732.html</wfw:comment><comments>http://www.cppblog.com/lambdacpp/archive/2006/06/19/8732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lambdacpp/comments/commentRss/8732.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lambdacpp/services/trackbacks/8732.html</trackback:ping><description><![CDATA[一． SUN Solstice DiskSuite<br />        SUN Solstice DiskSuite是SUN公司自主研发的磁盘管理软件，并向广大用户免费提供。此软件支持Solaris 2.6 、Solaris 7、 Solaris 8。虽然在Solaris 9中更名为“Sun Volume Manager”，但原理和命令几乎没有任何改变。SUN Solstice DiskSuite最常用的用途是磁盘镜像RAID 1，串连RAID 0（striping，concatenation），RAID 5，RAID 0＋1，RAID 1＋0，磁盘热备（hotspare），Diskset，操作系统扩容（growfs），文件系统日志（UFS logging）<br /><br />二． SUN Solstice DiskSuite软件安装<br />　　SUN Solstice DiskSuite软件免费提供于Solaris 2.6、Solaris 7、Solaris 8、Solaris 9及最新发布的Solaris 10中。在Solaris 9和Solaris 10中，SUN Solstice DiskSuite已经集成在操作系统当中，不需要安装就可以直接使用。在Solaris 2.6、Solaris 7、 Solaris 8的操作系统环境下，需要对SUN Solstice DiskSuite进行安装。以下介绍具体安装过程（以Solaris 8为例）。<br />　　 SUN Solstice DiskSuite软件存在于Solaris8系统安装盘的software 2　of　2中，也就是平常所说的Solaris 8安装盘的第3张（通常所说的Solaris 8安装盘有4张：install ，software 1　of 2，software 2 of 2，language）。软件具体目录如下： /sol_8_401_sparc_2/Solaris_8/EA/products/DiskSuite_4.2.1<br />　　其中， sol_8_401为操作系统版本号，本例中的操作系统版本号为Solaris 8 0401。DiskSuite_4.2.1为SUN Solstice DiskSuite软件版本号，此版本为4.2.1（如果没有安装介质，可以到SUN的网站免费下载软件包）。SUN Solstice DiskSuite软件的安装路径在/usr/opt下，所以您的/usr下至少需要30兆空间来安装SUN Solstice DiskSuite软件。<br />　　软件安装方法有两种，在图形界面环境下可以直接执行以上路径中的installer脚本程序。启动图形界面，进而根据下一步提示完成安装。除了 installer脚本程序，我们通常利用命令行通过安装软件包来安装SUN Solstice DiskSuite。SUN Solstice DiskSuite软件包存在目录为： sol_8_401_sparc_2/Solaris_8/EA/products/DiskSuite_4.2.1/sparc/packages/<br /><br />　　以下为安装实例：<br />　　1．进入Packages所在的目录<br />　　　　#cd /cdrom/cdrom0/Solaris_8/EA<br />　　　　#cd /products/DiskSuite_4.2.1/sparc/Packages<br />　　2．查看软件包<br />　　　　# ls<br />　　　　SUNWlvma SUNWlvmg SUNWlvmr SUNWmdg SUNWmdja SUNWmdnr SUNWmdnu SUNWmdr SUNWmdu SUNWmdx<br /><br />　　3．添加软件包<br />　　　　# pkgadd -d . （注：“.”为安装路径为当前目录，不可省略）<br />　　　　he following packages are available:<br />　　　　1 SUNWlvma Solaris Volume Management API's<br />　　　　(sparc) 1.0,REV=2001.11.02.03.17<br />　　　　2 SUNWlvmg Solaris Volume Management Application<br />　　　　(sparc) 1.0,REV=2001.11.14.03.19<br />　　　　3 SUNWlvmr Solaris Volume Management (root)<br />　　　　(sparc) 1.0,REV=2001.11.14.03.19<br />　　　　4 SUNWmdg Solstice DiskSuite Tool<br />　　　　(sparc) 4.2.1,REV=1999.11.04.18.29<br />　　　　5 SUNWmdja Solstice DiskSuite Japanese localization<br />　　　　(sparc) 4.2.1,REV=1999.12.09.15.37<br />　　　　6 SUNWmdnr Solstice DiskSuite Log Daemon Configuration Files<br />　　　　(sparc) 4.2.1,REV=1999.11.04.18.29<br />　　　　7 SUNWmdnu Solstice DiskSuite Log Daemon<br />　　　　(sparc) 4.2.1,REV=1999.11.04.18.29<br />　　　　8 SUNWmdr Solstice DiskSuite Drivers<br />　　　　(sparc) 4.2.1,REV=1999.12.03.10.00<br />　　　　9 SUNWmdu Solstice DiskSuite Commands<br />　　　　(sparc) 4.2.1,REV=1999.11.04.18.29<br />　　　　10 SUNWmdx Solstice DiskSuite Drivers(64-bit)<br />　　　　(sparc) 4.2.1,REV=1999.11.04.18.29<br />　　　　Select package(s) you wish to process (or 'all' to process all packages). (default: all) [?,??,q]:<br /><br />　　输入all来安装所有软件包。在实际安装过程中，笔者在较早的操作系统环境下曾经遇到安装不成功的情况，原因是驱动不符。SUN Solstice DiskSuite驱动由8号软件包SUNWmdr提供，大家如果碰到类似问题可以先安装8号软件包再安装其他软件包。也就是先在输入栏输入8，等待8号软件包安装成功后再对其它软件包进行安装。<br /><br />三． Metadevice State Database介绍<br />　　SUN Solstice DiskSuite软件在使用的时候需要调用一个其特有的Metadevice State Database小数据库。Metadevice State Database通常被称为Metadb，Metadb用来存储SUN Solstice DiskSuite软件对服务器硬盘的所有配置信息。换句话说，我们所做的所有磁盘、卷、RAID的结构，都存储在Metadb当中。每当服务器重新启动，SUN Solstice DiskSuite软件就会自动调用Metadb中的信息，从而按照这些信息配置物理磁盘，挂接UFS文件系统，从而使操作系统正常启动。相反，如果 Metadb被破坏了，操作系统就有可能无法正常启动，进入单用户状态，甚至可能丢失硬盘数据。<br />　　Metadb对于SUN Solstice DiskSuite软件来讲是异常重要的。因此我们会在建立Metadb时建立很多备份。一旦Metadb被破坏，SUN Solstice DiskSuite软件可以自动将其恢复，如果Metadb损坏严重，我们也可以手动恢复Metadb，Metadb和其备份之间是实时备份的。<br />　　在物理磁盘中，Metadb通常是磁盘的一个专有分区，也就是说在安装操作系统的时候要预留出一个分区给Metadb。这个分区不能存在文件系统，一旦这个分区被做成Metadb，它也就不能再做其他应用。我们通常把磁盘的7号分区预留给Metadb，其大小通常为10兆到50兆。当然，大家也可以用别的分区代替7号分区预留给Metadb。<br />　　在实际应用中，我们通常把SUN Solstice DiskSuite软件下的所有硬盘都建立一个Metadb。每个硬盘上的Metadb分区又可以存在多个备份，所有这些备份之间都是实时同步的。这样，我们就基本可以保证Metadb不会被破坏。<br />　　Metadb必须在SUN Solstice DiskSuite软件使用之前建立，否则SUN Solstice DiskSuite软件不会生效。我们使用metadb命令，建立Metadevice State Database。下面是一个建立Metadevice State Database的实例：<br />　　# metadb -a -f -c 3 cxtxdxsx cytydysy<br />　　metadb为软件命令；-a参数为增加metadb；-f参数为建立一个初始的metadb；-c参数后边要加个数字，表示在一个物理分区里的 metadb备份的数目，此例中为每个分区里面3个备份；cxtxdxsx cytydysy 则是要建立metadb的物理分区，可以增加他的个数。注意，一旦metadb命令执行成功，预留分区上的其他数据将会被破坏。所以此条命令可以解释为：在cxtxdxsx cytydysy两个硬盘分区上建立初始的Metadb，每块硬盘分区上的备份数目为3。<br /><br />　　下面介绍一个删除Metadb的实例：<br />　　# metadb –d cxtxdxsx<br />　　-d参数为删除metadb。这条命令可以解释为：在cxtxdxsx分区上删除原有的Metadb。我们要查看已经存在的Metadb可以用以下命令：<br />　　# metadb –I<br />　　最后，总结介绍一下metadb的参数：-a 参数意为增加一个metadb；-f 参数意为建立一个初始化的Metadb；-c n 其中n为数字，此参数意为在每一个分区中建立n个Metadb备份，如果不指定此参数，默认只建立一个Metadb；-d 参数意为删除一个Metadb；-I参数意为查询现有的Metadb的信息，包括备份个数，分布情况和Metadb的健康状况。<br />　　SUN Solstice DiskSuite软件的使用接口有三种：基于图形界面操作系统的GUI软件界面方式、命令行方式、修改/etc/opt/SUNWmd/md.tab文件方式。其中，命令行方式应用广泛，本文着重介绍命令行方式。<br /><br />四． RAID 0<br />　　我们通常所说的RAID 0就是对硬盘进行串连，把两个或更多的硬盘或分区串接起来，当做一个逻辑设备使用。RAID 0增加了X倍的数据空间（X为磁盘个数），但是数据的危险性也同时增加到X倍。例如，我们做一个3块硬盘的RAID 0，那么数据空间就是原来的3倍，危险性也是原来的3倍，坏掉3块盘中任何一块硬盘，整个RAID的数据将会全部丢失。<br />　　SUN Solstice DiskSuite软件通过把物理硬盘上的逻辑分区设备转换成特殊的DiskSuite设备，通常我们将DiskSuite设备称为 “metadevice”，可以通过metainit命令把一个系统逻辑分区做成一个metadevice。metadevice的设备路径和系统原来的设备路径不同，块设备路径在/dev/md/dsk下，裸设备路径在/dev/md/rdsk下。<br />　　SUN Solstice DiskSuite软件下的RAID 0有两种方式：concatenation方式和 striping方式。它们为RAID 0提供了两种不同的结构，而且各有各的优、缺点。<br />　　１．concatenation方式<br />　　concatenation方式把多个逻辑硬盘或分区首尾相接做成一个metadevice。具体结构如下图：<br /><br /><br /><br />　　由于数据是从第一个block顺序往下写的，因此，concatenation方式具有良好的可扩展性。也就是说，管理员可以根据文件系统的实时使用情况随时扩充metadevice的大小。然而，就是因为这种顺序写入的结构，使得concatenation方式有个致命的缺点，即IO性能降低。因为当数据写入的时候，只要第一块硬盘没有写满，在其后的硬盘上，都不会有任何的写入动作。这样，也就造成了后面硬盘IO带宽的浪费，从而使整个 concatenation方式的RAID 0 IO性能降低。下面是一个制作Concatenation方式RAID 0的实例：<br />　　# metainit d1 2 1 /dev/dsk/c0t0d0s1 1 /dev/dsk/c0t1d0s5<br />　　metainit为制作metadevice的命令；d1为metadevice的名字；metadevice的名字用dN表示，N可以从0到 127；2 为RAID 0的子盘个数，子盘实际上是以striping的方式做成的；1 为每个striping的方式做成的子盘中的分区个数，只有当这个数字为1的时候，我们做成的metadevice才是真正的concatenation 方式；/dev/dsk/c0t0d0s1 为要做成metadevice的物理分区。这条命令可以解释为，用metainit命令制作一个concatenation方式的包含两个子盘名为d1的 RAID 0，两个子盘分别为/dev/dsk/c0t0d0s1和/dev/dsk/c0t1d0s5。<br /><br />　　２．striping方式<br />　　striping方式把多个逻辑硬盘以条带化的方式连接成一个metadevice。具体方式参照下图：<br /><br /><br /><br />　　striping方式就是把硬盘分割成若干条带，数据写入的时候和concatenation方式不同。striping方式在写入数据的时候由于条带化的分割，对所有的磁盘都有写入操作，因此striping方式比concatenation方式有着良好的IO。但是，也由于这种条带结构， striping方式不可以在线扩充文件系统容量。下面是一个制作striping方式RAID 0的实例：<br />　　# metainit d2 1 2 /dev/dsk/c0t0d0s4 /dev/dsk/c0t0d0s5 –i 32k<br />　　metainit为制作metadevice的命令；d2为metadevice的名字；1 为RAID 0的子盘个数，只有当这个数字为1的时候，我们做成的RAID 0才是真正的striping方式；2 为striping方式做成的子盘中的分区个数；/dev/dsk/c0t0d0s4 为要做成metadevice的物理分区；-i 参数为每个条带的大小；-i 32k的意思是每个条带为32k字节。这条命令可以解释为，用metainit命令制作一个striping方式的包含两个子盘名为d2的RAID 0，两个子盘分别为/dev/dsk/ c0t0d0s4和/dev/dsk/ c0t0d0s4，每个条带大小为32k。<br />　　除了striping方式和concatenation方式，我们还可以通过metainit命令制作混合方式的RAID 0，不过很少有客户会要求把RAID 0制作成混合方式。 下面是一个制作混合RAID 0的实例：<br />　　#metainit d12 3 2 c0t1d0s1 c1t1d0s1 1 c0t2d0s3 3 c0t3d0s4 c1t3d0s4 c2t3d0s4<br />　　这条命令可以解释为，用metainit命令制作一个包含3个子盘名为d12的RAID 0，第一个子盘分别为c0t1d0s1和c1t1d0s1做成的striping，第二个子盘分别为c0t2d0s3，第三个子盘分别为c0t3d0s4 c1t3d0s4 c2t3d0s4做成的striping。<br /><br />五． RAID 1<br />　　我们通常所说的RAID 1也就是对磁盘进行并联，把两个或更多的硬盘或分区并联起来当做一个逻辑设备使用，起到镜像的作用。RAID 1提供了数据最大限度的安全性，它的数据安全性是没有RAID 1时候的X倍（X为子镜像数目）。为了提高数据安全性RAID 1浪费了X－1倍的空间，磁盘利用率是没有RAID 1时候的1/X，IO性能也略有下降。具体结构参照下图：<br /><br /><br />　　 在RAID 1中，两个子镜像的数据是实时同步的。也就是说，两个子镜像在同一时间进行相同的读写操作。RAID 1的方式被广泛的应用到系统盘的磁盘管理之中。就我个人的经验，超过半数的客户会要求管理员或者工程师对他的系统盘进行镜像操作，以便于当一块硬盘损坏之后，可以从另一块镜像盘引导操作系统。 下面是一个系统盘制作RAID 1完整的实例；<br />　　1.首先规划需要镜像的硬盘<br />　　d0 d10 d20 / s0<br />　　d1 d11 d21 /var s1<br />　　d2 d12 d22 swap s3<br />　　d3 d13 d23 /export/home s6　<br /><br />　　d0，d1，d2，d3为对应各个分区的metadevice名字；d10等是每个metadevice对应的子镜像。一般在做系统盘镜像前，大家最好规划一下各个metadevice的对应关系和子镜像名字以免混乱，同时也便于后期的维护。<br /><br />　　2.硬盘分区同步<br />　　# prtvtoc /dev/rdsk/c0t0d0s2 | fmthard -s - /dev/rdsk/c0t1d0s2　　<br /><br />　　由于系统盘镜象要求磁盘分区完全一致，两块硬盘分区大小也必须相同。如果两块物理硬盘大小不一致，在保持所有分区大小和顺序完全一致后，其他的空间将会浪费掉。上面的prtvtoc可以使硬盘c0t1d0的分区和硬盘c0t0d0的分区相同，c0t0d0上的数据不会被破坏，但是c0t1d0上的数据将会被完全毁灭。除此之外，也可以利用系统中的format命令手动修改磁盘分区至完全一致。<br />　　<br /><br />　　3．制作metadb<br />　　# metadb -a -f -c 3 c0t0d0s7 c1t0d0s7<br /><br />　　在c0t0d0s7、c0t1d0s7两个硬盘分区上建立初始的metadb，每块硬盘分区上的备份数目为3。<br /><br />　　4.作根分区的两路子镜像<br />　　# metainit -f d10 1 1 c0t0d0s0<br /><br />　　把c0t0d0s0制成名为d10的子镜像，实际上这个子镜像就是一个只包含一个分区的RAID 0。由于c0t0d0s0是操作系统的跟盘，分区中存在文件系统，所以使用参数-f在文件系统的分区中强制执行metainit命令，即：<br /><br />　　 # metainit d20 1 1 c0t1d0s0<br /><br />　　把c0t1d0s0制作成名为d20的子镜像。<br />　　<br /><br />　　5．制作根分区的镜像盘<br />　　# metainit d0 -m d10　　<br /><br />　　制名为d0的镜像盘，其中一路子镜像为d10。使用metainit命令和-f参数制作镜像盘，所制的镜像盘必须包含一路的子镜像。这路镜像硬盘必须是镜像源盘所对应的分区，也就是说这路子镜像中必须包含文件系统。<br /><br />　　6．备份vfstab<br />、　# cp /etc/vfstab /etc/vfstab.backup<br /><br />　　由于要修改vfstab文件，所以事先要备份vfstab文件，以便修改失败时可以通过单用户或者光盘单用户方式恢复。<br /><br />　　7．修改vfstab文件中关于根分区的项目<br />　　# metaroot d0<br />　　# lockfs<br />　　# reboot<br /><br />　　把系统逻辑设备制作成metadevice后，需要修改/etc/vfstab文件，从而使下次重启之后操作系统可以用metadevice的路径挂接文件系统。通常情况要把类似于/dev/dsk/c0t0d0s0和/dev/rdsk/c0t0d0s0的行改为 /dev/md/dsk/c0t0d0s0和/dev/md/rdsk/c0t0d0s0。<br />　　metaroot命令可以自动修改vfstab文件的有关根分区的内容， vfstab文件中非根分区的内容要进行手动修改。修改时注意项目之间要用tab键格开，不能用空格。<br />当系统重新引导成功后，用df –k命令可以看出系统根分区的挂接目录已经由原来的c0t0d0s0改为存在单路子镜像的metadevice，这个metadevice的名字是d0。<br /><br />　　8．制作其他分区的镜像盘<br /><br />　　其它分区镜像盘的制作方法类似于根分区的制作方法。<br /><br />　　# metainit -f d11 1 1 c0t0d0s1<br />　　制作c0t0d0硬盘上的1号分区的metadevice，名为d11。<br /><br />　　# metainit d21 1 1 c0t1d0s1<br />　　制作c0t1d0硬盘上的1号分区的metadevice，名为d21。<br /><br />　　# metainit d1 -m d11<br />　　制作/var分区镜像的metadevice，名为d1。其中，包含单路子镜像的d11。d11必是包含文件系统的源盘对应的分区。<br /><br />　　# metainit -f d12 1 1 c0t0d0s3<br />　　制作c0t0d0硬盘上的3号分区的metadevice，名为d12。<br /><br />　　# metainit d22 1 1 c0t1d0s3<br />　　制作c0t1d0硬盘上的3号分区的metadevice，名为d22。<br /><br />　　# metainit d2 -m d12<br />　　制作swap分区镜像的metadevice，名为d2，其中包含单路子镜像的d12。d12必须是包含文件系统的源盘对应的分区。<br /><br />　　# metainit -f d13 1 1 c0t0d0s6<br />　　制作c0t0d0硬盘上的6号分区的metadevice，名为d13。<br /><br />　　# metainit d23 1 1 c0t1d0s6<br />　　制作c0t1d0硬盘上的1号分区的metadevice，名为d23。<br /><br />　　# metainit d3 -m d13<br />　　制作/export/home分区镜像的metadevice， 名为d3，其中包含单路子镜像的d13。d13也必须是包含文件系统的源盘对应的分区。<br /><br />　　我们可以使用metastat命令来查看SUN Solstice DiskSuite软件使用的状态。metastat命令可以查看到各个metadevice的属性——也就是它们的RAID级别，各个 metadevice之间的依存关系，各个metadevice和系统逻辑硬盘分区的关系，各个metadevice的健康状况以及同步时显示同步百分比。在实际应用中，metastat是一个非常有用的命令，系统管理员和工程师可以很容易地从metastat命令的输出中观察到各个 metadevice的结构和健康状况。我们还可以使用metaclear命令清除对硬盘的metadevice操作。这个命令可以理解为是 metainit的反向命令。例如：<br />　　# metaclear d0<br /><br />　　9．将另外一路子镜像盘加入到镜像盘中<br /><br />　　# metattach d0 d20<br />　　# metattach d1 d21<br />　　# metattach d2 d22<br />　　# metattach d3 d23<br /><br />　　分别把子镜像d20、d21、d22、d23加入相应的镜像盘。我们使用metattach命令把另外一路子镜像添加到镜像盘中。metattach命令的格式是：metattach 镜像盘名子镜像盘名，这两个名字必须都是metadevice名称。同样的，我们还经常使用metadetach命令将一路子镜像盘从镜像盘中分离出去。 metadetach命令和metattach命令的作用是相反的。<br />在使用metattach命令把另外一路子镜像添加到镜像盘之后，两路子镜像会进行同步，这个同步的过程比较漫长。<br /><br />　　#metastat | grep %<br /><br />　　查看镜像同步百分比。可以使用此命令查看所有分区同步的百分比。<br /><br />　　10．修改/etc/vfstab文件中关于其它分区的项目<br />　　metaroot命令只能修改vfstab文件中关于根分区的项目，非根分区的项目需要手动修改。当修改vfstab文件和同步进程全部完成之后，可以重新引导操作系统，至此，系统盘镜像制作完毕。<br /><br />六．RAID　5<br />　　RAID　5是一种带有校验位的RAID形式。RAID　5的构成至少需要3块硬盘。它在把物理硬盘以类似于striping方式排列起来，并在其中加入校验位。在RAID　5中，校验位是以Z字形的顺序排列的。这样排列的好处是，一旦其中任何一块硬盘损坏，RAID　5都可以至少占有2个数据模块和一个校验模块中至少两项。而另外一项总可以根据已经存在的两项算出。也就是说RAID　5的空间可以增加到没有RAID　5之前的X－1倍，而同时又可以允许任何一块硬盘故障而不丢失数据（X为RAID　5中的物理硬盘个数）。RAID　5的具体结构可以参照下图。<br /><br />　　可利用metainit命令制作RAID 5，下面是一个制作RAID 5的实例：<br /><br />　　# metainit /dev/md/dsk/d12 –r /dev/dsk/c0t0d0s3 /dev/dsk/c0t0d0s4 /dev/dsk/c0t0d0s5 –i 8k<br /><br />　　我们用-r参数代表制作RAID　5，在-r参数后边加上需要做成RAID5的子磁盘；用 –i 参数来指定RAID　5中每个条带的大小。这条命令可以解释为用/dev/dsk/c0t0d0s3、/dev/dsk/c0t0d0s4、 /dev/dsk/c0t0d0s5三个分区制作一个名为d12的RAID　5，每个条带的大小为8k。同样可以用metastat命令查看RAID　5 的各项信息。由于RAID　5有着很好的容量和容错的平衡性，所以在实际项目实施中，RAID　5被应用十分普遍。由于通常情况下RAID　5都是用来存储数据，所以系统管理员需要经常观察RAID　5的健康状况，从而确保数据安全。<br />========<br />以下是使用心得(在一台SunFire V880使用):<br />1 在第0个盘上安装Solaris系统，由于无知没有预留metadb的空间<br />2 通过format命令,在第1、2个盘上安装metadb分区(c1t1d0s7,c1t2d0s7),在1-5盘上联立33GB的数据分区(c1t1d0s1,c1t2d0s1,c1t3d0s1,c1t4d0s1,c1t5d0s1)<br />3 建立meta数据<br />#metadb -a -f -c 3 c1t1d0s7 c1t2d0s7<br />    结果:<br /># metadb<br />        flags           first blk       block count<br />     a        u         16              8192            /dev/dsk/c1t1d0s7<br />     a        u         8208            8192            /dev/dsk/c1t1d0s7<br />     a        u         16400           8192            /dev/dsk/c1t1d0s7<br />     a        u         16              8192            /dev/dsk/c1t2d0s7<br />     a        u         8208            8192            /dev/dsk/c1t2d0s7<br />     a        u         16400           8192            /dev/dsk/c1t2d0s7<br />4 建立RAID5<br /> #metainit /dev/md/dsk/d12 -r /dev/dsk/c1t1d0s1 /dev/dsk/c1t2d0s1 \   <br />     /dev/dsk/c1t3d0s1 /dev/dsk/c1t4d0s1 /dev/dsk/c1t5d0s1 -i 8k<br />结果:<br /># metastat d12: RAID<br />    状态: 初始化<br />    正在进行初始化: 56.6% 完成<br />    交错： 16 块<br />    大小： 276821091 块 (131 GB)<br />原始设备：<br />    大小： 276823296 块 (131 GB)<br />        设备       引导块       Dbase         状态 Reloc  热备援<br />        c1t1d0s1       3059        否       初始化    是<br />        c1t2d0s1       3059        否       初始化    是<br />        c1t3d0s1       3059        否       初始化    是<br />        c1t4d0s1       3059        否       初始化    是<br />        c1t5d0s1       3059        否       初始化    是<br /><br />Device Relocation Information:<br />Device   Reloc  Device ID<br />c1t1d0   是     id1,ssd@n20000004cf7f1ce9<br />c1t2d0   是     id1,ssd@n20000004cf7f1757<br />c1t3d0   是     id1,ssd@n20000004cf7f178b<br />c1t4d0   是     id1,ssd@n2000002037f834fc<br />c1t5d0   是     id1,ssd@n20000004cf7f1a88<br />5 格式化<br /># newfs  /dev/md/dsk/d12<br />newfs: 建构新的文件系统 /dev/md/rdsk/d12: (y/n)？ y<br />警告：最后一个未分配柱面中的 2974 扇区<br />/dev/md/rdsk/d12:       在 45056 磁道上，48 扇区的 128 柱面的 276821090 扇区<br />        135166.5MB 在 2816 柱面群组 (16 c/g, 48.00MB/g, 5824 i/g)<br />超块 (fsck -F ufs -o b=#) 备份在：<br /> 32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,<br />初始化柱面组：<br />........................................................<br />最后 10 个柱面组的超级块备份位置：<br /> 275847968, 275946400, 276044832, 276143264, 276241696, 276340128, 276438560,<br /> 276536992, 276635424, 276733856<br />6 mount<br /># mount /dev/md/dsk/d12 /data/<br />在/etc/vfstab中添加<br />/dev/md/dsk/d12         /dev/md/dsk/d12         /data   ufs     2       yes     -<br /><br /><br /><br /><img src ="http://www.cppblog.com/lambdacpp/aggbug/8732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lambdacpp/" target="_blank">五点半</a> 2006-06-19 23:42 <a href="http://www.cppblog.com/lambdacpp/archive/2006/06/19/8732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Lua</title><link>http://www.cppblog.com/lambdacpp/archive/2006/06/11/8404.html</link><dc:creator>五点半</dc:creator><author>五点半</author><pubDate>Sun, 11 Jun 2006 01:34:00 GMT</pubDate><guid>http://www.cppblog.com/lambdacpp/archive/2006/06/11/8404.html</guid><wfw:comment>http://www.cppblog.com/lambdacpp/comments/8404.html</wfw:comment><comments>http://www.cppblog.com/lambdacpp/archive/2006/06/11/8404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lambdacpp/comments/commentRss/8404.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lambdacpp/services/trackbacks/8404.html</trackback:ping><description><![CDATA[    一直以为，只有游戏开发才会使用Lua。昨天认真的看了一天《Programming in Lua》才知道自己完全错了。Lua真是非常强大的动态语言。<br />    初步决定在现在进行的项目中使用Lua作为配置管理（本来是使用类似ini的配置文件，不要说我太土哦）。但现有的封装Lua API的C++库好象都不是太好用，决定自己写一个简单的，先用着。<br /><img src ="http://www.cppblog.com/lambdacpp/aggbug/8404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lambdacpp/" target="_blank">五点半</a> 2006-06-11 09:34 <a href="http://www.cppblog.com/lambdacpp/archive/2006/06/11/8404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读《编程卓越之道（第一卷 深入理解计算机）》</title><link>http://www.cppblog.com/lambdacpp/archive/2006/06/07/8240.html</link><dc:creator>五点半</dc:creator><author>五点半</author><pubDate>Wed, 07 Jun 2006 03:26:00 GMT</pubDate><guid>http://www.cppblog.com/lambdacpp/archive/2006/06/07/8240.html</guid><wfw:comment>http://www.cppblog.com/lambdacpp/comments/8240.html</wfw:comment><comments>http://www.cppblog.com/lambdacpp/archive/2006/06/07/8240.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lambdacpp/comments/commentRss/8240.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lambdacpp/services/trackbacks/8240.html</trackback:ping><description><![CDATA[    星期天，买了这本书。其实有一本国外教材就叫《深入理解计算机》，厚厚的、很经典、很实用。这本是《编程卓越之道》的第一卷，作者就是那个写《汇编程序的艺术》的Randall Hyde。这本书可以看成是厚《深入理解计算机》的简略本，把程序中最重要的计算机系统知识为读者疏离了一遍。书中没有太多的理论，读起来很轻松愉快，但我可以保证，读者的计算机系统知识再全面也能有一些收获，可能是不知道的、可能是以前没有注意到的、也可能是知道又遗忘的。<br /><img src ="http://www.cppblog.com/lambdacpp/aggbug/8240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lambdacpp/" target="_blank">五点半</a> 2006-06-07 11:26 <a href="http://www.cppblog.com/lambdacpp/archive/2006/06/07/8240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>