<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[开源虚拟化]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[]]></description>
<link>http://hi.baidu.com/jouby</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[Dash与Bash的语法区别]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/ca17cc22dca3a6ba4723e86e.html]]></link>
        <description><![CDATA[
		
		<p>如今Debian和Ubuntu中，/bin/sh默认已经指向dash，这是一个不同于bash的shell，它主要是为了执行脚本而出现，而不是交互，它速度更快，但功能相比bash要少很多，语法严格遵守POSIX标准，下面简要列举下从bash迁移到dash一般需要注意的问题</p><h1>1.定义函数</h1><p>bash: function在bash中为关键字</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div></td><td><div><div>igi@gentoo ~ $ foo(){ echo$0;}</div><div>igi@gentoo ~ $ foo</div><div>/bin/bash</div><div>igi@gentoo ~ $ functionfoo2(){ echo$0;}</div><div>igi@gentoo ~ $ foo2</div><div>/bin/bash</div></div></td></tr></tbody></table></div></div><p>dash: dash中没有function这个关键字                                                                              </p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div></td><td><div><div>$ foo(){ echo$0;}</div><div>$ foo</div><div>dash</div><div>$ functionfoo2(){ echo$0;}</div><div>dash: Syntax error: &quot;(&quot;unexpected</div></div></td></tr></tbody></table></div></div><h1>2.select var in list; do command; done</h1><p>bash:支持</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div><div>13</div><div>14</div><div>15</div><div>16</div><div>17</div><div>18</div><div>19</div></td><td><div><div>igi@gentoo ~ $ selectinput inA B</div><div>&gt; do</div><div>&gt;&nbsp;&nbsp; case$input in</div><div>&gt;&nbsp;&nbsp;&nbsp;&nbsp; A)</div><div>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo'Input:A'</div><div>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break</div><div>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;;</div><div>&gt;&nbsp;&nbsp;&nbsp;&nbsp; B)</div><div>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo'Input:B'</div><div>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break</div><div>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;;</div><div>&gt;&nbsp;&nbsp; esac</div><div>&gt; done</div><div>1) A</div><div>2) B</div><div>#? 1</div><div>Input:A</div><div>igi@gentoo ~ $ echo$0</div><div>/bin/bash</div></div></td></tr></tbody></table></div></div><p>dash:不支持, 替代方法:采用while+read+case来实现</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div><div>13</div><div>14</div><div>15</div><div>16</div><div>17</div><div>18</div><div>19</div></td><td><div><div>menu(){ echo-n &quot;1)A;\n2)B\n&gt;&quot;;}</div><div>menu</div><div>whilereadinput</div><div>do</div><div>&nbsp;&nbsp;&nbsp;&nbsp;case$input in</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo'A'</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo'B'</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;</div><div>&nbsp;&nbsp;&nbsp;&nbsp;esac</div><div>done</div></div></td></tr></tbody></table></div></div><h1>3. echo {0..10}</h1><p>bash:支持{n..m}展开</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div></td><td><div><div>igi@gentoo ~ $ echo$0</div><div>/bin/bash</div><div>igi@gentoo ~ $ echo{0..10}</div><div>0 1 2 3 4 5 6 7 8 9 10</div></div></td></tr></tbody></table></div></div><p>dash:不支持，替代方法, 采用seq外部命令</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div></td><td><div><div>$ echo$0</div><div>dash</div><div>$ echo{0..10}</div><div>{0..10}</div><div>$ echo`seq0 10`</div><div>0 1 2 3 4 5 6 7 8 9 10</div></div></td></tr></tbody></table></div></div><h1>4. here string</h1><p>bash:支持here string</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div></td><td><div><div>igi@gentoo ~ $ cat&lt;&lt;&lt;&quot;string&quot;</div><div>string</div><div>igi@gentoo ~ $ echo$0</div><div>/bin/bash</div></div></td></tr></tbody></table></div></div><p>dash:不支持, 替代方法:可采用here documents</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div></td><td><div><div>$ echo$0</div><div>dash</div><div>$ cat&lt;&lt;&lt;&quot;string&quot;</div><div>dash: Syntax error: redirection unexpected</div><div>$ cat&lt;&lt;EOF</div><div>&gt; string</div><div>&gt; EOF</div><div>string</div></div></td></tr></tbody></table></div></div><h1>5. &gt;&amp;word重定向标准输出和标准错误</h1><p>bash: 当word为非数字时，&gt;&amp;word变成重定向标准错误和标准输出到文件word, 常见用法&gt;&amp;/dev/null</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></td><td><div><div>igi@gentoo ~/test$ ls</div><div>a</div><div>igi@gentoo ~/test$ lsa b</div><div>ls: cannot access b: No such fileor directory</div><div>a</div><div>igi@gentoo ~/test$ lsa b &gt;&amp;/dev/null</div><div>igi@gentoo ~/test$ lsa b &gt;/dev/null2&gt;&amp;1</div><div>igi@gentoo ~/test$ echo$0</div><div>/bin/bash</div></div></td></tr></tbody></table></div></div><p>dash: &gt;&amp;word, word不支持非数字, 替代方法: &gt;word 2&gt;&amp;1; 常见用法 &gt;/dev/null 2&gt;&amp;1</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div></td><td><div><div>$ echo$0</div><div>dash</div><div>$ lsa</div><div>a</div><div>$ lsa b</div><div>ls: cannot access b: No such fileor directory</div><div>a</div><div>$ lsa b &gt;&amp;/dev/null</div><div>dash: Syntax error: Bad fd number</div><div>$ lsa b &gt;/dev/null2&gt;&amp;1</div><div>$</div></div></td></tr></tbody></table></div></div><h1>6. 数组</h1><p>bash: 支持数组, bash4支持关联数组</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div></td><td><div><div>igi@gentoo ~/test$ echo$0</div><div>/bin/bash</div><div>igi@gentoo ~/test$ array=( a b c )</div><div>igi@gentoo ~/test$ echo${array[2]}</div><div>c</div></div></td></tr></tbody></table></div></div><p>dash: 不支持数组，替代方法, 采用变量名+序号来实现类似的效果</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></td><td><div><div>$ fori ina b c</div><div>&gt; do</div><div>&gt; id=$((${id:=-1}+1))</div><div>&gt; evalarray_$id=$i</div><div>&gt; done</div><div>$ echo${array_1}</div><div>b</div><div>$ echo$0</div><div>dash</div></div></td></tr></tbody></table></div></div><p>很蛋疼的方法，非不得以不建议这么用</p><h1>7. 子字符串扩展</h1><p>bash: 支持${parameter:offset:length},${parameter:offset}</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div></td><td><div><div>igi@gentoo ~/test$ string='hello'</div><div>igi@gentoo ~/test$ echo${string:1:3}</div><div>ell</div><div>igi@gentoo ~/test$ echo${string:1}</div><div>ello</div><div>igi@gentoo ~/test$ echo$0</div><div>/bin/bash</div></div></td></tr></tbody></table></div></div><p>dash: 不支持， 替代方法:采用expr或cut外部命令代替</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div></td><td><div><div>$ string='hello'</div><div>$ exprsubstr &quot;$string&quot;2 3</div><div>ell</div><div>$ echo&quot;$string&quot;| cut-c2-4</div><div>ell</div><div>$ exprsubstr &quot;$string&quot;2 &quot;${#string}&quot;</div><div>ello</div><div>$ echo&quot;$string&quot;| cut-c2-</div><div>ello</div><div>$ echo$0</div><div>dash</div><div>$</div></div></td></tr></tbody></table></div></div><h1>8. 大小写转换</h1><p>bash: 支持${parameter^pattern},${parameter^^pattern},${parameter,pattern},${parameter,,pattern}</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></td><td><div><div>igi@gentoo ~/test$ string=&quot;abcABC&quot;</div><div>igi@gentoo ~/test$ echo${string^^}</div><div>ABCABC</div><div>igi@gentoo ~/test$ echo${string,,}</div><div>abcabc</div><div>igi@gentoo ~/test$ echo${string^^b}</div><div>aBcABC</div><div>igi@gentoo ~/test$ echo$0</div><div>/bin/bash</div></div></td></tr></tbody></table></div></div><p>dash: 不支持，替代方法:采用tr/sed/awk等外部命令转换</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div></td><td><div><div>$ string='abcABC'</div><div>$ echo&quot;$string&quot;| tr'[a-z]''[A-Z]'</div><div>ABCABC</div><div>$ echo&quot;$string&quot;| tr'[A-Z]''[a-z]'</div><div>abcabc</div><div>$ echo&quot;$string&quot;| sed's/b/\U&amp;/g'</div><div>aBcABC</div><div>$</div></div></td></tr></tbody></table></div></div><h1>9. 进程替换&lt;(command), &gt;(command)</h1><p>bash: 支持进程替换</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div></td><td><div><div>igi@gentoo ~ $ diff&lt;(seq3) &lt;(seq4)</div><div>3a4</div><div>&gt; 4</div><div>igi@gentoo ~ $ echo$0</div><div>/bin/bash</div></div></td></tr></tbody></table></div></div><p>dash: 不支持, 替代方法, 通过临时文件中转</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div></td><td><div><div>$ diff&lt;(seq3) &lt;(seq4)</div><div>dash: Syntax error: &quot;(&quot;unexpected</div><div>$ seq3 &gt;tmp1</div><div>$ seq4 &gt;tmp2</div><div>$ difftmp1 tmp2</div><div>3a4</div><div>&gt; 4</div><div>$ echo$0</div><div>dash</div><div>$</div></div></td></tr></tbody></table></div></div><h1>10. [ string1 = string2 ] 和 [ string1 == string2 ]</h1><p>bash: 支持两者</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div></td><td><div><div>igi@gentoo ~ $ [ 'a'= 'a'] &amp;&amp; echo'equal'</div><div>equal</div><div>igi@gentoo ~ $ [ 'a'== 'a'] &amp;&amp; echo'equal'</div><div>equal</div><div>igi@gentoo ~ $ echo$0</div><div>/bin/bash</div></div></td></tr></tbody></table></div></div><p>dash: 只支持=</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div></td><td><div><div>$ [ 'a'= 'a'] &amp;&amp; echo'equal'</div><div>equal</div><div>$ [ 'a'== 'a'] &amp;&amp; echo'equal'</div><div>[: 2: a: unexpected operator</div><div>$ echo$0</div><div>dash</div><div>$</div></div></td></tr></tbody></table></div></div><h1>11. [[ 加强版test</h1><p>bash: 支持[[ ]], 可实现正则匹配等强大功能</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div></td><td><div><div>igi@gentoo ~ $ [[ 'xyz123'=~ xyz[0-9]+ ]] &amp;&amp; echo'equal'</div><div>equal</div><div>igi@gentoo ~ $ echo$0</div><div>/bin/bash</div></div></td></tr></tbody></table></div></div><p>dash: 不支持[[ ]], 替代方法，采用外部命令</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div></td><td><div><div>$ [[ 'xyz123'=~ xyz[0-9]+ ]] &amp;&amp; echo'equal'</div><div>dash: [[: not found</div><div>$ echo'xyz123'| grep-q 'xyz[0-9]\+'&amp;&amp; echo'equal'</div><div>equal</div><div>$ echo$0</div><div>dash</div><div>$</div></div></td></tr></tbody></table></div></div><h1>12. for (( expr1 ; expr2 ; expr3 )) ; do list ; done</h1><p>bash: 支持C语言格式的for循环 </p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div></td><td><div><div>igi@gentoo ~ $ for((i=0;i&lt;=3;i++));doecho&quot;$i&quot;;done</div><div>0</div><div>1</div><div>2</div><div>3</div><div>igi@gentoo ~ $ echo$0</div><div>/bin/bash</div></div></td></tr></tbody></table></div></div><p>dash: 不支持该格式的for, 替代方法，用while+$((expression))实现</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div><div>13</div></td><td><div><div>$ i=0</div><div>$ while[ &quot;$i&quot;-le3 ]</div><div>&gt; do</div><div>&gt; echo&quot;$i&quot;</div><div>&gt; i=$((i+1))</div><div>&gt; done</div><div>0</div><div>1</div><div>2</div><div>3</div><div>$ echo$0</div><div>dash</div><div>$</div></div></td></tr></tbody></table></div></div><h1>13. let命令和((expression))</h1><p>bash: 有内置命令let, 也支持((expression))方式</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></td><td><div><div>igi@gentoo ~ $ i=0</div><div>igi@gentoo ~ $ leti++</div><div>igi@gentoo ~ $ echo$i</div><div>1</div><div>igi@gentoo ~ $ ((i++))</div><div>igi@gentoo ~ $ echo$i</div><div>2</div><div>igi@gentoo ~ $ echo$0</div><div>/bin/bash</div></div></td></tr></tbody></table></div></div><p>dash: 不支持，替代方法，采用$((expression))或者外部命令做计算</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div></td><td><div><div>$ i=0</div><div>$ i=$((i+1))</div><div>$ echo$i</div><div>1</div><div>$ echo$0</div><div>dash</div><div>$</div></div></td></tr></tbody></table></div></div><h1>14. $((expression))</h1><p>bash: 支持id++,id--,++id,--id这样到表达式</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div></td><td><div><div>igi@gentoo ~ $ i=0</div><div>igi@gentoo ~ $ echo$((i++))</div><div>0</div><div>igi@gentoo ~ $ echo$i</div><div>1</div><div>igi@gentoo ~ $ echo$((++i))</div><div>2</div><div>igi@gentoo ~ $ echo$i</div><div>2</div><div>igi@gentoo ~ $ echo$0</div><div>/bin/bash</div></div></td></tr></tbody></table></div></div><p>dash: 不支持++,--, 替代方法:id+=1,id-=1, id=id+1,id=id-1</p><div><div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div><div>13</div><div>14</div></td><td><div><div>$ i=0</div><div>$ echo$((i++))</div><div>dash: arithmetic expression: expecting primary: &quot;i++&quot;</div><div>$ echo$i;i=$((i+1))</div><div>0</div><div>$ echo$i</div><div>1</div><div>$ echo$((i+=1))</div><div>2</div><div>$ echo$i</div><div>2</div><div>$ echo$0</div><div>dash</div><div>$</div></div></td></tr></tbody></table></div></div><p>以上列举的都是常见容易混淆的地方，更多区别可以查看manpage</p> <a href="http://hi.baidu.com/jouby/blog/item/ca17cc22dca3a6ba4723e86e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/Shell">Shell</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/ca17cc22dca3a6ba4723e86e.html#comment">查看评论</a>]]></description>
        <pubDate>2011-12-28  21:13</pubDate>
        <category><![CDATA[Shell]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/ca17cc22dca3a6ba4723e86e.html</guid>
</item>

<item>
        <title><![CDATA[dmidecode详解]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/0ed7867fec8a821628388aa2.html]]></link>
        <description><![CDATA[
		
		<p>1、DMI简介<br />　 　DMI (Desktop Management Interface, DMI)就是帮助收集电脑系统信息的管理系统，DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行。 SMBIOS(System Management BIOS)是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。SMBIOS和DMI是由行业指导机构Desktop Management Task Force (DMTF)起草的开放性的技术标准，其中DMI设计适用于任何的平台和操作系统。&nbsp;<br />　　DMI充 当了管理工具和系统层之间接口的角色。它建立了标准的可管理系统更加方便了电脑厂商和用户对系统的了解。DMI的主要组成部分<b>是Management Information Format (MIF)数据库。这个数据库包括了所有有关电脑系统和配件的信息。通过DMI，用户可以获取序列号、电脑厂商、串口信息以及其它系统配件信息。</b></p><p><strong>dmidecode的输出格式一般如下：</strong><br />—————————————-<br />Handle 0×0002<br />DMI type 2, 8 bytes<br />Base Board Information<br />Manufacturer:Intel<br />Product Name: C440GX+<br />Version: 727281-0001<br />Serial Number: INCY92700942<br />—————————————-<br />其中的前三行都称为记录头(recoce Header), 其中包括了：<br />1、recode id(handle): DMI表中的记录标识符，这是唯一的,比如上例中的Handle 0×0002。<br />2、dmi type id: 记录的类型，譬如说:BIOS，Memory，上例是type 2，即”Base Board Information”<br />3、recode size: DMI表中对应记录的大小，上例为8 bytes.（不包括文本信息，所有实际输出的内容比这个size要更大。）<br />记录头之后就是记录的值：<br />4、decoded values: 记录值可以是多行的，比如上例显示了主板的制造商(manufacturer)、model、version以及serial Number。</p><p>2、Dmidecode作用<br />dmidecode的作用是将DMI数据库中的信息解码，以可读的文本方式显示。由于DMI信息可以人为修改，因此里面的信息不一定是系统准确的信息。</p><p>3、获取dmidecode程序<br />Dmidecode源码下载地址：<a rel="nofollow" href="http://download.savannah.gnu.org/releases/dmidecode/">http://download.savannah.gnu.org/releases/dmidecode/</a><br />Windows版下载地址：<a rel="nofollow" href="http://gnuwin32.sourceforge.net/packages/dmidecode.htm">http://gnuwin32.sourceforge.net/packages/dmidecode.htm</a></p><p>4、dmidecode命令用法<br />Usage: dmidecode [OPTIONS]<br />Options are:<br />-d, --dev-mem FILE&nbsp;&nbsp;&nbsp; Read memory from device FILE (default: /dev/mem)&nbsp;<br />#从设备文件读信息，输出内容与不加参数标准输出相同<br />-h, --help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Display this help text and exit&nbsp;<br />#显示帮助信息<br />-q, --quiet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Less verbose output<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #显示更少的简化信息<br />-s, --string KEYWORD Only display the value of the given DMI string<br />#只显示指定DMI字符串的信息<br />-t, --type TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Only display the entries of given type&nbsp;<br />#只显示指定条目的信息<br />-u, --dump&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do not decode the entries&nbsp;<br />#显示未解码的原始条目内容<br />&nbsp;&nbsp;&nbsp;&nbsp; --dump-bin FILE&nbsp;&nbsp; Dump the DMI data to a binary file<br />&nbsp;&nbsp;&nbsp;&nbsp; --from-dump FILE Read the DMI data from a binary file<br />-V, --version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Display the version and exit&nbsp;&nbsp;&nbsp;<br />#显示版本信息</p><p>5、参数string及type列表</p><p>（1）Valid string keywords are:<br />bios-vendor<br />bios-version<br />bios-release-date<br />system-manufacturer<br />system-product-name<br />system-version<br />system-serial-number<br />system-uuid<br />baseboard-manufacturer<br />baseboard-product-name<br />baseboard-version<br />baseboard-serial-number<br />baseboard-asset-tag<br />chassis-manufacturer<br />chassis-type<br />chassis-version<br />chassis-serial-number<br />chassis-asset-tag<br />processor-family<br />processor-manufacturer<br />processor-version<br />processor-frequency</p><p>（2）Valid type keywords are:<br />bios<br />system&nbsp;<br />baseboard<br />chassis<br />processor<br />memory<br />cache<br />connector<br />slot</p><p>（3）type全部编码列表<br />Type&nbsp;&nbsp; Information<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; BIOS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; System<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp; Base Board<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp; Chassis<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp; Processor<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp; Memory Controller<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp; Memory Module<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp; Cache<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp; Port Connector<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp; System Slots<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp; On Board Devices<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11&nbsp;&nbsp; OEM Strings<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12&nbsp;&nbsp; System Configuration Options<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13&nbsp;&nbsp; BIOS Language<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14&nbsp;&nbsp; Group Associations<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15&nbsp;&nbsp; System Event Log<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp; Physical Memory Array<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17&nbsp;&nbsp; Memory Device<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18&nbsp;&nbsp; 32-bit Memory Error<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19&nbsp;&nbsp; Memory Array Mapped Address<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20&nbsp;&nbsp; Memory Device Mapped Address<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21&nbsp;&nbsp; Built-in Pointing Device<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22&nbsp;&nbsp; Portable Battery<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23&nbsp;&nbsp; System Reset<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24&nbsp;&nbsp; Hardware Security<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25&nbsp;&nbsp; System Power Controls<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 26&nbsp;&nbsp; Voltage Probe<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27&nbsp;&nbsp; Cooling Device<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 28&nbsp;&nbsp; Temperature Probe<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29&nbsp;&nbsp; Electrical Current Probe<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30&nbsp;&nbsp; Out-of-band Remote Access<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31&nbsp;&nbsp; Boot Integrity Services<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 32&nbsp;&nbsp; System Boot<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33&nbsp;&nbsp; 64-bit Memory Error<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 34&nbsp;&nbsp; Management Device<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 35&nbsp;&nbsp; Management Device Component<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 36&nbsp;&nbsp; Management Device Threshold Data<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 37&nbsp;&nbsp; Memory Channel<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 38&nbsp;&nbsp; IPMI Device<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 39&nbsp;&nbsp; Power Supply</p><p>&nbsp;40 Additional Information<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 41 Onboard Device</p><p>6、命令示例<br /># dmidecode -s system-serial-number&nbsp;&nbsp; #显示系统序列号<br /># dmidecode -t memory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #显示内存信息<br /># dmidecode -t 11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #显示OEM信息</p><p>转自：http://yanmengxiang.blog.163.com/blog/static/1035782742010530947582/</p><p></p> <a href="http://hi.baidu.com/jouby/blog/item/0ed7867fec8a821628388aa2.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/Linux">Linux</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/0ed7867fec8a821628388aa2.html#comment">查看评论</a>]]></description>
        <pubDate>2011-12-28  16:21</pubDate>
        <category><![CDATA[Linux]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/0ed7867fec8a821628388aa2.html</guid>
</item>

<item>
        <title><![CDATA[Linux Kernel Shared Memory 剖析]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/3a1d26013601dac8277fb5cf.html]]></link>
        <description><![CDATA[
		
		<div><h1>Linux Kernel Shared Memory 剖析</h1><p><em>Linux 内核中的内存去耦合</em></p></div><div><div><div><a rel="#authortip1" href="http://www.ibm.com/developerworks/cn/linux/l-kernel-shared-memory/index.html?ca=drs-#author1" title="" style="color: #4c6e94;">M. Tim Jones</a>, 自由作家</div><p></p><p><strong>简介：</strong>&nbsp;作为一个系统管理程序（hypervisor），Linux&#174; 有几个创新，2.6.32 内核中一个有趣的变化是 Kernel Shared Memory (KSM)。KSM 允许这个系统管理程序通过合并内存页面来增加并发虚拟机的数量。本文探索 KSM 背后的理念（比如存储去耦合）、KSM 的实现、以及如何管理 KSM。</p><div></div><div></div><p></p><a href="http://www.ibm.com/developerworks/cn/linux/l-kernel-shared-memory/index.html?ca=drs-#">标记本文！</a><div></div><p></p></div><div><p><b>发布日期：</b>&nbsp;2010 年 5 月 12 日&nbsp;<br /><b>级别：</b>&nbsp;中级&nbsp;<br /><b>其他语言版本：</b>&nbsp;<a href="http://www.ibm.com/developerworks/linux/library/l-kernel-shared-memory/index.html" style="color: #4c6e94;">英文</a>&nbsp;<br /><strong>访问情况 ：</strong>&nbsp;2963 次浏览&nbsp;<br /><strong>评论：</strong>&nbsp;<span>1&nbsp;(<a href="http://www.ibm.com/developerworks/cn/linux/l-kernel-shared-memory/index.html?ca=drs-#icomments">查看</a>&nbsp;|&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/l-kernel-shared-memory/index.html?ca=drs-#icomments" style="color: #4c6e94;">添加评论</a>)</span></p><div><img src="http://hiphotos.baidu.com/jouby/pic/item/1e2a750735fae6cdd3728c2d0fb30f2443a70fbd.jpg" />&nbsp;平均分 (6个评分)<br /><a href="http://www.ibm.com/developerworks/cn/linux/l-kernel-shared-memory/index.html?ca=drs-#iratings">为本文评分</a></div><br /><p></p></div></div><div><a name="author"></a><h2>联系 Tim</h2>Tim 是我们最受欢迎、作品最多的作者之一。查看&nbsp;&nbsp;并与他以及 My developerWorks 中的其他作者和相关读者取得联系。<p>软件工程可能是一个不断演变的过程：通过解决方案解决问题，解决方案产生新问题，然后再构建新的解决方案。理想的情况是，产生的新问题能够证明原始解决方案的有效性。本文讨论的技术是这种二级解决方案之一，针对由服务器虚拟化产生的问题。但是，在深入 KSM 之前，我们先快速检查一下原始解决方案，以及 KSM 如何在这里和其他地方应用。</p><p><a name="server_virtualization"><span>服务器虚拟化</span></a></p><a name="consolidation"></a><h2>极端服务器合并</h2>尽管企业服务器可以使用虚拟化合并 10 个或更多服务器，但单个 IBM System z 服务器能够在一个单一的逻辑分区上支持数千个 Linux 客户机（guest）。<p>虚拟化技术从上世纪 60 年代开始出现，经由 IBM&#174; System/360&#174; 大型机得以流行。50 年过后，虚拟化技术取得了跨越式发展，使得多个操作系统和应用程序共享一个服务器成为可能。这一特殊用途（称为<em>服务器虚拟化</em>）正在演变为数据中心，因为单个物理机能够用于托管 10 个（一般情况）或更多虚拟机（VM），如图 1 所示。这种虚拟化使基础设施更动态、更省电、（因而也）更经济。请参见&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/l-kernel-shared-memory/index.html?ca=drs-#resources" style="color: #4c6e94;">参考资料</a>&nbsp;部分了解关于服务器虚拟化及其好处的更多信息。</p><br /><a name="fig1"><b>图 1. 通过虚拟化进行的服务器合并&nbsp;</b></a><br /><img height="200" src="http://hiphotos.baidu.com/jouby/pic/item/5d0694fae6cd7b8937aa1dcf0f2442a7d8330ebd.jpg" width="400" />&nbsp;<br /><p>如果某个物理服务器总是只使用 10-15% 的资源，那么在这个物理服务器上合并多个虚拟服务器就很有用。但是资源情况如何呢？主要的可用资源包括 CPU、内存和网络带宽。CPU 和网络通常没有得到充分利用，因此真正的问题就是可用内存。每个操作系统都有自己对可用内存资源的独特需求。由此产生的问题是：那些需求到底有多独特？</p><p><a href="http://www.ibm.com/developerworks/cn/linux/l-kernel-shared-memory/index.html?ca=drs-#ibm-pcon">回页首</a></p><p><a name="memory_sharing"><span>内存共享</span></a></p><p>事实证明，如果您虚拟化许多相同的操作系统和应用程序组，那么许多内存页面都是相同的。假如操作系统和应用程序代码以及常量数据在 VMs 之间相同，那么这个特点就很有用。当页面惟一时，它们可以被合并，从而释放内存，供其他应用程序使用。图 2 演示了内存共享，并展示了在内容相同的 VMs 之间共享页面时更多可用闲置内存的好处。</p><br /><a name="fig2"><b>图 2. 跨 VMs 的内存共享</b></a><br /><img height="361" src="http://hiphotos.baidu.com/jouby/pic/item/bcfb47cd7b899e51a5481d5842a7d933c9950dbd.jpg" width="400" />&nbsp;<br /><a name="naming"></a><h2>特性命名</h2><p>本文描述的特性非常新；因此，其名称经历了一些变化。您将发现这个 Linux 内核特性称为&nbsp;<em>Kernel Shared Memory</em>&nbsp;或&nbsp;<em>Kernel Samepage Merging</em>。</p><p>您很快就会发现，尽管 Linux 中的内存共享在虚拟环境中有优势（KSM 最初设计用于基于内核的虚拟机），但它在非虚拟环境中仍然有用。事实上，KSM 甚至在嵌入式 Linux 系统中也有用处，表明了这种方法的灵活性。下面，我们将探索这种 Linux 内存共享方法，以及如何使用该方法提高服务器的内存密度，从而增加其托管其他应用程序或 VMs 的能力。</p><p><a href="http://www.ibm.com/developerworks/cn/linux/l-kernel-shared-memory/index.html?ca=drs-#ibm-pcon">回页首</a></p><p><a name="parallel"><span>其他技术支持</span></a></p><p>存储技术中的一个称为<em>去耦合（de-duplication）</em>的最新进展是 Linux 和其他系统管理程序中的内存共享的先驱。去耦合这种技术通过删除冗余数据（基于数据块，或者基于更大的数据片段，比如文件）来减少已存储的数据。公共数据片段被合并（以一种 copy-on-write [CoW] 方式），释放空间供其他用途。使用这种方法，存储成本更低，最终需要的存储器也更少。鉴于当前的数据增长速度，这个功能显得非常重要。</p><p><a href="http://www.ibm.com/developerworks/cn/linux/l-kernel-shared-memory/index.html?ca=drs-#ibm-pcon">回页首</a></p><p><a name="ksm_operation"><span>KSM 操作</span></a></p><p>KSM 作为内核中的守护进程（称为&nbsp;ksmd）存在，它定期执行页面扫描，识别副本页面并合并副本，释放这些页面以供它用。KSM 执行上述操作的过程对用户透明。例如，副本页面被合并（然后被标记为只读），但是，如果这个页面的其中一个用户由于某种原因更改该页面，该用户将（以 CoW 方式）收到自己的副本。可以在内核源代码 ./mm/ksm.c 中找到 KSM 内核模块的完整实现。</p><p>KSM 依赖高级应用程序来提供指导，根据该指导确定合并的候选内存区域。尽管 KSM 可以只扫描系统中的匿名页面，但这将浪费 CPU 和内存资源（考虑到管理页面合并进程所需的空间）。因此，应用程序可以注册可能包含副本页面的虚拟区域。</p><p>KSM 应用程序编程接口（API）通过&nbsp;madvise&nbsp;系统调用（见清单 1）和一个新的建议参数（advice parameter）MADV_MERGEABLE（表明已定义的区域可以合并）来实现。可以通过&nbsp;MADV_UNMERGEABLE&nbsp;参数（立即从一个区域取消合并任何已合并页面）从可合并状态删除一个区域。注意，通过&nbsp;madvise&nbsp;来删除一个页面区域可能会导致一个&nbsp;EAGAIN&nbsp;错误，因为该操作可能会在取消合并过程中耗尽内存，从而可能会导致更大的麻烦（内存不足情况）。</p><br /><a name="list1"><b>清单 1. madvise 系统调用</b></a><br /><table width="100%" cellpadding="0" cellspacing="0" border="0"><tbody><tr><td><pre>				#include &lt;sys/mman.h&gt;int <strong>madvise</strong>( void *start, size_t length, int advice );</pre></td></tr></tbody></table><br /><p>一旦某个区域被定义为 “可合并”，KSM 将把该区域添加到它的工作内存列表。启用 KSM 时，它将搜索相同的页面，以写保护的 CoW 方式保留一个页面，释放另一个页面以供它用。</p><p>KSM 使用的方法与内存去耦合中使用的方法不同。在传统的去耦合中，对象被散列化，然后使用散列值进行初始相似性检查。当散列值一致时，下一步是进行一个实际对象比较（本例中是一个内存比较），以便正式确定这些对象是否一致。KSM 在它的第一个实现中采用这种方法，但后来开发了一种更直观的方法来简化它。</p><p>在当前的 KSM 中，页面通过两个 “红-黑” 树管理，其中一个 “红-黑” 树是临时的。第一个树称为<em>不稳定树</em>，用于存储还不能理解为稳定的新页面。换句话说，作为合并候选对象的页面（在一段时间内没有变化）存储在这个不稳定树中。不稳定树中的页面不是写保护的。第二个树称为<em>稳定树</em>，存储那些已经发现是稳定的且通过 KSM 合并的页面。为确定一个页面是否是稳定页面，KSM 使用了一个简单的 32 位校验和（checksum）。当一个页面被扫描时，它的校验和被计算且与该页面存储在一起。在一次后续扫描中，如果新计算的校验和不等于此前计算的校验和，则该页面正在更改，因此不是一个合格的合并候选对象。</p><p>使用 KSM 进程处理一个单一的页面时，第一步是检查是否能够在稳定树中发现该页面。搜索稳定树的过程很有趣，因为每个页面都被视为一个非常大的数字（页面的内容）。一个&nbsp;memcmp（内存比较）操作将在该页面和相关节点的页面上执行。如果memcmp&nbsp;返回 0，则页面相同，发现一个匹配值。反之，如果&nbsp;memcmp&nbsp;返回&nbsp;<strong>-1</strong>，则表示候选页面小于当前节点的页面；如果返回<strong>1</strong>，则表示候选页面大于当前节点的页面。尽管比较 4KB 的页面似乎是相当重量级的比较，但是在多数情况下，一旦发现一个差异，memcmp&nbsp;将提前结束。请参见图 3 查看这个过程的视觉呈现。</p><br /><a name="fig3"><b>图 3. 搜索树中的页面的搜索过程</b></a><br /><img height="393" src="http://hiphotos.baidu.com/jouby/pic/item/6fccda899e510fb3a4df50dbd933c895d0430cbd.jpg" width="580" />&nbsp;<br /><p>如果候选页面位于稳定树中，则该页面被合并，候选页面被释放。有关代码位于 ksm.c/stable_tree_search()（称为 ksm.c/cmp_and_merge_page()）中。反之，如果没有发现候选页面，则应转到不稳定树（参见 ksm.c/unstable_tree_search()）。</p><p>在不稳定树中搜索时，第一步是重新计算页面上的校验和。如果该值与原始校验和不同，则本次扫描的后续搜索将抛弃这个页面（因为它更改了，不值得跟踪）。如果校验和没有更改，则会搜索不稳定树以寻找候选页面。不稳定树的处理与稳定树的处理有一些不同。第一，如果搜索代码没有在不稳定树中发现页面，则在不稳定树中为该页面添加一个新节点。但是如果在不稳定树中发现了页面，则合并该页面，然后将该节点迁移到稳定树中。</p><p>当扫描完成（通过 ksm.c/ksm_do_scan()&nbsp;执行）时，稳定树被保存下来，但不稳定树则被删除并在下一次扫描时重新构建。这个过程大大简化了工作，因为不稳定树的组织方式可以根据页面的变化而变化（还记得不稳定树中的页面不是写保护的吗？）。由于稳定树中的所有页面都是写保护的，因此当一个页面试图被写入时将生成一个页面故障，从而允许 CoW 进程为写入程序取消页面合并（请参见 ksm.c/break_cow()）。稳定树中的孤立页面将在稍后被删除（除非该页面的两个或更多用户存在，表明该页面还在被共享）。</p><p>如前所述，KSM 使用 “红-黑” 树来管理页面，以支持快速查询。实际上，Linux 包含了一些 “红-黑” 树作为一个可重用的数据结构，可以广泛使用它们。“红-黑” 树还可以被 Completely Fair Scheduler (CFS) 使用，以便按时间顺序存储任务。您可以在 ./lib/rbtree.c 中找到 “红-黑” 树的这个实现。</p><p><a href="http://www.ibm.com/developerworks/cn/linux/l-kernel-shared-memory/index.html?ca=drs-#ibm-pcon">回页首</a></p><p><a name="configuring"><span>KSM 配置和监控</span></a></p><p>KSM 的管理和监控通过 sysfs（位于根 /sys/kernel/mm/ksm）执行。在这个 sysfs 子目录中，您将发现一些文件，有些用于控制，其他的用于监控。</p><p>第一个文件&nbsp;<em>run</em>&nbsp;用于启用和禁用 KSM 的页面合并。默认情况下，KSM 被禁用（0），但可以通过将一个&nbsp;1&nbsp;写入这个文件来启用 KSM 守护进程（例如，echo 1 &gt; sys/kernel/mm/ksm/run）。通过写入一个&nbsp;0，可以从运行状态禁用这个守护进程（但是保留合并页面的当前集合）。另外，通过写入一个&nbsp;2，可以从运行状态（1）停止 KSM 并请求取消合并所有合并页面。</p><p>KSM 运行时，可以通过 3 个参数（sysfs 中的文件）来控制它。sleep_millisecs 文件定义执行另一次页面扫描前&nbsp;ksmd&nbsp;休眠的毫秒数。max_kernel_pages 文件定义&nbsp;ksmd&nbsp;可以使用的最大页面数（默认值是可用内存的 25%，但可以写入一个&nbsp;0&nbsp;来指定为无限）。最后，pages_to_scan 文件定义一次给定扫描中可以扫描的页面数。任何用户都可以查看这些文件，但是用户必须拥有根权限才能修改它们。</p><p>还有 5 个通过 sysfs 导出的可监控文件（均为只读），它们表明&nbsp;ksmd&nbsp;的运行情况和效果。full_scans 文件表明已经执行的全区域扫描的次数。剩下的 4 个文件表明 KSM 的页面级统计数据：</p><ul><li>pages_shared：KSM 正在使用的不可交换的内核页面的数量。</li><li>pages_sharing：一个内存存储指示。</li><li>pages_unshared：为合并而重复检查的惟一页面的数量。</li><li>pages_volatile：频繁改变的页面的数量。</li></ul><p>KSM 作者定义：较高的 pages_sharing/pages_shared 比率表明高效的页面共享（反之则表明资源浪费）。</p><p><a href="http://www.ibm.com/developerworks/cn/linux/l-kernel-shared-memory/index.html?ca=drs-#ibm-pcon">回页首</a></p><p><a name="N101BB"><span>结束语</span></a></p><p>Linux 并不是使用页面共享来改进内存效率的惟一系统管理程序，但是它的独特之处在于将其实现为一个操作系统特性。VMware 的 ESX 服务器系统管理程序将这个特性命名为&nbsp;<em>Transparent Page Sharing</em>&nbsp;(TPS)，而 XEN 将其称为&nbsp;<em>Memory CoW</em>。不管采用哪种名称和实现，这个特性都提供了更好的内存利用率，从而允许操作系统（KVM 的系统管理程序）过量使用内存，支持更多的应用程序或 VM。 您可以在最新的 2.6.32 Linux 内核中发现 KSM — 以及其他很多有趣的特性。</p><br /><p><a name="resources"><span>参考资料</span></a></p><p><b>学习</b></p><ul><li>Red Hat 的 KSM 作者撰写了一篇很好的关于 KSM 的论文，标题为 “<a href="http://www.kernel.org/doc/ols/2009/ols2009-pages-19-28.pdf" style="color: #4c6e94;">Increasing memory density by using KSM</a>”（PDF），这篇论文介绍了 KSM，并深入研究了它的实现的一些细节。&nbsp;<br /><br /></li><li>作为一种节约能源并降低成本的方法，虚拟化正在迅猛发展，虚拟化还是云计算架构的一个关键元素。参阅 “<a href="http://www.ibm.com/developerworks/cn/aix/library/au-virtualization.html" style="color: #4c6e94;">通过虚拟化促进绿色计算：虚拟化是绿色 IT 的基础</a>”（developerWorks，2009 年 8 月），了解虚拟化及其在绿色 IT 中的角色。&nbsp;<br /><br /></li><li>本文展示了将 Linux 作为一个系统管理程序使用的优势。参阅 “<a href="http://www.ibm.com/developerworks/cn/linux/l-hypervisor/" style="color: #4c6e94;">剖析 Linux hypervisor</a>”（developerWorks，2009 年 5 月）、“<a href="http://www.ibm.com/developerworks/cn/linux/l-linux-kvm/" style="color: #4c6e94;">探索 Linux 内核虚拟机&nbsp;</a>”（developerWorks，2007 年 4 月）和 “<a href="http://www.ibm.com/developerworks/cn/linux/l-linuxvirt/" style="color: #4c6e94;">虚拟 Linux</a>”（developerWorks，2006 年 12 月），了解这个主题和其他主题。最后，参阅 “<a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/" style="color: #4c6e94;">Linux 2.6 Completely Fair Scheduler 内幕</a>”（developerWorks，2009 年 12 月），了解使用 “红-黑” 树的其他内核子系统。&nbsp;<br /><br /></li><li>您可以从&nbsp;<a href="http://kernelnewbies.org/Linux_2_6_32#head-d3f32e41df508090810388a57efce73f52660ccb" style="color: #4c6e94;">2.6.32	内核发布说明</a>&nbsp;了解关于内存去耦合的更多信息。这些说明提供了关于 KSM 的有用材料（包括一个到内核文档的链接）以及 2.6.32 版的各种其他变化。在 KSM 部分，您将发现一个有趣的参考，介绍如何在一个 RAM 为 16 GB 的服务器上运行 52 个 Windows&#174; XP VMs（其中每个 VM 被分配 1GB RAM 并与 KSM 共享）。&nbsp;<br /><br /></li><li>参阅&nbsp;<em>IT 分析</em>&nbsp;文章 “<a href="http://www.it-analysis.com/business/compliance/content.php?cid=9647" style="color: #4c6e94;">De-dupe for big storage savings?</a>”，了解关于内存系统的去耦合及其方法的更多信息。&nbsp;<br /><br /></li><li>Wikipedia 提供了一个不错的&nbsp;<a href="http://en.wikipedia.org/wiki/Data_deduplication" style="color: #4c6e94;">去耦合简介</a>，包括各种实现策略（比如源和目标）。&nbsp;<br /><br /></li><li>尽管 KSM 是在虚拟服务器中减小内存足迹的自动机制，但是应用程序开发人员有时也拥有类似的手动操作能力。Linux 动态（或共享）库允许二进制文件使用公共库对象，而不是由应用程序静态编译的库对象。参阅 “<a href="http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/" style="color: #4c6e94;">Linux 动态库剖析</a>”（developerWorks，2008 年 8 月），了解关于共享库的更多信息。&nbsp;<br /><br /></li><li><a href="http://en.wikipedia.org/wiki/Red-black_tree" style="color: #4c6e94;">“红-黑” 树</a>（或对称二进制 B 树）是 Rudolf Bayer 发明的一个自平衡二进制树。它是一个有用的树表示，对于插入、搜索和删除等操作，它拥有很好的 “最坏情况时间（worst-case time）” 。“红-黑” 树广泛应用于各种应用程序，其中包括关联数组的构造。&nbsp;<br /><br /></li><li>M. Tim Jones 是一位多产作者，更多内容请参考&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/theme/mtj/" style="color: #4c6e94;">M. Tim Jones 专栏</a>。&nbsp;<br /><br /></li><li>在&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/" style="color: #4c6e94;">developerWorks Linux 专区</a>&nbsp;寻找为 Linux 开发人员（包括&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/newto/" style="color: #4c6e94;">Linux 新手入门</a>）准备的更多参考资料，查阅我们&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/best2009/index.html" style="color: #4c6e94;">最受欢迎的文章和教程</a>。&nbsp;<br /><br /></li><li>在 developerWorks 上查阅所有&nbsp;<a href="http://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?search_by=Linux+%E6%8A%80%E5%B7%A7" style="color: #4c6e94;">Linux 技巧</a>&nbsp;和&nbsp;<a href="http://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?type_by=%E6%95%99%E7%A8%8B" style="color: #4c6e94;">Linux 教程</a>。&nbsp;<br /><br /></li><li>随时关注 developerWorks&nbsp;<a href="http://www.ibm.com/developerworks/cn/offers/techbriefings/" style="color: #4c6e94;">技术活动</a>和<a href="http://www.ibm.com/developerworks/cn/swi/" style="color: #4c6e94;">网络广播</a>。&nbsp;<br /><br /></li><li>观看&nbsp;<a href="http://www.ibm.com/developerworks/cn/offers/lp/demos/index.html" style="color: #4c6e94;">developerWorks 演示中心</a>，包括面向初学者的产品安装和设置演示，以及为经验丰富的开发人员提供的高级功能。<br /><br /></li></ul><p><b>获得产品和技术</b></p><ul><li>以最适合您的方式&nbsp;<a href="http://www.ibm.com/developerworks/cn/downloads/" style="color: #4c6e94;">IBM 产品评估试用版软件</a>：下载产品试用版，在线试用产品，在云环境下试用产品，或者在&nbsp;<a href="http://www.ibm.com/developerworks/cn/downloads/soasandbox/people/" style="color: #4c6e94;">IBM SOA Sandbox for People</a>&nbsp;中花费几个小时来学习如何高效实现 Service Oriented Architecture。<br /><br /></li></ul><p><b>讨论</b></p><ul><li>加入&nbsp;<a href="http://www.ibm.com/developerworks/community" style="color: #4c6e94;">My developerWorks 社区</a>。查看开发人员参与的博客、论坛、组和 wikis，并与其他 developerWorks 用户交流。<br /><br /></li></ul><p><a name="author"><span>关于作者</span></a></p><img src="http://hiphotos.baidu.com/jouby/pic/item/ebd853d3572c11df4433986f632762d0f603c29a.jpg" width="64" height="80" /><p><a name="author1"></a>M. Tim Jones 是一位嵌入式固件架构师，他是&nbsp;<em>Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming</em>（第二版），<em>AI Application Programming</em>（第二版），以及&nbsp;<em>BSD Sockets Programming from a Multilanguage Perspective</em>&nbsp;的作者。他的工程背景非常广泛，从同步宇宙飞船的内核开发到嵌入式系统架构设计，再到网络协议的开发。Tim 是位于科罗拉多州 Longmont 的 Emulex Corp. 的一名顾问工程师。</p></div><p></p> <a href="http://hi.baidu.com/jouby/blog/item/3a1d26013601dac8277fb5cf.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/Kvm">Kvm</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/3a1d26013601dac8277fb5cf.html#comment">查看评论</a>]]></description>
        <pubDate>2011-12-21  22:50</pubDate>
        <category><![CDATA[Kvm]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/3a1d26013601dac8277fb5cf.html</guid>
</item>

<item>
        <title><![CDATA[Linux 2.6 Completely Fair Scheduler 内幕]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/1def511f23a770ebe0fe0bca.html]]></link>
        <description><![CDATA[
		
		<div><h1>Linux 2.6 Completely Fair Scheduler 内幕</h1><p><em>自 2.6.23 起提供对 CPU 的出色访问</em></p></div><div><div><div><a rel="#authortip1" href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/#author1" title="" style="color: #4c6e94;">M. Tim Jones</a>, 自由作家</div><p></p><p><strong>简介：</strong>&nbsp;任务调度器是任何操作系统的关键部分，Linux 在此领域中不断发展和创新。在内核 2.6.23 中，推出了 Completely Fair Scheduler (CFS)。这款调度器不依赖于运行队列而是使用红黑树 (red-black tree) 实现任务管理。 本文介绍 CFS 的设计思想、其实现及其与之前的 O(1) 调度器相比的优势。</p><div></div><div></div><p></p><a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/#">标记本文！</a><div></div><p></p></div><div><p><b>发布日期：</b>&nbsp;2010 年 1 月 25 日&nbsp;<br /><b>级别：</b>&nbsp;中级&nbsp;<br /><b>其他语言版本：</b>&nbsp;<a href="http://www.ibm.com/developerworks/linux/library/l-completely-fair-scheduler/index.html" style="color: #4c6e94;">英文</a>&nbsp;<br /><strong>访问情况 ：</strong>&nbsp;5218 次浏览&nbsp;<br /><strong>评论：</strong>&nbsp;<span>0&nbsp;(<a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/#icomments">查看</a>&nbsp;|&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/#icomments" style="color: #4c6e94;">添加评论</a>)</span></p><div><img src="http://hiphotos.baidu.com/jouby/pic/item/4212e8540923dd5431938024d109b3de9d82489f.jpg" />&nbsp;平均分 (8个评分)<br /><a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/#iratings">为本文评分</a></div><br /><p></p></div></div><div><p>Linux 调度器是一个颇有压力但很有趣的课题。一方面它涉及应用 Linux 的使用模型。尽管 Linux 最初开发为桌面操作系统环境，但现在在服务器、微型嵌入式设备、主机和超级计算机中都能发现它。 无疑，这些领域的调度负载有很大差异。另一方面，它要考虑平台方面的技术进步，包括架构（多处理、对称多线程、非一致内存访问 [NUMA] 和虚拟化）。 另外，这里还要考虑交互性（用户响应能力）和整体公平性之间的平衡。从这些方面很容易看出解决 Linux 中的调度问题有多难。</p><p><a name="schedulers"><span>Linux 调度器简史</span></a></p><p>早期的 Linux 调度器使用了最低的设计，它显然不关注具有很多处理器的大型架构，更不用说是超线程了。1.2 Linux 调度器使用了环形队列用于可运行的任务管理，使用循环调度策略。 此调度器添加和删除进程效率很高（具有保护结构的锁）。简而言之，该调度器并不复杂但是简单快捷。</p><p>Linux 版本 2.2 引入了调度类的概念，允许针对实时任务、非抢占式任务、非实时任务的调度策略。 2.2 调度器还包括对称多处理 (SMP) 支持。</p><p>2.4 内核包含了相对简单的调度器，按 O(N) 的时间间隔运行（在调度事件期间它会迭代每个任务）。2.4 调度器将时间分割成 epoch，每个 epoch 中，每个任务允许执行到其时间切片用完。如果某个任务没有使用其所有的时间切片，那么 剩余时间切片的一半将被添加到新时间切片使其在下个 epoch 中可以执行更长时间。 调度器只是迭代任务，应用 goodness 函数（指标）决定下面执行哪个任务。尽管这种方法比较简单，但是却比较低效、缺乏可扩展性而且不适合用在实时系统中。它还缺少利用新硬件架构（比如多核处理器）的能力。</p><p>早期的 2.6 调度器，叫做&nbsp;<em>O(1) 调度器</em>，它旨在解决 2.4 调度器存在的问题 — 该调度器不需要迭代整个任务列表来确定要调度的下一个任务（因此得名&nbsp;<em>O(1)，</em>这意味着它效率更高，扩展性更好）。O(1) 调度器跟踪运行队列中可运行的任务（实际上，每个优先级水平有两个运行队列 — 一个用于活动任务，一个用于过期任务）， 这意味着要确定接下来执行的任务，调度器只需按优先级将下一个任务从特定活动的运行队列中取出即可）。 O(1) 调度器扩展性更好而且包含交互性，提供了大量启示用于确定任务是受 I/O 限制还是受处理器限制。 但是 O(1) 调度器在内核中很笨拙。需要大量代码计算启示，难以管理并且对于纯粹主义者而言未能体现算法的本质。</p><a name="threads"></a><h2>进程与线程</h2><p>Linux 通过将进程和线程调度视为一个，同时包含二者。进程可以看做是单个线程，但是进程可以包含共享一定资源（代码和/或数据）的多个线程。</p><p>为了解决 O(1) 调度器面临的问题以及应对其他外部压力， 需要改变某些东西。这种改变来自 Con Kolivas 的内核补丁，其中包括他的 Rotating Staircase Deadline Scheduler (RSDL)， 这包含了他在 staircase 调度器方面的早期工作。这些工作的成果就是一个设计简单的调度器，包含了公平性和界限内延迟。 Kolivas 的调度器吸引了很多人（并且很多人呼吁将其包含在目前的 2.6.21 主流内核中），很显然调度器的变革即将发生。 Ingo Molnar，O(1) 调度器的创造者，然后围绕 Kolivas 的一些思想开发了基于 CFS 的调度器。我们来剖析一下 CFS，从较高的层次上看看它是如何运行的。</p><p><a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/#ibm-pcon">回页首</a></p><p><a name="overview"><span>CFS 概述</span></a></p><p>CFS 背后的主要想法是维护为任务提供处理器时间方面的平衡（公平性）。这意味着应给进程分配相当数量的处理器。分给某个任务的时间失去平衡时（意味着一个或多个任务相对于其他任务而言未被给予相当数量的时间），应给失去平衡的任务分配时间，让其执行。</p><p>要实现平衡，CFS 在叫做<em>虚拟运行时</em>&nbsp;的地方维持提供给某个任务的时间量。任务的虚拟运行时越小， 意味着任务被允许访问服务器的时间越短 — 其对处理器的需求越高。CFS 还包含睡眠公平概念以便确保那些目前没有运行的 任务（例如，等待 I/O）在其最终需要时获得相当份额的处理器。</p><p>但是与之前的 Linux 调度器不同，它没有将任务维护在运行队列中，CFS 维护了一个以时间为顺序的红黑树（参见图 1）。&nbsp;<em>红黑树</em>&nbsp;是一个树，具有很多有趣、有用的属性。首先，它是自平衡的，这意味着树上没有路径比任何其他路径长两倍以上。 第二，树上的运行按 O(log&nbsp;<em>n</em>) 时间发生（其中&nbsp;<em>n</em>&nbsp;是树中节点的数量）。这意味着您可以快速高效地插入或删除任务。</p><br /><a name="fig1"><b>图 1. 红黑树示例</b></a><br /><img height="293" src="http://hiphotos.baidu.com/jouby/pic/item/c055a823dd54564efa85c375b3de9c82d0584f9f.jpg" width="459" />&nbsp;<br /><p>任务存储在以时间为顺序的红黑树中（由&nbsp;sched_entity&nbsp;对象表示），对处理器需求最多的任务 （最低虚拟运行时）存储在树的左侧，处理器需求最少的任务（最高虚拟运行时）存储在树的右侧。 为了公平，调度器然后选取红黑树最左端的节点调度为下一个以便保持公平性。任务通过将其运行时间添加到虚拟运行时， 说明其占用 CPU 的时间，然后如果可运行，再插回到树中。这样，树左侧的任务就被给予时间运行了，树的内容从右侧迁移到左侧以保持公平。 因此，每个可运行的任务都会追赶其他任务以维持整个可运行任务集合的执行平衡。</p><p><a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/#ibm-pcon">回页首</a></p><p><a name="internals"><span>CFS 内部原理</span></a></p><p>Linux 内的所有任务都由称为&nbsp;task_struct&nbsp;的任务结构表示。该结构（以及其他相关内容）完整地描述了任务并包括了任务的当前状态、其堆栈、进程标识、优先级（静态和动态）等等。您可以在 ./linux/include/linux/sched.h 中找到这些内容以及相关结构。 但是因为不是所有任务都是可运行的，您在&nbsp;task_struct&nbsp;中不会发现任何与 CFS 相关的字段。 相反，会创建一个名为sched_entity&nbsp;的新结构来跟踪调度信息（参见图 2）。</p><br /><a name="fig2"><b>图 2. 任务和红黑树的结构层次</b></a><br /><img height="435" src="http://hiphotos.baidu.com/jouby/pic/item/6051942ac65c103875bae98eb2119313b17e89b3.jpg" width="538" />&nbsp;<br /><p>各种结构的关系如&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/fig2" style="color: #4c6e94;">图 2</a>&nbsp;所示。树的根通过&nbsp;rb_root&nbsp;元素通过&nbsp;cfs_rq&nbsp;结构（在 ./kernel/sched.c 中）引用。红黑树的叶子不包含信息，但是内部节点代表一个或多个可运行的任务。红黑树的每个节点都由&nbsp;rb_node&nbsp;表示，它只包含子引用和父对象的颜色。&nbsp;rb_node&nbsp;包含在&nbsp;sched_entity&nbsp;结构中，该结构包含&nbsp;rb_node&nbsp;引用、负载权重以及各种统计数据。最重要的是，sched_entity&nbsp;包含&nbsp;vruntime（64 位字段），它表示任务运行的时间量，并作为红黑树的索引。 最后，task_struct&nbsp;位于顶端，它完整地描述任务并包含&nbsp;sched_entity&nbsp;结构。</p><p>就 CFS 部分而言，调度函数非常简单。 在 ./kernel/sched.c 中，您会看到通用&nbsp;schedule()&nbsp;函数，它会先抢占当前运行任务（除非它通过&nbsp;yield()&nbsp;代码先抢占自己）。注意 CFS 没有真正的时间切片概念用于抢占，因为抢占时间是可变的。 当前运行任务（现在被抢占的任务）通过对&nbsp;put_prev_task&nbsp;调用（通过调度类）返回到红黑树。 当&nbsp;schedule&nbsp;函数开始确定下一个要调度的任务时，它会调用&nbsp;pick_next_task&nbsp;函数。此函数也是通用的（在 ./kernel/sched.c 中），但它会通过调度器类调用 CFS 调度器。 CFS 中的&nbsp;pick_next_task&nbsp;函数可以在 ./kernel/sched_fair.c（称为&nbsp;pick_next_task_fair()）中找到。 此函数只是从红黑树中获取最左端的任务并返回相关&nbsp;sched_entity。通过此引用，一个简单的&nbsp;task_of()&nbsp;调用确定返回的task_struct&nbsp;引用。通用调度器最后为此任务提供处理器。</p><p><a name="priorities"><span>优先级和 CFS</span></a></p><p>CFS 不直接使用优先级而是将其用作允许任务执行的时间的衰减系数。 低优先级任务具有更高的衰减系数，而高优先级任务具有较低的衰减系数。 这意味着与高优先级任务相比，低优先级任务允许任务执行的时间消耗得更快。 这是一个绝妙的解决方案，可以避免维护按优先级调度的运行队列。</p><p><a name="group_scheduling"><span>CFS 组调度</span></a></p><p>CFS 另一个有趣的地方是<em>组调度</em>&nbsp;概念（在 2.6.24 内核中引入）。组调度是另一种为调度带来公平性的方式，尤其是在处理产生很多其他任务的任务时。 假设一个产生了很多任务的服务器要并行化进入的连接（HTTP 服务器的典型架构）。不是所有任务都会被统一公平对待， CFS 引入了组来处理这种行为。产生任务的服务器进程在整个组中（在一个层次结构中）共享它们的虚拟运行时，而单个任务维持其自己独立的虚拟运行时。这样单个任务会收到与组大致相同的调度时间。您会发现 /proc 接口用于管理进程层次结构，让您对组的形成方式有完全的控制。使用此配置，您可以跨用户、跨进程或其变体分配公平性。</p><p><a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/#ibm-pcon">回页首</a></p><p><a name="domains"><span>调度类和域</span></a></p><p>与 CFS 一起引入的是调度类概念（可以回顾&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/#fig2" style="color: #4c6e94;">图 2</a>）。每个任务都属于一个调度类，这决定了任务将如何调度。 调度类定义一个通用函数集（通过&nbsp;sched_class），函数集定义调度器的行为。例如，每个调度器提供一种方式， 添加要调度的任务、调出要运行的下一个任务、提供给调度器等等。每个调度器类都在一对一连接的列表中彼此相连，使类可以迭代（例如， 要启用给定处理器的禁用）。一般结构如图 3 所示。注意，将任务函数加入队列或脱离队列只需从特定调度结构中加入或移除任务。 函数pick_next_task&nbsp;选择要执行的下一个任务（取决于调度类的具体策略）。</p><br /><a name="fig3"><b>图 3. 调度类图形视图</b></a><br /><img height="225" src="http://hiphotos.baidu.com/jouby/pic/item/80227c54564e9258b8d4a1a29c82d158cdbf4e9f.jpg" width="572" />&nbsp;<br /><p>但是不要忘了调度类是任务结构本身的一部分（参见&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/#fig2" style="color: #4c6e94;">图 2</a>）。这一点简化了任务的操作，无论其调度类如何。例如， 以下函数用 ./kernel/sched.c 中的新任务抢占当前运行任务（其中&nbsp;curr&nbsp;定义了当前运行任务，&nbsp;rq&nbsp;代表 CFS 红黑树而&nbsp;p&nbsp;是下一个要调度的任务）：</p><table width="100%" cellpadding="0" cellspacing="0" border="0"><tbody><tr><td><pre>static inline void check_preempt( struct rq *rq, struct task_struct *p ){  rq-&gt;curr-&gt;sched_class-&gt;check_preempt_curr( rq, p );}</pre></td></tr></tbody></table><br /><p>如果此任务正使用公平调度类，则&nbsp;check_preempt_curr()&nbsp;将解析为&nbsp;check_preempt_wakeup()。 您可以在 ./kernel/sched_rt.c, ./kernel/sched_fair.c 和 ./kernel/sched_idle.c 中查看这些关系。</p><p>调度类是调度发生变化的另一个有趣的地方，但是随着调度域的增加，功能也在增加。 这些域允许您出于负载平衡和隔离的目的将一个或多个处理器按层次关系分组。 一个或多个处理器能够共享调度策略（并在其之间保持负载平衡）或实现独立的调度策略从而故意隔离任务。</p><p><a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/#ibm-pcon">回页首</a></p><p><a name="other"><span>其他调度器</span></a></p><p>继续研究调度，您将发现正在开发中的调度器将会突破性能和扩展性的界限。Con Kolivas 没有被他的 Linux 经验羁绊，他开发出了另一个 Linux 调度器，其缩写为：BFS。该调度器据说在 NUMA 系统以及移动设备上具有更好的性能， 并且被引入了 Android 操作系统的一款衍生产品中。</p><p><a href="http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/#ibm-pcon">回页首</a></p><p><a name="further"><span>展望</span></a></p><p>对于 Linux 技术而言，惟一不变的就是永恒的变化。今天，CFS 是 2.6 Linux 调度器； 明天可能就会是另一个新的调度器或一套可以被静态或动态调用的调度器。 CFS、RSDL 以及内核背后的进程中还有很多秘密，但是多亏了 Kolivas 和 Molnar 的工作，我们在 2.6 任务调度方面达到了更高层次的公平。</p><br /><p><a name="resources"><span>参考资料</span></a></p><p><b>学习</b></p><ul><li><a href="http://en.wikipedia.org/wiki/Red-black_tree" style="color: #4c6e94;">红黑树</a>&nbsp;（平衡二叉树）是自平衡二叉树，由 Rudolf Bayer 发明。它是一种非常有用的树表示法， 能以时间复杂度进行插入、搜索和删除等操作。您可以在各种应用程序中发现红黑树，包括关联数组的构建。<br /><br /></li><li>任务调度是操作系统设计的一个重要方面，从桌面操作系统调度器到实时调度器和嵌入式操作系统调度器。来自&nbsp;<a href="http://williamstallings.com/Extras/OS-Notes/h6.html" style="color: #4c6e94;">Martin C. Rinard 操作系统讲座</a>&nbsp;的文章提供了关于处理器调度话题的要点总结。<br /><br /></li><li><a href="http://en.wikipedia.org/wiki/Big_O_notation" style="color: #4c6e94;">大O符号</a>&nbsp;是用于描述函数渐近行为的数学符号。此维基百科条目包含了一些重要信息以及函数类的有用列表。<br /><br /></li><li>您可以在 “<a href="http://www.ibm.com/developerworks/cn/linux/l-scheduler/" style="color: #4c6e94;">Linux 调度器内幕</a>” （developerWorks，2006 年 6 月）中了解 Linux O(1) 调度器的更多信息。&nbsp;<br /><br /></li><li>Con Kolivas 从事新的实验性的 Linux 调度器研究有一段时间了。您可以了解关于其调度器的更多信息， 包括&nbsp;<a href="http://kerneltrap.org/node/2744" style="color: #4c6e94;">Staircase Process Scheduler</a>&nbsp;和&nbsp;<a href="http://lwn.net/Articles/224865/" style="color: #4c6e94;">Rotating Staircase Deadline Scheduler</a>，这些调度器最终证明公平共享调度是可以实现的。<br /><br /></li><li>Avinesh Kumar 对 CFS 及其他新增功能进行了介绍。了解其文章 “<a href="http://www.ibm.com/developerworks/cn/linux/l-cfs" style="color: #4c6e94;">使用完全公平调度程序（CFS）进行多任务处理</a>” （developerWorks，2008 年 1 月）。&nbsp;<br /><br /></li><li>没有戏剧生活将会怎样？要了解幕后故事，请参阅&nbsp;<a href="http://kerneltrap.org/node/8059" style="color: #4c6e94;">CFS 的开发</a>，查看此 Linux 内核邮件列表结合，其中包括 Con Kolivas（他引入了 RSDL 补丁、实现了 CFS 的核心思想）和 Ingo Molnar（调度器代码看门人，在最初拒绝该思想后，他稍后推出了自己的调度器版本）。真相总是介于两者之间，但是来自&nbsp;<a href="http://kerneltrap.org/" style="color: #4c6e94;">Kerneltrap</a>&nbsp;的这篇有趣的文章揭示了开源开发的另一面。&nbsp;<br /><br /></li><li>在&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/" style="color: #4c6e94;">developerWorks Linux 专区</a>&nbsp;寻找为 Linux 开发人员（包括&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/newto/" style="color: #4c6e94;">Linux 新手入门</a>）准备的更多参考资料，查阅我们&nbsp;<a href="http://www.ibm.com/developerworks/cn/linux/best2009/index.html" style="color: #4c6e94;">最受欢迎的文章和教程</a>。&nbsp;<br /><br /></li><li>在 developerWorks 上查阅所有&nbsp;<a href="http://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?search_by=Linux+%E6%8A%80%E5%B7%A7" style="color: #4c6e94;">Linux 技巧</a>&nbsp;和&nbsp;<a href="http://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?type_by=%E6%95%99%E7%A8%8B" style="color: #4c6e94;">Linux 教程</a>。&nbsp;<br /><br /></li><li>随时关注 developerWorks&nbsp;<a href="http://www.ibm.com/developerworks/cn/offers/techbriefings/" style="color: #4c6e94;">技术活动</a>和<a href="http://www.ibm.com/developerworks/cn/swi/" style="color: #4c6e94;">网络广播</a>。</li></ul></div><p></p> <a href="http://hi.baidu.com/jouby/blog/item/1def511f23a770ebe0fe0bca.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/Linux">Linux</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/1def511f23a770ebe0fe0bca.html#comment">查看评论</a>]]></description>
        <pubDate>2011-12-21  22:49</pubDate>
        <category><![CDATA[Linux]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/1def511f23a770ebe0fe0bca.html</guid>
</item>

<item>
        <title><![CDATA[Fedora 安装控制台]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/bafb238b1f8970cefd1f10d3.html]]></link>
        <description><![CDATA[
		
		<p>Fedora、Red Hat 或 CentOS 的安裝程式提供多個虛擬主控台(Virtual Console)，並在不同的虛擬主控台顯示不同的詳細系統資訊。當安裝出現問題時，讓您可以盡快診斷出問題所在。</p><table><tbody><tr><th>主控台</th><th>按鍵組合</th><th>內容</th></tr><tr><td>1</td><td>Ctrl-Alt-F1</td><td>安裝對話</td></tr><tr><td>2</td><td>Ctrl-Alt-F2</td><td>Shell 命令窗，讓您可以輸入 shell 命令修復安裝問題。</td></tr><tr><td>3</td><td>Ctrl-Alt-F3</td><td>安裝紀錄 (來自安裝程式 Anaconda 的訊息)</td></tr><tr><td>4</td><td>Ctrl-Alt-F4</td><td>系統相關的訊息</td></tr><tr><td>5</td><td>Ctrl-Alt-F5</td><td>其它訊息</td></tr><tr><td>6</td><td>Ctrl-Alt-F6</td><td>X Window 圖形顯示</td></tr></tbody></table><p></p> <a href="http://hi.baidu.com/jouby/blog/item/bafb238b1f8970cefd1f10d3.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/bafb238b1f8970cefd1f10d3.html#comment">查看评论</a>]]></description>
        <pubDate>2011-12-05  16:48</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/bafb238b1f8970cefd1f10d3.html</guid>
</item>

<item>
        <title><![CDATA[IBM Rational 系统开发]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/a9a5e7237df4384e9822ed46.html]]></link>
        <description><![CDATA[
		
		<div><p>在汽车、航空和国防、电信网络或医疗设备等行业中，许多开发和制造产品或整合系统的公司都深处创新的压力之中。 </p><p> 每个行业都必须应对不断增长的复杂度，提高质量，降低成本，提高生产力，并在快速变化、日渐全球化的市场中遵守规范。</p><p>  IBM&#174; Rational&#174; 系统开发平台提供了整合的系统工程和嵌入式软件开发解决方案，帮助制造商和集成商构建满足其业务目标和客户需求的系统和产品。</p><p>  Rational 系统开发平台包括： </p><ul><li><a href="http://www-01.ibm.com/software/cn/rational/offerings/ppm/">产品、项目和组合管理解决方案</a>，通过最佳实践指南和措施提高项目的成功率 </li><li><a href="http://www.ibm.com/software/products/cn/zh/ratifocapoin">IBM Rational Focal Point&#8482;</a>产品和组合管理软件，可以在从产品概念到交付的整个生命周期内帮助您改进产品决策。 </li><li><a href="http://www-01.ibm.com/software/cn/rational/offerings/eam/">企业架构管理解决方案</a>，帮助连接组织的业务和技术需求。 </li><li><a href="http://www-01.ibm.com/software/cn/rational/sa/index.html">IBM Rational System Architect&#174;</a>是一个支持您构建业务和企业架构的解决方案系列。 </li><li><a href="http://www-01.ibm.com/software/cn/rational/offerings/irm/">需求定义和管理解决方案</a>，提供最佳实践来帮助您节省时间和资金。 </li><li><a href="http://www-01.ibm.com/software/cn/rational/doors/productline/">IBM Rational DOORS&#174;</a>是一系列针对高级系统和软件开发的需求管理解决方案。 </li><li><a href="http://www-01.ibm.com/software/cn/rational/offerings/crm/">整合的变更和发布管理解决方案</a>，能够改善生命周期可跟踪性和软件交付。 </li><li><a href="http://www-01.ibm.com/software/cn/rational/offerings/architecture/">建模解决方案</a>，允许为 SOA、系统和应用建模、设计和构建弹性的架构。</li><li><a href="http://www-01.ibm.com/software/cn/rational/products/rhapsody/">IBM Rational Rhapsody&#174;</a>是一系列针对实时或嵌入式系统的基于  UML 和  SysML 的模型驱动开发解决方案。 </li><li><a href="http://www-01.ibm.com/software/cn/rational/offerings/quality/">质量管理解决方案</a>，确保开发和生产中的软件功能、可靠性和性能。<a href="http://www-01.ibm.com/software/cn/rational/rqm/">IBM Rational Quality Manager</a>是一个生命周期质量管理解决方案。 </li><li><a href="http://www.ibm.com/software/products/cn/zh/ratiteamwebt">IBM Rational Team Webtop&#8482;</a>提供了一个单一视图，并将不同来源的数据进行了混搭(mashup)，帮助您改进和简化生命周期管理流程。&nbsp;</li></ul></div><p></p> <a href="http://hi.baidu.com/jouby/blog/item/a9a5e7237df4384e9822ed46.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/Ibm">Ibm</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/a9a5e7237df4384e9822ed46.html#comment">查看评论</a>]]></description>
        <pubDate>2011-10-30  13:53</pubDate>
        <category><![CDATA[Ibm]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/a9a5e7237df4384e9822ed46.html</guid>
</item>

<item>
        <title><![CDATA[DB2 pureScale]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/85f276ca002bad5af21fe79b.html]]></link>
        <description><![CDATA[
		
		<div><h1>DB2 pureScale</h1><p><em>无限能力、应用程序透明。</em></p></div><div><div><div><img src="http://hiphotos.baidu.com/jouby/pic/item/0c3444dd7c2f5e9b76c638d1.jpg" width="530" height="150" /></div><div><div><p>DB2
 pureScale 通过提供无限能力、持续可用性和应用程序透明来降低企业成长的风险和成本。在IBM Power Systems 上部署的DB2
 pureScale 结合 PowerHA pureScale 技术交付的数据库高可扩展性和高可用性是之前在Unix 或 x86 
系统上所无法企及的。它是来自DB2 for z/OS 和 System z,在系统整体可用性、可扩展性、安全性和可靠性方面当之无愧的领导者。</p></div></div><div><h2>无限能力</h2><div><p>DB2 pureScale 为各种事务处理工作负载提供了几乎无限的产能。系统扩展非常简单，只需要与一个新节点连接，并发出两个简单的命令即可。DB2 pureScale 的基于集群、磁盘共享的架构通过有效利用系统资源，降低了成本。</p></div></div><div><h2>应用程序透明</h2><div><p>使
用DB2 
pureScale，您无需改变您的应用程序代码，就可以有效地运行在多个节点上。久经验证的、可扩展的架构能够使您随需扩展您的应用程序，以满足变化的
业务需求。您只需做少量改变或无需做任何改变，就能够运行为其他数据库软件编写的应用程序；DB2 为常用的语法规则和PL/SQL 
语言提供了全面的支持，使从 Oracle数据库迁移到 DB2 变得比以往更轻松了。</p></div></div><div><h2>持续的可用性</h2><div><p>DB2 pureScale 通过在IBM Power Systems上和冗余架构中使用高可靠的IBM PowerHA pureScale技术，提供了持续的可用性。此系统能够瞬间从节点故障中恢复，立即将工作负载重新分配给其他可用的节点。</p></div></div></div></div><p></p> <a href="http://hi.baidu.com/jouby/blog/item/85f276ca002bad5af21fe79b.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/Ibm">Ibm</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/85f276ca002bad5af21fe79b.html#comment">查看评论</a>]]></description>
        <pubDate>2011-10-30  13:21</pubDate>
        <category><![CDATA[Ibm]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/85f276ca002bad5af21fe79b.html</guid>
</item>

<item>
        <title><![CDATA[软件Tivoli  虚拟化管理  发现、管理和优化您的虚拟环境]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/d3ae050f60295cf1ab645794.html]]></link>
        <description><![CDATA[
		
		<div></div><div>&nbsp;</div><div></div><div><div><div><div><ul><li><span>虚拟化管理</span></li></ul><p><em>发现、管理和优化您的虚拟环境<br /><br /></em></p></div><div><div><div><div><div><div><div><p><a href="http://www-01.ibm.com/software/cn/tivoli/"><img src="http://hiphotos.baidu.com/jouby/pic/item/b0da17fdbd151d6209244d8e.jpg" width="235" height="31" /></a></p><h2>IBM 服务管理与虚拟化</h2><p>通过 IBM 服务管理，降低基础架构成本，提高虚拟环境效率</p><p>虚拟化正不断改变着人们和组织的计算方式，从服务器虚拟化扩展到了整个基础设施：从服务器到桌面、从存储到网络、从应用到管理软件。基础设施的所有组件现在都在 IT 经理的考虑范围之内，他们会根据其数据中心的虚拟化战略做出安排。</p><p>IBM 了解企业虚拟化及其在构建和管理动态基础架构中扮演的重要角色，但是要满足这一愿景，还需要部署新改进的管理功能，以充分利用已部署的虚拟环境的动态、可伸缩且灵活的特性。而这正是 IBM 服务管理的专长</p><h2>IBM 服务管理 –  在虚拟化环境中降低成本，并提供高质量服务</h2><p>IBM 服务管理提供了高效管理虚拟化环境所需的可视化、可控化和自动化，使您能提供高质量服务、降低风险，节省运营成本。</p><h2>可视化</h2><p>虚拟化带来的最大挑战之一就是难以管理在物理基础架构之上分层的虚拟基础架构。在虚拟化环境中，很难清楚地确定服务、应用和数据停留的位置，并且难以了解它们在一起如何工作。</p><p>IBM 服务管理可以帮助您发现并可视化虚拟环境，使您能监控整个物理和虚拟环境中的业务服务和 IT 组件的健康状况和关系。</p><h2>特色产品</h2><ul><li><a href="http://www.ibm.com/software/dre/ecatalog/detail.wss?locale=zh_CN&amp;synkey=O927756V31688Y75">IBM Tivoli Application Dependency Discovery Manager</a><br />使您能查看物理和虚拟环境中所有不同的业务服务和 IT 组件，以便了解您拥有的资源及其依赖关系。</li><li><a href="http://www.ibm.com/software/dre/ecatalog/detail.wss?locale=zh_CN&amp;synkey=U106183E34344S82">IBM Tivoli Monitoring</a><br />提供了出色的可视化，通过一个集中式的易用门户，帮助识别趋势、预见影响并采取行动。</li><li><a href="http://www.ibm.com/software/dre/ecatalog/detail.wss?locale=zh_CN&amp;synkey=B393373U18849Y84">IBM Tivoli Business Service Manager</a><br />提供服务和流程的高级实时可视化，帮助组织根据预定收入、增长和运营目标来监控和度量服务可用性和性能。</li></ul><h2>可控化</h2><p>IT 部门在控制成本、改善服务和管理风险方面面临着前所未有的压力。当虚拟 IT 资源被应用和用户共享时，管理资源访问、使用情况和成本将是一件棘手的事情。</p><p>IBM 服务管理为您提供了所需的控制力，使您能够高效地管理和保护您在业务和技术资产及流程方面的投资。</p><ul><li><a href="http://www.ibm.com/software/dre/ecatalog/detail.wss?locale=zh_CN&amp;synkey=A394496L37407A62">IBM Tivoli Change and Configuration Management Database (CCMDB)</a><br />跟踪 IT 基础架构中的 IT 资产、关系、配置和变更。通过数据、工作流和策略的整合、自动化和优化，Tivoli CCMDB 帮助根据业务优先级来调整对 IT 基础架构的现行管理，同时帮助消除管理虚拟基础架构的复杂性。</li><li><a href="http://www.ibm.com/software/dre/ecatalog/detail.wss?locale=zh_CN&amp;synkey=B567129N83986L50">IBM Tivoli Usage and Accounting Manager</a><br />根据部门、用户和其他标准来跟踪、分配和清点实际的资源使用情况，帮助改善共享计算资源的 IT 成本管理。</li><li><a href="http://www.ibm.com/software/dre/ecatalog/detail.wss?locale=zh_CN&amp;synkey=O106022W18053I48">IBM Tivoli License Compliance Manager</a><br />帮助管理在虚拟环境中运行的软件应用的成本和许可遵从性</li></ul></div></div></div></div><div><div><div><div><h2>自动化</h2><p>虚拟化与自动化的结合真正实现了灵活性、弹性和响应能力。对于类似的物理和虚拟系统而言，自动化关键操作对于确保可用性、提供高效的服务和减少手动错误、成本和复杂性而言至关重要。</p><p>手动部署硬件和软件是十分耗时和麻烦的过程。虚拟化的IT 基础架构要求您能够正确地协调物理和虚拟环境的工具。IBM 
服务管理提供了自动化功能，可以优化与部署、实现、变更和版本管理及其他运营任务相关的管理效率。Tivoli 
软件提供了自动化解决方案，旨在解决主要操作的自动化问题，包括配置、工作负载、存储和可用性。</p><h2>特色产品</h2><ul><li><a href="http://www.ibm.com/software/dre/ecatalog/detail.wss?locale=zh_CN&amp;synkey=K228451V76226E37">IBM Tivoli Provisioning Manager</a><br />为物理服务器、虚拟服务器、软件、存储设备和网络设备提供端到端的自动化功能。</li><li><a href="http://www.ibm.com/systems/storage/software/virtualization/svc/index.html">IBM System Storage SAN Volume Controller（英文）</a><br />磁盘存储虚拟化系统，旨在帮助客户降低存储成本并提高效率。</li><li><a href="http://www.ibm.com/software/dre/ecatalog/SearchCatalog_UTF8?locale=zh_CN&amp;resultjsp=catalog_searchv16.jsp&amp;text=Tivoli+Storage+Productivity+Center+">IBM Tivoli Storage Productivity Center</a><br />存储基础架构管理工具套件，帮助客户降低管理存储环境的复杂性，可以集中、简化并自动化与存储系统、存储网络、复制服务和容量管理相关的存储任务。</li><li><a href="http://www.ibm.com/software/products/cn/zh/subcategory/tivoli/SWK40">IBM Tivoli Workload Automation</a><br />动态调度工作负载，将其分配给可用性最好的虚拟资源，同时解决跨工作负载和物理资源的依赖关系问题，并使工作负载执行适应底层虚拟和物理 IT 基础架构中的事故、问题和配置变更。</li><li><a href="http://www.ibm.com/software/products/cn/zh/systemautomationapplicationmanager">IBM Tivoli System Automation</a><br />提供先进的基于策略的自动化功能，帮助减少服务中断的频率和持续时间，实现运行在异构和虚拟 IT 环境中的关键应用和中间件的高可用性。</li></ul><h2>使用 IBM Tivoli 产品，您能够从虚拟化中获益</h2><h2>降低成本</h2><ul><li>降低管理虚拟基础架构的复杂性。</li><li>改善共享 IT 资源的使用和账户管理。</li><li>优化现有资源的利用率，以降低运营开销，并避免数据中心升级或替换。</li><li>在虚拟和物理环境中迁移数据，并自动化空间管理。 </li><li>自动部署或取消部署虚拟资源，以响应需求变化。</li><li>通过中间件、应用和业务策略的标准化，降低运营成本。</li></ul><h2>改进服务</h2><ul><li>快速部署新服务和生产环境。</li><li>跨物理和虚拟资源整合管理和问题解决。</li><li>维护可以加载的图片库来改善部署质量。</li><li>支持在单一的中心位置进行应用更新。</li><li>动态调度工作负载，将其分配给可用性最好的虚拟资源。</li></ul><h2>降低风险</h2><ul><li>跟踪基础设施中的 IT 资产、关系、配置和变更。</li><li>改进虚拟共享环境中的安全性。</li><li>实现那些运行在异构和虚拟 IT 环境中的关键应用和中间件的高可用性。</li><li>http://www-01.ibm.com/software/cn/tivoli/solution/virtualization-management/</li></ul></div></div></div></div></div></div></div></div></div><div></div></div><div></div><div></div><p></p> <a href="http://hi.baidu.com/jouby/blog/item/d3ae050f60295cf1ab645794.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/d3ae050f60295cf1ab645794.html#comment">查看评论</a>]]></description>
        <pubDate>2011-10-30  13:08</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/d3ae050f60295cf1ab645794.html</guid>
</item>

<item>
        <title><![CDATA[IBM四大战略尝战果 Websphere飚高速]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/5812d2f0af0ef8b3a40f524e.html]]></link>
        <description><![CDATA[
		
		<div><div><div><div><div><p>IBM前三个季度的四大重点业务中，云计算业务三个季度收入已经在2010全年基础上实现了翻番，智慧地球收入增长超过
50%，BA（Business 
analytics）业务增长了19%，新兴市场增长了20%。而Websphere软件依然是IBM各产品线中得最大亮点，该季增长52%，并实现连续
三季增速超过50%。<br /><span style="color: #3366ff;"></span></p><p><span style="color: #3366ff;"></span>10
月17日，IBM发布了2011年三季度财报，该季度IBM收入262亿美元，比去年同比增长8%；净利润38.4亿美元，同比增长7%。公司整体毛利率
为46.8%，同比去年增加了1.5个百分点。尽管IBM三季度收入略低于分析师此前预计的263亿美元，股票也下跌4%左右，但IBM前三个季度在云计
算、智慧地球、商业分析（Business 
analytics）和新兴市场等四大战略重点上都取得了不错的战果。财报显示：IBM云计算业务前三个季度收入已经在2010全年基础上实现了翻番，智
慧地球收入增长超过50%，商业分析业务（BA）增长了19%，新兴市场增长了20%。</p><p>就IBM软件、硬件和服务三大集团旗下的各重点产品和业务而言，三季度最大的亮点是软件集团的Websphere产品线，该季度增长52%，已实现
连续三个季度增长超过50%。而曾经连续三个季度表现惊艳的z系统大机产品在本季度进入调整期，收入同比去年3季度下滑了5%（z系统收入前三个季度增长
69%、41%和61%）。此外，IBM三季度增速同比超过10%以上的产品线还有p系统（15%）、RSS（14%）、IM（12%）、
ITS（11%）、GBS外包（11%）。</p><p><strong>软件：Websphere领跑所有产品线</strong></p><p>按业务群划分，IBM软件部门2011年3季度收入58亿美元，增长13%，毛利率88.1%，其中IBM五大品牌中间件Websphere、
IM、Tivoli、Lotus和Rational总收入超过36亿美元，平均增长了17%，而最抢眼的Websphere增长了52%，在IBM所有产
品线中领跑。</p><p style="text-align: center;"><img src="http://hiphotos.baidu.com/jouby/pic/item/8625e3a7c4aa64e1d043586b.jpg" /></p><p><strong>硬件：z系统回调 p系统稳健 </strong></p><p>IBM系统和科技部（硬件部门）3季度收入45亿美元，增长4%，其中服务器和存储等系统业务增长了6%，低于上季度20%的增速。不过，IBM硬件部门3季度的毛利率比去年增长了3.4个百分点，达到了39.8%。</p><p>IBM服务器收入28.8亿美元，占整个硬件部门的64%。曾经连续三个季度表现惊艳的z系统大机产品在本季度进入调整期（2011年2季度z系统收入增长61%领跑IBM所有产品线），收入同比去年3季度下滑了5%。p系统表现不错，增长15%，x系统增长1%。</p><p>3季度IBM存储增长8%，收入约为8.5亿美元，占整个硬件部门的19%。占硬件部门的收入3%的RSS（零售解决方案）业务增速达14%。</p><p><img src="http://hiphotos.baidu.com/jouby/pic/item/cba67833d60c7d37ac4b5f6b.jpg" /></p><p><strong>服务：外包和ITS增速较快</strong></p><p>IBM全球服务部3季度整体收入151亿美元，收入环比持平，同比增长，毛利率略有增长。其中GTS部门收入103亿美元，同比增长9%，毛利率
35.7%。GTS的三大业务中，外包收入超过60亿美元，增长9%；ITS收入24亿美元，增长11%；运维18亿美元，运维业务增长5%；GBS部门
收入53亿美元，同比增长6%，毛利率29.4%。GBS的两大业务中，外包增长11%，咨询和系统集成增长4%。</p><p style="text-align: center;"><img src="http://hiphotos.baidu.com/jouby/pic/item/f41f731b067db7a1ad6e759b.jpg" /></p><p style="text-align: left;"><br /><strong>区域：新兴市场增速超公司整体两倍</strong></p><p style="text-align: left;"><br />按照地域
划分，IBM三季度来自美洲地区的收入为109亿美元，增长7%；来自欧洲、中东和非洲地区的营收为80亿美元，同比增长9%；来自亚太地区的收入为65
亿美元，同比增长10%。IBM第三季度来自于金砖四国(巴西、俄罗斯、印度和中国)的营收同比增长17%。新兴市场整体增长19%，是成熟市场增速的3
倍多，及IBM公司整体增速的两倍多。</p><p style="text-align: center;"><img src="http://hiphotos.baidu.com/jouby/pic/item/5b1aaff4125c011addc4749b.jpg" /></p><p style="text-align: left;"><strong>行业：金融市场维持老大格局</strong></p><p style="text-align: left;">按照行业划
分，IBM在金融、政府和公用事业、制造、流通、电信和工商企业等六大行业中，三季度金融行业收入达77亿美元，占IBM整体业务的29.4%；工商企业
收入54亿美元，占20.6%，政府和公用事业行业收入40亿美元，占15.3%。其余三个行业收入都为26亿美元。IBM金融行业不仅在公司内部的行业
份额中比例最大，在所有IT公司的金融行业业务中也处于领跑地位。</p><p style="text-align: center;"><strong><img src="http://hiphotos.baidu.com/jouby/pic/item/419470438dd27d6772f05d6b.jpg" /></strong></p></div></div></div></div></div> <a href="http://hi.baidu.com/jouby/blog/item/5812d2f0af0ef8b3a40f524e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/Cloud">Cloud</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/5812d2f0af0ef8b3a40f524e.html#comment">查看评论</a>]]></description>
        <pubDate>2011-10-29  18:03</pubDate>
        <category><![CDATA[Cloud]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/5812d2f0af0ef8b3a40f524e.html</guid>
</item>

<item>
        <title><![CDATA[Standard runlevels]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/8b09daf48ba4e1c5f2d385f0.html]]></link>
        <description><![CDATA[
		
		<p><table width="100%" border="1" cellpadding="4" cellspacing="0"><thead><tr><th><br /></th><th><br /></th><th><br /></th></tr></thead><tbody><tr><td>s (or S)</td><td>Single-user maintenance mode</td><td>Emergency system recovery work</td></tr><tr><td>0<br /></td><td>Halt</td><td>Stops the system</td></tr><tr><td>1<br /></td><td>Single-user mode</td><td>System administration</td></tr><tr><td>2<br /></td><td>(Multiuser without networking)</td><td>(Not normally used)</td></tr><tr><td>3<br /></td><td>Multiuser, character-mode</td><td>Normal system operation without graphical login; useful 
for servers</td></tr><tr><td>4<br /></td><td>(Not defined)</td><td>(Not normally used)</td></tr><tr><td>5<br /></td><td>Graphical</td><td>Normal system operation with graphical login.</td></tr><tr><td>6<br /></td><td>Reboot</td><td>Restarts the system</td></tr><tr><td>7, 8, 9,<br />a, b, c<br /></td><td>(Not defined)</td><td>Available for custom 
purposes</td></tr></tbody></table></p><br /> <a href="http://hi.baidu.com/jouby/blog/item/8b09daf48ba4e1c5f2d385f0.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/Linux">Linux</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/8b09daf48ba4e1c5f2d385f0.html#comment">查看评论</a>]]></description>
        <pubDate>2011-10-24  22:17</pubDate>
        <category><![CDATA[Linux]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/8b09daf48ba4e1c5f2d385f0.html</guid>
</item>

<item>
        <title><![CDATA[git命令参考（3）]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/c3ec8f73e03235078601b060.html]]></link>
        <description><![CDATA[
		
		<span style="font-size: 24px; font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">A.3&nbsp;<span style="font-family: 方正准圆简体; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">分支</span></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">$ T* r2 g5 u7 \" x3 H8 _</span><br><span style="font-family: Arial; font-size: 16px; color: rgb(153, 153, 153); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">Branches</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">&nbsp;&nbsp;M3 G' X/ h0 @/ s8 R</span><br><span style="font-family: Arial; font-size: 16px; color: rgb(153, 153, 153); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; "></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">* `1 E! D: n7 B- z# I4 }1 r</span><br><span style="font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; "><span style="font-family: 宋体; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">分支是</span><span>Git</span><span style="font-family: 宋体; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">的强项之一。本节介绍关于分支的各个命令。详细内容见第</span><span>5</span><span style="font-family: 宋体; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">章“理解和使用分支”（第</span><span>55</span><span style="font-family: 宋体; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">页）。</span></span><br><span style="font-family: 宋体; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; "></span><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">列出本地分支</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">&amp; h# _" y7 {5 ?7 l</span><br><span>prompt&gt;&nbsp;<strong>git branch</strong></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">1 o7 o6 R&amp; U8 b$ o% a5 Z8 f8 o</span><br><strong><span></span></strong><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">列出远程分支</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">' I3 R&nbsp;&nbsp;L( R* e3 h</span><br><span>prompt&gt;&nbsp;<strong>git branch -r</strong></span><br><strong><span></span></strong><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">$ {&nbsp;&nbsp;q( k, Z3 }. |&nbsp;&nbsp;s</span><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">列出所有分支</span><br><span>prompt&gt;&nbsp;<strong>git branch -a</strong></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">: {4 z3 k9 P. D</span><br><strong><span></span></strong><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">基于当前分支（的末梢）创建新分支</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">% D$ a9 z; U/ S7 Q2 W</span><br><span>prompt&gt;&nbsp;<strong>git branch &lt;new branch&gt;</strong></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); "># c: G# _" J5 c: i, f&amp; g</span><br><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">8 y6 q% \) C0 I</span><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">检出另一条分支</span><br><span>prompt&gt;&nbsp;<strong>git checkout &lt;some branch&gt;</strong></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); "># _2 U+ k: a' `0 b2 E0 @" ~. r' `</span><br><strong><span></span></strong><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">! J: x: v' z. f7 u&amp; u4 s&amp; F</span><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">基于当前分支创建新分支，同时检出该分支</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">6 v! S$ u7 d8 Z) F</span><br><span>prompt&gt;&nbsp;<strong>git checkout -b &lt;new branch&gt;</strong></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">6 y# }7 @/ D" g; D2 |* `2 q; x</span><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; "></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">7 I; u% R# m3 |9 v7 T/ t5 w$ C</span><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">基于另一个起点，创建新分支</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">/ [, K5 D1 B" u3 Y</span><br><span style="font-family: 宋体; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">你可以从版本库中的任何一个版本开始创建新分支。这个起始点可以用一条已有的分支名称、一个提交名称，或者一个标签名称来表达。</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">; F, O7 X. V) H</span><br><span>prompt&gt;&nbsp;<strong>git branch &lt;new branch&gt; &lt;start point&gt;</strong></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">! P7 `# l3 m$ H; i' G4 b</span><br><strong><span></span></strong><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">创建同名新分支，覆盖已有分支</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">&amp; A7 i3 \# E7 D/ M3 |</span><br><span>prompt&gt;&nbsp;<strong>git branch -f &lt;some existing branch&gt; [&lt;start point&gt;]</strong></span><br><strong><span></span></strong><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">移动或重命名分支</span><br><span style="font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; "><span style="font-family: 黑体; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">只有当</span><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">&lt;<i>new branch</i>&gt;</span><span style="font-family: 黑体; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">不存在时</span></span><br><span>prompt&gt;&nbsp;<strong>git checkout -m &lt;existing branch name&gt; &lt;new branch name&gt;</strong></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">% o8 U) ^, a7 O/ O( M% v7 E</span><br><strong><span></span></strong><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">9 e9 h* @4 [. N7 ]4 P</span><br><span style="font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; "><span style="font-family: 黑体; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">如果</span><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">&lt;<i>new branch</i>&gt;</span><span style="font-family: 黑体; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">已存在，就覆盖它</span></span><br><span>prompt&gt;&nbsp;<strong>git checkout -M &lt;existing branch name&gt; &lt;new branch name&gt;</strong></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">) E, h* w- u% _5 ?1 `</span><br><strong><span></span></strong><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">把另一条分支合并到当前分支</span><br><span>prompt&gt;&nbsp;<strong>git merge &lt;some branch&gt;</strong></span><br><strong><span></span></strong><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">3 C" R* P% O' J4 m+ @. u</span><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">合并，但不提交</span><br><span>prompt&gt;&nbsp;<strong>git merge --no-commit &lt;some branch&gt;</strong></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">9 ~- q+ `7 @% g. R" v' |' {, b</span><br><strong><span></span></strong><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">. u/ ]2 ~, O/ _, T&amp; H</span><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">拣选合并，并且提交</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">: v9 E. _&nbsp;&nbsp;f) \/ d6 h. \&nbsp;&nbsp;R</span><br><span>prompt&gt;&nbsp;<strong>git cherry-pick &lt;commit name&gt;</strong></span><br><strong><span></span></strong><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">5 S5 X/ U0 H&amp; j</span><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">拣选合并，但不提交</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">4 l3 H- v8 y) J! w2 _</span><br><span>prompt&gt;&nbsp;<strong>git cherry-pick -n &lt;commit name&gt;</strong></span><br><strong><span></span></strong><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">把一条分支上的内容压合到另一条分支（上的一个提交）</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">! l3 X6 z; I' {$ B/ U2 J</span><br><span>prompt&gt;&nbsp;<strong>git merge --squash &lt;some branch&gt;</strong></span><br><strong><span></span></strong><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">&amp; C) Z) i0 J&amp; |</span><br><span style="font-family: Arial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">删除分支</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">, s1 |4 m8 @/ h1 q/ T1 v5 U( t</span><br><span style="font-family: 黑体; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">仅当欲删除的分支已合并到当前分支时</span><br><span>prompt&gt;&nbsp;<strong>git branch -d &lt;branch to delete&gt;</strong></span><br><br><span style="font-family: 黑体; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">不论欲删除的分支是否已合并到当前分支</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; font-size: 10px; color: rgb(255, 255, 255); ">+ Z# L) l% q# f1 B&amp; W</span><br><span>prompt&gt;&nbsp;<strong>git branch -D &lt;branch to delete&gt;</strong></span><p></p> <a href="http://hi.baidu.com/jouby/blog/item/c3ec8f73e03235078601b060.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/c3ec8f73e03235078601b060.html#comment">查看评论</a>]]></description>
        <pubDate>2011-09-21  15:19</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/c3ec8f73e03235078601b060.html</guid>
</item>

<item>
        <title><![CDATA[KVM 实现机制]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/97162b829319f38af603a651.html]]></link>
        <description><![CDATA[
		
		<a href="http://blog.csdn.net/yearn520/article/details/6461047">http://blog.csdn.net/yearn520/article/details/6461047</a><p></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/97162b829319f38af603a651.html#comment">查看评论</a>]]></description>
        <pubDate>2011-08-01  13:24</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/97162b829319f38af603a651.html</guid>
</item>

<item>
        <title><![CDATA[极限编程的12个实践]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/d56195a8ba7014abcb130ca8.html]]></link>
        <description><![CDATA[
		
		<p>极限编程的12个实践是极限编程者总结的实践经典，是体现极限编程管理的原则，对极限编程具有指导性的意义，但并非一定要完全遵守12个实践，主要看它给软件过程管理带来的价值。</p><p><strong>1、小版本</strong><br>为了高度迭代，与客户展现开发的进展，小版本发布是一个可交流的好办法，客户可以针对性提出反馈。但小版本把模块缩得很小，会影响软件的整体思路连贯，所以小版本也需要总体合理的规划。</p><p><strong>2、规划游戏</strong><br>就是客户需求，以客户故事的形式，由客户负责编写。极限编程不讲求统一的客户需求收集，也不是由开发人员整理，而是采取让客户编写，开发人员进行分析，设定优先级别，并进行技术实现。当然游戏规则可进行多次，每次迭代完毕后再行修改。客户故事是开发人员与客户沟通的焦点，也是版本设计的依据，所以其管理一定是有效的、沟通顺畅的。</p><p><strong>3、现场客户<br></strong>极限编程要求客户参与开发工作，客户需求就是客户负责编写的，所以要求客户在开发现场一起工作，并为每次迭代提供反馈。</p><p><strong>4、隐喻</strong><br>隐喻是让项目参与人员都必须对一些抽象的概念理解一致，也就是我们常说的行业术语，因为业务本身的术语开发人员不熟悉，软件开发的术语客户不理解，因此开始要先明确双方使用的隐喻，避免歧异。</p><p><strong>5、简单设计</strong><br>极限编程体现跟踪客户的需求变化，既然需求是变化的，所以对于目前的需求就不必过多地考虑扩展性的开发，讲求简单设计，实现目前需求即可。简单设计的本身也为短期迭代提供了方便，若开发者考虑“通用”因素较多，增加了软件的复杂度，开发的迭代周期就会加长。简单设计包括四方面含义：（1）通过测试。（2）避免重复代码。（3）明确表达每步编码的目的，代码可读性强。（4）尽可能少的对象类和方法。由于采用简单设计，所以极限编程没有复杂的设计文档要求。</p><p><strong>6、重构<br></strong>重构是极限编程先测试后编码的必然需求，为了整体软件可以先进行测试，对于一些软件要开发的模块先简单模拟，让编译通过，到达测试的目的。然后再对模块具体“优化”，所以重构包括模块代码的优化与具体代码的开发。重构是使用了“物理学”的一个概念，是在不影响物体外部特性的前提下，重新优化其内部的机构。这里的外部特性就是保证测试的通过。</p><p><strong>7、测试驱动开发<br></strong>极限编程是以测试开始的，为了可以展示客户需求的实现，测试程序优先设计，测试是从客户实用的角度出发，客户实际使用的软件界面着想，测试是客户需求的直接表现，是客户对软件过程的理解。测试驱动开发，也就是客户的需求驱动软件的开发。</p><p><strong>8、持续集成</strong><br>集成的理解就是提交软件的展现，由于采用测试驱动开发、小版本的方式，所以不断集成(整体测试)是与客户沟通的依据，也是让客户提出反馈意见的参照。持续集成也是完成阶段开发任务的标志。</p><p><strong>9、结对编程<br></strong>这是极限编程最有争议的实践。就是两个程序员合用一台计算机编程，一个编码，一个检查，增加专人审计是为了提供软件编码的质量。两个人的角色经常变换，保持开发者的工作热情。这种编程方式对培养新人或开发难度较大的软件都有非常好的效果。</p><p><strong>10、代码共有</strong><br>在极限编程里没有严格文档管理，代码为开发团队共有，这样有利于开发人员的流动管理，因为所有的人都熟悉所有的编码。</p><p><strong>11、编码标准</strong><br>编码是开发团队里每个人的工作，又没有详细的文档，代码的可读性是很重要的，所以规定统一的标准和习惯是必要的，有些象编码人员的隐喻。</p><p><strong>12、每周40小时工作</strong><br>极限编程认为编程是愉快的工作，不轻易加班，今天的工作今天做，小版本的设计也为了单位时间可以完成的工作安排。</p><p></p> <a href="http://hi.baidu.com/jouby/blog/item/d56195a8ba7014abcb130ca8.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/d56195a8ba7014abcb130ca8.html#comment">查看评论</a>]]></description>
        <pubDate>2011-07-24  11:57</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/d56195a8ba7014abcb130ca8.html</guid>
</item>

<item>
        <title><![CDATA[Linux 自检和 SystemTap]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/31980801c5931b1c1d9583dc.html]]></link>
        <description><![CDATA[
		
		<p><a href="http://www.ibm.com/developerworks/cn/linux/l-systemtap/#main">http://www.ibm.com/developerworks/cn/linux/l-systemtap/#main</a></p><p>&nbsp;</p><p></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/31980801c5931b1c1d9583dc.html#comment">查看评论</a>]]></description>
        <pubDate>2011-07-19  14:30</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/31980801c5931b1c1d9583dc.html</guid>
</item>

<item>
        <title><![CDATA[使用loopback设备创建initrd文件的方法]]></title>
        <link><![CDATA[http://hi.baidu.com/jouby/blog/item/837aa308c8ae5acb62d98613.html]]></link>
        <description><![CDATA[
		
		<span style="font-size: 18px; font-family: Verdana; line-height: 28px; ">使用loopback设备创建<span style="color: rgb(153, 0, 153); line-height: 28px; ">initrd</span>文件的方法</span><div style="line-height: 22px; "><span style="line-height: 22px; font-family: Verdana; ">1）<br>&nbsp;&nbsp;&nbsp;&nbsp;确认lookback设备已经配置到内核里。<br>2）<br>创建一个适当大小的空白文件系统，例如：<br># dd if=/dev/zero of=initrd bs=300k count=1<br># mke2fs -F -m0 initrd<br>3）<br>把这个文件系统挂载进来，例如：<br># mount -t ext2 -o loop initrd /mnt<br>4）<br>创建控制台设备。<br># mkdir /mnt/dev<br># mknod /mnt/dev/console c 5 1<br>5）<br>复制所有可能在initrd环境中用到的文件到/mnt目录中。（别忘了/linuxrc文<br>件）<br>6）<br>initrd执行环境的测试需要反复进行修正，为了<strong><span style="color: rgb(255, 0, 0); line-height: 22px; ">避免不断的重新启动</span></strong>，可以使<br>用下列命令：<br>#&nbsp;<span style="color: rgb(255, 0, 0); line-height: 22px; ">chroot</span>&nbsp;/mnt /linuxrc<br>当然这样启用initrd还是有限制的，就是不能干扰正常系统的执行状态（比如<br>重新配置网络接口等等。如果在一个用<span style="color: rgb(0, 0, 204); line-height: 22px; "><strong>pivot_root</strong></span>指令转换根目录的执行环境中，就可以做这些事情了）。</span></div><div style="line-height: 22px; "><span style="line-height: 22px; font-family: Verdana; ">7）<br>卸载这个文件系统：<br># umount /mnt<br>8）<br>这时，初始化RAM盘系统就在“initrd”这个文件中了。可以把它压缩小一点：<br><br># gzip -9 initrd<br>最后，必须启动内核并载入initrd系统。需要设置下列引导参数：<br><span style="color: rgb(255, 0, 0); line-height: 22px; "><strong>root</strong></span>=/dev/ram0&nbsp;<span style="color: rgb(0, 0, 255); line-height: 22px; "><strong>init</strong></span>=/linuxrc rw<br>（只有需要写入initrd文件系统时才需要附加rw参数）。<br>使用&nbsp;<span style="color: rgb(0, 153, 0); line-height: 22px; "><strong>LOADLIN</strong></span>&nbsp;当引导器时，可以执行：<br>LOADLIN C:LINUXBZIMAGE&nbsp;<span style="color: rgb(255, 0, 0); line-height: 22px; "><strong>initrd</strong></span>=C:LINUXINITRD.GZ&nbsp;<strong><span style="color: rgb(0, 0, 204); line-height: 22px; ">root</span></strong>=/dev/ram0</span></div><div style="line-height: 22px; "><span style="line-height: 22px; font-family: Verdana; "><strong><span style="color: rgb(255, 0, 0); line-height: 22px; ">init</span></strong>=/linuxrc rw<br>使用&nbsp;<strong><span style="color: rgb(0, 153, 0); line-height: 22px; ">LILO</span></strong>当引导器时，可以在 /etc/lilo.conf 中如下设置：<br>image = /boot/bzImage<br><strong><span style="color: rgb(0, 0, 255); line-height: 22px; ">initrd</span></strong>&nbsp;= /boot/initrd.gz<br>append = "<strong><span style="color: rgb(255, 0, 0); line-height: 22px; ">root</span></strong>=/dev/ram0&nbsp;<strong><span style="color: rgb(255, 0, 0); line-height: 22px; ">init</span></strong>=/linuxrc rw"<br>如果使用其他引导器，请参考相关文档。</span></div><p>&nbsp;</p><p><span style="line-height: 22px; font-family: Verdana; "><span style="color: rgb(255, 0, 0); line-height: 32px; font-size: 20px; "><strong>改变根目录设备</strong></span><br>在执行完重要任务的尾声，linuxrc一般会执行改变根目录设备的动作，并让所<br>有程序在真实的根文件系统中展开。这个过程包括下列步骤：<br>O 挂载新的根文件系统<br>O 把initrd自己转到这个根文件系统中<br>O 结束所有旧的对initrd根文件系统的存取动作<br>O 卸载initrd文件系统并释放RAM盘内存<br>挂载新的根文件系统很简单：只需要把它挂载到当前根文件系统中的一个目录<br>下即可。例如：<br># mkdir /new-root<br># mount -o ro /dev/hda1 /new-root<br>最终改变根文件系统由pivot_root()系统调用或者pivot_root工具来完成（参<br>考手册页pivot_root(8)）。pivot_root可以把当前根文件系统转移到新根的一个目<br>录中，然后把指定的目录当作新的根。在调用pivot_root之前，必须先为旧根准备<br>目录，例如：<br># cd /new-root<br># mkdir initrd<br># pivot_root . initrd</span></p><div style="line-height: 22px; ">&nbsp;</div><div style="line-height: 22px; ">为了保持不同版本之间的兼容性，需要特别注意下列事项：<br>O 在调用pivot_root之前，当前目录应该是新的根目录；<br>O 使用“<strong><span style="color: rgb(255, 0, 0); line-height: 22px; ">.</span></strong>”（当前目录）作为pivot_root的第一个参数（新根），为旧根指定目录<br>的第二个参数也要用相对路径；<br>O chroot这个命令应该在新、旧根系统当中都能使用；<br>O 然后调用chroot转移根文件系统；<br>O 在exec命令中使用象 dev/console 这样的相对路径。<br>特别提示：让initrd文件系统的目录结构与新根文件系统的结构一致，有利于<br>转换过程的顺利。<br>这时，initrd可以卸载，RAM盘也可以释放：<br># umount /initrd<br># blockdev --flushbufs /dev/ram0<br>注意：如果linuxrc或者它调用的其他程序的执行因为某种原因中断，则会启用<br>旧的change_root机制。<br></div><div style="line-height: 22px; "><span style="color: rgb(255, 0, 0); line-height: 32px; font-size: 20px; "><strong>使用场合<br></strong></span>实现initrd的主要动机是允许系统安装时模块化的内核配置。这个过程大致如下：<br>1) 系统可以用一个最小配置的内核从软盘或者其他存储媒体启动，然后载入initr<br>d系统；<br>2) /linuxrc来决定需要什么来进一步挂载真实的根文件系统（如设备类型、驱动程<br>序等）或者支持发行版媒体（如CD-ROM，网络，磁带等）；<br>3) /linuxrc载入必须的内核模块；<br>4) /linuxrc建立并安装根文件系统；<br>5) /linuxrc调用pivot_root改变根文件系统，并通过chroot一个程序（继续安装过<br>程）；<br>6) 安装引导器；<br>7) 引导器被配置成装入initrd以及相关的模块，建立起系统环境；<br>8) 现在，系统可以引导，并执行其他的安装任务。<br>Initrd的关键作用是能够多重配置一个正常操作的系统，而不需要用一个庞大<br>的内核，或者重新编译、连接内核。在制作Linux发行版（光盘等）、系统恢复盘等<br>方面有广泛的应用。<br></div><div style="line-height: 22px; ">&nbsp;</div><div style="line-height: 22px; "><span style="line-height: 22px; font-family: Verdana; "><strong><span style="line-height: 32px; font-size: 20px; background-color: rgb(255, 153, 153); "><span style="line-height: 32px; background-color: rgb(255, 255, 128); ">根到底在哪里</span><br></span></strong>在配置使用initrd之前，首先你要清楚，系统正常运行时，根文件系统挂载在<br>什么设备上（也就是说，root device是什么——root在哪里？）。<br>我们知道，使用initrd机制的话，系统启动时先以RAM Disk（/dev/ram0）作为<br>根，然后通过某种方法将根转换到“真实的根（real-root-dev）”（之所以说rea<br>l，是与前面的RAM里临时的根比较而言）。一种常见的情形是启动时用initrd，然<br>后切换到一个硬盘分区，比如/dev/hda1。<br>事实上，这个根转换不是必须的。我们完全可以就把/dev/ram0作为我们真实的<br>根设备。这时，系统启动之后所有的操作都在RAM Disk中进行。当然这样做也有一<br>个明显的缺点，即无法保存数据。比如对系统配置进行的修改（象IP地址），重新<br>启动之后就丢掉了。如果要保存数据，就要想别的办法。</span>&nbsp;</div><div style="line-height: 22px; ">&nbsp;</div><div style="line-height: 22px; "><span style="line-height: 22px; font-family: Verdana; ">指定根设备是通过内核参数“<strong><span style="line-height: 22px; background-color: rgb(128, 255, 255); ">root=”</span></strong>来完成的。以GRUB引导器的配置为例：<br><strong><span style="color: rgb(255, 0, 0); line-height: 22px; ">kernel</span></strong>&nbsp;/boot/<span style="color: rgb(255, 0, 0); line-height: 22px; ">bzImage</span>&nbsp;ro ramdisk_size=65536&nbsp;<strong><span style="color: rgb(0, 0, 255); line-height: 22px; ">root</span></strong>=/dev/ram0<br><strong><span style="color: rgb(255, 0, 0); line-height: 22px; ">initrd</span></strong>&nbsp;/boot/<span style="color: rgb(255, 0, 0); line-height: 22px; ">initrd.img<br></span>其中 ramdisk_size=65536 说明初始RAM盘的大小为64MB，root=/dev/ram0 说明根的位置。</span></div><div style="line-height: 22px; ">&nbsp;</div><div style="line-height: 22px; "><span style="line-height: 22px; font-family: Verdana; ">下面第二个例子来自一台在hda1安装了Redhat 9的机子：<br>kernel /boot/vmlinuz-2.4.20-8 ro root=/dev/hda1<br>initrd /boot/initrd-2.4.20-8.img<br>很明显，这里 root=/dev/hda1 指定了真实的根，其启动过程包含根的转换。<br>但是这里没有指定 ramdisk_size，因为initrd的缺省大小是4MB，而initrd-2.4.2<br></span><p><span style="line-height: 22px; font-family: Verdana; ">0-8.img比较小，所以用缺省值即可。</span></p><p><span style="line-height: 22px; font-family: Verdana; "><a href="http://cange0580.blog.163.com/blog/static/75636435200891111526893/">http://cange0580.blog.163.com/blog/static/75636435200891111526893/</a></span></p></div><span style="font-size: 20px; font-family: 微软雅黑, 黑体, Arial, Helvetica, sans-serif; "></span><p></p> <a href="http://hi.baidu.com/jouby/blog/item/837aa308c8ae5acb62d98613.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jouby/blog/category/Vm">Vm</a>&nbsp;<a href="http://hi.baidu.com/jouby/blog/item/837aa308c8ae5acb62d98613.html#comment">查看评论</a>]]></description>
        <pubDate>2011-07-15  22:20</pubDate>
        <category><![CDATA[Vm]]></category>
        <author><![CDATA[settee]]></author>
		<guid>http://hi.baidu.com/jouby/blog/item/837aa308c8ae5acb62d98613.html</guid>
</item>


</channel>
</rss>
