﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-forrest-文章分类-linux理论</title><link>http://www.cnitblog.com/forrest/category/3702.html</link><description>对过去我已无法选择，但令我稍感安慰的是我还拥有现在，所以。。。。。
更弥足珍贵</description><language>zh-cn</language><lastBuildDate>Fri, 30 Sep 2011 04:59:56 GMT</lastBuildDate><pubDate>Fri, 30 Sep 2011 04:59:56 GMT</pubDate><ttl>60</ttl><item><title>diff, patch和quilt</title><link>http://www.cnitblog.com/forrest/articles/50652.html</link><dc:creator>forrest</dc:creator><author>forrest</author><pubDate>Fri, 24 Oct 2008 07:10:00 GMT</pubDate><guid>http://www.cnitblog.com/forrest/articles/50652.html</guid><wfw:comment>http://www.cnitblog.com/forrest/comments/50652.html</wfw:comment><comments>http://www.cnitblog.com/forrest/articles/50652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/forrest/comments/commentRss/50652.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/forrest/services/trackbacks/50652.html</trackback:ping><description><![CDATA[<h1>个人转载，多谢fmddlmyy的文章</h1>
<h1><font size="3">Linux之旅(1): diff, patch和quilt<br></font></h1>
<p><font size="3">diff和patch是在Linux环境为源代码制作和应用补丁的标准工具。diff可以比较文件或目录的差异，并
将差异记录到补丁文件。patch可以将补丁文件应用到源代码上。quilt也是一个制作和应用补丁的工具，它适合于管理较多补丁。quilt有自己的特
有的工作方式。本文通过简单的例子介绍这三个常用的工具。</font></p>
<h2><font size="3">0 示例工程</font></h2>
<p><font size="3">我们先准备一个用来做实验的工程，它包含若干子目录和文件。可以用find命令列出文件清单：</font></p>
<code><font size="3">$ find old-prj/ -type f<br>old-prj/inc/def1.h<br>old-prj/inc/def2.h<br>old-prj/src/sys/sys1.c<br>old-prj/src/sys/sys1.h<br>old-prj/src/app/app1.c<br>old-prj/src/app/app2.c<br>old-prj/src/app/app2.h<br>old-prj/src/app/app1.h<br>old-prj/src/drv/drv1.h<br>old-prj/src/drv/drv2.c<br>old-prj/src/drv/drv1.c<br>old-prj/src/drv/drv2.h<br>old-prj/build/Makefile<br></font></code>
<p><font size="3">find命令的"-type f"参数选择普通文件，可以省略掉目录。希望自己操作的读者可以下载这个</font><a  href="http://www.fmddlmyy.cn/samples/old-prj.zip"><font size="3">示例工程</font></a><font size="3">。</font></p>
<h2><font size="3">1 diff和patch</font></h2>
<h3><font size="3">1.1 比较一个文件</font></h3>
<p><font size="3">将old-prj.tar.bz2放到我们的工作目录，然后建立一个子目录，进入后解压示例工程：</font></p>
<code><font size="3">$ mkdir test1; cd test1; tar xvjf ../old-prj.tar.bz2<br></font></code>
<p><font size="3">用分号分隔多个命令可以节省篇幅。将old-prj复制到new-prj：</font></p>
<code><font size="3">$ cp -a old-prj/ new-prj<br></font></code>
<p><font size="3">让我们编辑一个文件。src/drv/drv1.h的内容本来是：</font></p>
<code><font size="3">$&nbsp;cat&nbsp;-n&nbsp;old-prj/src/drv/drv1.h<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;#ifndef&nbsp;DRV1_H<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;#define&nbsp;DRV1_H<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;#include&nbsp;"def1.h"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;typedef&nbsp;struct&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;p1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;p2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;p3;<br>&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;}&nbsp;App1;<br>&nbsp;&nbsp;&nbsp;&nbsp;11<br>&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;void&nbsp;do_app1(void);<br>&nbsp;&nbsp;&nbsp;&nbsp;13<br>&nbsp;&nbsp;&nbsp;&nbsp;14&nbsp;&nbsp;#endif<br></font></code>
<p><font size="3">cat命令的"-n"参数可以增加行号。我们用vi将它修改成：</font></p>
<code><font size="3">$&nbsp;cat&nbsp;-n&nbsp;new-prj/src/drv/drv1.h<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;#ifndef&nbsp;DRV1_H<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;#define&nbsp;DRV1_H<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;#include&nbsp;"def1.h"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;typedef&nbsp;struct&nbsp;{<br></font><font size="3"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;b;<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;}&nbsp;App1;<br>&nbsp;&nbsp;&nbsp;&nbsp;10<br>&nbsp;&nbsp;&nbsp;&nbsp;11&nbsp;&nbsp;void&nbsp;do_app1(void);<br>&nbsp;&nbsp;&nbsp;&nbsp;12<br>&nbsp;&nbsp;&nbsp;&nbsp;13&nbsp;&nbsp;#endif<br></font></code>
<p><font size="3">现在可以用diff命令比较文件了：</font></p>
<code><font size="3">$&nbsp;diff&nbsp;-u&nbsp;old-prj/src/drv/drv1.h&nbsp;new-prj/src/drv/drv1.h<br>---&nbsp;old-prj/src/drv/drv1.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2008-03-01&nbsp;12:59:46.000000000&nbsp;+0800<br>+++&nbsp;new-prj/src/drv/drv1.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2008-03-01&nbsp;13:07:14.000000000&nbsp;+0800<br>@@&nbsp;-4,9&nbsp;+4,8&nbsp;@@<br>&nbsp;#include&nbsp;"def1.h"<br>&nbsp;<br>&nbsp;typedef&nbsp;struct&nbsp;{<br>-&nbsp;&nbsp;int&nbsp;p1;<br>-&nbsp;&nbsp;int&nbsp;p2;<br>-&nbsp;&nbsp;int&nbsp;p3;<br>+&nbsp;&nbsp;int&nbsp;a;<br>+&nbsp;&nbsp;int&nbsp;b;<br>&nbsp;}&nbsp;App1;<br>&nbsp;<br>&nbsp;void&nbsp;do_app1(void);<br></font></code>
<p><font size="3">diff程序按行比较文本文件。比较文件的diff命令格式是：</font></p>
<code><font size="3">$&nbsp;diff&nbsp;-u&nbsp;旧文件&nbsp;新文件<br></font></code>
<p><font size="3">"-u"参数指定diff命令使用 unified 格式，这是一种最常用的格式，我们来看看它的含义。</font></p>
<h3><font size="3">1.2 diff的 unified 格式</font></h3>
<p><font size="3">以"---"开头的行是旧文件信息，以"+++"开头的行是新文件信息：</font></p>
<code><font size="3">---&nbsp;old-prj/src/drv/drv1.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2008-03-01&nbsp;12:59:46.000000000&nbsp;+0800<br>+++&nbsp;new-prj/src/drv/drv1.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2008-03-01&nbsp;13:07:14.000000000&nbsp;+0800<br></font></code>
<p><font size="3">unified
格式默认在变化部分的前后各显示三行上下文。在上例中，旧文件的7、8、9行被替换成新文件的7、8行。旧文件的变化部分是7-9行，前后多显示3行，因
此显示4-12行。新文件的变化部分是7-8行，前后多显示3行，因此显示4-11行。以"@@"包围的行指示补丁的范围：</font></p>
<code><font size="3">@@&nbsp;-4,9&nbsp;+4,8&nbsp;@@<br></font></code>
<p><font size="3">'-4,9'中，'-'表示旧文件，'4,9'表示从第4行开始，显示9行，即显示4-12行。'+4,8'中，'
+'表示新文件，'4,8'表示从第4行开始，显示8行，即显示4-11行。"@@"行之后是上下文和变化的文本，其中'-'开头的行是旧文件特有的，'
+'开头的行是新文件特有的，其它行是两个文件都有的，即补丁的上下文。例如：</font></p>
<code><font size="3">&nbsp;#include&nbsp;"def1.h"<br>&nbsp;<br>&nbsp;typedef&nbsp;struct&nbsp;{<br>-&nbsp;&nbsp;int&nbsp;p1;<br>-&nbsp;&nbsp;int&nbsp;p2;<br>-&nbsp;&nbsp;int&nbsp;p3;<br>+&nbsp;&nbsp;int&nbsp;a;<br>+&nbsp;&nbsp;int&nbsp;b;<br>&nbsp;}&nbsp;App1;<br>&nbsp;<br>&nbsp;void&nbsp;do_app1(void);<br></font></code>
<h3><font size="3">1.3 制作和应用补丁</font></h3>
<p><font size="3">所谓制作补丁就是diff的输出重定向到一个文件，这个文件就是补丁文件。例如：</font></p>
<code><font size="3">$ diff -u old-prj/src/drv/drv1.h new-prj/src/drv/drv1.h&gt;../drv1.diff<br></font></code>
<p><font size="3">我们将old-prj解压到另一个目录，准备应用这个补丁：</font></p>
<code><font size="3">$ cd ..; mkdir test2; cd test2; tar xvjf ../old-prj.tar.bz2; mv old-prj myprj; cd myprj<br></font></code>
<p><font size="3">在真实场景中,test2目录通常是在用户2的电脑上。用户2可能不使用 old-prj
作为第一级目录的名字。例如：用户1的第一级目录名是 linux-2.6.23.14, 用户2的第一级目录名是linux。所以我们将
old-prj 改为 myprj 以模拟这种情况。</font></p>
<p><font size="3">我们在 myprj 目录使用patch命令应用补丁：</font></p>
<code><font size="3">$ patch -p1 &lt; ../../drv1.diff <br>patching file src/drv/drv1.h<br></font></code>
<p><font size="3">patch命令行中为什么没有出现要打补丁的文件？这是因为patch命令可以使用补丁文件中的文件信息：</font></p>
<code><font size="3">---&nbsp;old-prj/src/drv/drv1.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2008-03-01&nbsp;12:59:46.000000000&nbsp;+0800<br></font></code>
<p><font size="3">"-pn"参数（上例中n=1）中的n表示要从补丁文件的文件路径中去掉几层目录，可以理解为去掉几个'/'。例
如：p1表示去掉一层目录，"old-prj/src/drv/drv1.h"去掉一层就成为"src/drv/drv1.h"。patch命令在
myprj 目录找到"src/drv/drv1.h"后应用补丁。</font></p>
<p><font size="3">我们通常都在代码树的上一层目录制作补丁，在代码树的根目录应用补丁。因此，最常用的patch命令格式是：</font></p>
<code><font size="3">$ patch -p1 &lt; 补丁文件 <br></font></code>
<h3><font size="3">1.4 比较目录</font></h3>
<p><font size="3">我们回到test1目录，再对 new_prj 做一些改动。这次我们删除掉src/sys目录及其中的文件。再建立src/usr目录，并在该目录增加两个文件usr1.h和usr1.c。</font></p>
<code><font size="3">$ cd ../../test1; rm -rf new-prj/src/sys; mkdir new-prj/src/usr<br>$ echo -e "#ifndef USR1_H\n#define USR1_H\n#include \"def1.h\"\n#endif"&gt;new-prj/src/usr/usr1.h<br>$ echo -e "#include \"usr1.h\""&gt;new-prj/src/usr/usr1.c<br></font></code>
<p><font size="3">echo命令的"-e"参数打开对转义符的支持，bash默认是不支持转义符的。</font></p>
<p><font size="3">现在我们比较目录并制作补丁：</font></p>
<code><font size="3">$ diff -Nur old-prj/ new-prj/ &gt; ../prj.diff<br></font></code>
<p><font size="3">读者可以cat这个补丁文件的内容。根据前面的介绍，读者应该能看懂补丁文件了吧。</font></p>
<p><font size="3">比较目录的常用命令是：</font></p>
<code><font size="3">$ diff -Nur 旧目录 新目录 &gt; 补丁文件<br></font></code>
<p><font size="3">或</font></p>
<code><font size="3">$ diff -Naur 旧目录 新目录 &gt; 补丁文件<br></font></code>
<p><font size="3">"-u"参数前面已经介绍过了。"-N"参数将不存在的文件当作空文件。如果没有这个参数，补丁就不会包含孤儿文件（即另一方没有的文件）。"-r"参数表示比较子目录。"-a"参数表示将所有文件当作文本文件。</font></p>
<p><font size="3">我们再准备一个目录来应用补丁：</font></p>
<code><font size="3">$ cd ..; mkdir test3; cd test3; tar xvjf ../old-prj.tar.bz2; mv old-prj myprj; cd myprj<br></font></code>
<p><font size="3">在源代码树的根目录应用补丁：</font></p>
<code><font size="3">$ patch -p1 &lt; ../../prj.diff <br>patching file src/drv/drv1.h<br>patching file src/sys/sys1.c<br>patching file src/sys/sys1.h<br>patching file src/usr/usr1.c<br>patching file src/usr/usr1.h<br></font></code>
<p><font size="3">好了，读者可以用"diff -Nur"比较一下"test1/new_prj"和"test3/myprj"，没有输出就表示完全相同。</font></p>
<code><font size="3">$ cd ../..; diff -Nur test1/new-prj test3/myprj<br></font></code>
<h3><font size="3">1.5 很多的补丁...</font></h3>
<p><font size="3">一个大项目可能有不同开发者提供很多补丁。这些补丁可能还存在依赖关系，例如补丁B必须打在补丁A上。我们当然可以凭着程序员的&#8220;心细如发&#8221;去管理好这些补丁，不过有一个叫quilt的工具可以使我们轻松一些。当然，即使有工具的帮助，细心和认真也是必需的。</font><font size="3">&nbsp;</font></p>
<h3><font size="3">附录 </font></h3>
<p><font size="3">为了简单起见，前面只介绍了一个"diff -Nur 老目录
新目录"的用法。有时候，新目录里只放了修改过的文件。这时可以不使用-N参数以忽略孤儿文件，即"diff -ur 老目录
新目录"。diff会输出孤儿文件的提示，我们可以删除或保留这些提示，它们对patch没有影响。</font></p>
<p><font size="3">使用diff时可以用--exclude排除文件和目录，例如：</font></p>
<code><font size="3">diff -ur -exclude=.* --exclude=CVS prj_old prj_new </font></code>
<p><font size="3">上例排除了源代码树中以'.'开头的文件和所有CVS目录。其实对于CVS项目，可以直接在源代码树根目录中执行：</font></p>
<font size="3">cvs diff -u3 &gt; 补丁文件名 </font>
<p><font size="3">u3表示输出3行上下文的unified 格式。打补丁时在源代码树根目录中执行：</font></p>
<code><font size="3">patch -p0 &lt; 补丁文件名 </font></code>
<p><font size="3">"cvs diff"会自动忽略CVS项目外的文件。通过CVS的tag和补丁文件，我们可以方便地保存工作快照。</font></p>
<h2><font size="3">2 quilt</font></h2>
<p><font size="3">我们自己的项目可以用cvs或svn管理全部代码。但有时我们要使用其他开发者维护的项目。我们需要修改一些文件，
但又不能直接向版本管理工具提交代码。自己用版本管理工具重建整个项目是不合适的，因为大多数代码都是别人维护的，例如Linux内核。我们只是想管理好
自己的补丁。这时可以使用quilt。</font></p>
<h3><font size="3">2.1 基本概念</font></h3>
<p><a  href="http://savannah.nongnu.org/projects/quilt/"><font size="3">quilt</font></a><font size="3">是一个帮助我们管理补丁的程序。quilt的命令格式类似于cvs：</font></p>
<p><font size="3">quilt 子命令 [参数] </font></p>
<p><font size="3">0.46版的quilt有29个子命令。</font></p>
<p><font size="3">掌握quilt的关键是了解使用quilt的流程。使用quilt时，我们会在一个完整的源代码树里工作。只要我们
在源代码树里使用了quilt命令，quilt就会在源代码树的根目录建立两个特殊目录：patches和.pc。quilt在patches目录保存它
管理的所有补丁。quilt用.pc目录保存自己的内部工作状态，用户不需要了解这个目录。</font></p>
<p><font size="3">patches/series文件记录了quilt当前管理的补丁。补丁按照加入的顺序排列，早加入的补丁在前。quilt用堆栈的概念管理补丁的应用。</font></p>
<p><font size="3"><img  src="http://www.fmddlmyy.cn/images/quilt-stack.png" alt="" border="0" height="353" width="683"></font></p>
<p><font size="3">我们在应用补丁A前，必须先应用所有早于补丁A的补丁。所以，patches/series中的补丁总是从上向下应
用。例如：上图中，补丁1到补丁5是已经应用的补丁。我们可以将已应用的补丁想象成一个向下生长的堆栈，栈顶就是已应用的最新补丁。应用补丁就是将补丁入
栈，撤销补丁就是将补丁出栈。</font></p>
<p><font size="3">我们在源代码树中作任何修改前，必须用"quilt add"命令将要修改的文件与一个补丁联系起来。在完成修改后，用"quilt refresh"命令将修改保存到已联系的补丁。下面我们通过一篇流程攻略来认识一下quilt的命令。</font></p>
<h3><font size="3">2.2 导入补丁</font></h3>
<p><font size="3">我们把 old-prj.tar.bz2 想象成Linux内核，我们把它解压后，进入代码树的根目录：</font></p>
<p><font size="3">$ mkdir qtest; cd qtest; tar xvjf ../old-prj.tar.bz2; mv old-prj prj; cd prj </font></p>
<p><font size="3">在修改代码前，我们通常要先打上官方补丁。在quilt中，可以用import命令导入补丁：</font></p>
<p><font size="3">$ quilt import ../../prj.diff </font></p>
<p><font size="3">Importing patch ../../prj.diff (stored as prj.diff)</font></p>
<p><font size="3">执行improt命令后， prj 目录会多出一个叫 patches 的子目录：</font></p>
<p><font size="3">$ find patches/ -type f</font></p>
<p><font size="3">patches/prj.diff</font></p>
<p><font size="3">patches/series</font></p>
<p><font size="3">quilt在这个目录存放所有补丁和前面介绍的series文件。quilt的大多数命令都可以在代码树的任意子目录运行，不一定要从根目录运行。我们可以用applied命令查询当前已应用的补丁。</font></p>
<p><font size="3">$ quilt applied </font></p>
<p><font size="3">No patches applied</font></p>
<p><font size="3">目前还没有应用任何补丁。unapplied命令查询当前还没有应用的补丁，top命令查询栈顶补丁，即已应用的最新补丁：</font></p>
<p><font size="3">$ quilt unapplied</font></p>
<p><font size="3">prj.diff</font></p>
<p><font size="3">$ quilt top</font></p>
<p><font size="3">No patches applied</font> </p>
<p><font size="3">我们可以使用push命令应用补丁，例如：</font></p>
<p><font size="3">$ quilt push -a</font></p>
<p><font size="3">Applying patch prj.diff</font></p>
<p><font size="3">patching file src/drv/drv1.h</font></p>
<p><font size="3">patching file src/sys/sys1.c</font></p>
<p><font size="3">patching file src/sys/sys1.h</font></p>
<p><font size="3">patching file src/usr/usr1.c</font></p>
<p><font size="3">patching file src/usr/usr1.h</font></p>
<p><font size="3">Now at patch prj.diff </font></p>
<p><font size="3">push的"-a"参数表示应用所有补丁。在使用push命令后，prj 目录会多了一个叫.pc的隐含子目录。quilt用这个目录保存内部状态，用户不需要了解这个目录。应用补丁后，我们再使用applied、unapplied和top命令查看：</font></p>
<p><font size="3">$ quilt applied</font></p>
<p><font size="3">prj.diff</font></p>
<p><font size="3">$ quilt unapplied</font></p>
<p><font size="3">File series fully applied, ends at patch prj.diff</font></p>
<p><font size="3">$ quilt top</font></p>
<p><font size="3">prj.diff</font> </p>
<h3><font size="3">2.3 修改文件</font></h3>
<p><font size="3">我们必须将对源代码树所作的任何改动都和一个补丁联系起来。add命令将文件的当前状态与补丁联系起来。add命令的格式为：</font></p>
<p><font size="3">quilt add [-P 补丁名] 文件名
</font></p>
<p><font size="3">如果未指定补丁名，文件就与栈顶补丁联系起来。目前，我们的栈顶补丁是官方补丁。我们不想修改这个补丁，可以用new命令新建一个补丁：</font></p>
<p><font size="3">$ quilt new drv_p1.diff</font></p>
<p><font size="3">Patch drv_p1.diff is now on top</font></p>
<p><font size="3">$ quilt top</font></p>
<p><font size="3">drv_p1.diff</font></p>
<p><font size="3">$ quilt applied</font></p>
<p><font size="3">prj.diff</font></p>
<p><font size="3">drv_p1.diff</font></p>
<p><font size="3">$ quilt unapplied</font></p>
<p><font size="3">File series fully applied, ends at patch drv_p1.diff</font>
</p>
<p><font size="3">然后用add命令向栈顶补丁添加一个准备修改的文件：</font></p>
<p><font size="3">$ cd src/drv; quilt add drv2.h</font></p>
<p><font size="3">File src/drv/drv2.h added to patch drv_p1.diff</font>
</p>
<p><font size="3">add命令为指定补丁保存了指定文件的当前快照，当我们执行refresh命令时，quilt就会检查文件
的变化，将差异保存到指定补丁中。使用"quilt diff -z [-P 补丁名]
[文件名]"可以查看指定补丁指定文件的当前改动。省略-P参数表示查看当前补丁的改动，省略文件名表示查看所有改动。我们修改drv2.h后，执行
diff命令：</font></p>
<p><font size="3">$ quilt diff -z</font></p>
<p><font size="3">Index: prj/src/drv/drv2.h</font></p>
<p><font size="3">===================================================================</font></p>
<p><font size="3">--- prj.orig/src/drv/drv2.h 2008-03-02 13:37:34.000000000 +0800</font></p>
<p><font size="3">+++ prj/src/drv/drv2.h 2008-03-02 13:38:53.000000000 +0800</font></p>
<p><font size="3">@@ -1,7 +1,7 @@</font></p>
<p><font size="3">-#ifndef APP1_H</font></p>
<p><font size="3">-#define APP1_H</font></p>
<p><font size="3">+#ifndef DRV2_H</font></p>
<p><font size="3">+#define DRV2_H</font></p>
<p>&nbsp;</p>
<p><font size="3">-#include "def1.h"+#include "def2.h"
#endif</font></p>
<p>&nbsp;</p>
<p><font size="3">只要文件已经与我们希望保存改动的补丁联系过了，我们就可以多次修改文件。使用"quilt files
[补丁名]"命令可以查看与指定补丁关联的文件。使用"quilt files
-val"可以查看所有补丁联系的所有文件。"-v"参数表示更友好的显示，"-a"参数表示显示所有补丁，"-l"参数显示补丁名。例如：</font></p>
<p><font size="3">$ quilt files</font></p>
<p><font size="3">src/drv/drv2.h</font></p>
<p><font size="3">$ quilt files -val</font></p>
<p><font size="3">[prj.diff] src/drv/drv1.h</font></p>
<p><font size="3">[prj.diff] src/sys/sys1.c</font></p>
<p><font size="3">[prj.diff] src/sys/sys1.h</font></p>
<p><font size="3">[prj.diff] src/usr/usr1.c</font></p>
<p><font size="3">[prj.diff] src/usr/usr1.h</font></p>
<p><font size="3">[drv_p1.diff] src/drv/drv2.h</font>
</p>
<p><font size="3">"quilt refresh [补丁名]"刷新补丁，即将指定补丁的文件变化保存到补丁。省略文件名表示刷新栈顶补丁。我们refresh后，查看补丁文件：</font></p>
<p><font size="3">$ quilt refresh</font></p>
<p><font size="3">Refreshed patch drv_p1.diff</font></p>
<p><font size="3">$ cat ../../patches/drv_p1.diff</font></p>
<p><font size="3">Index: prj/src/drv/drv2.h</font></p>
<p><font size="3">===================================================================</font></p>
<p><font size="3">--- prj.orig/src/drv/drv2.h 2008-03-02 12:42:21.000000000 +0800</font></p>
<p><font size="3">+++ prj/src/drv/drv2.h 2008-03-02 12:46:25.000000000 +0800</font></p>
<p><font size="3">@@ -1,7 +1,7 @@</font></p>
<p><font size="3">-#ifndef APP1_H</font></p>
<p><font size="3">-#define APP1_H</font></p>
<p><font size="3">+#ifndef DRV2_H</font></p>
<p><font size="3">+#define DRV2_H</font></p>
<p>&nbsp;</p>
<p><font size="3">-#include "def1.h"</font></p>
<p><font size="3">+#include "def2.h"</font></p>
<p>&nbsp;</p>
<p><font size="3">#endif</font></p>
<p><font size="3">&nbsp;</font>
</p>
<p><font size="3">"quilt diff -z"命令不会显示已经保存的差异。"quilt diff"显示所有的差异，不管是否保存过。</font></p>
<h3><font size="3">2.4 再做几个补丁</font></h3>
<p><font size="3">在增加文件前,我们要先将准备增加的文件与补丁联系起来。我们新建一个补丁，然后新增两个文件src/applet/applet1.h和src/applet/applet1.c。</font></p>
<p><font size="3">$ cd ..; quilt new more_p1.diff</font></p>
<p><font size="3">Patch more_p1.diff is now on top</font></p>
<p><font size="3">$ quilt add applet/applet.c</font></p>
<p><font size="3">File src/applet/applet.c added to patch more_p1.diff</font></p>
<p><font size="3">$ quilt add applet/applet.1</font></p>
<p><font size="3">File src/applet/applet.1 added to patch more_p1.diff</font></p>
<p>&nbsp;</p>
<p><font size="3">看看我们增加的文件：</font></p>
<p><font size="3">$ quilt files</font></p>
<p><font size="3">src/applet/applet.1</font></p>
<p><font size="3">src/applet/applet.c</font></p>
<p>&nbsp;</p>
<p><font size="3">哎呀，文件名写错了。我们可以用"remove"命令从补丁中删除关联文件：</font></p>
<p><font size="3">$ quilt remove applet/applet.1</font></p>
<p><font size="3">rm: remove write-protected regular empty file `.pc/more_p1.diff/src/applet/applet.1'? y</font></p>
<p><font size="3">File src/applet/applet.1 removed from patch more_p1.diff</font></p>
<p><font size="3">$ quilt remove applet/applet.c</font></p>
<p><font size="3">rm: remove write-protected regular empty file `.pc/more_p1.diff/src/applet/applet.c'? y</font></p>
<p><font size="3">File src/applet/applet.c removed from patch more_p1.diff</font></p>
<p><font size="3">$ quilt files</font></p>
<p><font size="3">$ quilt add applet/applet1.h</font></p>
<p><font size="3">File src/applet/applet1.h added to patch more_p1.diff</font></p>
<p><font size="3">$ quilt add applet/applet1.c</font></p>
<p><font size="3">File src/applet/applet1.c added to patch more_p1.diff</font></p>
<p><font size="3">$ quilt files</font></p>
<p><font size="3">src/applet/applet1.c</font></p>
<p><font size="3">src/applet/applet1.h</font></p>
<p>&nbsp;</p>
<p><font size="3">好了，现在可以创建新文件：</font></p>
<p><font size="3">$ mkdir applet</font></p>
<p><font size="3">$ echo -e "#ifndef APPLET1_H\n#define APPLET1_H\n#include \"def1.h\"\n#endif"&gt;applet/applet1.h</font></p>
<p><font size="3">$ echo -e "#include \"applet1.h\""&gt;applet/applet1.c</font></p>
<p><font size="3">$ quilt refresh more_p1.diff</font></p>
<p><font size="3">Refreshed patch more_p1.diff</font></p>
<p>&nbsp;</p>
<p><font size="3">刷新补丁后，我们再修改文件drv2.h。修改前一定要先将文件与准备保存改动的补丁联系起来：</font></p>
<p><font size="3">$ quilt add drv/drv2.h</font></p>
<p><font size="3">File src/drv/drv2.h added to patch more_p1.diff</font></p>
<p><font size="3">$ vi drv/drv2.h</font></p>
<p><font size="3">$ quilt diff -z drv/drv2.h</font></p>
<p><font size="3">Index: prj/src/drv/drv2.h</font></p>
<p><font size="3">===================================================================</font></p>
<p><font size="3">--- prj.orig/src/drv/drv2.h 2008-03-02 14:19:35.000000000 +0800</font></p>
<p><font size="3">+++ prj/src/drv/drv2.h 2008-03-02 14:31:28.000000000 +0800</font></p>
<p><font size="3">@@ -1,7 +1,7 @@</font></p>
<p><font size="3">#ifndef DRV2_H</font></p>
<p><font size="3">#define DRV2_H</font></p>
<p>&nbsp;</p>
<p><font size="3">-#include "def2.h"</font></p>
<p><font size="3">+#include "def1.h"</font></p>
<p>&nbsp;</p>
<p><font size="3">#endif</font></p>
<p><font size="3">&nbsp;</font>
</p>
<p><font size="3">我们再新建一个补丁，然后删除两个文件。删除文件前也要先为文件建立关联：</font></p>
<p><font size="3">$ quilt new more_p2.diff</font></p>
<p><font size="3">Patch more_p2.diff is now on top</font></p>
<p><font size="3">$ quilt add app/*</font></p>
<p><font size="3">File src/app/app1.c added to patch more_p2.diff</font></p>
<p><font size="3">File src/app/app1.h added to patch more_p2.diff</font></p>
<p><font size="3">File src/app/app2.c added to patch more_p2.diff</font></p>
<p><font size="3">File src/app/app2.h added to patch more_p2.diff</font></p>
<p><font size="3">$ rm -rf app</font></p>
<p><font size="3">$ quilt refresh</font></p>
<p><font size="3">Refreshed patch more_p2.diff</font></p>
<p>&nbsp;</p>
<p><font size="3">我们再修改applet/applet1.h：</font></p>
<p><font size="3">$ quilt edit applet/applet1.h</font></p>
<p><font size="3">File src/applet/applet1.h added to patch more_p2.diff</font></p>
<p><font size="3">$ quilt refresh</font></p>
<p><font size="3">Refreshed patch more_p2.diff</font></p>
<p>&nbsp;</p>
<p><font size="3">"quilt edit"在调用"quilt add"后自动启动编辑器。用refresh命令刷新补丁。</font></p>
<p><font size="3">对了，前面为more_p1.diff修改drv2.h后还没有刷新呢。我们查看修改并刷新：</font></p>
<p><font size="3">$ quilt diff -z -P more_p1.diff</font></p>
<p><font size="3">Index: prj/src/drv/drv2.h</font></p>
<p><font size="3">===================================================================</font></p>
<p><font size="3">--- prj.orig/src/drv/drv2.h 2008-03-02 14:19:35.000000000 +0800</font></p>
<p><font size="3">+++ prj/src/drv/drv2.h 2008-03-02 14:31:28.000000000 +0800</font></p>
<p><font size="3">@@ -1,7 +1,7 @@</font></p>
<p><font size="3">#ifndef DRV2_H</font></p>
<p><font size="3">#define DRV2_H</font></p>
<p>&nbsp;</p>
<p><font size="3">-#include "def2.h"</font></p>
<p><font size="3">+#include "def1.h"</font></p>
<p>&nbsp;</p>
<p><font size="3">#endif</font></p>
<p>&nbsp;</p>
<p><font size="3">Warning: more recent patches modify files in patch more_p1.diff</font></p>
<p><font size="3">$ quilt refresh more_p1.diff </font></p>
<p><font size="3">More recent patches modify files in patch more_p1.diff. Enforce refresh with -f.</font></p>
<p><font size="3">$ quilt refresh -f more_p1.diff </font></p>
<p><font size="3">Refreshed patch more_p1.diff</font></p>
<p><font size="3">quilt会抱怨更新的补丁修改了补丁more_p1.diff的文件。这是在说more_p2.diff修改了applet1.h。我们知道这和我们要刷新的drv2.h没关系，所以可以用-f参数强制刷新。</font></p>
<h3><font size="3">2.5 管理补丁</font></h3>
<p><font size="3">series命令可以查看series文件中的补丁：</font></p>
<p><font size="3">$ quilt series</font></p>
<p><font size="3">prj.diff</font></p>
<p><font size="3">drv_p1.diff</font></p>
<p><font size="3">more_p1.diff</font></p>
<p><font size="3">more_p2.diff</font>
</p>
<p><font size="3">"quilt patches 文件名"显示修改了指定文件的所有补丁，例如：</font></p>
<p><font size="3">$ quilt patches drv/drv2.h</font></p>
<p><font size="3">drv_p1.diff</font></p>
<p><font size="3">more_p1.diff</font>
</p>
<p><font size="3">"quilt annotate 文件名"显示指定文件的修改情况，它会指出哪个补丁修改了哪一行。例如：</font></p>
<p><font size="3">$ quilt annotate drv/drv2.h</font></p>
<p><font size="3">1 #ifndef DRV2_H</font></p>
<p><font size="3">1 #define DRV2_H</font></p>
<p>&nbsp;</p>
<p><font size="3">2 #include "def1.h"</font></p>
<font size="3">
<p>
#endif
</p>
<p>1 drv_p1.diff</p>
<p>2 more_p1.diff</p>
</font>
<p><font size="3">我们可以使用push和pop命令应用补丁或撤销补丁，例如：</font></p>
<p><font size="3">$ quilt pop -a</font></p>
<p><font size="3">Removing patch more_p2.diff</font></p>
<p><font size="3">Restoring src/app/app1.c</font></p>
<p><font size="3">Restoring src/app/app2.c</font></p>
<p><font size="3">Restoring src/app/app2.h</font></p>
<p><font size="3">Restoring src/app/app1.h</font></p>
<p><font size="3">Restoring src/applet/applet1.h</font></p>
<p>&nbsp;</p>
<p><font size="3">Removing patch more_p1.diff</font></p>
<p><font size="3">Restoring src/drv/drv2.h</font></p>
<p><font size="3">Removing src/applet/applet1.h</font></p>
<p><font size="3">Removing src/applet/applet1.c</font></p>
<p>&nbsp;</p>
<p><font size="3">Removing patch drv_p1.diff</font></p>
<p><font size="3">Restoring src/drv/drv2.h</font></p>
<p>&nbsp;</p>
<p><font size="3">Removing patch prj.diff</font></p>
<p><font size="3">Restoring src/sys/sys1.c</font></p>
<p><font size="3">Restoring src/sys/sys1.h</font></p>
<p><font size="3">Restoring src/drv/drv1.h</font></p>
<p><font size="3">Removing src/usr/usr1.c</font></p>
<p><font size="3">Removing src/usr/usr1.h</font></p>
<p><font size="3">No patches applied</font></p>
<p><font size="3">$ quilt top</font></p>
<p><font size="3">No patches applied</font></p>
<p><font size="3">$ quilt next</font></p>
<p><font size="3">prj.diff</font></p>
<p><font size="3">$ quilt previous</font></p>
<p><font size="3">No patches applied</font>
</p>
<p><font size="3">"quilt pop -a"撤销所有补丁。top命令显示栈顶命令，即当前应用的最新的补丁。next命令显示下一个可以应用的补丁。previous显示上一条应用过的补丁。"push 补丁A"将从上到下依次应用所有早于补丁A的补丁，最后应用补丁A。例如：</font></p>
<p><font size="3">$ quilt push more_p1.diff</font></p>
<p><font size="3">Applying patch prj.diff</font></p>
<p><font size="3">patching file src/drv/drv1.h</font></p>
<p><font size="3">patching file src/sys/sys1.c</font></p>
<p><font size="3">patching file src/sys/sys1.h</font></p>
<p><font size="3">patching file src/usr/usr1.c</font></p>
<p><font size="3">patching file src/usr/usr1.h</font></p>
<p><font size="3">Applying patch drv_p1.diff</font></p>
<p><font size="3">patching file src/drv/drv2.h</font></p>
<p><font size="3">Applying patch more_p1.diff</font></p>
<p><font size="3">patching file src/applet/applet1.c</font></p>
<p><font size="3">patching file src/applet/applet1.h</font></p>
<p><font size="3">patching file src/drv/drv2.h</font></p>
<p><font size="3">Now at patch more_p1.diff</font></p>
<p><font size="3">$ quilt top</font></p>
<p><font size="3">more_p1.diff</font></p>
<p><font size="3">$ quilt next</font></p>
<p><font size="3">more_p2.diff</font></p>
<p><font size="3">$ quilt previous</font></p>
<p><font size="3">drv_p1.diff</font></p>
<p><font size="3">"quilt push -a"应用所有补丁：</font></p>
<p><font size="3">$ quilt push -a</font></p>
<p><font size="3">Applying patch more_p2.diff</font></p>
<p><font size="3">patching file src/app/app1.c</font></p>
<p><font size="3">patching file src/app/app1.h</font></p>
<p><font size="3">patching file src/app/app2.c</font></p>
<p><font size="3">patching file src/app/app2.h</font></p>
<p><font size="3">patching file src/applet/applet1.h</font></p>
<p><font size="3">Now at patch more_p2.diff</font>
</p>
<p><font size="3">"quilt graph -all"可以为栈顶补丁的依赖关系生成dot文件。Graphviz的dot可以根据dot文件产生图片，例如：</font></p>
<p><font size="3">$ quilt graph --all &gt; ../../more_p2.dot</font></p>
<p><font size="3">$ cd ../..; dot -Tpng more_p2.dot -o more_p2.png
</font>
</p>
<p><font size="3"><img  src="http://www.fmddlmyy.cn/images/more_p2.png" alt="" border="0" height="266" width="146"></font></p>
<h3><font size="3">2.6 发布补丁</font></h3>
<p><font size="3">只要将patches目录打包发布就可以了。例如：</font></p>
<p><font size="3">$ cd prj; tar cvjf prj-0.1-patches.tar.bz2 patches; mv prj-0.1-patches.tar.bz2 ../..
</font></p>
<p><font size="3">用户先下载、解压补丁包对应的源代码树：</font></p>
<p><font size="3">$ cd ../..; mkdir user; cd user; tar xvjf ../old-prj.tar.bz2; mv old-prj/ prj
</font></p>
<p><font size="3">然后下载、解压补丁：</font></p>
<p><font size="3">$ cd ../..; tar xvjf prj-0.1-patches.tar.bz2; cd user/prj
</font></p>
<p><font size="3">最后把补丁目录链接到源代码树的patches目录，然后应用所有补丁：</font></p>
<p><font size="3">$ ln -sfn ../../patches/ patches</font></p>
<p><font size="3">$ quilt push -a</font></p>
<p><font size="3">Applying patch prj.diff</font></p>
<p><font size="3">patching file src/drv/drv1.h</font></p>
<p><font size="3">patching file src/sys/sys1.c</font></p>
<p><font size="3">patching file src/sys/sys1.h</font></p>
<p><font size="3">patching file src/usr/usr1.c</font></p>
<p><font size="3">patching file src/usr/usr1.h
Applying patch drv_p1.diff</font></p>
<p><font size="3">patching file src/drv/drv2.h</font></p>
<p><font size="3">Applying patch more_p1.diff</font></p>
<p><font size="3">patching file src/applet/applet1.c</font></p>
<p><font size="3">patching file src/applet/applet1.h</font></p>
<p><font size="3">patching file src/drv/drv2.h</font></p>
<p><font size="3">Applying patch more_p2.diff</font></p>
<p><font size="3">patching file src/app/app1.c</font></p>
<p><font size="3">patching file src/app/app1.h</font></p>
<p><font size="3">patching file src/app/app2.c</font></p>
<p><font size="3">patching file src/app/app2.h</font></p>
<p><font size="3">patching file src/applet/applet1.h</font></p>
<p><font size="3">Now at patch more_p2.diff
</font>
</p>
<h2><font size="3">３ 结束语</font></h2>
<p><font size="3">在上面的流程攻略中，我们演示了19个quilt命令：add, annotate, applied,
diff, edit, files, graph, import, new, next, patches, pop, previous,
push, refresh, remove, series, top, unapplied。</font></p>
<p><font size="3">本次Linux之旅到此结束，欢迎您再次参加Linux之旅，一起探索浩瀚的Linux世界。</font></p><img src ="http://www.cnitblog.com/forrest/aggbug/50652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/forrest/" target="_blank">forrest</a> 2008-10-24 15:10 <a href="http://www.cnitblog.com/forrest/articles/50652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用VNC访问远端Linux桌面 详细步骤解析(转)</title><link>http://www.cnitblog.com/forrest/articles/42346.html</link><dc:creator>forrest</dc:creator><author>forrest</author><pubDate>Mon, 14 Apr 2008 06:32:00 GMT</pubDate><guid>http://www.cnitblog.com/forrest/articles/42346.html</guid><wfw:comment>http://www.cnitblog.com/forrest/comments/42346.html</wfw:comment><comments>http://www.cnitblog.com/forrest/articles/42346.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/forrest/comments/commentRss/42346.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/forrest/services/trackbacks/42346.html</trackback:ping><description><![CDATA[<h1 class="xspace-title">用VNC访问远端Linux桌面 详细步骤解析</h1>
<br>
<p style="text-indent: 2em;">下面详细介绍如何使用VNC登陆远端<a  href="javascript:;" onclick="javascript:tagshow(event, 'linux');" target="_self"><u><strong>Linux</strong></u></a>桌面</p>
<p style="text-indent: 2em;"><strong>步骤1：安装</strong></p>
<p style="text-indent: 2em;">下载Linux版本VNC软件和Windows版本VNC，分别进行安装，windows下的安装不用</p>
<p style="text-indent: 2em;">介绍了，这里着重介绍Linux下VNC软件的安装，</p>
<p style="text-indent: 2em;">1)、[root@gliethttp root]#tar zxvf vnc-4.0-x86_linux.tar.gz</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/README</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/vncinstall</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/Xvnc</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/Xvnc.man</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/vncviewer</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/vncviewer.man</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/vncpasswd</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/vncpasswd.man</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/vncconfig</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/vncconfig.man</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/vncserver</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/vncserver.man</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/x0vncserver</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/x0vncserver.man</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/vnc.so</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/LICENCE.TXT</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/java/</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/java/index.vnc</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/java/logo150x150.gif</p>
<p style="text-indent: 2em;">vnc-4.0-x86_linux/java/vncviewer.jar</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">2)、[root@gliethttp root]#cd vnc-4.0-x86_linux</p>
<p style="text-indent: 2em;">[root@gliethttp root]#./vncinstall /usr/local/bin</p>
<p style="text-indent: 2em;">Can't install manual pages to /usr/local/man/man1</p>
<p style="text-indent: 2em;">Copying Xvnc to /usr/local/bin</p>
<p style="text-indent: 2em;">Copying vncviewer to /usr/local/bin</p>
<p style="text-indent: 2em;">Copying vncpasswd to /usr/local/bin</p>
<p style="text-indent: 2em;">Copying vncconfig to /usr/local/bin</p>
<p style="text-indent: 2em;">Copying vncserver to /usr/local/bin</p>
<p style="text-indent: 2em;">Copying x0vncserver to /usr/local/bin</p>
<p style="text-indent: 2em;">[root@gliethttp root]#mkdir -p /usr/local/vnc/classes</p>
<p style="text-indent: 2em;">[root@gliethttp root]#cp java/* /usr/local/vnc/classes</p>
<p style="text-indent: 2em;">3)、好了安装完毕，接下来就是配置了</p>
<p style="text-indent: 2em;"><strong>步骤2：配置</strong></p>
<p style="text-indent: 2em;">1、配置Linux主机</p>
<p style="text-indent: 2em;">1)、[root@gliethttp root]#vncserver :1 //启动1号连接服务，会自动生成~/.vnc</p>
<p style="text-indent: 2em;">2)、[root@gliethttp root]#vim ~/.vnc/xstartup</p>
<p style="text-indent: 2em;">删除xstartup中所有内容，加入startkde&amp;(KDE桌面) 或 gnome-session&amp;(GNOME桌面)</p>
<p style="text-indent: 2em;">startkde&amp; #表示远程客户端将登陆Linux的KDE桌面（显示效果不太好）</p>
<p style="text-indent: 2em;">gnome-session&amp; #表示远程客户端将登陆Linux的GNOME桌面</p>
<p style="text-indent: 2em;">3)、[root@gliethttp root]#vncserver -kill :1 //关闭1号服务</p>
<p style="text-indent: 2em;">[root@gliethttp root]#vncserver :1 //重启1号服务，使2)设置生效</p>
<p style="text-indent: 2em;">4)、[root@gliethttp root]#vncpasswd //设置登陆<a  href="javascript:;" onclick="javascript:tagshow(event, '%c3%dc%c2%eb');" target="_self"><u><strong>密码</strong></u></a></p>
<p style="text-indent: 2em;">2、使用windows下VNC Viewerv.exe登陆远端Linux主机</p>
<p style="text-indent: 2em;"><a  href="javascript:;" onclick="javascript:tagshow(event, 'server');" target="_self"><u><strong>Server</strong></u></a>:192.168.0.250:1正确输入密码后即可正常登陆远端Linux桌面</p>
<p style="text-indent: 2em;">3、使用IE浏览器登陆远端Linux主机</p>
<p style="text-indent: 2em;">在IE
浏览器中输入vncserver地址：http://192.168.0.250:5801/在IE浏览器中会出现一个类似vncviewer的登陆界
面，确定后，提示输入用户名和密码，输入后就进入了远端Linux桌面（不过要比采用vncviewer登陆的显示效果糟糕的多）</p><img src ="http://www.cnitblog.com/forrest/aggbug/42346.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/forrest/" target="_blank">forrest</a> 2008-04-14 14:32 <a href="http://www.cnitblog.com/forrest/articles/42346.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>嵌入式Linux操作系统及其上应用软件开发(摘录)</title><link>http://www.cnitblog.com/forrest/articles/32386.html</link><dc:creator>forrest</dc:creator><author>forrest</author><pubDate>Fri, 24 Aug 2007 08:19:00 GMT</pubDate><guid>http://www.cnitblog.com/forrest/articles/32386.html</guid><wfw:comment>http://www.cnitblog.com/forrest/comments/32386.html</wfw:comment><comments>http://www.cnitblog.com/forrest/articles/32386.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/forrest/comments/commentRss/32386.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/forrest/services/trackbacks/32386.html</trackback:ping><description><![CDATA[ARM+LINUX路线，主攻嵌入式Linux操作系统及其上应用软件开发<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目标：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1） 掌握主流嵌入式微处理器的结构与原理（初步定为arm9）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2） 必须掌握一个嵌入式操作系统 （初步定为uclinux或linux,版本待定）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （3） 必须熟悉嵌入式软件开发流程并至少做一个嵌入式软件项目。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从事嵌入式软件开发的好处是：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）目前国内外这方面的人都很稀缺。这一领域入门门槛较高，所以非专业IT人员很难切入这一领域；另一方面，是因为这一领域较新，目前发展太快，大多数人无条件接触。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）与企业计算等应用软件不同，嵌入式领域人才的工作强度通常低一些（但收入不低）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （3）哪天若想创业，搞自已的产品，嵌入式不像应用软件那样容易被盗版。硬件设计一般都是请其它公司给订做（这叫&#8220;贴牌&#8221;：OEM），都是通用的硬件，我们只管设计软件就变成自己的产品了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （4）兴趣所在，这是最主要的。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从事嵌入式软件开发的缺点是：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1） 入门起点较高，所用到的技术往往都有一定难度，若软硬件基础不好，特别是操作系统级软件功底不深，则可能不适于此行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）这方面的企业数量要远少于企业计算类企业。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （3）有少数公司经常要硕士以上的人搞嵌入式，主要是基于嵌入式的难度。但大多数公司也并无此要求，只要有经验即可。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （4）平台依托强，换平台比较辛苦。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 兴趣的由来：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、成功观念不同，不虚度此生，就是我的成功。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、喜欢思考，挑战逻辑思维。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、喜欢C<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C是一种能发挥思维极限的语言。关于C的精神的一些方面可以被概述成短句如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相信程序员。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不要阻止程序员做那些需要去做的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 保持语言短小精干。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一种方法做一个操作。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使得它运行的够快，尽管它并不能保证将是可移植的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、喜欢底层开发，讨厌vb类开发工具（并不是说vb不好）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、发展前景好，适合创业，不想自己要死了的时候还是一个工程师。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法步骤：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、基础知识：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目的：能看懂硬件工作原理，但重点在嵌入式软件，特别是操作系统级软件，那将是我的优势。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 科目：数字电路、计算机组成原理、嵌入式微处理器结构。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 汇编语言、C/C++、编译原理、离散数学。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据结构和算法、操作系统、软件工程、网络、数据库。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法：虽科目众多，但都是较简单的基础，且大部分已掌握。不一定全学，可根据需要选修。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主攻书籍：the c++ programming language（一直没时间读）、数据结构-C2。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、学习linux：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目的：深入掌握linux系统。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法：使用linux—〉linxu系统编程开发—〉驱动开发和分析linux内核。先看深，那主讲原理。看几遍后，看情景分析，对照深看，两本交叉，深是纲，情是目。剖析则是0.11版，适合学习。最后深入代码。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主攻书籍：linux内核完全剖析、unix环境高级编程、深入理解linux内核、情景分析和源代。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、学习嵌入式linux：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目的：掌握嵌入式处理器其及系统。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法：（1）嵌入式微处理器结构与应用：直接arm原理及汇编即可，不要重复x86。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）嵌入式操作系统类：ucOS/II简单，开源，可供入门。而后深入研究uClinux。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （3）必须有块开发板（arm9以上），有条件可参加培训（进步快，能认识些朋友）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主攻书籍：毛德操的《嵌入式系统》及其他arm9手册与arm汇编指令等。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、深入学习：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A、数字图像压缩技术：主要是应掌握MPEG、mp3等编解码算法和技术。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B、通信协议及编程技术：TCP/IP协议、802.11，Bluetooth，GPRS、GSM、CDMA等。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C、网络与信息安全技术：如加密技术，数字证书CA等。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D、DSP技术：Digital Signal Process，DSP处理器通过硬件实现数字信号处理算法。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明：太多细节未说明，可根据实际情况调整。重点在于1、3，不必完全按照顺序作。对于学习c++，理由是c++不只是一种语言，一种工具，她还是一种艺术，一种文化，一种哲学理念、但不是拿来炫耀得东西。对于linux内核，学习编程，读一些优秀代码也是有必要的。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：　要学会举一反多，有强大的基础，很多东西简单看看就能会。想成为合格的程序员，前提是必须熟练至少一种编程语言，并具有良好的逻辑思维。一定要理论结合实践。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　不要一味钻研技术，虽然挤出时间是很难做到的，但还是要留点余地去完善其他的爱好，比如宇宙，素描、机械、管理，心理学、游戏、科幻电影。还有一些不愿意做但必须要做的！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 技术是通过编程编程在编程编出来的。永远不要梦想一步登天，不要做浮躁的人，不要觉得路途漫上。而是要编程编程在编程，完了在编程，在编程！等机会来了在创业（不要相信有奇迹发生，盲目创业很难成功，即便成功了发展空间也不一定很大）。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 嵌入式书籍推荐<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linux基础<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、《Linux与Unix Shell 编程指南》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C语言基础<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、《C Primer Plus，5th Edition》【美】Stephen Prata著<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie（K &amp; R）著<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、《Advanced Programming in the UNIX Environment，2nd Edition》（APUE）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、《嵌入式Linux应用程序开发详解》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linux内核<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、《深入理解Linux内核》（第三版）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、《Linux内核源代码情景分析》毛德操 胡希明著<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 研发方向<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、《UNIX Network Programming》（UNP）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、《TCP/IP详解》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、《Linux内核编程》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、《Linux设备驱动开发》（LDD）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 硬件基础<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、《ARM体系结构与编程》杜春雷著<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、S3C2410 Datasheet<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 英语基础<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、《计算机与通信专业英语》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统教程<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、《嵌入式系统――体系结构、编程与设计》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、《嵌入式系统――采用公开源代码和StrongARM/Xscale处理器》毛德操 胡希明著<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、《Building Embedded Linux Systems》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 理论基础<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、《算法导论》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、《数据结构（C语言版）》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、《计算机组织与体系结构?性能分析》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、《深入理解计算机系统》【美】Randal E. Bryant David O'Hallaron著<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、《操作系统：精髓与设计原理》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、《编译原理》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、《数据通信与计算机网络》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、《数据压缩原理与应用》<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C语言书籍推荐<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. The C programming language<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 《Ｃ程序设计语言》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. Pointers on C<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 《Ｃ和指针》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. C traps and pitfalls<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 《Ｃ陷阱与缺陷》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4. Expert C Lanuage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 《专家Ｃ编程》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5. Writing Clean Code<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----Microsoft Techiniques for Developing Bug-free C Programs<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 《编程精粹--Microsoft 编写优质无错Ｃ程序秘诀》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6. Programming Embedded Systems in C and C++<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 《嵌入式系统编程》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.《C语言嵌入式系统编程修炼》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8.《高质量C++/C编程指南》林锐<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 尽可能多的编码，要学好C，不能只注重C本身。算法，架构方式等都很重要。<br><img src ="http://www.cnitblog.com/forrest/aggbug/32386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/forrest/" target="_blank">forrest</a> 2007-08-24 16:19 <a href="http://www.cnitblog.com/forrest/articles/32386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Network Installation of SuSE Linux via PXE Boot</title><link>http://www.cnitblog.com/forrest/articles/16337.html</link><dc:creator>forrest</dc:creator><author>forrest</author><pubDate>Mon, 04 Sep 2006 02:31:00 GMT</pubDate><guid>http://www.cnitblog.com/forrest/articles/16337.html</guid><wfw:comment>http://www.cnitblog.com/forrest/comments/16337.html</wfw:comment><comments>http://www.cnitblog.com/forrest/articles/16337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/forrest/comments/commentRss/16337.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/forrest/services/trackbacks/16337.html</trackback:ping><description><![CDATA[Error convertoring HTML to XHTML: System.ArgumentException: Cannot have ']]&gt;' inside an XML CDATA block.
   at System.Xml.XmlTextWriter.WriteCData(String text)
   at System.Xml.XmlWriter.WriteNode(XmlReader reader, Boolean defattr)
   at FreeTextBoxControls.Support.Formatter.HtmlToXhtml(String input)<img src ="http://www.cnitblog.com/forrest/aggbug/16337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/forrest/" target="_blank">forrest</a> 2006-09-04 10:31 <a href="http://www.cnitblog.com/forrest/articles/16337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何远程安装Linux </title><link>http://www.cnitblog.com/forrest/articles/16336.html</link><dc:creator>forrest</dc:creator><author>forrest</author><pubDate>Mon, 04 Sep 2006 02:05:00 GMT</pubDate><guid>http://www.cnitblog.com/forrest/articles/16336.html</guid><wfw:comment>http://www.cnitblog.com/forrest/comments/16336.html</wfw:comment><comments>http://www.cnitblog.com/forrest/articles/16336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/forrest/comments/commentRss/16336.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/forrest/services/trackbacks/16336.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<h1>如何远程安装Linux</h1>
										<img class="display-img" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" />
								</td>
								<td class="no-print" width="192">
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td width="100%">
										<p>2006年 9月 04 日</p>
										<blockquote>本文介绍了在不需要光驱和软驱的情况下，如何通过PXE协议快速安装Linux的原理和步骤，这对于提高安装Linux的效率非常有帮助；同时，PXE协议也可以作为无盘linux技术，用于引导远程的Linux启动。</blockquote>
										<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
										<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
										<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
										<p>
												<a name="N1003B">
														<span class="atitle">
																<font face="Arial" size="4">1． 引言</font>
														</span>
												</a>
										</p>
										<p>一般情况下，我们都是利用软驱或光驱引导Linux后，再通过本地的光驱安装Linux。但是，这种安装方法在以下的几种情况下就不能适用：</p>
										<ol>
												<li>无软驱和光驱：很多公司为了节省成本，计算机一般都不带光驱或软驱，这样就无法通过本地安装Linux； 
</li>
												<li>非标准的软驱和光驱：虽然笔记本都会配置光驱，但是并不一定都是标准的IDE设备，有些是通过USB接口，有些是通过1394接口（例如Samsung的Q10）。在Linux安装时所引导的Linux内核一般都不会带这些接口的驱动，所以也无法通过本地安装Linux； 
</li>
												<li>另外，在一些场合，如机房中，有大量的计算机需要同时安装Linux，如果通过光驱的方式一个个安装，不仅效率低，也不利于维护。 </li>
										</ol>
										<p>笔者在工作过程中，就遇到过第二种情况。一台Samsung的Q10笔记本需要安装Redhat Linux 8.0，但是通过光驱引导后发现，安装程序无法访问光盘。针对这个问题，笔者经过查阅资料和摸索，找到了在Q10上安装Linux的方法。在下面的讨论中，如不做特别声明，都将以Q10为例，介绍如何通过PXE Bootrom来远程安装Linux。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/linux/l-tip-prompt/l-pex/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N10053">
														<span class="atitle">
																<font face="Arial" size="4">2． 基本原理</font>
														</span>
												</a>
										</p>
										<p>
												<a name="N10059">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">1） 什么是PXE</font>
																</strong>
														</span>
												</a>
										</p>
										<p>PXE(Pre-boot Execution Environment)是由Intel设计的协议，它可以使计算机通过网络启动。协议分为client和server两端，PXE client在网卡的ROM中，当计算机引导时，BIOS把PXE client调入内存执行，并显示出命令菜单，经用户选择后，PXE client将放置在远端的操作系统通过网络下载到本地运行。</p>
										<p>PXE协议的成功运行需要解决以下两个问题：</p>
										<ol>
												<li>既然是通过网络传输，那么计算机在启动时，它的IP地址由谁来配置； 
</li>
												<li>通过什么协议下载Linux内核和根文件系统 </li>
										</ol>
										<p>对于第一个问题，可以通过DHCP Server解决，由DHCP server来给PXE client分配一个IP地址，DHCP Server是用来给DHCP Client动态分配IP地址的协议，不过由于这里是给PXE Client分配IP地址，所以在配置DHCP Server时，需要增加相应的PXE特有配置。</p>
										<p>至于第二个问题，在PXE client所在的ROM中，已经存在了TFTP Client。PXE Client使用TFTP Client，通过TFTP协议到TFTP Server上下载所需的文件。</p>
										<p>这样，PXE协议运行的条件就具备了，下面我们就来看看PXE协议的工作过程。</p>
										<p>
												<a name="N10077">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">2） 工作过程</font>
																</strong>
														</span>
												</a>
										</p>
										<br />
										<strong>
												<font face="Arial">
														<img height="786" alt="" src="http://www-128.ibm.com/developerworks/cn/linux/l-tip-prompt/l-pex/1.gif" width="689" border="0" />
												</font>
										</strong>
										<br />
										<p>在上图中，PXE client是需要安装Linux的计算机，TFTP Server和DHCP Server运行在另外一台Linux Server上。Bootstrap文件、配置文件、Linux内核以及Linux根文件系统都放置在Linux Server上TFTP服务器的根目录下。</p>
										<p>PXE client在工作过程中，需要三个二进制文件：bootstrap、Linux 内核和Linux根文件系统。Bootstrap文件是可执行程序，它向用户提供简单的控制界面，并根据用户的选择，下载合适的Linux内核以及Linux根文件系统。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/linux/l-tip-prompt/l-pex/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N10094">
														<span class="atitle">
																<font face="Arial" size="4">3． 步骤</font>
														</span>
												</a>
										</p>
										<p>有了前面的背景知识，接下来就可以正式操作了，下面按照顺序给出了操作步骤：</p>
										<p>
												<a name="N1009D">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">1） 配置DHCP Server</font>
																</strong>
														</span>
												</a>
										</p>
										<p>选用ISC dhcp-3.0，DHCP Server的配置文件是/etc/dhcpd.conf，配置文件的内容如下：</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
																						<font face="Lucida Console">option space PXE;
option PXE.mtftp-ip               code 1 = ip-address;  
option PXE.mtftp-cport            code 2 = unsigned integer 16;
option PXE.mtftp-sport            code 3 = unsigned integer 16;
option PXE.mtftp-tmout            code 4 = unsigned integer 8;
option PXE.mtftp-delay            code 5 = unsigned integer 8;
option PXE.discovery-control      code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr   code 7 = ip-address;

class "pxeclients" {
    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
    option vendor-class-identifier "PXEClient";
    vendor-option-space PXE;

    # At least one of the vendor-specific PXE options must be set in
    # order for the client boot ROMs to realize that we are a PXE-compliant
    # server.  We set the MCAST IP address to 0.0.0.0 to tell the boot ROM
    # that we can't provide multicast TFTP (address 0.0.0.0 means no
    # address).

    option PXE.mtftp-ip 0.0.0.0;

    # This is the name of the file the boot ROMs should download.
    filename "pxelinux.0";

    # This is the name of the server they should get it from.
    next-server 192.168.0.1;
}
ddns-update-style interim;
ignore client-updates;
default-lease-time 1200;
max-lease-time 9200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
option routers 192.168.0.254;
option domain-name-servers 192.168.0.1,192.168.0.2;
option domain-name "mydomain.org";
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.10 192.168.0.100;
} 
host q10 {
hardware ethernet 00:00:F0:6B:38:5B;
	fixed-address 192.168.0.22;
}
</font>
																				</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>dhcpd.conf配置文件中几个关键部分说明如下：host q10{…}定义了笔记本Q10网卡的MAC地址与IP地址的对应关系，表明DHCP Server为Q10分配一个固定的IP：192.168.0.22；filename ""指定bootstrap的文件名；netx-server指定TFTP Server的地址。其它的配置请读者参考DHCP Server的手册。</p>
										<p>
												<a name="N100AD">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">2） 配置TFTP server</font>
																</strong>
														</span>
												</a>
										</p>
										<p>选用tftp-hpa，TFTP Server的配置文件是/etc/xinetd.d/tftp，配置文件的内容如下：</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
																						<font face="Lucida Console">	
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -u nobody -s /tftpboot
        disable                 = no
        per_source              = 11
        cps                     = 100 2
	}
	</font>
																				</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>这里制定了/tftpboot为TFTP Server的根目录位置。</p>
										<p>
												<a name="N100BD">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">3） 配置bootstrap</font>
																</strong>
														</span>
												</a>
										</p>
										<p>bootstrap文件在dhcpd.conf中被指定为pxelinux.0文件，放置在/tftpboot。Linux内核以及Linux根文件系统也放置在/tftpboot。pxelinux.0在执行过程中，要读配置文件，所有的配置文件都放在/tftpboot/pxelinux.cfg/目录下。由于PXElinux具有为不同的PXE Client提供不同的Linux内核以及根文件系统的功能，所以要通过不同的配置文件名来区分出不同的PXE Client的需求。比如一个PXE Client由DHCP Server分配的IP地址为192.168.0.22，那么相对应的配置文件名为/tftpboot/pxelinux.cfg/C0A80016（注：C0A80016为IP地址192.168.0.22的十六进制表示）。如果找不到，就按照顺序C0A80016-&gt; C0A8001-&gt; C0A800-&gt; C0A80-&gt; C0A8-&gt; C0A-&gt; C0-&gt; C-&gt;default查找配置文件。</p>
										<p>/tftpboot/pxelinux.cft/C0A80001配置文件的具体内容如下：</p>
										<p>DEFAULT install <br />PROMPT 1 <br />LABEL install <br />KERNEL vmlinuz <br />APPEND initrd=initrd.img devfs=nomount ramdisk_size=16384 </p>
										<p>此配置文件指定了Linux内核以及根文件系统的名称，并给内核传递了一些参数，其中ramdisk_size参数要非常注意，它指定Linux内核启动后建立ramdisk的大小，如果设置太小，Linux的安装过程就可能无法进行。</p>
										<p>
												<a name="N100D7">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">4） 制作Linux内核/根文件系统</font>
																</strong>
														</span>
												</a>
										</p>
										<p>因为需要通过网络安装，所有选择Redhat Linux 8.0安装盘（disk #1）中E:\images\bootnet.img（光驱的盘符为E:）。bootnet.img包括Linux内核、Linux根文件系统（有安装程序在内）。用bootnet.img制作一张引导软盘，方法在DOS命令行运行E:\dosutils\rawrite E:\images\bootnet.img，根据提示制作。制作完毕后，将引导软盘中的vmlinuz（Linux内核）和initrd.img（Linux根文件系统）拷贝到Linux Server的/tftpboot下。</p>
										<p>
												<a name="N100E0">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">5） 启动DHCP Server/TFTP Server</font>
																</strong>
														</span>
												</a>
										</p>
										<p>在Linux Server上，运行service dhcpd start和service xinetd restart。</p>
										<p>
												<a name="N100E9">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">6） 启动Q10</font>
																</strong>
														</span>
												</a>
										</p>
										<p>Q10加电后，在出现Samsung公司徽标时，在左下角会提示用户按F12进入网络引导。按F12后，Q10进入网络引导过程。首先通过DHCP Server获得了IP地址，然后下载并执行bootstrap文件pxelinux.0；在执行中，读入配置文件/tftpboot/pxelinux.cfg/C0A80016。此时屏幕上出现boot:，敲入install，就进入了Redhat Linux 8.0的网络安装界面，一切OK!</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/linux/l-tip-prompt/l-pex/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N100F2">
														<span class="atitle">
																<font face="Arial" size="4">4． 结束语</font>
														</span>
												</a>
										</p>
										<p>虽然以上的讨论是针对Samsung Q10笔记本，但是工作原理和安装方法对于其它类型的计算机也是适用的，不过要记住，计算机的网卡中必须要有BootROM--PXE Client。同时，PXE协议也可作为无盘Linux技术，用于引导放置在远程的Linux。实际上，只要根据需要，在Pxelinux的配置文件的APPEND选项中，为Linux内核传进需要mount的文件系统的位置参数即可。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/linux/l-tip-prompt/l-pex/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="resources">
														<span class="atitle">
																<font face="Arial" size="4">参考资料 </font>
														</span>
												</a>
										</p>
										<ul>
												<li>PXELINUX， <a href="http://syslinux.zytor.com/pxe.php"><font color="#5c81a7">http://syslinux.zytor.com/pxe.php</font></a><br /><br /></li>
												<li>Net booting with DHCP, PXE-Linux and TFTP， <a href="http://logout.sh/computers/linux/netboot/"><font color="#5c81a7">http://logout.sh/computers/linux/netboot/</font></a><br /><br /></li>
												<li>Different kinds of PXE， <a href="http://clic.mandrakesoft.com/documentation/pxe/ch02.html"><font color="#5c81a7">http://clic.mandrakesoft.com/documentation/pxe/ch02.html</font></a></li>
										</ul>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/forrest/aggbug/16336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/forrest/" target="_blank">forrest</a> 2006-09-04 10:05 <a href="http://www.cnitblog.com/forrest/articles/16336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> linux文件系统基础 </title><link>http://www.cnitblog.com/forrest/articles/16218.html</link><dc:creator>forrest</dc:creator><author>forrest</author><pubDate>Thu, 31 Aug 2006 08:57:00 GMT</pubDate><guid>http://www.cnitblog.com/forrest/articles/16218.html</guid><wfw:comment>http://www.cnitblog.com/forrest/comments/16218.html</wfw:comment><comments>http://www.cnitblog.com/forrest/articles/16218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/forrest/comments/commentRss/16218.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/forrest/services/trackbacks/16218.html</trackback:ping><description><![CDATA[一 、linux文件结构 <br />文件结构是文件存放在磁盘等存贮设备上的组织方法。主要体现在对文件和目录的组织上。 <br />目录提供了管理文件的一个方便而有效的途径。 <br />linux使用标准的目录结构，在安装的时候，安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式，并指定了每个目录的作用和其中的文件类型。 <br /><br /><br /><br />/根目录 <br />┃ <br />┏━━━┳━━━━┳━━━━┳━━━━╋━━━━┳━━━━┳━━━━┳━━━━┓ <br />┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ <br />bin home dev etc lib sbin tmp usr var <br />┃ ┃ <br />┏━┻━┓ ┏━━━━┳━━━┳━┻━┳━━━┳━━━┓ <br />┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ <br />rc.d cron.d X11R6 src lib local man bin <br />┃ ┃ ┃ <br />┏━━━┳━━━┳━┻━┳━━━━┓ ┃ ┏━━━╋━━━┓ <br />┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ <br />init.d rc0.d rc1.d rc2.d …… linux bin lib src <br /><br /><br /><br />linux采用的是树型结构。最上层是根目录，其他的所有目录都是从根目录出发而生成的。微软的DOS和windows也是采用树型结构，但是在DOS和windows中这样的树型结构的根是磁盘分区的盘符，有几个分区就有几个树型结构，他们之间的关系是并列的。但是在linux中，无论操作系统管理几个磁盘分区，这样的目录树只有一个。从结构上讲，各个磁盘分区上的树型目录不一定是并列的。 <br />如果这样讲不好理解的话，我来举个例子： <br /><br />有一块硬盘，分成了4个分区，分别是/；/boot；/usr和windows下的fat <br />对于/和/boot或者/和/usr，它们是从属关系；对于/boot和/usr，它们是并列关系。 <br />如果我把windows下的fat分区挂载到/mnt/winc下，（挂载？？哦，别急，呵呵，一会就讲，一会就讲。）那么对于/mnt/winc和/usr或/mnt/winc和/boot来说，它们是从属于目录树上没有任何关系的两个分支。 <br /><br /><br />因为linux是一个多用户系统，制定一个固定的目录规划有助于对系统文件和不同的用户文件进行统一管理。但就是这一点让很多从windows转到linux的初学者感到头疼。下面列出了linux下一些主要目录的功用。 <br /><br /><br />/bin 二进制可执行命令 <br />/dev 设备特殊文件 <br />/etc 系统管理和配置文件 <br />/etc/rc.d 启动的配置文件和脚本 <br />/home 用户主目录的基点，比如用户user的主目录就是/home/user，可以用~user表示 <br />/lib 标准程序设计库，又叫动态链接共享库，作用类似windows里的.dll文件 <br />/sbin 系统管理命令，这里存放的是系统管理员使用的管理程序 <br />/tmp 公用的临时文件存储点 <br />/root 系统管理员的主目录（呵呵，特权阶级） <br />/mnt 系统提供这个目录是让用户临时挂载其他的文件系统。 <br />/lost+found 这个目录平时是空的，系统非正常关机而留下“无家可归”的文件（windows下叫什么.chk）就在这里 <br />/proc 虚拟的目录，是系统内存的映射。可直接访问这个目录来获取系统信息。 <br />/var 某些大文件的溢出区，比方说各种服务的日志文件 <br />/usr 最庞大的目录，要用到的应用程序和文件几乎都在这个目录。其中包含： <br />/usr/X11R6 存放X window的目录 <br />/usr/bin 众多的应用程序 <br />/usr/sbin 超级用户的一些管理程序 <br />/usr/doc linux文档 <br />/usr/include linux下开发和编译应用程序所需要的头文件 <br />/usr/lib 常用的动态链接库和软件包的配置文件 <br />/usr/man 帮助文档 <br />/usr/src 源代码，linux内核的源代码就放在/usr/src/linux里 <br />/usr/local/bin 本地增加的命令 <br />/usr/local/lib 本地增加的库 <br /><br /><br /><br /><br /><br />二 、linux文件系统 <br />文件系统指文件存在的物理空间，linux系统中每个分区都是一个文件系统，都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。一个操作系统的运行离不开对文件的操作，因此必然要拥有并维护自己的文件系统。 <br />linux文件系统使用索引节点来记录文件信息，作用像windows的文件分配表。 <br />索引节点是一个结构，它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组，每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码，也就是该节点在数组中的索引号，称为索引节点号。 <br />linux文件系统将文件索引节点号和文件名同时保存在目录中。所以，目录只是将文件的名称和它的索引节点号结合在一起的一张表，目录中每一对文件名称和索引节点号称为一个连接。 <br />对于一个文件来说有唯一的索引节点号与之对应，对于一个索引节点号，却可以有多个文件名与之对应。因此，在磁盘上的同一个文件可以通过不同的路径去访问它。 <br />可以用ln命令对一个已经存在的文件再建立一个新的连接，而不复制文件的内容。 <br />连接有软连接和硬连接之分，软连接又叫符号连接。它们各自的特点是： <br /><br />硬连接：原文件名和连接文件名都指向相同的物理地址。 <br />目录不能有硬连接；硬连接不能跨越文件系统（不能跨越不同的分区） <br />文件在磁盘中只有一个拷贝，节省硬盘空间； <br />由于删除文件要在同一个索引节点属于唯一的连接时才能成功，因此可以防止不必要的误删除。 <br /><br />符号连接：用ln -s命令建立文件的符号连接 <br />符号连接是linux特殊文件的一种，作为一个文件，它的数据是它所连接的文件的路径名。类似windows下的快捷方式。 <br />可以删除原有的文件而保存连接文件，没有防止误删除功能。 <br /><br /><br />这一段的的内容过于抽象，又是节点又是数组的，我已经尽量通俗再通俗了，又不好加例子作演示。大家如果还是云里雾里的话，我也没有什么办法了，只有先记住，日后在实际应用中慢慢体会、理解了。这也是我学习的一个方法吧。 <br /><br /><br /><br /><br /><br />三 、挂载文件系统 <br />由上一节知道，linux系统中每个分区都是一个文件系统，都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。这里所说的“按一定方式”就是指的挂载。 <br />将一个文件系统的顶层目录挂到另一个文件系统的子目录上，使它们成为一个整体，称为挂载。把该子目录称为挂载点。 <br />举个例子吧： <br /><br /><br />根分区： <br /><br /><br />/根目录 <br />┃ <br />┏━━━━┳━━━━┳━━━━┳━━━━╋━━━━┳━━━━┳━━━━┳━━━━┓ <br />┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ <br />bin home dev etc lib sbin tmp usr var <br />┃ <br />┏━┻━┓ <br />┃ ┃ <br />rc.d cron.d <br />┃ <br />┏━━━┳━━━┳━┻━┳━━━━┓ <br />┃ ┃ ┃ ┃ ┃ <br />init.d rc0.d rc1.d rc2.d …… <br /><br /><br /><br /><br />/usr分区 ： <br /><br />usr <br />┃ <br />┏━━━━┳━━━╋━━━┳━━━┳━━━┓ <br />┃ ┃ ┃ ┃ ┃ ┃ <br />X11R6 src lib local man bin <br />┃ ┃ <br />┃ ┏━━━╋━━━┓ <br />┃ ┃ ┃ ┃ <br />linux bin lib src <br /><br /><br /><br /><br />挂载之后就形成了文章开始时的那个图。像不像挂上去的？ <br /><br />注意：1、挂载点必须是一个目录。 <br /><br />2、一个分区挂载在一个已存在的目录上，这个目录可以不为空，但挂载后这个目录下以前的内容将不可用。 <br />对于其他操作系统建立的文件系统的挂载也是这样。但是需要理解的是：光盘、软盘、其他操作系统使用的文件系统的格式与linux使用的文件系统格式是不一样的。光盘是ISO9660；软盘是fat16或ext2；windows NT是fat16、NTFS；windows98是fat16、fat32；windows2000和windowsXP是fat16、fat32、NTFS。挂载前要了解linux是否支持所要挂载的文件系统格式。 <br /><br /><br />挂载时使用mount命令： <br />格式：mount [-参数] [设备名称] [挂载点] <br /><br />其中常用的参数有 <br />-t&lt;文件系统类型&gt; 指定设备的文件系统类型，常见的有： <br />minix linux最早使用的文件系统 <br />ext2 linux目前常用的文件系统 <br />msdos MS-DOS的fat，就是fat16 <br />vfat windows98常用的fat32 <br />nfs 网络文件系统 <br />iso9660 CD-ROM光盘标准文件系统 <br />ntfs windows NT 2000的文件系统 <br />hpfs OS/2文件系统 <br />auto 自动检测文件系统 <br />-o&lt;选项&gt; 指定挂载文件系统时的选项。有些也可用在/etc/fstab中。常用的有 <br />codepage=XXX 代码页 <br />iocharset=XXX 字符集 <br />ro 以只读方式挂载 <br />rw 以读写方式挂载 <br />nouser 使一般用户无法挂载 <br />user 可以让一般用户挂载设备 <br /><br /><br /><br />提醒一下，mount命令没有建立挂载点的功能，因此你应该确保执行mount命令时，挂载点已经存在。（不懂？说白了点就是你要把文件系统挂载到哪，首先要先建上个目录。这样OK？） <br /><br />例子：windows98装在hda1分区，同时计算机上还有软盘和光盘需要挂载。 <br /># mk /mnt/winc <br /># mk /mnt/floppy <br /># mk /mnt/cdrom <br /># mount -t vfat /dev/hda1 /mnt/winc <br /># mount -t msdos /dev/fd0 /mnt/floppy <br /># mount -t iso9660 /dev/cdrom /mnt/cdrom <br />现在就可以进入/mnt/winc等目录读写这些文件系统了。 <br /><br />要保证最后两行的命令不出错，要确保软驱和光驱里有盘。（要是硬盘的磁盘片也可以经常随时更换的话，我想就不会犯这样的错误了:-&gt; ） <br />如果你的windows98目录里有中文文件名，使用上面的命令挂载后，显示的是一堆乱码。这就要用到 -o 参数里的codepage iocharset选项。codepage指定文件系统的代码页，简体中文中文代码是936；iocharset指定字符集，简体中文一般用cp936或gb2312。 <br /><br /><br />当挂载的文件系统linux不支持时，mount一定报错，如windows2000的ntfs文件系统。可以重新编译linux内核以获得对该文件系统的支持。关于重新编译linux内核，就不在这里说了。 <br /><br />四 、自动挂载 <br />每次开机访问windows分区都要运行mount命令显然太烦琐，为什么访问其他的linux分区不用使用mount命令呢？ <br />其实，每次开机时，linux自动将需要挂载的linux分区挂载上了。那么我们是不是可以设定让linux在启动的时候也挂载我们希望挂载的分区，如windows分区，以实现文件系统的自动挂载呢？ <br />这是完全可以的。在/etc目录下有个fstab文件，它里面列出了linux开机时自动挂载的文件系统的列表。我的/etc/fstab文件如下： <br /><br /><br /><br />/dev/hda2 / ext3 defaults 1 1 <br />/dev/hda1 /boot ext3 defaults 1 2 <br />none /dev/pts devpts gid=5,mode=620 0 0 <br />none /proc proc defaults 0 0 <br />none /dev/shm tmpfs defaults 0 0 <br />/dev/hda3 swap swap defaults 0 0 <br />/dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0 <br />/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0 <br />/dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0 <br />/dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0 <br /><br /><br /><br /><br />在/etc/fstab文件里，第一列是挂载的文件系统的设备名，第二列是挂载点，第三列是挂载的文件系统类型，第四列是挂载的选项，选项间用逗号分隔。第五六列不知道是什么意思，还望高手指点。 <br /><br />在最后两行是我手工添加的windows下的C；D盘，加了codepage=936和ocharset=cp936参数以支持中文文件名。参数defaults实际上包含了一组默认参数： <br /><br />rw 以可读写模式挂载 <br />suid 开启用户ID和群组ID设置位 <br />dev 可解读文件系统上的字符或区块设备 <br />exec 可执行二进制文件 <br />auto 自动挂载 <br />nouser 使一般用户无法挂载 <br />async 以非同步方式执行文件系统的输入输出操作 <br /><br />大家可以看到在这个列表里，光驱和软驱是不自动挂载的，参数设置为noauto。（如果你非要设成自动挂载，你要确保每次开机时你的光驱和软驱里都要有盘，呵呵。） <br /><img src ="http://www.cnitblog.com/forrest/aggbug/16218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/forrest/" target="_blank">forrest</a> 2006-08-31 16:57 <a href="http://www.cnitblog.com/forrest/articles/16218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>