﻿<?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博客-相信自己是对的，朋友多多才是走向成功的开始……-文章分类-linux</title><link>http://www.cnitblog.com/yang55xiaoguang/category/8359.html</link><description>自己的事自己办！</description><language>zh-cn</language><lastBuildDate>Tue, 27 Sep 2011 15:19:56 GMT</lastBuildDate><pubDate>Tue, 27 Sep 2011 15:19:56 GMT</pubDate><ttl>60</ttl><item><title>TCP/IP基础:DNS协议</title><link>http://www.cnitblog.com/yang55xiaoguang/articles/60674.html</link><dc:creator>可冉</dc:creator><author>可冉</author><pubDate>Sun, 09 Aug 2009 03:39:00 GMT</pubDate><guid>http://www.cnitblog.com/yang55xiaoguang/articles/60674.html</guid><wfw:comment>http://www.cnitblog.com/yang55xiaoguang/comments/60674.html</wfw:comment><comments>http://www.cnitblog.com/yang55xiaoguang/articles/60674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yang55xiaoguang/comments/commentRss/60674.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yang55xiaoguang/services/trackbacks/60674.html</trackback:ping><description><![CDATA[　DNS 的来由<br><br>　　如果您为您的机器设定过 internet 连线╋那么您一定接触过 DNS 了╋但 DNS 又是什么东东呢?说穿了╋DNS 是用来帮助记忆网路位址的╋完全是为了迁就人类的记忆思维而设的。<br><br>　　DNS 的全称是 Domain Name System(或 Service) ╋当您连上一个网址╋在URL打上?www.google.com 的时候╋可以说就是使用了 DNS 的服务了。但如果您知道这个 www.google.com 的 IP 位址╋直接输入 216.239.53.101 也同样可以到达这个网址。其实╋电脑使用的只是 IP 位址而已(最终也是 0 和 1 啦)╋这个 www.google.com 只是让人们容易记忆而设的。因为我们人类╋对一些比较有意义的文字记忆(如?www.google.com)╋比记忆那些毫无头绪的号码(如?216.239.53.101)╋往往容易得多。DNS 的作用就是为我们在文字和 IP 之间担当了翻译╋而免除了强记号码的痛苦。<br><br>　　假如您的电话有名字记忆功能╋您只需知道对方的名字╋就可以拨号给友人了╋我们可以说╋这电话也具备如 DNS 的功能了呢?但是╋我们在网路中使用的 DNS 系统╋就是这么简单吗?非也╋复杂得很呢?下面╋就让我们一起去探索一下 DNS 的奥秘?<br><br>　　在早期的 IP 网路世界里面╋每台电脑都只用 IP 位址来表示╋不久人们就发现这样很难记忆╋于是╋一些 UNIX 的管理者╋就建立一个 HOSTS 对应表╋将 IP 和主机名字对应起来╋这样╋用户只需输入电脑名字╋就可以代替 IP 来进行沟通了。如果你安装了 Linux 系统╋在 /etc 下面就可以找到这个 hosts 档案?在 NT 的系统里╋你也可以在 winntsystem32driversetc 下面找到它。不过这个 HOSTS 档是要由管理者手工维护的╋最大的问题是无法适用于大型网路╋而且更新也是件非常头痛的事情。这就是 DNS 大派用场的时候了。<br><br>　　DNS 的结构<br><br>　　DNS 是一个分层级的分散式名称对应系统╋有点像电脑的目录树结构?在最顶端的是一个&#8220;root&#8221;╋然后其下分为好几个基本类别名称╋如?com?org?edu 等?再下面是组织名称╋如?ibm?microsoft?intel 等?继而是主机名称╋如?www?mail?ftp 等。因为当初 internet 是从美国发展起的╋所以当时并没有国域名称╋但随着后来 internet 的蓬勃发展╋DNS 也加进了诸如 tw?hk?cn 等国域名称。所以一个完整的 dns 名称就好象是这样的?www.xyz.com.tw╋而整个名称对应的就是一个(或多个) IP 位址了。<br><br>　　在早期的设计下╋root 下面只有六个组织类别?<br><br>　　<img src="http://doc.linuxpk.com/imgfiles/2002.12.24.19.44.44.1.jpg"><br><br>　　不过╋自从组织类别名称开放以后╋各种各样五花八门的名称也相继涌现出来了╋但无论如何╋取名的规则最好尽量适合网站性质。除了原来的类别资料由美国本土的 NIC(Network Information Center) 管理之外╋其它在国域以下的类别分别由该国的 NIC 管理(比方说台湾的 DNS 将授权给 twnic 来管理)。这样的结构看起来就像这样?<br><br>　　<img src="http://doc.linuxpk.com/imgfiles/2002.12.24.19.44.53.2.jpg"><br><br>　　在结构中╋各组织的 DNS 经过申请后由该组织或其委托主机管理(通常当您申请注册一个 domain 域名称的时候╋都要指定两台 DNS 主机负责该域名的 DNS 管理)。<br><br>　　DNS 的运作<br><br>　　在我们设定 IP 网路环境的时候╋都要告诉每台主机关于 DNS 伺服器的位址(我们可以手动的在每一台主机上面设置╋也可以使用 DHCP 来指定)。但这设定的义意何在呢？从前面的介绍我们或可知道：其目的就是请 DNS 帮忙解析主机名称与 IP 位址啦。在这个设定过程中，DNS 被称为 resolver (也就是负责解析的 DNS Server)，而被设定主机，则只是单纯的 DNS Client 了，也就是提出解析请求的主机。<br><br>　　下面让我们看看 DNS 是怎样运作的?<br><br>　　1. 当被询问到有关本域名之内的主机名称的时候╋DNS 伺服器会直接做出回答?<br><br>　　2. 客户端向伺服器提出查询项目?<br><br>　　3. 当被询问到有关本域名之内的主机名称的时候╋DNS 伺服器会直接做出回答?<br><br>　　4. 如果所查询的主机名称属于其它域名的话╋会检查快取记忆体(Cache)╋看看有没有相关资料?<br><br>　　5. 如果没有发现╋则会转向 root 伺服器查询?<br><br>　　6. 然后 root 伺服器会将该域名之下一层授权(authoritative)伺服器的位址告知(可能会超过一台)?<br><br>　　7. 本地伺服器然后会向其中的一台伺服器查询╋并将这些伺服器名单存到记忆体中╋以备将来之需(省却再向 root 查询的步骤)?<br><br>　　8. 远方伺服器回应查询?<br><br>　　9. 若该回应并非最后一层的答案，则继续往下一层查询，直到获的客户端所查询的结果为止?<br><br>　　10. 将查询结果回应给客户端╋并同时将结果储存一个备份在自己的快取记忆里面?<br><br>　　11. 如果在存放时间尚未过时之前再接到相同的查询╋则以存放于快取记忆里面的资料来做回应。<br><br>　　从这个过程我们可以看出╋没有任何一台 DNS 主机会包含所有域名的 DNS 资料╋资料都是分散在全部的 DNS 伺服器中╋而 NIC 只需知道各 DNS 伺服器位址就可以了。<br><br>　　为了更好地理解一下 DNS 的运作╋让我们用下图看看查询 www.home.netman.com.tw 这台主机位址的过程?<br><br>　　<img src="http://doc.linuxpk.com/imgfiles/2002.12.24.19.45.3.3.jpg"><br><br>　　在这个例子中╋www.home.netman.com.tw 台主机的 DNS 对应资料╋是由负责 home.netman.com.tw 这个域名的 DNS 伺服器管理的。(在 DNS 术语中╋我们称一个域名为&#8220;zone&#8221;╋这个 zone 可以是您从 NIC 申请回来的域名╋也可以是从该域名之下延伸出来的&#8220;sub-zone&#8221;)。在这台 DNS 伺服器上面╋必须有一?龉赜? home.netman.com.tw 这个 zone 的档案╋而这档案里面必须有一笔关于 www 的记录(任何主机都是以&#8220;记录&#8221;来表示，称为 Resource Record)。这个记录可以为一个 IP 位址╋也可以以别名形式来对应一台主机名称╋但无论如何╋所对应的主机名称最终是要被一个 IP 位址所对应着就是了。<br><br>　　同时╋DNS 还能提供&#8220;反查询&#8221;(reverse lookup) 功能╋也就是以 IP 来查询主机名称。网路上面的许多服务╋如?FTP, SMTP?等等╋都需要到这个功能。其实╋DNS 服务本身就必须要使用反查询功能╋而且在设定上╋也必须要为每个网路建立起 reverse zone。虽然有些人发觉即使没有 reverse zone 也可以使用到 DNS 服务╋但其中弊端却不容易被察觉到╋在这个(中文)网页?http://dnsrd.nctu.edu.tw/Basic/WhenToUse-Rev.html 上面╋您可以看到忽略 revers zone 所致一些问题。<br><br>　　DNS 的名称记录<br><br>　　事实上╋DNS 不仅仅是用来解释位址用的╋而且还可以回答更多关于网路和主机的其它信息╋其中很重要的一个功能就是可以供邮件系统进行路由。这些资料╋通常会以不同的&#8220;记录&#8221;名称出现在DNS的资料档案中。下面让我们参考一个 Linux 的 DNS 档案╋看看这些记录是如何表示的?<br><br>　　;<br><br>　　; Zone file for siyongc.domain<br><br>　　;<br><br>　　; Then full zone file<br><br>　　;<br><br>　　$TTL 86400<br><br>　　@<br><br>　　IN SOA redhat52.siyongc.domain. netman.siyongc.domain. (<br><br>　　 1999092801 ; serial<br><br>　　 8H ; refresh<br><br>　　 2H ; retry<br><br>　　 1W ; expire<br><br>　　 1D ) ; minimun<br><br>　　;<br><br>　　 IN TXT "A test domain, created by Netman"<br><br>　　 IN NS redhat52<br><br>　　 IN NS debian.home<br><br>　　 IN MX 10 redhat52.siyongc.domain.<br><br>　　 IN MX 20 debian.home<br><br>　　;<br><br>　　localhost IN A 127.0.0.1<br><br>　　?<br><br>　　gw IN A 192.168.0.17<br><br>　　 IN HINFO "Redhat" "MASQ"<br><br>　　 IN TXT "The masquerade gateway to internet"<br><br>　　?<br><br>　　redhat52 IN A 192.168.0.17<br><br>　　 IN MX 10 redhat52<br><br>　　 IN MX 20 debian.home<br><br>　　 IN HINFO "Dell PII 266" "Linux RedHat"<br><br>　　www IN CNAME redhat52<br><br>　　mail IN CNAME redhat52<br><br>　　ftp IN CNAME redhat52<br><br>　　news IN CNAME redhat52<br><br>　　smtp IN CNAME redhat52<br><br>　　?<br><br>　　pii266 IN A 192.168.0.15<br><br>　　 IN MX 10 redhat52.siyongc.domain.<br><br>　　 IN MX 20 debian.home.<br><br>　　?<br><br>　　slware36 IN A 192.168.0.18<br><br>　　 IN MX 10 redhat52.siyongc.domain.<br><br>　　 IN MX 20 debian.home.<br><br>　　?<br><br>　　rhroute IN A 192.168.0.4<br><br>　　 IN MX 10 redhat52.siyongc.domain.<br><br>　　 IN MX 20 debian.home.<br><br>　　?<br><br>　　home IN ns debian.home.siyongc.domain.<br><br>　　debian.home IN A 10.0.2.101<br><br>　　我们姑且不理会开头那几行的意思╋那是给 DNS 系统本身使用的(我将会在&#8220;学习 Linux&#8221;文章里面再详细讨论)╋这里我们只是看看几个记录名称而已?<br><br>　　<img src="http://doc.linuxpk.com/imgfiles/2002.12.24.19.45.13.4.jpg"><br><br>　　分? DNS 工作<br><br>　　由於 DNS 的重要性日益锢著，?提高其容邋能力及查?效能，我?在架韵某一?一 zone 的?侯，常以多台伺服器???? zone 的服?。其中，我?必需指定一台 Primary(master) DNS 伺服器，它是架韵在某一?咀域下被主要授??控制所有名费??的主控伺服器╋管?著?咀域的所有??儋料╋呃些??儋料只有 primary(master) 可以修改。<br><br>　　但如果在一?比蒉大型的咀路中╋DNS 伺服器就??得很繁忙╋所以您可以韵定多? DNS ?分? master 的工作╋但您或杂不?意到每一? DNS 伺服器去更新儋料吧?而且就算您?意呃?做╋也容易出?邋锗或儋料不同步的情形。呃?您可以韵定其它的伺服器? secondary (slave) DNS ?妖氧 master 上面的??儋料╋呃?╋其它的?呢可以被分派到不同的 DNS 做查?╋既可以分? master 的工作╋而且儋料也可以自?咄行同步工作。?催保儋料的一致性，master 每次更新咿儋料後?以 notify ?制主?通知 slave 前?同步。此外，您可以韵定 DNS 儋料同步的?殓殓隔╋在 dns ?案中的 Refresh 韵定就是了。在?案中，您??看到 Serial ╋? slave 的上面的 serial<br>
<img src ="http://www.cnitblog.com/yang55xiaoguang/aggbug/60674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yang55xiaoguang/" target="_blank">可冉</a> 2009-08-09 11:39 <a href="http://www.cnitblog.com/yang55xiaoguang/articles/60674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎样用mdadm管理软RAID</title><link>http://www.cnitblog.com/yang55xiaoguang/articles/60631.html</link><dc:creator>可冉</dc:creator><author>可冉</author><pubDate>Sat, 08 Aug 2009 02:15:00 GMT</pubDate><guid>http://www.cnitblog.com/yang55xiaoguang/articles/60631.html</guid><wfw:comment>http://www.cnitblog.com/yang55xiaoguang/comments/60631.html</wfw:comment><comments>http://www.cnitblog.com/yang55xiaoguang/articles/60631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yang55xiaoguang/comments/commentRss/60631.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yang55xiaoguang/services/trackbacks/60631.html</trackback:ping><description><![CDATA[安装程式实现软件RAID代替硬件RAID的方法，今天再进一步谈谈手动创建软RAID和日常维护的方法。<br>mdadm使用的也是md驱动，由于其拥有多种模式，而且单一工具，不依赖所有设置文件，是替代raidtools的好工具。目前几乎所有发行版本使用的都是该工具。<br>一、安装和编译<br>源码下载：<br><font color=#3f68a6>http://www.cse.unsw.edu.au/~neilb/source/mdadm/</font><br>编译：<br>tar xzvf ./mdadm-1.6.0.tgz<br>cd mdadm-1.6.0<br>make install<br>rpm安装：<br>rpm -ivh mdadm-1.6.0-3.rpm<br><strong>※源码最新版本是2.5，由于我使用的1.6.0的rpm包，所以还是以该版本为例。</strong><br>二、模式<br>mdadm有6种模式，前两种模式：Create、Assemble用于设置和激活阵列；Manage模式用于操作在活动阵列中的设备；Follow或Monitor模式允许管理员对活动阵列设置事件提醒和动作；Build模式用于对旧阵列使用旧版本的md驱动；更有Grow模式能扩展阵列；剩下的是Misc模式，他包括对多种内部的任务和没有指定特别模式的一些操作。<br><strong>系统平台： 红旗 DC Server for x86<br>硬件平台： Intel Xeon 3.0G DP、1个系统硬盘，3个组成阵列磁盘</strong><br>三、部署<br><strong>1、准备磁盘</strong><br>只能使用Sofware RAID格式的磁盘才能组成阵列，所以，首先我们要把做好磁盘格式。正如上面提到的，除了系统盘sda外，我们需要对sdb、sdc、sdd进行操作<br>a）对sdb进行分区<br>fdisk /dev/sdb<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0000-1150260323.jpg"><br>分区前状态：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0001-1150260371.jpg"><br>n，划分区：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0002-1150260436.jpg"><br>t，修改分区格式为fd：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0003-1150260485.jpg"><br>w，保存：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0004-1150260539.jpg"><br>b）同样的方法，对sdc、sdd进行分区和保存<br>最后状态如下：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0005-1150260649.jpg"><br><strong>2、创建阵列<br></strong>mdadm能支持LINEAR、RAID0&nbsp;&nbsp; (striping)、 RAID1(mirroring)、 RAID4、RAID5、RAID6和MULTIPATH的阵列模式。<br>创建命令格式如下：<br>mdadm [mode]&nbsp;&nbsp; [options] <br>例如：创建一个RAID 0设备：<br>mdadm --create --verbose /dev/md0 --level=0 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1<br>--level表示创建的阵列模式，--raid-devices表示参和阵列的磁盘数量。<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0006-1150261391.jpg"><br><strong>也能这样表达，意思是相同的：</strong><br>mdadm -Cv /dev/md0 -l0 -n3 /dev/sd[bcd]1<br>还能增加-c128参数，指定chunk size为128K（默认64K）<br><strong>3、设置文件</strong><br>mdadm不采用/etc/mdadm.conf作为主要设置文件，他能完全不依赖该文件而不会影响阵列的正常工作。<br>该设置文件的主要作用是方便跟踪软RAID的设置。对该设置文件进行设置是有好处的，但不是必须的。<strong>推荐对该文件进行设置。</strong><br><font color=#000000>通常能这样来建立：<br></font><br><strong>echo DEVICE /dev/sd[bcd]1 &gt; /etc/mdadm.conf</strong><br><strong>mdadm -Ds &gt;&gt; /etc/mdadm.conf<br>mdadm --detail --scan &gt;&gt; /etc/mdadm.conf</strong><br><font color=#560459><strong>4、格式化阵列<br></strong>后续，只要你把/dev/md0作为一个独立的设备来进行操作即可：<br></font><br>mkfs.ext3 /dev/md0<br>mkdir /mnt/test<br>mount /dev/md0 /mnt/test<br><strong>5、若要开机自动挂载，请加入/etc/fstab中：</strong><br>/dev/md0 &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; /mnt/tes &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; auto defaults &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 0 0<br>四、监视和管理<br>mdadm能非常方便的对阵列进行监视和管理的操作，也包括了停止和启动阵列等常用维护。<br><strong>1、查看</strong><br>cat /proc/mdstat<br>能查看所有使用md驱动的阵列的状态：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0008-1150262787.jpg"><br>mdadm --detail /dev/md0<br>查看指定阵列的周详信息（-D）：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0009-1150262864.jpg"><br><strong>2、停止</strong><br>mdadm -S /dev/md0<br>停止指定阵列，并释放磁盘（--stop）：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0010-1150262982.jpg"><br><strong>※注意：停止后，原组成阵列的磁盘将处于空闲状态，一旦吾操作这些磁盘，将不能再重启激活原阵列。</strong><br><strong>3、启动</strong><br>mdadm -A /dev/md0 /dev/sd[bcd]1<br>启动指定的阵列，也可理解为讲一个新阵列装配到系统中（--assemble）：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0011-1150263271.jpg"><br>若你已在上面设置了/etc/mdadm.conf文件，也可用-s查找：<br>mdadm -As /dev/md0<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0012-1150263421.jpg"><br><strong>4、测试</strong><br>如果你没有设置/etc/mdadm.conf文件，而且又忘了某磁盘属于那个阵列，则你能使用检测：（--examine）<br>mdadm -E /dev/sdb1<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0013-1150263638.jpg"><br>获得UUID后，也能这样激活阵列：<br>mdadm -Av /dev/md0 --uuid=8ba81579:e20fb0e8:e040da0e:f0b3fec8 /dev/sd*<br>能看到，只要磁盘没有损坏，这样装配是非常方便的：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0014-1150263872.jpg"><br><strong>5、添加及删除磁盘</strong><br>mdadm能在Manage模式下，对运行中的阵列进行添加及删除磁盘。常用于标识failed磁盘，增加spare（冗余）磁盘，及替换磁盘等。<br>例如：原来状态是：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0019-1150266851.jpg"><br>则能使用--fail指定坏磁盘，并--remove走：<br>mdadm /dev/md0 --fail /dev/sdc1 --remove /dev/sdc1<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0020-1150267197.jpg"><br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0021-1150267277.jpg"><br>等待同步完成后，结果：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0022-1150267349.jpg"><br><strong>※需要注意的是，对于某些阵列模式，如RAID0等，是不能用--fail和--remove的。</strong><br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0016-1150264626.jpg"><br>增加一个新的阵列用磁盘<br>mdadm /dev/md0 --add /dev/sdc1<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0023-1150267539.jpg"><br><strong>※需要注意的是，对于某些阵列模式，如RAID0等，是不能用--add的。</strong><br><strong>6、监视</strong><br>在Follow或Monitor状态下，能使用mdadm对阵列进行监视，例如当阵列出现问题的时候，发送邮件给管理员；或当磁盘出现问题的时候进行自动的磁盘替换。<br>nohup mdadm --monitor --mail=sysadmin --delay=300 /dev/md0 &amp;<br>上述定义：没300秒监视一次，当阵列出现错误，会发送邮件给sysadmin用户。由于monitor启动后是不会自动退出的，所以需要加上nohup和&amp;，使之持续在后台运行。<br>在Follow模式下，是允许共享冗余磁盘的。<br>例如，我们有两个阵列：/dev/md0、/dev/md1，而/dev/md0里面有一个spare磁盘。当我们在/etc/mdadm.conf中定义类似：<br>DEVICE&nbsp;&nbsp; /dev/sd*<br>ARRAY /dev/md0 level=raid1 num-devices=3 spare-group=database&nbsp;&nbsp;<br>&nbsp;&nbsp; UUID=410a299e:4cdd535e:169d3df4:48b7144a<br>ARRAY&nbsp;&nbsp; /dev/md1 level=raid1 num-device=2 spare-group=database&nbsp;&nbsp;<br>&nbsp;&nbsp; UUID=59b6e564:739d4d28:ae0aa308:71147fe7<br>也就是定义一个spare-group组。并运行上面的monitor模式命令。这样，当组成/dev/md1的其中一个磁盘出现问题的时候，mdadm会自动从/dev/md0上移走spare磁盘，并加入/dev/md1中，而不必人工干预<strong>。（请注意，能实现这样工作的，只有在该阵列支持冗余的情况下才能实现，如raid1、raid5等。而对于raid0等阵列模式，是无效的）</strong><br>五、其他<br><strong>1、增加spare磁盘</strong><br>能通过在创建的时候指定冗余磁盘：<br>mdadm -Cv /dev/md0 -l1 -n2 -x1 /dev/sd[bcd]1<br>-x（--spare-devices）参数用于指定冗余磁盘的数量，结果：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0019-1150266851.jpg"><br><strong>另外，对于full的阵列（例如已有2个磁盘的RAID1），则直接使用-add参数，mdadm会自动把冗余的磁盘作为spare disk。</strong><br><strong>2、删除阵列</strong><br>mdadm -S /dev/md0<br>或<br>rm /dev/md0<br>修改/etc/mdadm.conf、/etc/fstab等设置文件，把相关的地方去掉；<br>最后，用fdisk对磁盘进行重新分区即可。<br><strong>3、重建阵列</strong><br>我们也能在没有fdisk的情况下把使用过，但目前没有属于所有阵列的磁盘划分到新阵列中：<br><img border=0 src="http://www.linuxfly.org/upload/SNAG-0018-1150266700.jpg"><br>确认后即可。
<img src ="http://www.cnitblog.com/yang55xiaoguang/aggbug/60631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yang55xiaoguang/" target="_blank">可冉</a> 2009-08-08 10:15 <a href="http://www.cnitblog.com/yang55xiaoguang/articles/60631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POSIX</title><link>http://www.cnitblog.com/yang55xiaoguang/articles/60377.html</link><dc:creator>可冉</dc:creator><author>可冉</author><pubDate>Sun, 26 Jul 2009 04:16:00 GMT</pubDate><guid>http://www.cnitblog.com/yang55xiaoguang/articles/60377.html</guid><wfw:comment>http://www.cnitblog.com/yang55xiaoguang/comments/60377.html</wfw:comment><comments>http://www.cnitblog.com/yang55xiaoguang/articles/60377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yang55xiaoguang/comments/commentRss/60377.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yang55xiaoguang/services/trackbacks/60377.html</trackback:ping><description><![CDATA[<p><strong>POSIX</strong>是<a class=mw-redirect title=IEEE href="http://zh.wikipedia.org/wiki/IEEE"><u><font color=#0000ff>IEEE</font></u></a>为要在各种<a title=UNIX href="http://zh.wikipedia.org/wiki/UNIX"><u><font color=#0000ff>UNIX</font></u></a><a title=操作系统 href="http://zh.wikipedia.org/wiki/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F"><u><font color=#0000ff>操作系统</font></u></a>上运行的软件，而定义<a class=mw-redirect title=API href="http://zh.wikipedia.org/wiki/API"><u><font color=#0000ff>API</font></u></a>的一系列互相关联的标准的总称，其正式称呼为IEEE 1003，而国际标准名称为<a class=mw-redirect title=ISO href="http://zh.wikipedia.org/wiki/ISO"><u><font color=#0000ff>ISO</font></u></a>／<a class=mw-redirect title=IEC href="http://zh.wikipedia.org/wiki/IEC"><u><font color=#0000ff>IEC</font></u></a> 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由<a class=mw-redirect title="Richard Stallman" href="http://zh.wikipedia.org/wiki/Richard_Stallman"><u><font color=#0000ff>Richard Stallman</font></u></a>应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface（可移植操作系统界面）的缩写，而<strong>X</strong>则表明其对Unix API的传承。</p>
<p><a title=Linux href="http://zh.wikipedia.org/wiki/Linux"><u><font color=#0000ff>Linux</font></u></a>基本上逐步实现了POSIX兼容，但并没有参加正式的POSIX认证。</p>
<p><a title=微软 href="http://zh.wikipedia.org/wiki/%E5%BE%AE%E8%BD%AF"><u><font color=#0000ff>微软</font></u></a>的<a title="Windows NT" href="http://zh.wikipedia.org/wiki/Windows_NT"><u><font color=#0000ff>Windows NT</font></u></a>至少部分实现了POSIX兼容。</p>
<p>当前的POSIX文档分为三个部分：POSIX Kernel API，POSIX命令和工具集，及POSIX一致性测试。</p>
<strong>术语解释：</strong>POSIX是Portable Operating System Interface of Unix的缩写。由IEEE（Institute of Electrical and Electronic Engineering）开发，由ANSI和ISO标准化。<br>
<div class=spctrl></div>
　　<strong>由来：</strong>POSIX的诞生和Unix的发展是密不可分的，Unix于70年代诞生于Bell lab，并于80年代向美各大高校分发V7版的源码以做研究。UC Berkeley在V7的基础上开发了BSD Unix。后来很多商业厂家意识到Unix的价值也纷纷以Bell Lab的System V或BSD为基础来开发自己的Unix，较著名的有Sun OS，AIX，VMS。由于各厂家对Unix的开发各自为政，造成了Unix的版本相当混乱，给软件的可移植性带来很大困难，对Unix的发展极为不利。为结束这种局面，IEEE开发了POSIX，POSIX在源代码级别上定义了一组最小的Unix(类Unix)操作系统接口。<br>
<div class=spctrl></div>
　　POSIX 表示可移植操作系统接口（Portable Operating System Interface ，缩写为 POSIX 是为了读音更像 UNIX）。电气和电子工程师协会（Institute of Electrical and Electronics Engineers，IEEE）最初开发 POSIX 标准，是为了提高 UNIX 环境下应用程序的可移植性。然而，POSIX 并不局限于 UNIX。许多其它的操作系统，例如 DEC OpenVMS 和 Microsoft Windows NT，都支持 POSIX 标准，尤其是 IEEE Std. 1003.1-1990（1995 年修订）或 POSIX.1，POSIX.1 提供了源代码级别的 C 语言应用编程接口（API）给操作系统的服务程序，例如读写文件。POSIX.1 已经被国际标准化组织（International Standards Organization，ISO）所接受，被命名为 ISO/IEC 9945-1:1990 标准。 <br>
<div class=spctrl></div>
　　POSIX 现在已经发展成为一个非常庞大的标准族，某些部分正处在开发过程中。表 1-1 给出了 POSIX 标准的几个重要组成部分。POSIX 与 IEEE 1003 和 2003 家族的标准是可互换的。除 1003.1 之外，1003 和 2003 家族也包括在表中。<br><span class=mw-headline><br>POSIX 1.1标准</span>
<p><a class=new title=1003.0 href="http://zh.wikipedia.org/w/index.php?title=1003.0&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.0</font></u></a></p>
<p>　　管理 POSIX 开放式系统环境（OSE）。IEEE 在 1995 年通过了这项标准。 ISO 的版本是 ISO/IEC 14252:1996。</p>
<p><a class=new title=1003.1 href="http://zh.wikipedia.org/w/index.php?title=1003.1&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.1</font></u></a></p>
<p>　　被广泛接受、用于源代码级别的可移植性标准。1003.1 提供一个操作系统的 C 语言应用编程接口（API）。IEEE 和 ISO 已经在 1990 年通过了这个标准，IEEE 在 1995 年重新修订了该标准。</p>
<p><a class=new title=1003.1b href="http://zh.wikipedia.org/w/index.php?title=1003.1b&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.1b</font></u></a></p>
<p>　　一个用于实时编程的标准（以前的 P1003.4 或 POSIX.4）。这个标准在 1993 年被 IEEE 通过，被合并进 ISO/IEC 9945-1。</p>
<p><a class=new title=1003.1c href="http://zh.wikipedia.org/w/index.php?title=1003.1c&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.1c</font></u></a></p>
<p>　　一个用于线程（在一个程序中当前被执行的代码段）的标准。以前是 P1993.4 或 POSIX.4 的一部分，这个标准已经在 1995 年被 IEEE 通过，归入 ISO/IEC 9945-1:1996。</p>
<p><a class=new title=1003.1g href="http://zh.wikipedia.org/w/index.php?title=1003.1g&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.1g</font></u></a></p>
<p>　　一个关于协议独立接口的标准，该接口可以使一个应用程序通过网络与另一个应用程序通讯。 1996 年，IEEE 通过了这个标准。</p>
<p><a class=new title=1003.2 href="http://zh.wikipedia.org/w/index.php?title=1003.2&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.2</font></u></a></p>
<p>　　一个应用于 shell 和 工具软件的标准，它们分别是操作系统所必须提供的命令处理器和工具程序。 1992 年 IEEE 通过了这个标准。ISO 也已经通过了这个标准（ISO/IEC 9945-2:1993）。</p>
<p><a class=new title=1003.2d href="http://zh.wikipedia.org/w/index.php?title=1003.2d&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.2d</font></u></a></p>
<p>　　改进的 1003.2 标准。</p>
<p><a class=new title=1003.5 href="http://zh.wikipedia.org/w/index.php?title=1003.5&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.5</font></u></a></p>
<p>　　一个相当于 1003.1 的 Ada 语言的 API。在 1992 年，IEEE 通过了这个标准。并在 1997 年对其进行了修订。ISO 也通过了该标准。</p>
<p><a class=new title=1003.5b href="http://zh.wikipedia.org/w/index.php?title=1003.5b&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.5b</font></u></a></p>
<p>　　一个相当于 1003.1b（实时扩展）的 Ada 语言的 API。IEEE 和 ISO 都已经通过了这个标准。ISO 的标准是 ISO/IEC 14519:1999。</p>
<p><a class=new title=1003.5c href="http://zh.wikipedia.org/w/index.php?title=1003.5c&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.5c</font></u></a></p>
<p>　　一个相当于 1003.1q（协议独立接口）的 Ada 语言的 API。在 1998 年， IEEE 通过了这个标准。ISO 也通过了这个标准。</p>
<p><a class=new title=1003.9 href="http://zh.wikipedia.org/w/index.php?title=1003.9&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.9</font></u></a></p>
<p>　　一个相当于 1003.1 的 FORTRAN 语言的 API。在 1992 年，IEEE 通过了这个标准，并于 1997 年对其再次确认。ISO 也已经通过了这个标准。</p>
<p><a class=new title=1003.10 href="http://zh.wikipedia.org/w/index.php?title=1003.10&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.10</font></u></a></p>
<p>　　一个应用于超级计算应用环境框架（Application Environment Profile，AEP）的标准。在 1995 年，IEEE 通过了这个标准。</p>
<p><a class=new title=1003.13 href="http://zh.wikipedia.org/w/index.php?title=1003.13&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.13</font></u></a></p>
<p>　　一个关于应用环境框架的标准，主要针对使用 POSIX 接口的实时应用程序。在 1998 年，IEEE 通过了这个标准。</p>
<p><a class=new title=1003.22 href="http://zh.wikipedia.org/w/index.php?title=1003.22&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.22</font></u></a></p>
<p>　　一个针对 POSIX 的关于安全性框架的指南。</p>
<p><a class=new title=1003.23 href="http://zh.wikipedia.org/w/index.php?title=1003.23&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003.23</font></u></a></p>
<p>　　一个针对用户组织的指南，主要是为了指导用户开发和使用支持操作需求的开放式系统环境（OSE）框架</p>
<p><a title=2003 href="http://zh.wikipedia.org/wiki/2003"><u><font color=#0000ff>2003</font></u></a></p>
<p>　　针对指定和使用是否符合 POSIX 标准的测试方法，有关其定义、一般需求和指导方针的一个标准。在 1997 年，IEEE 通过了这个标准。</p>
<p><a class=new title=2003.1 href="http://zh.wikipedia.org/w/index.php?title=2003.1&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>2003.1</font></u></a></p>
<p>　　这个标准规定了针对 1003.1 的 POSIX 测试方法的提供商要提供的一些条件。在 1992 年，IEEE 通过了这个标准。</p>
<p><a class=new title=2003.2 href="http://zh.wikipedia.org/w/index.php?title=2003.2&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>2003.2</font></u></a></p>
<p>　　一个定义了被用来检查与 IEEE 1003.2（shell 和 工具 API）是否符合的测试方法的标准。在 1996 年，IEEE 通过了这个标准。</p>
<p>　　除了 <a class=new title=1003 href="http://zh.wikipedia.org/w/index.php?title=1003&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1003</font></u></a> 和 <a title=2003 href="http://zh.wikipedia.org/wiki/2003"><u><font color=#0000ff>2003</font></u></a> 家族以外，还有几个其它的 <a class=mw-redirect title=IEEE href="http://zh.wikipedia.org/wiki/IEEE"><u><font color=#0000ff>IEEE</font></u></a> 标准，例如 <a class=new title=1224 href="http://zh.wikipedia.org/w/index.php?title=1224&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1224</font></u></a> 和 <a class=new title=1228 href="http://zh.wikipedia.org/w/index.php?title=1228&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>1228</font></u></a>，它们也提供开发可移植应用程序的 <a class=mw-redirect title=API href="http://zh.wikipedia.org/wiki/API"><u><font color=#0000ff>API</font></u></a>。要想得到关于 <a class=mw-redirect title=IEEE href="http://zh.wikipedia.org/wiki/IEEE"><u><font color=#0000ff>IEEE</font></u></a> <a title=标准 href="http://zh.wikipedia.org/wiki/%E6%A0%87%E5%87%86"><u><font color=#0000ff>标准</font></u></a>的最新信息，可以访问 <a class=mw-redirect title=IEEE href="http://zh.wikipedia.org/wiki/IEEE"><u><font color=#0000ff>IEEE</font></u></a> <a title=标准 href="http://zh.wikipedia.org/wiki/%E6%A0%87%E5%87%86"><u><font color=#0000ff>标准</font></u></a>的主页，网址是<a class="external autonumber" title=http://standards.ieee.org/ href="http://standards.ieee.org/" rel=nofollow><u><font color=#0000ff>[1]</font></u></a>。有关 POSIX 标准的概述信息，请访问 <a class=mw-redirect title=Web href="http://zh.wikipedia.org/wiki/Web"><u><font color=#0000ff>Web</font></u></a> <a class=new title=站点 href="http://zh.wikipedia.org/w/index.php?title=%E7%AB%99%E7%82%B9&amp;action=edit&amp;redlink=1"><u><font color=#0000ff>站点</font></u></a> <a class="external autonumber" title=http://standards.ieee.org/reading/ieee/stad_public/description/posix/。 href="http://standards.ieee.org/reading/ieee/stad_public/description/posix/。" rel=nofollow><u><font color=#0000ff>[2]</font></u></a></p>
<p><a id=.E5.A4.96.E9.83.A8.E9.93.BE.E6.8E.A5 name=.E5.A4.96.E9.83.A8.E9.93.BE.E6.8E.A5><u><font color=#0000ff></font></u></a></p>
<h2><span class=editsection>[<a title=编辑段落：外部链接 href="http://zh.wikipedia.org/w/index.php?title=POSIX&amp;action=edit&amp;section=2"><u><font color=#0000ff>编辑</font></u></a>]</span> <span class=mw-headline>外部链接</span></h2>
<ul>
    <li><a class="external text" title=http://www.pasc.org/ href="http://www.pasc.org/" rel=nofollow><u><font color=#0000ff>The Portable Application Standards Committee</font></u></a>
    <li><a class="external text" title=http://standards.ieee.org/regauth/posix/ href="http://standards.ieee.org/regauth/posix/" rel=nofollow><u><font color=#0000ff>IEEE POSIX&#174; Certification Authority</font></u></a> </li>
</ul>
<img src ="http://www.cnitblog.com/yang55xiaoguang/aggbug/60377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yang55xiaoguang/" target="_blank">可冉</a> 2009-07-26 12:16 <a href="http://www.cnitblog.com/yang55xiaoguang/articles/60377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux内核对内存的管理</title><link>http://www.cnitblog.com/yang55xiaoguang/articles/59895.html</link><dc:creator>可冉</dc:creator><author>可冉</author><pubDate>Mon, 06 Jul 2009 15:40:00 GMT</pubDate><guid>http://www.cnitblog.com/yang55xiaoguang/articles/59895.html</guid><wfw:comment>http://www.cnitblog.com/yang55xiaoguang/comments/59895.html</wfw:comment><comments>http://www.cnitblog.com/yang55xiaoguang/articles/59895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yang55xiaoguang/comments/commentRss/59895.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yang55xiaoguang/services/trackbacks/59895.html</trackback:ping><description><![CDATA[<div class=tit>linux内核对内存的管理</div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div id=blog_text class=cnt><font style="LINE-HEIGHT: 18px" color=#333333>内存是Linux内核所管理的最重要的资源之一，内存管理系统是操作系统中最为重要的部分。对于Linux的初学者来说，熟悉Linux的内存管理非常重要。<br><br>进程是运行于虚拟地址空间的一个程序。可以说，任何在Linux系统下运行的程序都是进程。Linux系统中包括交互进程和批处理进程。交互进程是由 Shell控制和运行的，既可以在前台运行，也可以在后台运行。批处理进程不属于某个终端，被提交到一个队列中以便顺序执行。大多数的进程都需要虚拟内 存。<br><br>一般需要多少内存<br><br>对于典型的Linux应用系统，128MB内存是合理的选择。如果不运行X-Window系统，那么在一台特殊用途的机器(比如用于调试设备驱动程序的&#8220;崩溃和烧毁&#8221;系统)上仅用8MB内存就可以工作。<br><br>笔者曾经做过实验，在128MB和256MB下编译内核所需的时间几乎一样，都少于3分半钟（笔者的Linux发行版本是 Mandrake Linux 9.1,内核2.4.21）。在一个只有8MB内存的系统上，编译需要的时间会更长一些。类似Web浏览器这样的多媒体应用软件，在内存充足时会运行得更 流畅，特别是在一边编译程序，一边上网浏览的时候更是如此。因此，如果只有128MB内存，则预期的性能会有所降低。类似地，如果要开发消耗大量内存的应 用程序，可能会要求更多的内存。所以，需要多少内存由工作需求来决定。<br><br>实时监控内存使用情况<br><br>1.在命令行使用&#8220;Free&#8221;命令监控内存使用情况<br><br>＃free<br>total used free shared buffers cached<br>Mem: 256024 192284 63740 0 10676 101004<br>-/+ buffers/cache: 80604 75420<br>Swap: 522072 0 522072<br><br><br><br>上面代码给出了一个256MB的RAM和512MB交换空间的系统情况。第三行输出(Mem:)显示物理内存。Total列不显示核心使用的物理内存(通 常大约1MB)。Used列显示被使用的内存总额(第二行不计缓冲)。Free列显示全部没有使用的内存。Shared列显示多个进程共享的内存总额。 Buffers列显示磁盘缓存的当前大小。第五行(Swap:)对换空间，显示的信息类似上面。如果这行为全0，那么就没有使用对换空间。在缺省的状态 下，free命令以千字节(也就是1024字节为单位)来显示内存使用情况。使用-h参数，以字节为单位显内存使用情况；或者使用-m参数，以兆字节为单 位显示内存使用情况。还可以通过-s参数，使用命令来不间断地监视内存使用情况：<br>＃free -b -s5<br>这个命令将会在终端窗口中连续不断地报告内存的使用情况，每5秒钟更新一次。<br><br>2.使甩vmstat命令监视虚拟内存使用情况<br><br>＃ vmstat<br>procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----<br>r b swpd free buff cache si so bi bo in cs us sy id wa<br>1 0 0 63692 10704 101008 0 0 239 42 126 105 48 45 7 0<br><br><br><br>vmstat（）命令是一个通用监控程序，是Virtual Meomory Statistics（虚拟内存统计）的缩写。如果使用vmstat命令的时候没有使用任何命令行参数，将会得到一个一次性的报告。vmstat命令报告 主要的活动类型有进程(procs)、内存(以千字节为单位)、交换分区(以千字节为单位)、来自块设备(硬盘驱动器)的输入输出量、系统中断(每秒钟发 生的次数)，以及中央处理单元(CPU)分配给用户、系统和空闲时分别占用的比例。<br><br>虚拟内存实现的机制<br><br>存储管理子系统是操作系统中最重要的组成部分之一。在早期计算时代，由于人们所需要的内存数目远远大于物理内存，因此设计出了各种各样的策略来解决此问 题，其中最成功的就是虚拟内存技术，它使得系统中有限的物理内存竞争进程所需内存空间得到满足。虚拟内存通过在各个进程之间共享内存，而使系统看起来有多 于实际内存的内存容量。Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展，使可用内存相应地有效扩大。核心把当前不用的内存块存到硬盘，腾出内存给其它目的。当原来的内容又要使用时，再读回内存。 运行于Linux的程序只看到大量的可用内存，而不关心哪部分在磁盘上。当然，读写硬盘比真的内存慢(大约慢千倍)，所以程序运行较慢。用做虚拟内存的这 部分硬盘叫对换空间。<br><br>虚拟内存技术不仅仅让我们可以使用更多的内存，它还提供了下面这些功能：　<br><br>1.巨大的寻址空间<br>操作系统让系统看上去有比实际内存大得多的内存空间。虚拟内存可以是系统中实际物理空间的许多倍。每个进程运行在其独立的虚拟地址空间中，这些虚拟空间相 互之间都完全隔离开来，所以进程间不会互相影响。同时，硬件虚拟内存机构可以将内存的某些区域设置成不可写，这样可以保护代码与数据不会受恶意程序的干 扰。　<br><br>2.公平的物理内存分配<br>内存管理子系统允许系统中每个运行的进程公平地共享系统中的物理内存。　<br><br>3.共享虚拟内存<br>尽管虚拟内存允许进程有其独立的虚拟地址空间，但有时也需要在进程之间共享内存。例如，有可能系统中有几个进程同时运行BASH命令外壳程序。为了避免在 每个进程的虚拟内存空间内都存在BASH程序的拷贝，较好的解决办法是系统物理内存中只存在一份BASH的拷贝，并在多个进程间共享。动态库则是另外一种 进程间共享执行代码的方式。共享内存可用来作为进程间通信(IPC)的手段，多个进程通过共享内存来交换信息。Linux支持SYSTEM V的共享内存IPC机制。　<br><br>4.进程的保护<br>系统中的每一个进程都有自己的虚拟地址空间。这些虚拟地址空间是完全分开的，这样一个进程的运行不会影响其它进程，并且硬件上的虚拟内存机制是被保护的，内存不能被写入。这样可以防止迷失的应用程序覆盖代码的数据。<br><br>5.Linux虚拟内存实现机制<br>Linux虚拟内存的实现需要6种机制的支持：地址映射机制、内存分配回收机制、缓存和刷新机制、请求页机制、交换机制和内存共享机制。<br><br>内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址。当用户程序运行时，如果发现程序中要用的虚地址没有对应的物理内存，就发出了请求页要求。 如果有空闲的内存可供分配，就请求分配内存(于是用到了内存的分配和回收)，并把正在使用的物理页记录在缓存中(使用了缓存机制)。如果没有足够的内存可 供分配，那么就调用交换机制；腾出一部分内存。另外，在地址映射中要通过TLB(翻译后援存储器)来寻找物理页；交换机制中也要用到交换缓存，并且把物理 页内容交换到交换文件中，也要修改页表来映射文件地址。Linux虚拟内存实现原理见图1。<br><br><br>图1 Linux虚拟内存实现原理<br><br>6.虚拟内存容量设定<br>也许有人说，虚拟内存容量的设定应该分配2倍于物理内存，但这只是个规律。如果物理内存比较小，可以这样设定。如果有256MB物理内存或更多的话，就可 以缩小虚拟内存。Linux会把大量的内存用做Cache，但在资源紧张时会收回。只要看到swap为0，或者该数很小就可以放心了，内存放着不用才是最 大的浪费。<br><br>内存泄露和回收内存的方法<br><br>1.内存泄漏的定义<br>一般常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的、大小任意的（内存块的大小可以在程序运行期决定）、使用完后必须显示释放的内存。应用 程序一般使用malloc、realloc、new等函数从堆中分配到一块内存，使用完后，程序必须负责相应的调用free或delete释放该内存块。 否则，这块内存就不能被再次使用，我们就说这块内存泄漏了。<br><br>2.内存泄露的危害<br>从用户使用程序的角度来看，内存泄漏本身不会产生什么危害。作为一般的用户，根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积，这会最终消耗尽 系统所有的内存。从这个角度来说，一次性内存泄漏并没有什么危害，因为它不会堆积。而隐式内存泄漏危害性则非常大，因为较之于常发性和偶发性内存泄漏它更 难被检测到。存在内存泄漏问题的程序除了会占用更多的内存外，还会使程序的性能急剧下降。对于服务器而言，如果出现这种情况，即使系统不崩溃，也会严重影 响使用。<br><br>3.内存泄露的检测和回收<br>对于内存溢出之类的麻烦，大家可能在编写指针比较多的复杂程序时就会遇到。在Linux或Unix 下，C和C++语言是最常使用的工具。但是C++程序缺乏相应的手段来检测内存信息，只能使用top指令观察进程的动态内存总额。而且程序退出时，我们无 法获知任何内存泄漏信息。<br><br>(1)使用Linux命令回收内存，可以使用ps、kill两个命令检测内存使用情况和进行回收。在使用超级用户权限时使用命令 &#8220;ps&#8221;，它会列出所有正在运行的程序名称和对应的进程号（PID）。kill命令的工作原理是向Linux操作系统的内核送出一个系统操作信号和程序的 进程号（PID）。<br><br>下面举例说明，为了高效率回收内存可以使用命令ps参数v：<br><br>＃ps v<br>PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND<br>2530 vc/1 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty1<br>2531 vc/2 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty2<br>2532 vc/3 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty3<br>2533 vc/4 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty4<br>2534 vc/5 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty5<br>2535 vc/6 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty6<br>2639 pts/1 S 0:00 545 16 2643 968 0.3 [su]<br>2684 pts/1 S 0:00 361 586 2501 1592 0.6 bash<br>2711 pts/0 S 0:00 545 16 2643 968 0.3 [su]<br>2714 pts/0 S 0:00 361 586 2501 1592 0.6 bash<br>2754 pts/2 S 0:00 545 16 2643 968 0.3 [su]<br>2757 pts/2 S 0:00 361 586 2501 1592 0.6 bash<br>2818 pts/1 S 0:00 120 29 1478 480 0.1 ping 192.168.1.7<br>2939 pts/2 R 0:00 156 58 2469 644 0.2 ps -v<br><br><br><br>如果想回收ping命令的内存的话，可以使用下面命令：<br>＃ kill －9 2818<br><br>(2)使用工具软件<br>Memprof是一个非常具有吸引力且易于使用的软件，它由Red Hat的Owen Talyor创立。这个工具用于GNOME前端的Boehm-Demers-Weiser垃圾回收器。这个工具直接就可以执行，并且其工作起来无需对源代 码进行任何修改。在程序执行时，这个工具会以图形化的方式显示内存的使用情况，工作界面见图2。<br><br><br>图2 内存回收工具Memprof<br><br>但是，该工具目前只能运行于x86和PPC体系结构的Linux系统之中，需要一个完整的GNOME环境。这样就使得其不能灵活用于所有的地方。此外，该工具的开发工作进展得也比较缓慢，现在是0.5.1版。<br><br>上面讲述了Linux内存的概念、需要多少内存、实时监控内存使用情况、虚拟内存实现的机制，以及内存泄露和回收方法等五个方面内容，希望能对Linux初学者高效率使用内存系统有所帮助。</font></div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnitblog.com/yang55xiaoguang/aggbug/59895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yang55xiaoguang/" target="_blank">可冉</a> 2009-07-06 23:40 <a href="http://www.cnitblog.com/yang55xiaoguang/articles/59895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>命令 lld</title><link>http://www.cnitblog.com/yang55xiaoguang/articles/59684.html</link><dc:creator>可冉</dc:creator><author>可冉</author><pubDate>Sun, 28 Jun 2009 02:38:00 GMT</pubDate><guid>http://www.cnitblog.com/yang55xiaoguang/articles/59684.html</guid><wfw:comment>http://www.cnitblog.com/yang55xiaoguang/comments/59684.html</wfw:comment><comments>http://www.cnitblog.com/yang55xiaoguang/articles/59684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yang55xiaoguang/comments/commentRss/59684.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yang55xiaoguang/services/trackbacks/59684.html</trackback:ping><description><![CDATA[ldd命令<br><br>该命令用于判断某个可执行的 binary 档案含有什么动态函式库。<br>[root@test root]# ldd [-vdr] [filename]<br>参数说明：<br>--version　　打印ldd的版本号<br>-v --verbose　　打印所有信息，例如包括符号的版本信息<br>-d --data-relocs　　执行符号重部署，并报告缺少的目标对象（只对ELF格式适用）<br>-r --function-relocs　　对目标对象和函数执行重新部署，并报告缺少的目标对象和函数（只对ELF格式适用）<br>--help 用法信息<br>如果命令行中给定的库名字包含'/'，这个程序的libc5版本将使用它作为库名字；否则它将在标准位置搜索库。运行一个当前目录下的共享库，加前缀"./"。<br>错误:<br>　　ldd不能工作在a.out格式的共享库上。<br>　　ldd不能工作在一些非常老的a.out程序上，这些程序在支持ldd的编译器发行前已经创建。如果你在这种类型的程序上使用ldd，程序将尝试argc = 0的运行方式，其结果不可预知。<br><br>例如：<br>[songbei6@hn ~]$ ldd -v /lib/libc.so.6<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib/ld-linux.so.2 (0x002c1000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linux-gate.so.1 =&gt;&nbsp; (0x00cb3000)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Version information:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib/libc.so.6:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ld-linux.so.2 (GLIBC_PRIVATE) =&gt; /lib/ld-linux.so.2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ld-linux.so.2 (GLIBC_2.3) =&gt; /lib/ld-linux.so.2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ld-linux.so.2 (GLIBC_2.1) =&gt; /lib/ld-linux.so.2<br>[root@hn songbei6]# ldd /usr/sbin/useradd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linux-gate.so.1 =&gt;&nbsp; (0x00fa3000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libcrypt.so.1 =&gt; /lib/libcrypt.so.1 (0x00c90000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libaudit.so.0 =&gt; /lib/libaudit.so.0 (0x005e2000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libselinux.so.1 =&gt; /lib/libselinux.so.1 (0x002de000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libc.so.6 =&gt; /lib/libc.so.6 (0x00101000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libdl.so.2 =&gt; /lib/libdl.so.2 (0x00d18000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libsepol.so.1 =&gt; /lib/libsepol.so.1 (0x002f7000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib/ld-linux.so.2 (0x002c1000)<br>[root@hn songbei6]# <br>
<img src ="http://www.cnitblog.com/yang55xiaoguang/aggbug/59684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yang55xiaoguang/" target="_blank">可冉</a> 2009-06-28 10:38 <a href="http://www.cnitblog.com/yang55xiaoguang/articles/59684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于编写静态函数库，共享函数库和动态函数库的问题</title><link>http://www.cnitblog.com/yang55xiaoguang/articles/59682.html</link><dc:creator>可冉</dc:creator><author>可冉</author><pubDate>Sun, 28 Jun 2009 02:34:00 GMT</pubDate><guid>http://www.cnitblog.com/yang55xiaoguang/articles/59682.html</guid><wfw:comment>http://www.cnitblog.com/yang55xiaoguang/comments/59682.html</wfw:comment><comments>http://www.cnitblog.com/yang55xiaoguang/articles/59682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yang55xiaoguang/comments/commentRss/59682.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yang55xiaoguang/services/trackbacks/59682.html</trackback:ping><description><![CDATA[这两天一直在琢磨scim-bridge的机制，也想自己编出个类似的东西来。可是最近一直被immodule的加载机制所困惑，下面这篇文章很好的解答了我最近的问题。呵呵，看来还是自己的知识面太窄了，对于有些概念是模糊的。<br>-----------------------------------<br><span style="FONT-SIZE: 12pt"><strong>Linux下创建库函数<br>--------------------------<br></strong>1. 介绍<br>使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个&#8220;程序函数库&#8221;简单的说就是一个文件包含了一些编译好的代码和数据，这些编 译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化，更容易重新编译，而且更方便升级。程序函数库可分为3种类型：静态函 数库（static libraries）、共享函数库（shared libraries）和动态加载函数库（dynamically loaded libraries）。<br>静态函数库是在程序执行前就加入到目标程序中去了；而共享函数库则是在程序启动的时候加载到程序中，它可以被不同的程序共享；动态加载函数库则可以在程序运行的任何时候动态的加载。实际上，动态函数库并非另外一种库函数格式，区别是动态加载函数库是如何被程序员使用的。后面我们将举例说明。<br>本文档主要参考Program Library HOWTO，作者是luster（hwang@ustc.edu），任何非商业目的的再次发行本文档都是允许的，但是请保留作者信息和本版权声明。本文档首先在www.linuxaid.com.cn发布。<br>2. 静态函数库<br>静态函数库实际上就是简单的一个普通的目标文件的集合，一般来说习惯用&#8220;.a&#8221;作为文件的后缀。可以用ar这个程序来产生静态函数库文件。Ar 是archiver的缩写。静态函数库现在已经不在像以前用得那么多了，主要是共享函数库与之相比较有很多的优势的原因。慢慢地，大家都喜欢使用共享函数库了。不过，在一些场所静态函数库仍然在使用，一来是保持一些与以前某些程序的兼容，二来它描述起来也比较简单。<br>静态库函数允许程序员把程序link起来而不用重新编译代码，节省了重新编译代码的时间。不过，在今天这么快速的计算机面前，一般的程序的重新编译也花费不了多少时间，所以这个优势已经不是像它以前那么明显了。静态函数库对开发者来说还是很有用的，例如你想把自己提供的函数给别人使用，但是又想对函数的源代码进行保密，你就可以给别人提供一个静态函数库文件。理论上说，使用ELF格式的静态库函数生成的代码可以比使用共享函数库（或者动态函数库）的程序运行速度上快一些，大概1－5％。<br>创建一个静态函数库文件，或者往一个已经存在地静态函数库文件添加新的目标代码，可以用下面的命令：<br><br>ar rcs my_library.a file1.o file2.o<br>这个例子中是把目标代码file1.o和 file2.o加入到my_library.a这个函数库文件中，如果my_library.a不存在则创建一个新的文件。在用ar命令创建静态库函数的时候，还有其他一些可以选择的参数，可以参加ar的使用帮助。这里不再赘述。<br>一旦你创建了一个静态函数库，你可以使用它了。你可以把它作为你编译和连接过程中的一部分用来生成你的可执行代码。如果你用gcc来编译产生可执行代码的话，你可以用&#8220;-l&#8221;参数来指定这个库函数。你也可以用ld来做，使用它的&#8220;-l&#8221;和&#8220;-L&#8221;参数选项。具体用法，可以参考info:gcc。<br>3. 共享函数库<br>共享函数库中的函数是在当一个可执行程序在启动的时候被加载。如果一个共享函数库正常安装，所有的程序在重新运行的时候都可以自动加载最新的函数库中的函数。对于Linux系统还有更多的可以实现的功能：<br>o 升级了函数库但是仍然允许程序使用老版本的函数库。 o 当执行某个特定程序的时候可以覆盖某个特定的库或者库中指定的函数。 o 可以在库函数被使用的过程中修改这些函数库。<br>3.1. 一些约定<br>如果你要编写的共享函数库支持所有有用的特性，你在编写的过程中必须遵循一系列约定。你必须理解库的不同的名字间的区别，例如它的 &#8220;soname&#8221;和&#8220;real name&#8221;之间的区别和它们是如何相互作用的。你同样还要知道你应该把这些库函数放在你文件系统的什么位置等等。下面我们具体看看这些问题。<br>3.1.1. 共享库的命名<br>每个共享函数库都有个特殊的名字，称作&#8220;soname&#8221;。Soname名字命名必须以&#8220;lib&#8221;作为前缀，然后是函数库的名字，然后是&#8220;.so&#8221;，最后是版本号信息。不过有个特例，就是非常底层的C库函数都不是以lib开头这样命名的。<br>每个共享函数库都有一个真正的名字（&#8220;real name&#8221;），它是包含真正库函数代码的文件。真名有一个主版本号，和一个发行版本号。最后一个发行版本号是可选的，可以没有。主版本号和发行版本号使你可以知道你到底是安装了什么版本的库函数。<br>另外，还有一个名字是编译器编译的时候需要的函数库的名字，这个名字就是简单的soname名字，而不包含任何版本号信息。<br>管理共享函数库的关键是区分好这些名字。当可执行程序需要在自己的程序中列出这些他们需要的共享库函数的时候，它只要用soname就可以了；反过来，当你要创建一个新的共享函数库的时候，你要指定一个特定的文件名，其中包含很细节的版本信息。当你安装一个新版本的函数库的时候，你只要先将这些函数库文件拷贝到一些特定的目录中，运行ldconfig这个实用就可以。Ldconfig检查已经存在的库文件，然后创建soname的符号链接到真正的函数库，同时设置/etc/ld.so.cache这个缓冲文件。这个我们稍后再讨论。<br>Ldconfig并不设置链接的名字，通常的做法是在安装过程中完成这个链接名字的建立，一般来说这个符号链接就简单的指向最新的soname 或者最新版本的函数库文件。最好把这个符号链接指向soname，因为通常当你升级你的库函数的后，你就可以自动使用新版本的函数库勒。<br>我们来举例看看：<br>/usr/lib/libreadline.so.3 是一个完全的完整的soname，ldconfig可以设置一个符号链接到其他某个真正的函数库文件，例如是 /usr/lib/libreadline.so.3.0。同时还必须有一个链接名字，例如/usr/lib/libreadline.so 就是一个符号链接指向/usr/lib/libreadline.so.3。<br>3.1.2. 文件系统中函数库文件的位置<br>共享函数库文件必须放在一些特定的目录里，这样通过系统的环境变量设置，应用程序才能正确的使用这些函数库。大部分的源码开发的程序都遵循 GNU的一些标准，我们可以看info帮助文件获得相信的说明，info信息的位置是：info: standards#Directory_Variables。GNU标准建议所有的函数库文件都放在/usr/local/lib目录下，而且建议命令可执行程序都放在/usr/local/bin目录下。这都是一些习惯问题，可以改变的。<br>文件系统层次化标准FHS（Filesystem Hierarchy Standard）（http://www.pathname.com/fhs）规定了在一个发行包中大部分的函数库文件应该安装到/usr/lib目录下，但是如果某些库是在系统启动的时候要加载的，则放到/lib目录下，而那些不是系统本身一部分的库则放到/usr/local/lib下面。<br>上面两个路径的不同并没有本质的冲突。GNU提出的标准主要对于开发者开发源码的，而FHS的建议则是针对发行版本的路径的。具体的位置信息可以看/etc/ld.so.conf里面的配置信息。<br>3.2. 这些函数库如何使用<br>在基于GNU glibc的系统里，包括所有的linux系统，启动一个ELF格式的二进制可执行文件会自动启动和运行一个program loader。对于Linux系统，这个loader的名字是/lib/ld-linux.so.X（X是版本号）。这个loader启动后，反过来就会 load所有的其他本程序要使用的共享函数库。<br>到底在哪些目录里查找共享函数库呢？这些定义缺省的是放在/etc/ld.so.conf文件里面，我们可以修改这个文件，加入我们自己的一些特殊的路径要求。大多数RedHat系列的发行包的/etc/ld.so.conf文件里面不包括/usr/local/lib这个目录，如果没有这个目录的话，我们可以修改/etc/ld.so.conf，自己手动加上这个条目。<br>如果你想覆盖某个库中的一些函数，用自己的函数替换它们，同时保留该库中其他的函数的话，你可以在/etc/ld.so.preload中加入你想要替换的库（.o结尾的文件），这些preloading的库函数将有优先加载的权利。<br>当程序启动的时候搜索所有的目录显然会效率很低，于是Linux系统实际上用的是一个高速缓冲的做法。Ldconfig缺省情况下读出 /etc/ld.so.conf相关信息，然后设置适当地符号链接，然后写一个cache到/etc/ld.so.cache这个文件中，而这个 /etc/ld.so.cache则可以被其他程序有效的使用了。这样的做法可以大大提高访问函数库的速度。这就要求每次新增加一个动态加载的函数库的时候，就要运行ldconfig来更新这个cache，如果要删除某个函数库，或者某个函数库的路径修改了，都要重新运行ldconfig来更新这个 cache。通常的一些包管理器在安装一个新的函数库的时候就要运行ldconfig。<br>另外，FreeBSD使用cache的文件不一样。FreeBSD的ELF cache是/var/run/ld-elf.so.hints，而a.out的cache责是/var/run/ld.so.hints。它们同样是通过ldconfig来更新。<br>3.3. 环境变量<br>各种各样的环境变量控制着一些关键的过程。例如你可以临时为你特定的程序的一次执行指定一个不同的函数库。Linux系统中，通常变量 LD_LIBRARY_PATH就是可以用来指定函数库查找路径的，而且这个路径通常是在查找标准的路径之前查找。这个是很有用的，特别是在调试一个新的函数库的时候，或者在特殊的场合使用一个肥标准的函数库的时候。环境变量LD_PRELOAD列出了所有共享函数库中需要优先加载的库文件，功能和 /etc/ld.so.preload类似。这些都是有/lib/ld-linux.so这个loader来实现的。值得一提的是， LD_LIBRARY_PATH可以在大部分的UNIX-linke系统下正常起作用，但是并非所有的系统下都可以使用，例如HP－UX系统下，就是用 SHLIB_PATH这个变量，而在AIX下则使用LIBPATH这个变量。<br>LD_LIBRARY_PATH在开发和调试过程中经常大量使用，但是不应该被一个普通用户在安装过程中被安装程序修改，大家可以去参考 http://www.visi.com/~barr/ldpath.html,这里有一个文档专门介绍为什么不使用LD_LIBRARY_PATH这个变量。<br>事实上还有更多的环境变量影响着程序的调入过程，它们的名字通常就是以LD_或者RTLD_打头。大部分这些环境变量的使用的文档都是不全，通常搞得人头昏眼花的，如果要真正弄清楚它们的用法，最好去读loader的源码（也就是gcc的一部分）。<br>允许用户控制动态链接函数库将涉及到setuid/setgid这个函数如果特殊的功能需要的话。因此，GNU loader通常限制或者忽略用户对这些变量使用setuid和setgid。如果loader通过判断程序的相关环境变量判断程序的是否使用了 setuid或者setgid，如果uid和euid不同，或者gid和egid部一样，那么loader就假定程序已经使用了setuid或者 setgid，然后就大大的限制器控制这个老链接的权限。如果阅读GNU glibc的库函数源码，就可以清楚地看到这一点，特别的我们可以看elf/rtld.c和sysdeps/generic/dl-sysdep.c这两个文件。这就意味着如果你使得uid和gid与euid和egid分别相等，然后调用一个程序，那么这些变量就可以完全起效。<br>3.4. 创建一个共享函数库<br>现在我们开始学习如何创建一个共享函数库。其实创建一个共享函数库非常容易。首先创建object文件，这个文件将加入通过gcc &#8211;fPIC 参数命令加入到共享函数库里面。PIC的意思是&#8220;位置无关代码&#8221;（Position Independent Code）。下面是一个标准的格式：<br><br>gcc -shared -Wl,-soname,your_soname -o library_name file_list library_list<br>下面再给一个例子，它创建两个object文件（a.o和b.o），然后创建一个包含a.o和b.o的共享函数库。例子中&#8221;-g&#8221;和&#8220;－Wall&#8221;参数不是必须的。<br><br>gcc -fPIC -g -c -Wall a.cgcc -fPIC -g -c -Wall b.cgcc -shared -Wl,<br>-soname,liblusterstuff.so.1 -o liblusterstuff.so.1.0.1 a.o b.o -lc<br>下面是一些需要注意的地方：<br>&#183; 不用使用-fomit-frame-pointer这个编译参数除非你不得不这样。虽然使用了这个参数获得的函数库仍然可以使用，但是这使得调试程序几乎没有用，无法跟踪调试。 &#183; 使用-fPIC来产生代码，而不是-fpic。 &#183; 某些情况下，使用gcc 来生成object文件，需要使用&#8220;-Wl,-export-dynamic&#8221;这个选项参数。通常，动态函数库的符号表里面包含了这些动态的对象的符号。这个选项在创建ELF格式的文件时候，会将所有的符号加入到动态符号表中。可以参考ld的帮助获得更详细的说明。<br>3.5. 安装和使用共享函数库<br>一旦你了一个共享函数库，你还需要安装它。其实简单的方法就是拷贝你的库文件到指定的标准的目录（例如/usr/lib），然后运行ldconfig。<br>如果你没有权限去做这件事情，例如你不能修改 /usr/lib目录，那么你就只好通过修改你的环境变量来实现这些函数库的使用了。首先，你需要创建这些共享函数库；然后，设置一些必须得符号链接，特别是从soname到真正的函数库文件的符号链接，简单的方法就是运行ldconfig：<br><br>ldconfig -n directory_with_shared_libraries<br>然后你就可以设置你的LD_LIBRARY_PATH这个环境变量，它是一个以逗号分隔的路径的集合，这个可以用来指明共享函数库的搜索路径。例如，使用bash，就可以这样来启动一个程序my_program:<br><br>LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH my_program<br>如果你需要的是重载部分函数，则你就需要创建一个包含需要重载的函数的object文件，然后设置LD_PRELOAD环境变量。通常你可以很方便的升级你的函数库，如果某个API改变了，创建库的程序会改变soname。然而，如果一个函数升级了某个函数库而保持了原来的soname，你可以强行将老版本的函数库拷贝到某个位置，然后重新命名这个文件（例如使用原来的名字，然后后面加.orig后缀），然后创建一个小的&#8220;wrapper&#8221;脚本来设置这个库函数和相关的东西。例如下面的例子：<br><br>#!/bin/sh export LD_LIBRARY_PATH=/usr/local/my_lib:$LD_LIBRARY_PATH exec<br>/usr/bin/my_program.orig $*<br>我们可以通过运行ldd来看某个程序使用的共享函数库。例如你可以看ls这个实用工具使用的函数库：<br><br>ldd /bin/ls<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libtermcap.so.2 =&gt; /lib/libtermcap.so.2 (0x4001c000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libc.so.6 =&gt; /lib/libc.so.6 (0x40020000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x40000000)<br>通常我么可以看到一个soname的列表，包括路径。在所有的情况下，你都至少可以看到两个库：<br><br>&#183; /lib/ld-linux.so.N（N是1或者更大，一般至少2）。<br>这是这个用力加载其他所有的共享库的库。<br>&#183; libc.so.N(N应该大于或者等于6)。这是C语言函数库。<br>值得一提的是，不要在对你不信任的程序运行 ldd命令。在ldd的manual里面写得很清楚，ldd是通过设置某些特殊的环境变量（例如，对于ELF对象，设置LD_TRACE_LOADED_OBJECTS），然后运行这个程序。这样就有可能使得某地程序可能使得ldd来执行某些意想不到的代码，而产生不安全的隐患。<br>3.6. 不兼容的函数库<br>如果一个新版的函数库要和老版本的二进制的库不兼容，则soname需要改变。对于C语言，一共有4个基本的理由使得它们在二进制代码上很难兼容：<br>o. 一个函数的行文改变了，这样它就可能与最开始的定义不相符合。<br>o. 输出的数据项改变了。<br>o. 某些输出的函数删除了。<br>o. 某些输出函数的接口改变了。<br>如果你能避免这些地方，你就可以保持你的函数库在二进制代码上的兼容，或者说，你可以使得你的程序的应用二进制接口（ABI：Application Binary Interface）上兼容。<br>4. 动态加载的函数库Dynamically Loaded (DL) Libraries<br>动态加载的函数库Dynamically loaded (DL) libraries是一类函数库，它可以在程序运行过程中的任何时间加载。它们特别适合在函数中加载一些模块和plugin扩展模块的场合，因为它可以在 当程序需要某个plugin模块时才动态的加载。例如，Pluggable Authentication Modules(PAM)系统就是用动态加载函数库来使得管理员可以配置和重新配置身份验证信息。<br>Linux系统下，DL函数库与其他函数库在格式上没有特殊的区别，我们前面提到过，它们创建的时候是标准的object格式。主要的区别就是这些函数库不是在程序链接的时候或者启动的时候加载，而是通过一个API来打开一个函数库，寻找符号表，处理错误和关闭函数库。通常C语言环境下，需要包含这个头文件。<br>Linux中使用的函数和Solaris中一样，都是dlpoen（） API。当时不是所有的平台都使用同样的接口，例如HP-UX使用shl_load()机制，而Windows平台用另外的其他的调用接口。如果你的目的是使得你的代码有很强的移植性，你应该使用一些wrapping函数库，这样的wrapping函数库隐藏不同的平台的接口区别。一种方法是使用 glibc函数库中的对动态加载模块的支持，它使用一些潜在的动态加载函数库界面使得它们可以夸平台使用。具体可以参考http: //developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.html. 另外一个方法是使用libltdl，是GNU libtool的一部分，可以进一步参考CORBA相关资料。<br>4.1. dlopen()<br>dlopen函数打开一个函数库然后为后面的使用做准备。C语言原形是：<br><br>void * dlopen(const char *filename, int flag);<br>如果文件名filename是以&#8220;/&#8221;开头，也就是使用绝对路径，那么dlopne就直接使用它，而不去查找某些环境变量或者系统设置的函数库所在的目录了。否则dlopen（）<br>就会按照下面的次序查找函数库文件：<br>1. 环境变量LD_LIBRARY指明的路径。 2. /etc/ld.so.cache中的函数库列表。 3. /lib目录，然后/usr/lib。不过一些很老的a.out的loader则是采用相反的次序，也就是先查/usr/lib，然后是/lib。<br>Dlopen()函数中，参数flag的值必须是RTLD_LAZY或者RTLD_NOW，RTLD_LAZY的意思是resolve undefined symbols as code from the dynamic library is executed，而RTLD_NOW的含义是resolve all undefined symbols before dlopen() returns and fail if this cannot be done'。<br>如果有好几个函数库，它们之间有一些依赖关系的话，例如X依赖Y，那么你就要先加载那些被依赖的函数。例如先加载Y，然后加载X。<br>dlopen（）函数的返回值是一个句柄，然后后面的函数就通过使用这个句柄来做进一步的操作。如果打开失败dlopen()就返回一个NULL。如果一个函数库被多次打开，它会返回同样的句柄。<br>如果一个函数库里面有一个输出的函数名字为_init,那么_init就会在dlopen（）这个函数返回前被执行。我们可以利用这个函数在我的函数库里面做一些初始化的工作。我们后面会继续讨论这个问题的。<br>4.2. dlerror()<br>通过调用dlerror()函数，我们可以获得最后一次调用dlopen()，dlsym()，或者dlclose（）的错误信息。<br>4.3. dlsym()<br>如果你加载了一个DL函数库而不去使用当然是不可能的了，使用一个DL函数库的最主要的一个函数就是dlsym()，这个函数在一个已经打开的函数库里面查找给定的符号。这个函数如下定义：<br><br>void * dlsym(void *handle, char *symbol);<br>函数中的参数handle就是由dlopen打开后返回的句柄，symbol是一个以NIL结尾的字符串。<br>如果dlsym()函数没有找到需要查找的 symbol，则返回NULL。如果你知道某个symbol的值不可能是NULL或者0，那么就很好，你就可以根据这个返回结果判断查找的symbol是否存在了；不过，如果某个symbol的值就是NULL，那么这个判断就有问题了。标准的判断方法是先调用dlerror()，清除以前可能存在的错误，然后调用dlsym（）来访问一个symbol，然后再调用dlerror（）来判断是否出现了错误。一个典型的过程如下：<br><br>dlerror(); /* clear error code */<br>s = (actual_type) dlsym(handle, symbol_being_searched_for);<br>if ((err = dlerror()) != NULL)<br>{<br>/* handle error, the symbol wasn't found */<br>}<br>else<br>{<br>/* symbol found, its value is in s */<br>}<br>4.4. dlclose()<br>dlopen()函数的反过程就是 dlclose（）函数，dlclose（）函数用力关闭一个DL函数库。Dl函数库维持一个资源利用的计数器，当调用dlclose的时候，就把这个计数器的计数减一，如果计数器为0，则真正的释放掉。真正释放的时候，如果函数库里面有_fini()这个函数，则自动调用_fini（）这个函数，做一些必要的处理。Dlclose（）返回0表示成功，其他非0值表示错误。<br>4.5. DL Library Example<br>下面是一个例子。例子中调入math函数库，然后打印2.0的余弦函数值。例子中每次都检查是否出错。应该是个不错的范例：<br><br>&nbsp;&nbsp;&nbsp; #include<br>&nbsp;&nbsp;&nbsp; #include<br>&nbsp;&nbsp;&nbsp; #include<br>&nbsp;&nbsp;&nbsp; int main(int argc, char **argv)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void *handle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double (*cosine)(double);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *error;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!handle) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fputs (dlerror(), stderr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cosine = dlsym(handle, "cos");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((error = dlerror()) != NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fputs(error, stderr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf ("%f ", (*cosine)(2.0));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dlclose(handle);<br>}<br>如果这个程序名字叫foo.c,那么用下面的命令来编译：<br><br>&nbsp;&nbsp;&nbsp; gcc -o foo foo.c -ldl<br><br>5. 其他<br>5.1. nm命令<br>nm命令可以列出一个函数库文件中的符号表。它对于静态的函数库和共享的函数库都起作用。对于一个给定的函数库，nm命令可以列出函数库中定义的所有符号，包括每个符号的值和类型。还可以给出在原程序中这个函数（符号）是在多少行定义的，不过这必须要求编译该函数库的时候加&#8220;-l&#8221;选项。<br>关于符号的类型，这里我们再多讨论一下。符号的类型是以一个字母的形式显示的，小写字母表示这个符号是本地（local）的，而大写字母则表示这个符号是全局的（global,externel）。一般来说，类型有一下几种：T、D、B、U、W。各自的含义如下：T表示在代码段中定义的一般变量符号；D表示时初始化过的数据段；B表示初始化的数据段；U表示没有定义的，在这个库里面使用了，但是在其他库中定义的符号；W，weak的缩写，表示如果其他函数库中也有对这个符号的定义，则其他符号的定义可以覆盖这个定义。<br>如果你知道一个函数的名字，但是你不知道这个函数在什么库中定义的，那么可以用mn的&#8220;-o&#8221;选项和grep命令来查找库的名字。-o选项使得显示的每一行都有这个函数库文件名。例如，你要查找&#8220;cos&#8221;这个是在什么地方定义的，大致可以用下面的命令：<br><br>nm -o /lib/* /usr/lib/* /usr/lib/*/* /usr/local/lib/* 2&gt; /dev/null<br>| grep 'cos$'<br>关于nm的更详细的用法我们可以参考info文档，位置是info:binutils#nm。<br>5.2. 特殊函数_init和_fini<br>函数库里面有两个特殊的函数，_init和 _fini，这个我们在前面已经说过了。主要是分别用来初始化函数库和关闭的时候做一些必要的处理，我们可以把自己认为需要的代码放到这两个函数里面，它们分别在函数库被加载和释放的时候被执行。具体说，如果一个函数库里面有一个名字为&#8220;_init&#8221;的函数输出，那么在第一次通过dlopen()函数打开这个函数库，或者只是简单的作为共享函数库被打开的时候，_init函数被自动调用执行。与之相对应的就是_fini函数，当一个程序调用dlclose()去释放对这个函数库的引用的时候，如果该函数库的被引用计数器为0了，或者这个函数库是作为一般的共享函数库被使用而使用它的程序正常退出的时候，_fini就会被调用执行。C语言定义它们的原型如下：<br><br>void _init(void); void _fini(void);<br>当用gcc编译源程序为&#8220;.o&#8221;文件的时候，需要加一个&#8220;-nostartfiles&#8221;选项。这个选项使得C编译器不链接系统的启动函数库里面的启动函数。否则，就会得到一个&#8220;multiple-definition&#8221;的错误。<br>5.3. 共享函数库也可以使脚本（Scripts）<br>GNU的loader允许使用特殊格式的脚本语言来写一个函数库。这对于那些需要间接包含其他函数库的情况还是有用的。例如，下面是一个/usr/lib/libc.so的例子：<br><br>/* GNU ld script Use the shared library, but some functions are only in<br>the static library, so try that secondarily. */GROUP ( /lib/libc.so.6<br>/usr/lib/libc_nonshared.a )<br>更多的信息可以参考texinfo文档中关于ld链接的脚本部分。一般的信息还可以参考: info:ld#Options 和info:ld#Commands，也可以参考info:ld#Option Commands。<br>5.4. GNU libtool<br>如果你正在编译的系统相很方便的移植到其他操作系统下，你可以使用GNU libtool来创建和安装这个函数库。GNU libtool是一个函数库支持的典型的脚本。Libtool隐藏了使用一个可移植的函数库的负责性。Libtool提供了一个可以移植的界面来创建 object文件，链接函数库（静态或者共享的），并且安装这些库。它还包含了libltdl，一个可移植的动态函数库调入程序的wrapper。更多的 详细讨论，可以在http://www.gnu.org/software/libtool/manual.html看到。<br>5.5. 删除一些符号<br>在一个生产的文件中很多符号都是为了debug而包含的，占用了不少空间。如果空间不够，而且这些符号也许不再需要，就可以将其中一些删除。<br>最好的方法就是先正常的生成你需要的 object文件，然后debug和测试你需要的一些东西。一旦你完全测试完毕了，就可以用strip去删除一些不需要的符号了。Strip命令可以使你很方便的控制删除什么符号，而保留什么符号。Strip的具体用法可以参考其帮助文件。<br>另外的方法就是使用GNU ld的选项&#8220;-S&#8221;和&#8220;-s&#8221;;&#8220;-S&#8221;会删除一些debugger的符号，而&#8220;-s&#8221;则是将所有的符号信息都删除。通常我们可以在gcc中加这样的参数&#8220;-Wl,-S&#8221;和&#8220;-Wl,-s&#8221;来达到这个目的。<br>摘要<br>下面是一些例子，例子中我们会使用三种函数库（静态的、共享的和动态加载的函数库）。文件libhello.c是一个函数库，libhello.h 是它的头文件；demo_use.c则是一个使用了libhello函数库的。Script_static和script_dynamic分别演示如何以静态和共享方式使用函数库，而后面的demo_dynamic.c和script_dynamic则表示演示如何以动态加载函数库的方式来使用它。<br>(2002-08-25 17:38:37)<br>By Wing<br>6. 更多的例子<br>下面是一些例子，例子中我们会使用三种函数库（静态的、共享的和动态加载的函数库）。文件libhello.c是一个函数库， libhello.h是它的头文件；demo_use.c则是一个使用了libhello函数库的。Script_static和 script_dynamic分别演示如何以静态和共享方式使用函数库，而后面的demo_dynamic.c和script_dynamic则表示演示如何以动态加载函数库的方式来使用它。<br>6.1. File libhello.c<br><br>/* libhello.c - demonstrate library use. */<br>#include<br>void hello(void)<br>{<br>printf("Hello, library world.<br>");<br>}<br>6.2. File libhello.h<br><br>/* libhello.h - demonstrate library use. */<br>void hello(void);<br>6.3. File demo_use.c<br><br>/* demo_use.c -- demonstrate direct use of the "hello" routine */<br>#include "libhello.h"<br>int main(void)<br>{<br>hello();<br>return 0;<br>}<br>6.4. File script_static<br><br>#!/bin/sh<br># Static library demo<br># Create static library's object file, libhello-static.o.<br># I'm using the name libhello-static to clearly<br># differentiate the static library from the<br># dynamic library examples, but you don't need to use<br># "-static" in the names of your<br># object files or static libraries.gcc -Wall -g -c -o libhello-static.o<br>libhello.c<br># Create static library.ar rcs libhello-static.a libhello-static.o<br># At this point we could just copy libhello-static.a<br># somewhere else to use it.<br># For demo purposes, we'll just keep the library<br># in the current directory.<br># Compile demo_use program file.gcc -Wall -g -c demo_use.c -o demo_use.o<br># Create demo_use program; -L. causes "." to be searched during<br># creation of the program. Note that this command causes<br># the relevant object file in libhello-static.a to be<br># incorporated into file demo_use_static.gcc -g -o demo_use_static<br>demo_use.o -L. -lhello-static<br># Execute the program../demo_use_static<br>6.5. File script_shared<br><br>#!/bin/sh<br># Shared library demo<br># Create shared library's object file, libhello.o.gcc -fPIC -Wall<br>-g -c libhello.c<br># Create shared library.<br># Use -lc to link it against C library, since libhello<br># depends on the C library.gcc -g -shared -Wl,-soname,libhello.so.0 -o<br>libhello.so.0.0 libhello.o -lc# At this point we could just copy<br>libhello.so.0.0 into<br># some directory, say /usr/local/lib.<br># Now we need to call ldconfig to fix up the symbolic links.<br># Set up the soname. We could just execute:<br># ln -sf libhello.so.0.0 libhello.so.0<br># but let's let ldconfig figure it out./sbin/ldconfig -n .<br># Set up the linker name.<br># In a more sophisticated setting, we'd need to make<br># sure that if there was an existing linker name,<br># and if so, check if it should stay or not.ln -sf libhello.so.0<br>libhello.so<br># Compile demo_use program file.gcc -Wall -g -c demo_use.c -o<br>demo_use.o<br># Create program demo_use.<br># The -L. causes "." to be searched during creation<br># of the program; note that this does NOT mean that "."<br># will be searched when the program is executed.gcc -g -o demo_use<br>demo_use.o -L. -lhello<br># Execute the program. Note that we need to tell the program<br># where the shared library is,<br>using LD_LIBRARY_PATH.LD_LIBRARY_PATH="." ./demo_use<br>6.6. File demo_dynamic.c<br><br>/* demo_dynamic.c -- demonstrate dynamic loading and<br>use of the "hello" routine */<br>/* Need dlfcn.h for the routines to<br>dynamically load libraries */<br>#include<br>#include<br>#include<br>/* Note that we don't have to include "libhello.h".<br>&nbsp;&nbsp; However, we do need to specify something related;<br>&nbsp;&nbsp; we need to specify a type that will hold the value<br>&nbsp;&nbsp; we're going to get from dlsym(). */<br>/* The type "simple_demo_function" describes a function that<br>&nbsp;&nbsp; takes no arguments, and returns no value: */<br>typedef void (*simple_demo_function)(void);<br>int main(void)<br>{<br>const char *error;<br>void *module;<br>simple_demo_function demo_function;<br>/* Load dynamically loaded library */<br>module = dlopen("libhello.so", RTLD_LAZY);<br>if (!module)<br>{<br>&nbsp;&nbsp; fprintf(stderr, "Couldn't open libhello.so: %s<br>",dlerror());<br>&nbsp;&nbsp; exit(1);<br>}<br>/* Get symbol */<br>dlerror();<br>demo_function = dlsym(module, "hello");<br>if ((error = dlerror()))<br>{<br>&nbsp;&nbsp; fprintf(stderr, "Couldn't find hello: %s<br>", error);<br>&nbsp;&nbsp; exit(1);<br>}<br>/* Now call the function in the DL library */<br>(*demo_function)();<br>/* All done, close things cleanly */<br>dlclose(module);<br>return 0;<br>}<br>6.7. File script_dynamic<br><br>#!/bin/sh<br># Dynamically loaded library demo<br># Presume that libhello.so and friends have<br># been created (see dynamic example).<br># Compile demo_dynamic program file into an object file.gcc<br>-Wall -g -c demo_dynamic.c<br># Create program demo_use.<br># Note that we don't have to tell it where to search<br>for DL libraries,<br># since the only special library this program uses won't be<br># loaded until after the program starts up.<br># However, we DO need the option -ldl to include the library<br># that loads the DL libraries.gcc -g -o demo_dynamic<br>demo_dynamic.o -ldl<br># Execute the program. Note that we need to tell the<br># program where get the dynamically loaded library,<br># using LD_LIBRARY_PATH.LD_LIBRARY_PATH="." ./demo_dynamic</span>
<img src ="http://www.cnitblog.com/yang55xiaoguang/aggbug/59682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yang55xiaoguang/" target="_blank">可冉</a> 2009-06-28 10:34 <a href="http://www.cnitblog.com/yang55xiaoguang/articles/59682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下DNS服务器的设置</title><link>http://www.cnitblog.com/yang55xiaoguang/articles/59625.html</link><dc:creator>可冉</dc:creator><author>可冉</author><pubDate>Thu, 25 Jun 2009 03:39:00 GMT</pubDate><guid>http://www.cnitblog.com/yang55xiaoguang/articles/59625.html</guid><wfw:comment>http://www.cnitblog.com/yang55xiaoguang/comments/59625.html</wfw:comment><comments>http://www.cnitblog.com/yang55xiaoguang/articles/59625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yang55xiaoguang/comments/commentRss/59625.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yang55xiaoguang/services/trackbacks/59625.html</trackback:ping><description><![CDATA[<p>环境：要设的DNS机子的 IP 34.0.188.99<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网关 34.0.188.250<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子网掩码 255.255.255.0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主机名为 linux.zzw.com<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 域名为 zzw.com</p>
<p>==================================================================</p>
<p>设置本子的IP地址、DNS、主机名</p>
<p>(1)IP地址：修改下面的文件/etc/sysconfig/network-scripts/ifcfg-eth0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEVICE=eth0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ONBOOT=yes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOTPROTO=startic<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPADDR=34.0.188.99<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NETMASK=255.255.255.0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GATEWAY=34.0.188.250</p>
<p>(2)修改本机DNS设置：修改/etc/resolv.conf文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nameserver&nbsp;&nbsp;&nbsp; 34.0.188.99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #把本机的DNS设成34.0.188.99</p>
<p>(3)修改本机的主机名：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a、打开/etc/hosts 文件 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加入下面一行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 34.0.188.99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linux.zzw.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linux<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b、修改/etc/sysconfig/network&nbsp;&nbsp; 文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HOSTNAME = linux.zzw.com</p>
<p>====================================================================</p>
<p>对DNS进行设置</p>
<p>(1)修改/etc/named.config 这个文件<br>##############################################################<br>// generated by named-bootconf.pl</p>
<p>options {<br>directory "/var/named";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义了named要读写文件的路径<br>// query-source address * port 53;<br>};</p>
<p>controls {<br>inet 127.0.0.1 allow { localhost; } keys { rndckey; };<br>};</p>
<p>zone "." IN {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在这个文件中是用zone关键字来定义域区的，一个zone关键字定义一个域区<br>type hint;<br>/*在这里type类型有三种，它们分别是master,slave和hint它们的含义分别是： <br>master:表示定义的是主域名服务器 <br>slave :表示定义的是辅助域名服务器 <br>hint:表示是互联网中根域名服务器 <br>*/ <br>file "named.ca";&nbsp;&nbsp;&nbsp;&nbsp; //用来指定具体存放DNS记录的文件<br>};</p>
<p>zone "localhost" IN {&nbsp;&nbsp;&nbsp;&nbsp; //定义一具域名为localhost的正向区域<br>type master;<br>file "localhost.zone";<br>allow-update { none; };<br>};</p>
<p>zone "0.0.127.in-addr.arpa" IN {&nbsp;&nbsp; //定义一个IP为127.0.0.*的反向域区<br>type master;<br>file "named.local";<br>allow-update { none; };<br>};</p>
<p>zone "zzw.com" IN {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //指定一个域名为zzw.com的正向区域<br>type master;<br>file "zzw.com.db";<br>};</p>
<p>zone "188.0.34.in-addr.arpa" IN {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义一个IP为34.0.188.*反向域区<br>type master;<br>file "34.0.188.db";<br>};</p>
<p>include "/etc/rndc.key";<br>##############################################################<br>红色部分是加上去的，zzw.com设置的是zzw.com这个域的正向搜索文件为zzw.com.db而99.188.0.34.in-addr.arpa设置的是IP地址搜索的反向文件34.0.188.db，这些文件都从directory "/var/named";这里这里设置的/var/named目录调取</p>
<p>&#160;</p>
<p><br>(2)建立正向搜索文件 /var/named/zzw.com.db <br>##############################################################<br>$TTL 83600<br>@ IN SOA linux.zzw.com. root.linux.zzw.com. (<br>/*SOA表示授权开始,上面的IN表示后面的数据使用的是INTERNET标准。而@则代表相应的域名，如在这里代表zzw.com,即表示一个域名记录定义的开始。而linux.zzw.com则是这个域的主域名服务器，而root.linux.zzw.com则是管理员的邮件地址。注意这是邮件地址中用.来代替常见的邮件地址中的@.而SOA表示授权的开始 <br>*/ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2004071601 ; Serial<br>/*本行前面的数字表示配置文件的修改版本，格式是年月日当日修改的修改的次数，每次修改这个配置文件时都应该修改这个数字，要不然你所作的修改不会更新到网上的其它DNS服务器的数据库上，即你所做的更新很可能对于不以你的所配置的DNS服务器为DNS服务器的客户端来说就不会反映出你的更新，也就对他们来说你更新是没有意义的。 <br>*/ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 28800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Refresh<br>/*定义的是以为单位的刷新频率 即规定从域名服务器多长时间查询一个主服务器，以保证从服务器的数据是最新的 */ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Retry<br>/*上面的这个值是规定了以秒为单位的重试的时间间隔，即当从服务试图在主服务器上查询更时，而连接失败了，则这个值规定了从服务多长时间后再试 */ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3600000&nbsp;&nbsp;&nbsp; ; Expire<br>/*上面这个用来规定从服务器在向主服务更新失败后多长时间后清除对应的记录，上述的数值是以分钟为单位的 */ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 86400 )&nbsp;&nbsp;&nbsp; ; Minimum<br>/*上面这个数据用来规定缓冲服务器不能与主服务联系上后多长时间清除相应的记 <br>录 */</p>
<p>@ IN&nbsp;&nbsp; NS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linux.zzw.com.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //指定的是NS记录指向<br>@ IN&nbsp;&nbsp; MX 10 linux.zzw.com.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //指定的是MX记录提向</p>
<p>linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp; 34.0.188.99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //把linux主机指到34.0.188.99<br>my&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp; 34.0.188.39<br>hq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 34.0.188.98<br>www&nbsp;&nbsp; IN&nbsp;&nbsp; CNAME&nbsp;&nbsp; linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //www主机对应linux</p>
<p>/*上面的第一列表示是主机的名字，省去了后面的域。 <br>NS：表示是这个主机是一个域名服务器， <br>A：定义了一条A记录，即主机名到IP地址的对应记录 <br>MX 定义了一邮件记录 <br>CNAME：定义了对应主机的一个别名 */<br>//注：在文件的最后一定要空一行，不然好像会出错<br>##############################################################</p>
<p>&#160;</p>
<p>&#160;</p>
<p>(3)建立反向搜索文件 /var/named/34.0.188.db<br>##############################################################<br>$TTL 83600<br>@ IN SOA linux.zzw.com. root.linux.zzw.com. (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2004071601 ; Serial<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 28800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Refresh<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Retry<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3600000&nbsp;&nbsp;&nbsp; ; Expire<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 86400 )&nbsp;&nbsp;&nbsp; ; Minimum<br>@&nbsp;&nbsp; IN&nbsp;&nbsp; NS&nbsp;&nbsp;&nbsp; linux.zzw.com.<br>@&nbsp;&nbsp; IN&nbsp;&nbsp; MX 10 linux.zzw.com.</p>
<p>&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTR&nbsp;&nbsp;&nbsp;&nbsp; linux.zzw.com.<br>&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTR&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.zzw.com/"><u><font color=#0000ff>www.zzw.com</font></u></a>.<br>&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTR&nbsp;&nbsp;&nbsp;&nbsp; my.zzw.com.<br>&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTR&nbsp;&nbsp;&nbsp;&nbsp; hq.zzw.com.<br>//注域后面一定要加上是"."<br>##############################################################</p>
<p>&#160;</p>
<p>(4)named.ca、localhost.zone、named.local这三个文件基本不用改</p>
<p>&#160;</p>
<p>&#160;</p>
<p>(5)修改 /etc/hosts 文件<br>　　作用：实现与网上其他主要计算机的映射，它通常是当作DNS的备份出现的，也就是说，当DNS系统出现问题的时候才使用Hosts表。</p>
<p>　　实例：</p>
<p>　　 127.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost localhost.localdomain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost</p>
<p>　　 34.0.188.99　　linux.zzw.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linux</p>
<p>　　//由于每台服务器都会有几个域名与IP的对应关系是永久的， 所以Hosts表中存放的应该是它们。</p>
<p>&#160;</p>
<p>&#160;</p>
<p>(6)修改 /etc/resolv.conf 文件<br>　　作用：指定域名服务器的IP和搜索顺序。</p>
<p>　　实例：</p>
<p>　　domain zzw.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义本地域名。</p>
<p>　　search zzw.com</p>
<p>/*简化用户输入的主机名，即当用户输入thj时，使得DNS可以把它成功地解析为linux.zzw.com。它与domain是互斥的，无论谁出现都是用来定义search列表的。*/</p>
<p>　　nameserver 192.168.10.1 <br>　　//定义域名服务器的IP,最多三个，建议一般使用两个。</p>
<p><br></p>
<p>(7) 修改 /etc/hosts.conf 文件<br>　　作用：如何实现hosts表与DNS的关系和接口。</p>
<p>　　实例：</p>
<p>　　 order hosts,bind //解析域名的顺序</p>
<p>　　 multi on //允许一台计算机拥有多个IP</p>
<p>&#160;</p>
<p>完成设置</p>
<p>===================================================================<br>进行测试</p>
<p>[root@linux /]# /etc/rc.d/init.d/named restart&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>执行两次来更改生效</p>
<p>[root@linux /]# tail -f /var/log/messages<br>来查看DNS启动日志</p>
<p>[root@linux /]# nslookup<br>用来测试正向和反向<br>&gt;linux.zzw.com&nbsp;&nbsp;&nbsp; 正向测试<br>&gt;34.0.188.99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 反向测试</p>
<p><br>[root@linux /]# iptables -F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 去掉防火墙</p>
<p><br>[root@linux /]# chkconfig named on&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就可以下次自动起动服务了</p>
<p>&#160;</p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/zzw45/archive/2004/07/17/43591.aspx"><u><font color=#0000ff>http://blog.csdn.net/zzw45/archive/2004/07/17/43591.aspx</font></u></a></p>
<img src ="http://www.cnitblog.com/yang55xiaoguang/aggbug/59625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yang55xiaoguang/" target="_blank">可冉</a> 2009-06-25 11:39 <a href="http://www.cnitblog.com/yang55xiaoguang/articles/59625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 基于红旗Linux系统的DNS的配置与实现</title><link>http://www.cnitblog.com/yang55xiaoguang/articles/59624.html</link><dc:creator>可冉</dc:creator><author>可冉</author><pubDate>Thu, 25 Jun 2009 03:38:00 GMT</pubDate><guid>http://www.cnitblog.com/yang55xiaoguang/articles/59624.html</guid><wfw:comment>http://www.cnitblog.com/yang55xiaoguang/comments/59624.html</wfw:comment><comments>http://www.cnitblog.com/yang55xiaoguang/articles/59624.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yang55xiaoguang/comments/commentRss/59624.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yang55xiaoguang/services/trackbacks/59624.html</trackback:ping><description><![CDATA[<strong>1．DNS简介<br><br></strong>&nbsp;&nbsp;&nbsp; 随着互联网在世界范围的快速发展，网络已经日益走进人们的生活。在TCP/IP网络上，每个设备必须分配一个唯一的地址，计算机在网络上通讯时只能识别如"202.96.134.163"之类的数字地址，而人们在使用网络资源的时候，为了便于记忆和理解，更倾向于使用有代表意义的名称，即域名系统DNS，如www.szptt.net.cn代表深圳之窗网站的域名，这就是为什么当我们打开浏览器，在地址栏中输入如"www.szptt.net.cn"的域名后，就能看到我们所需要的页面。这是因为在我们输入域名后，有一台称为"DNS服务器"的计算机自动把我们的域名"翻译"成了相应的IP地址，然后调出那个IP地址所对应的网页，最后再传回给我们的浏览器，我们才能得到结果。<br>&nbsp;&nbsp;&nbsp; DNS是域名系统(DomainNameSystem)的缩写，在一个TCP/IP架构的网络（例如Internet）环境中，DNS是一个非常重要而且常用的系统，主要的功能就是将人易于记忆的DomainName与人不容易记忆的IPAddress作转换。而上面执行DNS服务的这台网络主机，就可以称之为DNS Server。DNS最常见的版本是BIND--伯克利Internet域名服务器，该服务器称为named。<br><br><strong>&nbsp;&nbsp;&nbsp; 2．资源记录</strong><br><br>&nbsp;&nbsp;&nbsp; 每个DNS数据库都由资源记录构成，资源记录包含与特定主机有关的信息。而每个资源记录通常包含5项，大多数情况下用ACSII文本显示，每条记录一行，格式如下：<br>Domain Time to live Record type Class Record data<br>各项的含义如下：<br>(1)域名（Domain）：该项给出要定义的资源记录的域名，该域通常用来作为域名查询时的关键字。<br>(2)存活期（Timeolive）：在该存活期过后，该记录不在有效。<br>(3)类别（Class）：该项说明网络类型。目前大部分的资源记录都采用"IN"，表明Internet，该域的缺省值为"IN"。<br>(4)记录数据（Record data）：说明和该资源记录相关的信息，通常由资源记录类型来决定。<br>(5)记录类型（Record type）：该项说明资源记录的类型。<br><br><strong>&nbsp;&nbsp;&nbsp; 3．DNS配置步骤<br></strong><br>&nbsp;&nbsp;&nbsp; 我们假定用户建立的DNS服务器所管辖的域名为redflag.com，对应的子网IP地址是10.1.14.0，域名服务器的IP地址为10.1.14.61。配置过程如下：<br>（1）配置启动文件/etc/named.conf<br>&nbsp;&nbsp;&nbsp; 该文件是域名服务器守护进程named启动时读取到内存的第一个文件。在该文件中定义了域名服务器的类型、所授权管理的域以及相应数据库文件和其所在的目录。该文件的内容如下：<br><br><font color=#0000c0>options {<br>directory "/var/named";<br>notify no;<br>forwarders{<br>&nbsp;&nbsp;202.96.134.133;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br>};<br>zone "." IN {<br>type hint;<br>file "named.ca";<br>};<br>zone "0.0.127.in-addr.arpa" IN {<br>type master;<br>file "named.local";<br>allow-update { none; };<br>};<br>zone "redflag.com" IN {<br>type master;<br>file " named.hosts";<br>allow-update { none; };<br>};<br>zone "14.1.10.in-addr.arpa" IN {<br>type master;<br>file "named.10.1.14 ";<br>allow-update { none; };<br>};<br>&nbsp;</font>
<p>&nbsp;&nbsp;&nbsp; 【说明】<br>（a）"directory"指定了dns记录文件的存放目录是/var/named。<br>（b）第一个"zone"语句定义了dns服务器的根域名服务器的信息是从 "name.ca"获得。这个记录文件是系统自带的，不用去改动它。<br>（c）第二个"zone"语句是"回送地址"的数据库文件，文件名是"named.local"。这个记录文件也是系统自带的，不用去改动它。<br>（d）forwarders {202.96.134.133;}，其中202.96.134.133是我这里电信的dns服务器的地址，forwarders参数指明了其后的IP所在的服务器作为备选的dns服务器。也就是说，把本机的dns不能解析的主机发送到这个备选的dns服务器上，让它来进行解析。<br>（e）第三个"zone"和第四个"zone"定义了"redflag.com"这个域和对应的反向查询域。<br>（f）"named.hosts"和"named.10.1.14"是域的记录文件。这两个文件也是自己创建的。<br>（g）在named.conf文件中涉及到的文件名当然也可以自己命名，但是要和/var/named目录下的文件名保持一致。<br>（h）在行"zone "14.1.10.in-addr.arpa" IN {"行中，网络号一定反序写出。<br>（2）创建或保留/var/named/named.ca<br>&nbsp;&nbsp;&nbsp; 在Linux系统上通常在/var/named目录下已经提供了一个named.ca，该文件中包含了Internet的顶层域名服务器，但这个文件通常会有变化，所以建议最好从Inter NIC下载最新的版本。该文件可以通过匿名ftp下载。<br>（3）创建/var/named/named.hosts<br>&nbsp;&nbsp;&nbsp; 该文件指定了域中主机域名同IP地址的映射，内容如下：</p>
<p><br><font color=#0000c0>$TTL&nbsp; 86400<br>@&nbsp;&nbsp;IN&nbsp;SOA&nbsp;a100.redflag.com.&nbsp;root.redflag.com. (<br>&nbsp;&nbsp;&nbsp;2001110600 ; serial<br>&nbsp;&nbsp;&nbsp;28800 ; refresh<br>&nbsp;&nbsp;&nbsp;14400 ; retry<br>&nbsp;&nbsp;&nbsp;3600000 ; expire<br>&nbsp;&nbsp;&nbsp;86400 ; minimum<br>&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;NS&nbsp;a100.redflag.com.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;MX&nbsp;10&nbsp;a100.redflag.com.<br>&nbsp;&nbsp;&nbsp;<br>localhost.&nbsp;IN&nbsp;A&nbsp;127.0.0.1<br>a100&nbsp;&nbsp;IN&nbsp;A&nbsp;10.1.14.61<br>a101&nbsp;&nbsp;IN&nbsp;A&nbsp;10.1.14.62<br>www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;CNAME&nbsp;a100<br></font>&nbsp;<br>&nbsp;&nbsp;&nbsp; 【说明】<br>（a）在文件中所有的记录行（本文件从第10行开始）都要顶行写，前面不能有空格。<br>（b）行"IN NS a100.redflag.com."说明该域的域名服务器，至少应该定义一个。<br>（c）行"IN MX 10 a100.redflag.com."是MX记录，该程序专门处理邮件地址的主机部分为"@redflag.com"的邮件，"10"表示优先级别。<br>（d）类似行"a100 IN A 10.1.14.61"是一系列的"A"记录，表示主机名和IP地址的对应关系建立起来。a100是主机名，10.1.14.61是它的IP地址。<br>（e）行"www IN CNAME a100"表示一条定义别名的记录。即"www.redflag.com"和"a100.redflag.com"表示同一台主机。<br>(4) 创建/var/named/named.10.1.14<br>&nbsp;&nbsp;&nbsp; 该文件主要定义了IP地址到主机名的转换。IP地址到主机名的转换是非常重要的，Internet上很多应用，例如NFS、Web服务等都要用到该功能。该文件的内容如下：</p>
<p><br><font color=#0000c0>$TTL&nbsp; 86400<br>@&nbsp;&nbsp;IN&nbsp;SOA&nbsp;a100.redflag.com.&nbsp;root.a100.redflag.com. (<br>&nbsp;&nbsp;&nbsp;2001110600 ; serial<br>&nbsp;&nbsp;&nbsp;28800 ; refresh<br>&nbsp;&nbsp;&nbsp;14400 ; retry<br>&nbsp;&nbsp;&nbsp;3600000 ; expire<br>&nbsp;&nbsp;&nbsp;86400 ; minimum<br>&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;IN&nbsp;NS&nbsp;a100.redflag.com.<br>61&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;PTR&nbsp;a100.redflag.com.<br>62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;PTR&nbsp;a101.redflag.com.<br></font>&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp; 【说明】<br>（a）PTR记录用于定义IP地址名到主机域名的映射。<br>（b）PTR记录的最后一项必须是一个完整的标识域名，以"."结束。<br>（5）创建/var/named/named.local<br>&nbsp;&nbsp;&nbsp; 该文件用来说明"回送地址"的IP地址到主机名的映射。该文件的内容如下：</p>
<p><br><font color=#0000c0>$TTL&nbsp; 86400<br>@&nbsp;&nbsp;IN&nbsp;SOA&nbsp;a100.redflag.com.&nbsp;root.a100.redflag.com. (<br>&nbsp;&nbsp;&nbsp;2001110600 ; serial<br>&nbsp;&nbsp;&nbsp;28800 ; refresh<br>&nbsp;&nbsp;&nbsp;14400 ; retry<br>&nbsp;&nbsp;&nbsp;3600000 ; expire<br>&nbsp;&nbsp;&nbsp;86400 ; minimum<br>&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;IN&nbsp;NS&nbsp;a100.redflag.com.<br>1&nbsp;&nbsp;IN&nbsp;PTR&nbsp;localhost.<br></font>&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp; 【说明】<br>（a）此文件的内容是特定的，在不同的域的域名服务器上，所要修改的只是SOA记录和NS记录。<br>（b）"PTR"记录的最后域名为完全标识域名，以"."结束。<br>（6） 配置文件/etc/resolv.conf<br>&nbsp;&nbsp;&nbsp; 该文件用来告诉解析器调用的本地域名、域名查找的顺序以及要访问域名服务器的IP地址。该文件的内容如下：<br>domain redflag.com<br>nameserver 10.1.14.61<br>search redflag.com<br>&nbsp;</p>
<p><br>（7）修改/etc/nsswitch.conf<br>&nbsp;&nbsp;&nbsp; 该文件中和域名服务有关的一项是"hosts"。修改如下：<br>hosts: files dns nisplus nis <br>（8）启动DNS<br>&nbsp;&nbsp;&nbsp; /etc/rc.d/init.d/named start或restart<br><br><strong>&nbsp;&nbsp;&nbsp; 4.DNS测试</strong><br><br>&nbsp;&nbsp;&nbsp; DNS测试最常用的是nslookup命令。<br>（1）检查正向DNS<br>（a）查找主机<br><br><font color=#0000c0>[root@redflag root]#nslookup<br>&gt;a100.redflag.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Server:&nbsp;&nbsp;10.1.14.61<br>Address:&nbsp;10.1.14.61#53</font></p>
<p><font color=#0000c0>Name:&nbsp;a100.redflag.com<br>Address: 10.1.14.61<br></font>&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp; 该命令用来查找主机a100.redflag.com的IP地址。<br>如果只输入：<br>&gt;a100<br>nslookup应该能够根据文件/etc/resolv.conf中的定义，自动添加redflag.com的域名，然后显示与上面相同的结果。<br>(b)查找域名信息<br><br><font color=#0000c0>[root@redflag root]#nslookup<br>&gt;set type=ns<br>&gt;redflag.com<br>Server:&nbsp;&nbsp;10.1.14.61<br>Address:&nbsp;10.1.14.61#53<br>redflag.com&nbsp;nameserver = a100.redflag.com.</font><br>&nbsp;</p>
<p><br>（2）检查反向DNS<br>&nbsp;&nbsp;&nbsp; 假如要查找IP地址为10.1.14.61的域名，输入：<br><br><font color=#0000c0>[root@redflag root]#nslookup<br>&gt;set type=ptr<br>&gt;10.1.14.61<br>Server:&nbsp;&nbsp;10.1.14.61<br>Address:&nbsp;10.1.14.61#53<br>61.14.1.10.in-addr.arpa&nbsp;name = a100.redflag.com.</font><br>&nbsp;</p>
<p>（3）检查MX邮件记录<br>&nbsp;&nbsp;&nbsp; 要查找redflag.com域的邮件记录地址，输入：</p>
<p><br><font color=#0000c0>[root@redflag root]#nslookup<br>&gt;set type=mx<br>&gt;redflag.com<br>Server:&nbsp;&nbsp;10.1.14.61<br>Address:&nbsp;10.1.14.61#53<br>redflag.com&nbsp;mail exchanger = 10 a100.redflag.com.<br>&nbsp;</font></p>
<p><br>（4）检查CNAME别名记录<br>&nbsp;&nbsp;&nbsp; 要查找www.redflag.com主机的别名，输入：</p>
<p><br><font color=#0000c0>[root@redflag root]#nslookup<br>&gt;set type=cname<br>&gt;www.redflag.com<br>Server:&nbsp;&nbsp;10.1.14.61<br>Address:&nbsp;10.1.14.61#53<br>www.redflag.com&nbsp;canonical name = a100.redflag.com.</font><br>&nbsp;</p>
<p><strong>5．小结</strong><br>&nbsp;&nbsp;&nbsp; 域名系统（DNS）是一种用于TCP/IP应用程序的分布式数据库，它提供主机名和IP地址之间的转换以及有关电子邮件的路由信息。本文主要讨论的红旗Linux下DNS的配置和测试，该配置已在红旗Linux操作系统上测试通过。 </p>
<img src ="http://www.cnitblog.com/yang55xiaoguang/aggbug/59624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yang55xiaoguang/" target="_blank">可冉</a> 2009-06-25 11:38 <a href="http://www.cnitblog.com/yang55xiaoguang/articles/59624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP状态的变迁(建立连接示意图)</title><link>http://www.cnitblog.com/yang55xiaoguang/articles/59584.html</link><dc:creator>可冉</dc:creator><author>可冉</author><pubDate>Wed, 24 Jun 2009 04:51:00 GMT</pubDate><guid>http://www.cnitblog.com/yang55xiaoguang/articles/59584.html</guid><wfw:comment>http://www.cnitblog.com/yang55xiaoguang/comments/59584.html</wfw:comment><comments>http://www.cnitblog.com/yang55xiaoguang/articles/59584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yang55xiaoguang/comments/commentRss/59584.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yang55xiaoguang/services/trackbacks/59584.html</trackback:ping><description><![CDATA[<p>可以从下图形象地看出：<br>　　<a href="http://blog.s135.com/attachment/200707/tcps.gif" target=_blank><img title=点击在新窗口中浏览此图片 border=0 alt=点击在新窗口中浏览此图片 src="http://blog.s135.com/attachment/200707/tcps.gif"></a>　　<br>　　状态：描述<br>　　CLOSED：无连接是活动的或正在进行<br>　　LISTEN：服务器在等待进入呼叫<br>　　SYN_RECV：一个连接请求已经到达，等待确认<br>　　SYN_SENT：应用已经开始，打开一个连接<br>　　ESTABLISHED：正常数据传输状态<br>　　FIN_WAIT1：应用说它已经完成<br>　　FIN_WAIT2：另一边已同意释放<br>　　ITMED_WAIT：等待所有分组死掉<br>　　CLOSING：两边同时尝试关闭<br>　　TIME_WAIT：另一边已初始化一个释放<br>　　LAST_ACK：等待所有分组死掉<br><br><br></p>
<p>&nbsp;&nbsp;&nbsp; 参考至：<a href="http://blog.s135.com/post/269/"><u><font color=#1b719b>http://blog.s135.com/post/269/</font></u></a></p>
<img src ="http://www.cnitblog.com/yang55xiaoguang/aggbug/59584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yang55xiaoguang/" target="_blank">可冉</a> 2009-06-24 12:51 <a href="http://www.cnitblog.com/yang55xiaoguang/articles/59584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ICMP TYPE CODE 对应表</title><link>http://www.cnitblog.com/yang55xiaoguang/articles/59581.html</link><dc:creator>可冉</dc:creator><author>可冉</author><pubDate>Wed, 24 Jun 2009 04:37:00 GMT</pubDate><guid>http://www.cnitblog.com/yang55xiaoguang/articles/59581.html</guid><wfw:comment>http://www.cnitblog.com/yang55xiaoguang/comments/59581.html</wfw:comment><comments>http://www.cnitblog.com/yang55xiaoguang/articles/59581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yang55xiaoguang/comments/commentRss/59581.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yang55xiaoguang/services/trackbacks/59581.html</trackback:ping><description><![CDATA[<strong>ICMP类型</strong>
<table class=CALSTABLE border=1>
    <thead>
        <tr>
            <th vAlign=top width="11%" align=middle>TYPE</th>
            <th vAlign=top width="11%" align=middle>CODE</th>
            <th vAlign=top width="56%" align=left>Description</th>
            <th vAlign=top width="11%" align=middle>Query</th>
            <th vAlign=top width="11%" align=middle>Error</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>Echo Reply——回显应答（Ping应答）</td>
            <td vAlign=top width="11%" align=middle>x</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>Network Unreachable——网络不可达</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>1</td>
            <td vAlign=top width="56%" align=left>Host Unreachable——主机不可达</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>2</td>
            <td vAlign=top width="56%" align=left>Protocol Unreachable——协议不可达</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="56%" align=left>Port Unreachable——端口不可达</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>4</td>
            <td vAlign=top width="56%" align=left>Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>5</td>
            <td vAlign=top width="56%" align=left>Source routing failed——源站选路失败</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>6</td>
            <td vAlign=top width="56%" align=left>Destination network unknown——目的网络未知</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>7</td>
            <td vAlign=top width="56%" align=left>Destination host unknown——目的主机未知</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>8</td>
            <td vAlign=top width="56%" align=left>Source host isolated (obsolete)——源主机被隔离（作废不用）</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>9</td>
            <td vAlign=top width="56%" align=left>Destination network administratively prohibited——目的网络被强制禁止</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>10</td>
            <td vAlign=top width="56%" align=left>Destination host administratively prohibited——目的主机被强制禁止</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>11</td>
            <td vAlign=top width="56%" align=left>Network unreachable for TOS——由于服务类型TOS，网络不可达</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>12</td>
            <td vAlign=top width="56%" align=left>Host unreachable for TOS——由于服务类型TOS，主机不可达</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>13</td>
            <td vAlign=top width="56%" align=left>Communication administratively prohibited by filtering——由于过滤，通信被强制禁止</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>14</td>
            <td vAlign=top width="56%" align=left>Host precedence violation——主机越权</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="11%" align=middle>15</td>
            <td vAlign=top width="56%" align=left>Precedence cutoff in effect——优先中止生效</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>4</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>Source quench——源端被关闭（基本流控制）</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>5</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>Redirect for network——对网络重定向</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>5</td>
            <td vAlign=top width="11%" align=middle>1</td>
            <td vAlign=top width="56%" align=left>Redirect for host——对主机重定向</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>5</td>
            <td vAlign=top width="11%" align=middle>2</td>
            <td vAlign=top width="56%" align=left>Redirect for TOS and network——对服务类型和网络重定向</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>5</td>
            <td vAlign=top width="11%" align=middle>3</td>
            <td vAlign=top width="56%" align=left>Redirect for TOS and host——对服务类型和主机重定向</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>8</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>Echo request——回显请求（Ping请求）</td>
            <td vAlign=top width="11%" align=middle>x</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>9</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>Router advertisement——路由器通告</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>10</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>Route solicitation——路由器请求</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>11</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>TTL equals 0 during transit——传输期间生存时间为0</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>11</td>
            <td vAlign=top width="11%" align=middle>1</td>
            <td vAlign=top width="56%" align=left>TTL equals 0 during reassembly——在数据报组装期间生存时间为0</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>12</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>IP header bad (catchall error)——坏的IP首部（包括各种差错）</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>12</td>
            <td vAlign=top width="11%" align=middle>1</td>
            <td vAlign=top width="56%" align=left>Required options missing——缺少必需的选项</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="11%" align=middle>x</td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>13</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>Timestamp request (obsolete)——时间戳请求（作废不用）</td>
            <td vAlign=top width="11%" align=middle>x</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>14</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
            <td vAlign=top width="56%" align=left>Timestamp reply (obsolete)——时间戳应答（作废不用）</td>
            <td vAlign=top width="11%" align=middle>x</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>15</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>Information request (obsolete)——信息请求（作废不用）</td>
            <td vAlign=top width="11%" align=middle>x</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>16</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>Information reply (obsolete)——信息应答（作废不用）</td>
            <td vAlign=top width="11%" align=middle>x</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>17</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>Address mask request——地址掩码请求</td>
            <td vAlign=top width="11%" align=middle>x</td>
            <td vAlign=top width="11%" align=middle>&nbsp;<wbr></td>
        </tr>
        <tr>
            <td vAlign=top width="11%" align=middle>18</td>
            <td vAlign=top width="11%" align=middle>0</td>
            <td vAlign=top width="56%" align=left>Address mask reply——地址掩码应答</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnitblog.com/yang55xiaoguang/aggbug/59581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yang55xiaoguang/" target="_blank">可冉</a> 2009-06-24 12:37 <a href="http://www.cnitblog.com/yang55xiaoguang/articles/59581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>inittab详细介绍</title><link>http://www.cnitblog.com/yang55xiaoguang/articles/59562.html</link><dc:creator>可冉</dc:creator><author>可冉</author><pubDate>Tue, 23 Jun 2009 05:12:00 GMT</pubDate><guid>http://www.cnitblog.com/yang55xiaoguang/articles/59562.html</guid><wfw:comment>http://www.cnitblog.com/yang55xiaoguang/comments/59562.html</wfw:comment><comments>http://www.cnitblog.com/yang55xiaoguang/articles/59562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yang55xiaoguang/comments/commentRss/59562.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yang55xiaoguang/services/trackbacks/59562.html</trackback:ping><description><![CDATA[<strong>一、什么是init</strong> <br><br>　　init是Linux系统操作中不可缺少的程序之一。 是一个由内核启动的用户级进程。 <br><br>　　内核启动（已经被载入内存，开始运行，并已初始化所有的设备驱动程序和数据结构等）之后，就通过启动一个用户级程序init的方式来启动其他用户级的进程或服务。所以，init始终是第一个进程（其PID始终为1）。<br><br>　　内核会在过去曾使用过init的几个地方查找它，它的正确位置（对Linux系统来说）是/sbin/init.如果内核找不到init，它就会试着运行/bin/sh，如果运行失败，系统的启动也会失败。<br><strong>二、运行级别<br><br></strong>　　运行级就是操作系统当前正在运行的功能级别。这个级别从1到6，具有不同的功能。其功能级别如下：# 0 - 停机（千万不能把initdefault 设置为0 ）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除此之外还有ABC三个运行级别，但在RHLinux中都没有意义。<br><br>　　这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件，最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中，启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。（这里的n 就是运行级0-6）<br><br><strong>三、运行级别的配置</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行级别的配置是在/etc/inittab行内进行的，如下所示：12 ： 2 ： wait ： / etc / init.d / rc 2各字段解释如下：id：runlevels：action：process id：是一个任意指定的四个字符以内的序列标号，在本文件内必须唯一；使用老版本的libc5（低于5.2.18）或a.out库编译出来的sysvinit限制为2字符。注意：像getty之类的登陆进程必须使id字段与tty编号一致，如tty1需要id=1，许多老版本的登陆进程都遵循这种规则。<br><br>　　runlevels：表示这一行适用于运行那个/些级别（这里是2，可以有多个，表示在相应的运行级均需要运行）；另外sysinit、boot、bootwait这三个进程会忽略这个设置值。<br><br>　　action：表示进入对应的runlevels时，init应该运行process字段的命令的方式，常用的字段值及解释在附录内。例子中的wait表示需要运行这个进程一次并等待其结束。<br><br>　　process：具体应该执行的命令。例子中的/etc/init.d/rc命令启动运行级别2中应该运行的进程/命令，并负责在退出运行级时将其终止（当然在进入的runlevel中仍要运行的程序除外。）<br><br>　　当运行级别改变，并且正在运行的程序并没有在新的运行级别中指定需要运行，那么init会先发送一个SIGTERM 信号终止，然后是SIGKILL.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; action字段告诉init执行的动作，即如何处理process字段指定的进程，action字段允许的值及对应的动作分别为:
<p>　　1)respawn:如果process字段指定的进程不存在，则启动该进程，init不等待处理结束，而是继续扫描inittab文件中的后续进程，当这样的进程终止时，init会重新启动它，如果这样的进程已存在，则什么也不做。</p>
<p>　　2)wait:启动process字段指定的进程，并等到处理结束才去处理inittab中的下一记录项。</p>
<p>　　3)once:启动process字段指定的进程，不等待处理结束就去处理下一记录项。当这样的进程终止时，也不再重新启动它，在进入新的运行级别时，如果这样的进程仍在运行，init也不重新启动它。</p>
<p>　　4)boot:只有在系统启动时，init才处理这样的记录项，启动相应进程，并不等待处理结束就去处理下一个记录项。当这样的进程终止时，系统也不重启它。</p>
<p>　　5)bootwait:系统启动后，当第一次从单用户模式进入多用户模式时处理这样的记录项，init启动这样的进程，并且等待它的处理结束，然后再进行下一个记录项的处理，当这样的进程终止时，系统也不重启它。</p>
<p>　　6)powerfail:当init接到断电的信号(SIGPWR)时，处理指定的进程。</p>
<p>　　7)powerwait:当init接到断电的信号(SIGPWR)时，处理指定的进程，并且等到处理结束才去检查其他的记录项。</p>
<p>　　8)off:如果指定的进程正在运行，init就给它发SIGTERM警告信号，在向它发出信号SIGKILL强制其结束之前等待5秒，如果这样的进程不存在，则忽略这一项。</p>
<p>　　9)ondemand:功能通respawn，不同的是，与具体的运行级别无关，只用于rstate字段是a、b、c的那些记录项。</p>
<p>　　10)sysinit:指定的进程在访问控制台之前执行，这样的记录项仅用于对某些设备的初始化，目的是为了使init在这样的设备上向用户提问有关运行级别的问题，init需要等待进程运行结束后才继续。</p>
<p>　　11)initdefault:指定一个默认的运行级别，只有当init一开始被调用时才扫描这一</p>
<p>init进程是系统中所有进程的父进程，init进程繁衍出完成通常操作所需的子进程，这些操作包括:设置机器名、检查和安装磁盘及文件系统、启动系统日志、配置网络接口并启动网络和邮件服务，启动打印服务等。Solaris中init进程的主要任务是按照inittab文件所提供的信息创建进程，由于进行系统初始化的那些进程都由init创建，所以init进程也称为系统初始化进程。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外:在任何时候，可以在文件inittab中添加新的记录项，级别Q/q不改变当前的运行级别，重新检查inittab文件，可以通过命令init Q或init q使init进程立即重新读取并处理文件inittab <br><br><br>补充：<br>　　<br>　　1、关于进入单用户模式，一般都是采用设置initdefault为1或者在grub/lilo中指定一个&#8220;single&#8221;或&#8220;emergency&#8221; 命令行参数来实现。其实另外还有一个更干净的方法，编辑：kernel /vmlinuz-2.6.9-22.EL ro root=/bin/sh，这样init就直接启动一个shell，其他任何进程都没有启动哦，够干净吧！<br><br>　　2、系统正在运行时，telinit命令可更改运行级别。运行级别发生变化时， init 就会从/etc/inittab运行相应的命令</p>
<img src ="http://www.cnitblog.com/yang55xiaoguang/aggbug/59562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yang55xiaoguang/" target="_blank">可冉</a> 2009-06-23 13:12 <a href="http://www.cnitblog.com/yang55xiaoguang/articles/59562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>