﻿<?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/zhy010/category/4823.html</link><description>service linux</description><language>zh-cn</language><lastBuildDate>Sat, 01 Oct 2011 00:07:16 GMT</lastBuildDate><pubDate>Sat, 01 Oct 2011 00:07:16 GMT</pubDate><ttl>60</ttl><item><title>Linux 指令大全(1)</title><link>http://www.cnitblog.com/zhy010/articles/22821.html</link><dc:creator>张海英</dc:creator><author>张海英</author><pubDate>Thu, 08 Feb 2007 05:27:00 GMT</pubDate><guid>http://www.cnitblog.com/zhy010/articles/22821.html</guid><wfw:comment>http://www.cnitblog.com/zhy010/comments/22821.html</wfw:comment><comments>http://www.cnitblog.com/zhy010/articles/22821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhy010/comments/commentRss/22821.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhy010/services/trackbacks/22821.html</trackback:ping><description><![CDATA[
		<p>cat cd <br />chmod chown <br />cp cut </p>
		<p>名称：cat <br />使用权限：所有使用者 <br />使用方式：cat [-AbeEnstTuv] [--help] [--version] fileName <br />说明：把档案串连接后传到基本输出（萤幕或加 &gt; fileName 到另一个档案） <br />参数： <br />-n 或 --number 由 1 开始对所有输出的行数编号 <br />-b 或 --number-nonblank 和 -n 相似，只不过对于空白行不编号 <br />-s 或 --squeeze-blank 当遇到有连续两行以上的空白行，就代换为一行的空白行 <br />-v 或 --show-nonprinting </p>
		<p>范例： <br />cat -n textfile1 &gt; textfile2 把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里 <br />cat -b textfile1 textfile2 &gt;&gt; textfile3 把 textfile1 和 textfile2 的档案内容加上行号（空白行不加）之后将内容附加到 textfile3 </p>
		<p>名称 : cd <br />使用权限 : 所有使用者 </p>
		<p>使用方式 : cd [dirName] </p>
		<p>说明 : 变换工作目录至 dirName。 其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略，则变换至使用者的 home directory (也就是刚 login 时所在的目录)。 </p>
		<p>另外，"~" 也表示为 home directory 的意思，"." 则是表示目前所在的目录，".." 则表示目前目录位置的上一层目录。 </p>
		<p>范例 : 跳到 /usr/bin/ : <br />cd /usr/bin </p>
		<p>跳到自己的 home directory : <br />cd ~ </p>
		<p>跳到目前目录的上上两层 : <br />cd ../.. </p>
		<p> </p>
		<p>指令名称 : chmod <br />使用权限 : 所有使用者 </p>
		<p>使用方式 : chmod [-cfvR] [--help] [--version] mode file... </p>
		<p>说明 : Linux/Unix 的档案存取权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所存取。 </p>
		<p>把计 : </p>
		<p>mode : 权限设定字串，格式如下 : [ugoa...][[+-=][rwxX]...][,...]，其中u 表示该档案的拥有者，g 表示与该档案的拥有者属于同一个群体(group)者，o 表示其他以外的人，a 表示这三者皆是。 <br />+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。 <br />r 表示可读取，w 表示可写入，x 表示可执行，X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 <br />-c : 若该档案权限确实已经更改，才显示其更改动作 <br />-f : 若该档案权限无法被更改也不要显示错误讯息 <br />-v : 显示权限变更的详细资料 <br />-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更) <br />--help : 显示辅助说明 <br />--version : 显示版本 </p>
		<p>范例 :将档案 file1.txt 设为所有人皆可读取 : <br />chmod ugo+r file1.txt </p>
		<p>将档案 file1.txt 设为所有人皆可读取 : <br />chmod a+r file1.txt </p>
		<p>将档案 file1.txt 与 file2.txt 设为该档案拥有者，与其所属同一个群体者可写入，但其他以外的人则不可写入 : <br />chmod ug+w,o-w file1.txt file2.txt </p>
		<p>将 ex1.py 设定为只有该档案拥有者可以执行 : <br />chmod u+x ex1.py </p>
		<p>将目前目录下的所有档案与子目录皆设为任何人可读取 : <br />chmod -R a+r * </p>
		<p>此外chmod也可以用数字来表示权限如 chmod 777 file <br />语法为：chmod abc file </p>
		<p>其中a,b,c各为一个数字，分别表示User、Group、及Other的权限。 </p>
		<p>r=4，w=2，x=1 <br />若要rwx属性则4+2+1=7； <br />若要rw-属性则4+2=6； <br />若要r-x属性则4+1=7。 </p>
		<p>范例： <br />chmod a=rwx file </p>
		<p>和 <br />chmod 777 file </p>
		<p>效果相同 <br />chmod ug=rwx,o=x file </p>
		<p>和 <br />chmod 771 file </p>
		<p>效果相同 </p>
		<p> </p>
		<p> </p>
		<p>若用chmod 4755 filename可使此程式具有root的权限 </p>
		<p>
				<br />指令名称 : chown <br />使用权限 : root </p>
		<p>使用方式 : chmod [-cfhvR] [--help] [--version] user[:group] file... </p>
		<p>说明 : Linux/Unix 是多人多工作业系统，所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说，这个指令只有是由系统管理者(root)所使用，一般使用者没有权限可以改变别人的档案拥有者，也没有权限可以自己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。 </p>
		<p>把计 : </p>
		<p>user : 新的档案拥有者的使用者 IDgroup : 新的档案拥有者的使用者群体(group)-c : 若该档案拥有者确实已经更改，才显示其更改动作-f : 若该档案拥有者无法被更改也不要显示错误讯息-h : 只对于连结(link)进行变更，而非该 link 真正指向的档案-v : 显示拥有者变更的详细资料-R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)--help : 显示辅助说明--version : 显示版本 </p>
		<p>范例 : <br />将档案 file1.txt 的拥有者设为 users 群体的使用者 jessie : <br />chown jessie:users file1.txt </p>
		<p>将目前目录下的所有档案与子目录的拥有者皆设为 users 群体的使用者 lamport : <br />chmod -R lamport:users * </p>
		<p>
				<br />名称：cp <br />使用权限：所有使用者 </p>
		<p>使用方式： </p>
		<p>cp [options] source dest <br />cp [options] source... directory </p>
		<p>说明：将一个档案拷贝至另一档案，或将数个档案拷贝至另一目录。 </p>
		<p>把计 </p>
		<p>-a 尽可能将档案状态、权限等资料都照原状予以复制。 <br />-r 若 source 中含有目录名，则将目录下之档案亦皆依序拷贝至目的地。 <br />-f 若目的地已经有相同档名的档案存在，则在复制前先予以删除再行复制。 <br />范例： <br />将档案 aaa 复制(已存在)，并命名为 bbb : <br />cp aaa bbb </p>
		<p>将所有的C语言程式拷贝至 Finished 子目录中 : <br />cp *.c Finished </p>
		<p> </p>
		<p>名称：cut </p>
		<p>使用权限：所有使用者 </p>
		<p>用法：cut -cnum1-num2 filename </p>
		<p>说明：显示每行从开头算起 num1 到 num2 的文字。 </p>
		<p>范例： </p>
		<p>shell&gt;&gt; cat example <br />test2 <br />this is test1 <br />shell&gt;&gt; cut -c0-6 example ## print 开头算起前 6 个字元 <br />test2 <br />this i </p>
		<p>
				<br />名称 : find <br />用法 : find <br />使用说明 : </p>
		<p>将档案系统内符合 expression 的档案列出来。你可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合，只有完全相符的才会被列出来。 </p>
		<p>find 根据下列规则判断 path 和 expression，在命令列上第一个 - ( ) , ! 之前的部份为 path，之后的是 expression。如果 path 是空字串则使用目前路径，如果 expression 是空字串则使用 -print 为预设 expression </p>
		<p>expression 中可使用的选项有二三十个之多，在此只介绍最常用的部份。 </p>
		<p>-mount, -xdev : 只检查和指定目录在同一个档案系统下的档案，避免列出其它档案系统中的档案 <br />-amin n : 在过去 n 分钟内被读取过 <br />-anewer file : 比档案 file 更晚被读取过的档案 <br />-atime n : 在过去 n 天过读取过的档案 <br />-cmin n : 在过去 n 分钟内被修改过 <br />-cnewer file :比档案 file 更新的档案 <br />-ctime n : 在过去 n 天过修改过的档案 <br />-empty : 空的档案-gid n or -group name : gid 是 n 或是 group 名称是 name <br />-ipath p, -path p : 路径名称符合 p 的档案，ipath 会忽略大小写 <br />-name name, -iname name : 档案名称符合 name 的档案。iname 会忽略大小写 <br />-size n : 档案大小 是 n 单位，b 代表 512 位元组的区块，c 表示字元数，k 表示 kilo bytes，w 是二个位元组。-type c : 档案类型是 c 的档案。 <br />d: 目录 <br />c: 字型装置档案 <br />b: 区块装置档案 <br />p: 具名贮列 <br />f: 一般档案 <br />l: 符号连结 <br />s: socket <br />-pid n : process id 是 n 的档案 </p>
		<p>你可以使用 ( ) 将运算式分隔，并使用下列运算。 <br />exp1 -and exp2 <br />! expr <br />-not expr <br />exp1 -or exp2 <br />exp1, exp2 <br />范例: <br />将目前目录及其子目录下所有延伸档名是 c 的档案列出来。 <br /># find . -name "*.c" </p>
		<p>
				<br />将目前目录其其下子目录中所有一般档案列出 <br /># find . -ftype f </p>
		<p>
				<br />将目前目录及其子目录下所有最近 20 分钟内更新过的档案列出 <br /># find . -ctime -20 </p>
		<p> </p>
		<p>名称：less </p>
		<p>使用权限：所有使用者 </p>
		<p>使用方式： </p>
		<p>less [Option] filename </p>
		<p>说明： <br />less 的作用与 more 十分相似，都可以用来浏览文字档案的内容，不同的是 less 允许使用者往回卷动 <br />以浏览已经看过的部份，同时因为 less 并未在一开始就读入整个档案，因此在遇上大型档案的开启时，会比一般的文书编辑器(如 vi)来的快速。 </p>
		<p>
				<br />范例： </p>
		<p>
				<br />指令名称 : ln <br />使用权限 : 所有使用者 </p>
		<p>使用方式 : ln [options] source dist，其中 option 的格式为 : </p>
		<p>[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}] <br />[--help] [--version] [--] <br />说明 : Linux/Unix 档案系统中，有所谓的连结(link)，我们可以将其视为档案的别名，而连结又可分为两种 : 硬连结(hard link)与软连结(symbolic link)，硬连结的意思是一个档案可以有多个名称，而软连结的方式则是产生一个特殊的档案，该档案的内容是指向另一个档案的位置。硬连结是存在同一个档案系统中，而软连结却可以跨越不同的档案系统。 <br />ln source dist 是产生一个连结(dist)到 source，至于使用硬连结或软链结则由参数决定。 </p>
		<p>不论是硬连结或软链结都不会将原本的档案复制一份，只会占用非常少量的磁碟空间。 </p>
		<p>
				<br />-f : 链结时先将与 dist 同档名的档案删除-d : 允许系统管理者硬链结自己的目录-i : 在删除与 dist 同档名的档案时先进行询问-n : 在进行软连结时，将 dist 视为一般的档案-s : 进行软链结(symbolic link)-v : 在连结之前显示其档名-b : 将在链结时会被覆写或删除的档案进行备份-S SUFFIX : 将备份的档案都加上 SUFFIX 的字尾-V METHOD : 指定备份的方式--help : 显示辅助说明--version : 显示版本 <br />范例 : <br />将档案 yy 产生一个 symbolic link : zz <br />ln -s yy zz </p>
		<p>将档案 yy 产生一个 hard link : zz <br />ln yy xx </p>
		<p> </p>
		<p>名称：locate <br />使用权限：所有使用者 <br />使用方式： locate [-q] [-d ] [--database=] <br />locate [-r ] [--regexp=] <br />locate [-qv] [-o ] [--output=] <br />locate [-e ] [-f ] &lt;[-l ] [-c] <br />&lt;[-U ] [-u]&gt; <br />locate [-Vh] [--version] [--help] <br />说明： <br />locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的资料库，之后当寻找时就只需查询这个资料库，而不必实际深入档案系统之中了。 </p>
		<p>在一般的 distribution 之中，资料库的建立都被放在 contab 中自动执行。一般使用者在使用时只要用 </p>
		<p># locate your_file_name </p>
		<p>的型式就可以了。 参数： <br />-u <br />-U </p>
		<p>建立资料库，-u 会由根目录开始，-U 则可以指定开始的位置。 </p>
		<p>-e </p>
		<p>将 <br />排除在寻找的范围之外。 </p>
		<p>-l <br />如果 是 1．则启动安全模式。在安全模式下，使用者不会看到权限无法看到的档案。这会始速度减慢，因为 locate 必须至实际的档案系统中取得档案的权限资料。 </p>
		<p>-f <br />将特定的档案系统排除在外，例如我们没有到理要把 proc 档案系统中的档案放在资料库中。 </p>
		<p>-q <br />安静模式，不会显示任何错误讯息。 </p>
		<p>-n <br />至多显示 个输出。 </p>
		<p>-r <br />使用正规运算式 做寻找的条件。 </p>
		<p>-o <br />指定资料库存的名称。 </p>
		<p>-d </p>
		<p>指定资料库的路径 </p>
		<p>-h <br />显示辅助讯息 </p>
		<p>-v <br />显示更多的讯息 </p>
		<p>-V <br />显示程式的版本讯息 范例： </p>
		<p>locate chdrv : 寻找所有叫 chdrv 的档案 <br />locate -n 100 a.out : 寻找所有叫 a.out 的档案，但最多只显示 100 个 <br />locate -u : 建立资料库 </p>
		<p>
				<br />名称 : ls <br />使用权限 : 所有使用者 </p>
		<p>使用方式 : ls [-alrtAFR] [name...] </p>
		<p>说明 : 显示指定工作目录下之内容（列出目前工作目录所含之档案及子目录)。 </p>
		<p>
				<br />-a 显示所有档案及目录 (ls内定将档案名或目录名称开头为"."的视为隐藏档，不会列出) <br />-l 除档案名称外，亦将档案型态、权限、拥有者、档案大小等资讯详细列出 <br />-r 将档案以相反次序显示(原定依英文字母次序) <br />-t 将档案依建立时间之先后次序列出 <br />-A 同 -a ，但不列出 "." (目前目录) 及 ".." (父目录) <br />-F 在列出的档案名称后加一符号；例如可执行档则加 "*", 目录则加 "/" <br />-R 若目录下有档案，则以下之档案亦皆依序列出 </p>
		<p>范例： <br />列出目前工作目录下所有名称是 s 开头的档案，愈新的排愈后面 : <br />ls -ltr s* </p>
		<p>将 /bin 目录以下所有目录及档案详细资料列出 : <br />ls -lR /bin </p>
		<p>列出目前工作目录下所有档案及目录；目录于名称后加 "/", 可执行档于名称后加 "*" : <br />ls -AF </p>
		<p>名称：more <br />使用权限：所有使用者 <br />使用方式：more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..] <br />说明：类似 cat ，不过会以一页一页的显示方便使用者逐页阅读，而最基本的指令就是按空白键（space）就往下一页显示，按 b 键就会往回（back）一页显示，而且还有搜寻字串的功能（与 vi 相似），使用中的说明文件，请按 h 。 <br />参数：-num 一次显示的行数 <br />-d 提示使用者，在画面下方显示 [Press space to continue, q to quit.] ，如果使用者按错键，则会显示 [Press h for instructions.] 而不是 哔 声 <br />-l 取消遇见特殊字元 ^L（送纸字元）时会暂停的功能 <br />-f 计算行数时，以实际上的行数，而非自动换行过后的行数（有些单行字数太长的会被扩展为两行或两行以上） <br />-p 不以卷动的方式显示每一页，而是先清除萤幕后再显示内容 <br />-c 跟 -p 相似，不同的是先显示内容再清除其他旧资料 <br />-s 当遇到有连续两行以上的空白行，就代换为一行的空白行 <br />-u 不显示下引号 （根据环境变数 TERM 指定的 terminal 而有所不同） <br />+/ 在每个档案显示前搜寻该字串（pattern），然后从该字串之后开始显示 <br />+num 从第 num 行开始显示 <br />fileNames 欲显示内容的档案，可为复数个数 <br />范例： <br />more -s testfile 逐页显示 testfile 之档案内容，如有连续两行以上空白行则以一行空白行显示。 <br />more +20 testfile 从第 20 行开始显示 testfile 之档案内容。 </p>
		<p>
				<br />名称：mv <br />使用权限：所有使用者 </p>
		<p>使用方式： </p>
		<p>mv [options] source dest <br />mv [options] source... directory <br />说明：将一个档案移至另一档案，或将数个档案移至另一目录。 <br />参数：-i 若目的地已有同名档案，则先询问是否覆盖旧档。 </p>
		<p>范例： </p>
		<p>将档案 aaa 更名为 bbb : <br />mv aaa bbb </p>
		<p>将所有的C语言程式移至 Finished 子目录中 : <br />mv -i *.c </p>
		<p> </p>
		<p>名称：rm <br />使用权限：所有使用者 </p>
		<p>使用方式：rm [options] name... </p>
		<p>说明：删除档案及目录。 </p>
		<p>把计 </p>
		<p>-i 删除前逐一询问确认。 <br />-f 即使原档案属性设为唯读，亦直接删除，无需逐一确认。 <br />-r 将目录及以下之档案亦逐一删除。 <br />范例： <br />删除所有C语言程式档；删除前逐一询问确认 : <br />rm -i *.c </p>
		<p>将 Finished 子目录及子目录中所有档案删除 : <br />rm -r Finished </p>
		<p> </p>
		<p>名称：rmdir <br />使用权限：于目前目录有适当权限的所有使用者 </p>
		<p>使用方式： rmdir [-p] dirName </p>
		<p>说明： 删除空的目录。 </p>
		<p>参数： -p 是当子目录被删除后使它也成为空目录的话，则顺便一并删除。 </p>
		<p>范例： </p>
		<p>将工作目录下，名为 AAA 的子目录删除 : <br />rmdir AAA </p>
		<p>在工作目录下的 BBB 目录中，删除名为 Test 的子目录。若 Test 删除后，BBB 目录成为空目录，则 BBB 亦予删除。 <br />rmdir -p BBB/Test </p>
		<p> </p>
		<p>名称：split <br />使用权限：所有使用者 </p>
		<p>使用方式：split [OPTION] [INPUT [PREFIX]] </p>
		<p>说明： </p>
		<p>将一个档案分割成数个。而从 INPUT 分割输出成固定大小的档案，其档名依序为 PREFIXaa, PREFIXab...；PREFIX 预设值为 `x。若没有 INPUT 档或为 `-，则从标准输入读进资料。 </p>
		<p>匡兜 </p>
		<p>-b, --bytes=SIZE </p>
		<p>SIZE 值为每一输出档案的大小，单位为 byte。 <br />-C, --line-bytes=SIZE </p>
		<p>每一输出档中，单行的最大 byte 数。 <br />-l, --lines=NUMBER </p>
		<p>NUMBER 值为每一输出档的列数大小。 <br />-NUMBER </p>
		<p>与 -l NUMBER 相同。 <br />--verbose </p>
		<p>于每个输出档被开启前，列印出侦错资讯到标准错误输出。 <br />--help </p>
		<p>显示辅助资讯然后离开。 <br />--version </p>
		<p>列出版本资讯然后离开。 <br />SIZE 可加入单位: b 代表 512， k 代表 1K， m 代表 1 Meg。 </p>
		<p>范例： </p>
		<p>PostgresSQL 大型资料库备份与回存： </p>
		<p>因 Postgres 允许表格大过你系统档案的最大容量，所以要将表格 dump 到单一的档案可能会有问题，使用 split进行档案分割。 </p>
		<p>
				<br />% pg_dump dbname | split -b 1m - filename.dump. </p>
		<p> </p>
		<p>重新载入 </p>
		<p>
				<br />% createdb dbname <br />% cat filename.dump.* | pgsql dbname </p>
		<p> </p>
		<p>名称：touch <br />使用权限：所有使用者 </p>
		<p>使用方式： <br />touch [-acfm] <br />[-r reference-file] [--file=reference-file] <br />[-t MMDDhhmm[[CC]YY][.ss]] <br />[-d time] [--date=time] [--time={atime,access,use,mtime,modify}] <br />[--no-create] [--help] [--version] <br />file1 [file2 ...] </p>
		<p>
				<br />说明： <br />touch 指令改变档案的时间记录。 ls -l 可以显示档案的时间记录。 </p>
		<p>
				<br />参数： <br />a 改变档案的读取时间记录。 <br />m 改变档案的修改时间记录。 <br />c 假如目的档案不存在，不会建立新的档案。与 --no-create 的效果一样。 <br />f 不使用，是为了与其他 unix 系统的相容性而保留。 <br />r 使用参考档的时间记录，与 --file 的效果一样。 <br />d 设定时间与日期，可以使用各种不同的格式。 <br />t 设定档案的时间记录，格式与 date 指令相同。 <br />--no-create 不会建立新档案。 <br />--help 列出指令格式。 <br />--version 列出版本讯息。 </p>
		<p>
				<br />范例： </p>
		<p>
				<br />最简单的使用方式，将档案的时候记录改为现在的时间。若档案不存在，系统会建立一个新的档案。 </p>
		<p>touch file <br />touch file1 file2 </p>
		<p>将 file 的时间记录改为 5 月 6 日 18 点 3 分，公元两千年。时间的格式可以参考 date 指令，至少需输入 MMDDHHmm ，就是月日时与分。 </p>
		<p>touch -c -t 05061803 file <br />touch -c -t 050618032000 file </p>
		<p>将 file 的时间记录改变成与 referencefile 一样。 </p>
		<p>touch -r referencefile file </p>
		<p>将 file 的时间记录改成 5 月 6 日 18 点 3 分，公元两千年。时间可以使用 am, pm 或是 24 小时的格式，日期可以使用其他格式如 6 May 2000 。 </p>
		<h1>touch -d "6:03pm" file <br />touch -d "05/06/2000" file <br />touch -d "6:03pm 05/06/2000" file </h1>
<img src ="http://www.cnitblog.com/zhy010/aggbug/22821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhy010/" target="_blank">张海英</a> 2007-02-08 13:27 <a href="http://www.cnitblog.com/zhy010/articles/22821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二十年来 UNIX 的发展史</title><link>http://www.cnitblog.com/zhy010/articles/22820.html</link><dc:creator>张海英</dc:creator><author>张海英</author><pubDate>Thu, 08 Feb 2007 05:24:00 GMT</pubDate><guid>http://www.cnitblog.com/zhy010/articles/22820.html</guid><wfw:comment>http://www.cnitblog.com/zhy010/comments/22820.html</wfw:comment><comments>http://www.cnitblog.com/zhy010/articles/22820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhy010/comments/commentRss/22820.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhy010/services/trackbacks/22820.html</trackback:ping><description><![CDATA[
		<p>早期历史</p>
		<p>Thompson和Ritchie在1973年Purdue大学召开的操作系统原理研讨会上，发表了第一篇关于UNIX的论文。那时伯克利分校的Bob Fabry教授也在场，他立刻对UNIX产生兴趣，并得到一份拷贝，准备在伯克利做实验。</p>
		<p>当时，伯克利分校仅有几台大型主机做批处理工作。因此，伯克利的计算机科学系、数学系和统计系联合订购了一台能够运行当时最新的第四版UNIX的 PDP - 11/45。1974年1月，UNIX第四版磁带交付学校使用，并被研究生Keith Standiford安装到这台机器上。</p>
		<p>那时，有太多系统需要Thompson维护，但在Purdue大学的Thompson还是没有直接参与伯克利UNIX系统的安装。由于在伯克利安装的系统出现几次奇怪的系统崩溃，这样一来就需要他这样的专家来解决问题。因为伯克利仅有一台300波特的声频偶合式调制解调器，且没有应答功能， Thompson不得不先通过电话通知在机房Standiford，让他将电话线插入调制解调器中，通过这种方法，Thompson得以在新泽西州对崩溃的系统进行远程调试、除错。</p>
		<p>系统多次崩溃是由于硬盘控制器不能进行重叠性搜索引起的。相对于普通的文档搜索不同，伯克利的PDP- 11/45是Thompson遇到的第一批在同一个控制器上有两个硬盘的计算机。Thompson的远程除错也是伯克利和贝尔实验室合作的一个例子。贝尔实验室积极肯干的研究人员乐于助人，同时也和伯克利分享工作成果，这在很大程度上促进伯克利软件的改进工作。</p>
		<p>尽管Unix很快能够运行，并且比较稳定。但计算机系、数学系和统计系开始出现矛盾——数学系和统计系想要运行DEC的RSTS系统。争论之后，他们达成协议：每个系可以每班运行8小时的计算机系统；Unix可以在运行RSTS系统16小时后，再运行8小时。为公平起见，运行的时间段为每天轮换。因此，第一天Unix运行从上午 8点到下午4点，然后是第二天的下午4点到午夜，而后是第三天的凌晨到上午8点。尽管有这样离奇的时间安排，参加学习操作系统课程的学生仍然喜欢在 Unix而不是批处理机上做项目。</p>
		<p>早期的发行版本</p>
		<p>此间，对Pascal编译器的错误恢复工作的兴趣使得这一工作被引入了对系统的需求。1977年初, Joy完成了“伯克利发行版(Berkeley Software Distribution)”。这个发行版本包括Pascal系统，以及存放在在Pascal源码的晦涩的子目录下的ex编辑器。又过了一年，作为发行组的秘书的Joy，发放了大约三十份免费的系统拷贝。</p>
		<p>随着提供指向显示缓冲区指针功能的ADM-3a终端的出现，Joy最终完成了屏幕编辑器vi，给Berkeley带来了全屏幕编辑器。他很快发现自己处在进退两难的境地。在学校，经费不足是常有的事，旧的设备根本就没有替换掉。他决定放弃进行代码优化和修改几个终端的支持工作，转而通过使用一个小的解释器去重画屏幕，籍此来改善屏幕管理。这个解释器通过描述终端的特性来驱动，这最终导致了termcap的产生。</p>
		<p>到1978年中期，软件的发行版已经开始过时，需要修改。对于Pascal系统，日益增长的用户群体反馈了很多意见，根据反馈的意见修改后的系统更加稳定，同时也修改为两遍扫描，使其可以在PDP-11/34上运行，修改的结果定名为“伯克利发行第二版(Second Berkeley Software Distribution)”很快被缩写为2BSD，它包括了增强的Pascal系统，vi编辑器和几个终端的termcap在内。Bill Joy再次独自作了发行版软件的集成，答复用户的电话，并且把客户的反馈也集中在系统中。一年后，又发行了75份系统。然而，接下来的一年Joy转向另一个项目，而2BSD发布还在进行。其最终版本为2.11BSD，是一个至今仍运行在世界各个角落的几百台PDP-11上的完整的系统。</p>
		<p>VAX Unix</p>
		<p>1978年初，Richard Fateman教授开始寻找拥有更大地址空间的机器，以继续支持他在Macsyma上的研究工作(最初开始于PDP-10)。新发布的VAX- 11/780满足了要求，并出现在预算中。Fateman和三十个同事一同向NSF(美国国家科学基金会，译注)提出建议，并购买了一台VAX。</p>
		<p>最初VAX运行DEC的VMS操作系统，但系里一直在使用Unix环境，并希望继续用下去。因此，在VAX交付之后不久，Fateman获得了一份贝尔实验室John Reiser和Tom London移植到VAX上的Unix——32/V。</p>
		<p>尽管32/V在VAX上提供了第七版Unix环境，但它没有利用VAX硬件的虚拟内存功能。如同它在PDP-11上运行的先驱一样，它是完全基于交换的系统。对于Berkeley的Macsyma研究组来说，没有虚拟内存意味着进程的地址空间只能局限于物理内存，在新的VAX上，他的大小是一兆字节。</p>
		<p>为了解决这一问题，Fateman找到了Domenico Ferrari教授，Berkeley系统学科部成员，来研究为Unix编写虚拟内存支持的可能性。Ozalp Babaoglu，Ferrari的学生之一，开始着手研究在VAX上实现页面系统，由于VAX没有引用位，他的工作遇到了难题。</p>
		<p>在Babaoglu接近完成他的第一个实现的时候，他找到了Bill Joy，以寻求在理解错综复杂的Unix内核中遇到的困难的帮助。Joy由于Bill Joy而对这些工作产生了兴趣，并加入到将这些代码集成到32/V，以及后续的调试工作中。</p>
		<p>不幸的是，Berkeley只有一台VAX，同时用于系统的开发和日常工作。因此，在圣诞节假期的几周内，富有耐心的用户群体发现他们交替地登录到了 32/V和“Virtual VAX/Unix”上。他们的工作经常在后面的系统中突然地挂起，几分钟之后，32/V的登录提示再次出现。1979年1月，绝大多数问题得到了修正，而 32/V正式成为历史。</p>
		<p>Joy认识到32-位VAX很快就会让16-位的PDP-11果实，于是开始将2BSD的软件移植到VAX上。当我和Peter Kessler移植Pascal系统时，Joy移植了ex和vi编辑器，C Shell，以及2BSD中的无数小程序。1979年年底，完整的发行版被集成到了一起。这个发行版包括了虚拟内存内核、标准的32/V实用程序，以及 2BSD新增加的功能。1979年12月，Joy发行了3BSD的近百份拷贝，这是Berkeley在VAX上的第一个发行版。</p>
		<p>贝尔实验室发行的最后一个Unix版本是32/V；其后，所有的AT&amp;T Unix版本，从System III开始，以及其后的System V，转而由一个强调稳定的商业发行版本的小组继续维护。随着Unix的商业化，Bell实验室无法继续作为Unix研究的清静所在。随着研究团体对 Unix的继续修改，它发现需要一个能够制作研究性发行版本的组织。由于对Unix的早期影响，Berkeley很快进入了原先由贝尔实验室扮演的角色。</p>
		<p>DARPA(美国国防部高级研究局)的支持</p>
		<p>同时，DARPA部门的策划人的讨论对Berkeley的工作产生了重要影响。DARPA早期成功的计划是把他们的主要研究中心连在一起，形成一个全国的计算机网络。与此同时，他们也在这些研究中心寻找已到寿命的计算机，并且换掉它们。然而，比巨大的替换开销还大的是把研究的软件移植到新的计算机上。另外，由于硬件和操作系统的多样性，使得很多主机之间不能共享软件。</p>
		<p>选择一个单一硬件的卖主是不契合实际的，因为研究小组对多种类型的计算机需要和不能单一的依靠一个制造商。然而，DARPA的决策者决定最好的方案在于操作系统的统一。经过多次讨论之后，由于Unix已被证实的可移植性，被选定为操作系统的标准。</p>
		<p>1979年秋，Bob Fabry回应DARPA的关于移向Unix建议，向Berkeley提议，开发一个为DARPA团队使用的3BSD增强版本。Fabry 带着他的建议去参加DARPA图象处理的会议和约见VLSI的承包人，一同去的还有ARPAnet开发者Bolt，Beranek，以及Newman的代表。当时还为Berkeley能否开发一个工作系统心存怀疑；然而，1979年十二月3BSD的发布打消了他们的顾虑。</p>
		<p>由于3BSD 版本实现了他的承诺，3BSD声誉也随着大大提高，因此Bob Fabry和DARPA签定了一份在1980四月生效的长约18个月的合同。在这份合同的赞助下，Bob Fabry组建了名为“计算机系统研究小组”的组织，或者简写为CSRG。他很快雇佣了Laura Tong处理项目的管理。Fabry把他的注意力转向寻找一位能够管理软件开发的项目经理。Fabry以为已经通过Ph.D.资格考试的Joy，宁愿完成他的学位也不肯当软件开发的职位，然而Joy又有了其他的计划。三月上旬的一个晚上，Joy达电话往Fabry家里打电话，表示对掌管Unix进一步发展感兴趣。尽管这个提议使 Fabry很吃惊，但Fabry梢加考虑就答应了。</p>
		<p>项目进展的的很顺利。Tong建立一套发行系统，能够使从Joy早先发行版处理大量的定单。Fabry开始同AT&amp;T的Bob Guffy以及加洲大学的律师合作，制定使用者需要同意使用Unix的条款。Joy将Jim Kulp作业控制机制，还有自动重启动功能，1K-块文件系统，并且支持新型VAX-11/750。到了1980年十月，优化后的系统4BSD发布，包括 Pascal编译器、Franz的Lisp系统，和增强的邮件处理系统。在它9个月的生命周期中，大约卖出150份系统拷贝。许可的管理是通过以公共机构为单位的，而不是以每台机器来收费的；因此这个版本运行在500台以上的机器上。</p>
		<p>随着发行版本大量增加，Berkeley Unix的可见性增加。几个评论评论家开始评论BSD。斯坦福研究院的工作人员撰写了一篇主要关于VMS和Berkeley Unix运行测试结果的论文，这些测试结果表明VAX运行Unix的几个严重问题。Joy看到这篇论文，立刻把未来的计划搁置了几个月，着手调整内核。几周以后，他基于Kashtan的测试结果回复一篇文章，表明Unix可以很好地运行在VMS机器上。</p>
		<p>4BSD不断发行的同时，仍然处于细微的调整阶段。增加Robert Elz的自动配置代码之后的系统，于1981年6月发布，这个版本称为4.1BSD。在它两年多的生存周期内，大约发行了400份。原计划称为5BSD版本，然而，AT&amp;T反对此事，宣称顾客可能会把它和商业Unix——System V混淆。所以，为了解决这个争端，Berkeley答应在未来版本命名计划中，主版本号停留在4BSD，只增加次版本号。</p>
		<p>4.2BSD</p>
		<p>随着4.1BSD版本的发行，很多关于性能的疑虑被解决。DARPA非常满意合同的结果。以致于又同Berkeley签定一份两年期的合同，而且这次的基金很多，大约是原来的5倍。这部分资金一半用来资助Unix项目，余下的分给计算机科学系的几个其他研究员。合同要求，主要工作放在系统研究上，以便 DARPA的研究人员可以很好地进行他们的工作。</p>
		<p>由于DARPA团队的要求，确定了新的工作，并且开始据此对系统进改进。特别地，新系统希望包含能够适应新的硬盘技术的快速文件系统、支持GB级的进程地址空间、提供灵活的交互处理通讯机制，以支持在分布式系统下的研究工作，并且集成网络支持，这样能够使运行新系统的机器都很容易地连到 ARPAnet。</p>
		<p>为了帮助确定新系统的方案，Duane Adams作为DARPA在Berkeley合同的监督人，组织了“筹划指导委员会”协助指导设计工作，确保研究DARPA的要求得到满足。这个委员会在 1981年4月到1983年6月，共开了两次大会。委员会包括Bob Fabry、Bill Joy，和Berkeley的Sam Leffler、Alan Nemeth和Bolt的Rob Gurwitz、Beranek和Newman，贝尔实验室的Dennis Ritchie，斯坦福(Stanford)大学的Keith Lantz、卡内基梅隆(Carnegie-Mellon)大学的Rick Rashid，麻省理工(MIT)的Bert Halstead、Information Sciences Institute的Dan Lynch、Duane Adams和DARPA的Bob Baker，以及加洲大学洛杉矶分校的Jerry Popek。1984年初，这些会议被由更多人参加的主题讨论会取代。</p>
		<p>1981年7月，在新系统中建议包含特性的原始文档交给“筹划指导委员会”和其他不在Berkeley的人那里，引起了很长时间的讨论。这年夏天，我成为 CSRG的成员，并且参与实现新的文件系统。整个夏天，Joy一直集中设计进程间通讯机制的原型。1981年秋，Sam Leffler也作为全职人员加入CSRG，同Bill Joy一起工作。</p>
		<p>当Rob Gurwitz released在Berkeley发布早期的TCP/IP协议，而Joy则把它集成到系统中并优化了其性能。在这项工作中，Joy和Leffler发现新系统不应该只针对DARPA的标准网络协议，还应该支持更多协议。因此，他们重新设计了软件的内部结构，精炼了多个网络协议的接口，以便这些网络协议可以同时使用。</p>
		<p>随着内部结构重建的完成，和TCP/IP被集成到IPC功能的原型中，还写了几个简单的程序，让本地用户可以存取远程资源。它们是熟知的rcp、 rsh、 rlogin和rwho。它们是作为暂时性工具设计的，以至日后可以被其他更合理的工具替换（所以在命令前加了一个”r”）。这个系统，称为4.1a，初次发行是在1982年4月，且仅供内部用户使用，也没有期望它广泛应用，然而它却加速人们对4.2 版本的渴望。</p>
		<p>系统4.1a在它完成之前就过时了。但是，用户提供反馈有价值的信息，被用来建立一个修订计划“4.2BSD系统使用手册”。这份文档在1982年2月发行，其中包含将在4.2BSD中实现的为系统调用功能提供的接口的简要描述。</p>
		<p>4.1a开发的同时，我完成了新文件系统。在1982年6月，我把它完整地集成到4.1a的内核中。新系统称为4.1b，只运行在 Berkeley 选定的几台用于开发的机器上。Joy感觉一个面临较大改动的系统连内部发行都应尽量避免，特别是这个变动需要将每台机器的文件系统转储并恢复，以完成 4.1a 到 4.1b的转换。在证实新的文件系统能够稳定运行之后，Leffler立即着手进行增加有与新的文件系统有关的系统调用的工作，而Joy主要完成交互通讯机制的修订。</p>
		<p>1982年暮春，Joy宣布他将参加Sun公司。夏天过后，他将工作分开，一部分时间为Sun工作，另一部分时间为 Berkeley工作，他花费大量时间对交互通讯机制进行修订，而且重新组织Unix核心以减小对机器的依赖问题。Joy离开后，Leffler接管整个项目的开发工作。开发的最后截止期限已经被确定，而且Berkeley已经答应DARPA团队1983年春天完成发行版本。由于时间紧迫，对剩余的工作进行了完成评估，而且而且设置优先级别。特别地，增强交互通讯机制和虚拟内存中最复杂的部份都降低优先级（后来完全被搁置）。同时，由于Unix团体的期望高涨，Berkeley认为在最终版本发行之前，有必要分布一个过渡版本。这个系统被称为4.1c，于1983年4月发布；许多厂商准备将4.2BSD移植到他们的硬件上。从4.1c版本开始，Pauline Schwartz被雇来管理发行工作。</p>
		<p>1983年6月，Bob Fabry把CSRG管理权交给Domenico Ferrari和Susan Grahamturned，并开始度假，以解放他4年来疯狂的生活节奏。Leffler继续完成系统，实现新的信号机制，增加了网络支持，重做了单独的输入／输出系统以简化安装程序，整合来自Robert Elz的磁盘配额机制，更新所有的文档，修复了自4.1c版以来的bug。在1983年8月，4.2BSD发布。</p>
		<p>当4.2BSD发布不久，Leffler离开Berkeley去了Lucasfilm，他的职务被Mike Karels取代。Karels早期发行2.9BSD PDP的经验，给他的新工作提供理想的背景。在我完成博士学位之后，1984年12月，我作为全职工作人员参加了CSRG，同Karels一起工作。</p>
		<p>4.2BSD的流行让人印象深刻。在发行的18个月内，签发了1000多份站点许可。随后，又发行大量4.2BSD的发行版，可以说其数量超过以前发行版数量的总和。大部份Unix厂商移植4.2BSD系统到他们的硬件上，而不是移植AT&amp;T的商用System V。因为System V既没有网络也没有Berkley快速文件系统。BSD版的Unix在商用领域占优势的地位长达几年。4.2BSD的改进逐渐被集成到System V中，厂商逐渐又转而移植System V，不过，后来的BSD开发成果仍然继续被System V引进。</p>
		<p>4.3BSD</p>
		<p>4.1BSD发行不久，很快招致多方面批评。大部份人抱怨系统运行太慢。这个问题 并不令人惊讶，因为新的功能还没有被优化，许多内核中的数据结构和新的功能不能协调工作。Karels和我的第一年完全花费优化系统上。</p>
		<p>在花费二年时间调整系统和精炼网络代码之后, 我们如预期的1985年夏天，6月在Usenix会议上宣布了发布4.3BSD的消息。然而我们的发行计划被BBN突然中止。他们及时地指出我们从未用他们的最终网络代码修改4.2BSD，相反，我们仍然在使用他们早先给我们的初始模型，这个模型其后经过了大量的修改。他们向DARPA抱怨，预想的情况应该是Berkeley实现接口，BBN实现协议。因此Berkeley应该在4.3BSD中用BBN设计的TCP/IP代码。</p>
		<p>Mike Karels得到了BBN的代码，而且做了自从代码被传递到Berkeley以后的工作进行了评估。他决定最好的计划是把BBN代码的优秀思想结合到 Berkeley代码基础中，但是不要替换Berkeley代码。理由有Berkeley代码已经在4.2BSD中广泛地测试和进行了很大改进。然而，折中处理，他提出两者都包括在4.3BSD的发行版本中，让用户在内核挑选使用那种代码。</p>
		<p>检讨Mike Karels的决定之后，DARPA确定发行二个代码基础，那会导致不必要的互操作问题，决定只发布一套代码。为了要决定使用哪中代码作为基础，他们把两者都给Ballistics研究实验室Mike Muuse，作为第三方评估者。在一月评估之后，报告Berkeley代码更有效率，而BBN代码处理阻塞比较好。更重要的一点，Berkeley 代码在各种测试中都能很好地通过，BBN代码在高负荷条件下会菪机。DARPA最后决定，4.3BSD应该使用Berkeley代码基矗</p>
		<p>修改一新的4.3BSD最后在1986年6月发布。就向预期的一样，它平息了多数用户的抱怨，就像4.1BSD平息了多数用户对4BSD的抱怨一样。虽然大部份厂商已经开始转向System V，但是4.3BSD的大部份成果还是集成到他们的系统之内，特别是网络子系统。</p>
		<p>在1986 年10月，Keith Bostic参加了CSRG。他的任务是完成在他的早先工作之上一个项目，要把4.3BSD移植到PDP-11。虽然Karels和我都认为它不太可能，在VAX编译成250 Kbytes的系统，并且能满足PDP-11的64 KB的地址空间的要求。但是，我们还是同意Bostic 可以实现他的这有设想。令我们吃惊的是，移植非常成功，他在PDP-11上使用一组复杂的叠加集合和附加处理。其结果是2.11BSD的发布。该系统由 Casey Leedom和Bostic完成，在1998年仍然在一些PDP-11远行这个系统。同时，显然易见VAX体系已经达成生命的晚年，是该开始考虑在其他的机器上运行流行的BSD时候了。Computer Consoles公司这时制造了一种叫做Power 6/32的新体系的计算机。不幸的是，当公司决定改变它的策略方向的时候，该体系不被支持。然而，他们确实为CSRG提供了能够完成我们工作的一些机器。于是Bill Joy开始，从整个BSD内核中分离依赖机器的那部分代码。这个工作的结果是，1988年6月发布4.3BSD-Tahoe。Tahoe来自 Computer Consoles开发过程中所有的一个名字，他们原本打算将它用于Power 6/32机器上。虽然Power 6/32 机器生命周期很短，但它对BSD向其他机器移植，分离内核代码工作有宝贵的价值。</p>
		<p>Networking, Release 1</p>
		<p>4.3BSD-Tahoe的发布时，所有的BSD用户必须事先得到AT&amp;T的一份源代码的许可，因为Berkeley从来没有只发行二进的 BSD 系统；发行版本完全包含系统每个部分的原代码。Unix系统和BSD系统的历史显示原代码具有强大的威力。用户不是消极地使用系统, 而是积极地修改臭虫，改良性能和完善功能，甚至完全地增加新的特征。</p>
		<p>随着AT&amp;T原代码许可费用逐渐增加，那些想要用BSD 代码为PC市场开发仅以TCP/IP为基础的网络产品的厂商，发现为每个二进制版本付费是不可能的。因此，他们要求Berkeley把网络代码和实用工具分离出来，在许可条款下，提供该他们，而不再需要AT&amp;T的原代码许可。显然易见，TCP/IP 网络代码不包含在32/V中，完全由Berkeley和它的支持者开发。BSD早期的网络代码和支持工具在1989年6月开始发布，即 Networking, Release 1，首次由Berkeley 发行的可自由再发布的代码。</p>
		<p>那许可条款很宽泛。获得许可的人可以发行被修改的代码，不论是以源代码还是二进制的形式发行，Berkeley都不会计较。唯一的要求是源文件中必须包含完整的版权声明，在产品的文档中指明产品中包含来自来加州的大学和它的贡献者的代码。尽管这样，Berkeley还是对每盘磁带收取$1,000 费用，任何人都可以从已经得到磁带的人那里免费的到副本。的确，一些大的站点在其发布不久，就建立匿名ftp供人免费下载。由于许可条款很宽泛，大约有几百个组织购买了磁带，发行费用可以帮助进一步项目的发展，CSRG当然很高兴。</p>
		<p>4.3BSD-Reno</p>
		<p>同时，基础系统的发展仍在继续。虚拟内存系统接口第一次在4.2BSD体系描述文件中出现，最终的已实现。大多数情况下，CSRG总是试着寻找存在的代码然后整和，而不是从头写起。如此，并非设计一个新的虚拟存储系统，我们四处寻找存在的替代方案。我们的第一选择是在Sun公司的SunOS下出现的虚拟存储系统。虽然有关Sun公司对Berkeley贡献代码的一些讨论，但是还是不了而止。因此，我们的第二个选项，卡内基梅隆大学的Mach操作系统的虚拟存储系统被集成到系统中。Utah大学的Mike Hibler将Mach的核心技术同4.2BSD体系中的接口合并(也是被SunOS使用的接口)合并。</p>
		<p>那时，在系统中，另一个主要附加的是同Sun公司兼容的网络文件系统(NFS)。CSRG再一次得以避免实际编写NFS代码，这次集成工作是由加拿大的Geulph大学的Rick Macklem完成的。</p>
		<p>虽然我们仍然没有完成预发行版本4.4BSD的所有性能，但是CSRG决定发行一个过渡版本，目的是得到新系统的反馈和经验。这个许可过渡版本被叫做 4.3BSD-Reno，在1990年初发行。版本的名字来自内华达州一座大的赌博城市中的一个斜的记念物，提醒用户运行这个版本是一场赌博。</p>
		<p>Networking, Release 2</p>
		<p>在我们一次每周的团体会议上，Keith Bostic提出可再发布网络版本的普及性的主题，建议发行包含更多BSD代码的扩充版本。Mike Karels和我指出，发行系统的大部份是一件艰巨的工作，但是我们同意，如果他能够重新分类实现几百个实用程序和庞大的C语言库函数，那么我们会处理内核。事实上Karels和我私下里感觉讨论已经结束。</p>
		<p>不过，这并没有阻碍Bostic在技术上的探索和大量网络基础上的开发工作。他还要求其他成员依据新发布的Unix实用程序。作为补偿，他们仅要求他们的名字和Berkeley贡献者的名字同时在实用程序中列出。工作进展很慢，而且大部分是一些琐细的实用程序。但是同样完成实用程序列表不断变大，而且 Bostic继续寻找贡献者(例如Usenix的公开场合)，贡献者的人数继续增长。很快列表超过过了100多个公用程序，而且在18个月内几乎所有重要的使用程序都被完全重写。</p>
		<p>后来，Bostic带着实用程序列表进入Mike Karels和我的办公室，想要知道我们正在核心上的工作进展。我们重新分配工作，Karels，Bostic和我花费以后的几个月详细察检查整个发行版本，一个文件一个文件地删除来自32/V版本的代码。当工作将近结束的时候，我们发现还有六个核心文件，且没有必要重写。我们考虑重写那六个文件，以便我们可以发行一个完全的系统。我们决定改为发行现有的系统，然而，我们需要得到大学行政部门高层人员的许可。经过内部讨论之后，并验证了我们对代码的所有权问题，我们提前发行了新版本。</p>
		<p>我们起初的想法是，为我们的的第二个可自由再发行的系统起个全新的名字。然而,我们看到大学律师写的新版许可证，那样完全没有必要，而且可能浪费时间。因此，我们决定对Networking Release 1的许可证进行修订，并且以Networking Release 2来发行我们的系统。就这样，我们在1991年六月发行了扩展后的系统。这个版本的费用同第一版的一样。与以往相同，几百个个人和组织以每份拷贝 $1,000的费用从Berkeley得到它的副本。</p>
		<p>Networking Release 2和完整系统的差别不断减小，在发行的六月内，Jolitz已经重写了六个不太重要的文件。他随后就发行了完全编译基于PC体系，可启动的系统。 Jolitz的386/BSD完全在网络上发行。他搭建了匿名FTP，以便用户可以免费下载。在几个星期内，他有了大量的追随者。</p>
		<p>不幸的是，由于全职工作的需要，Jolitz不能把所有的时间用于修改BUG和提高386/BSD系统性能。因此386/BSD发行几个月之内，一群热心的 386/BSD使用者形成了NetBSD用户组，汇集他们的资源，帮助维护和增强后来的系统。他们的发行的系统就是著名的NetBSD 分支。NetBSD团体选择尽可能地支持大量的体系，延续CSRG的研究风格来发展系统。直到1998年，他们的发布还仅仅限于网络；没有提供发行媒体。他们团体主要目标仍是核心技术用户。NetBSD项目的站点是<a href="http://www.netbsd.org">http://www.netbsd.org</a>。</p>
		<p>FreeBSD团体在 NetBSD团体成立几个月之后成立，其宗旨是仅支持个人计算机体系，并追求数量更多(较少技术化)的改进，同Linux作法十分相象。他们精心的设计安装脚本，以低廉的价格的CD-ROM发行他们的系统。易于安装和疯狂的网络促销、以及在Comdex大会的表演导致快速的，大量的发行。不可否认， FreeBSD是所有Networking Release 2分支中发行最多的系统。</p>
		<p>FreeBSD也曾为Linux的流行而苦恼，因此FreeBSD平台加入Linux模拟模式。这个特征允许FreeBSD使用者运行大量的 Linux程序。同时，也促进FreeBSD系统向更加健壮，高兼容性和高性能方向发展。最近，团体开设了一个FreeBSD商城，把FreeBSD社区的许多部份连接起来，包括商业服务、产品、书籍和新闻报道。</p>
		<p>在1990年代中期，OpenBSD从NetBSD团体中分离出来。他们的技术上的宗旨瞄准增强系统的安全。他们的推广重点在使系统更容易使用和更广泛地获得。因此，他们开始生产并销售CD-ROM——这一FreeBSD最先采用的发行方式。关于OpenBSD项目的更多信息，可以在 OpenBSD.org找到。</p>
		<p>诉讼</p>
		<p>在一些组织免费地发放Networking Release 2的磁带的同时，成立了一家公司，Berkeley Software Design公司，主要从事发行提供商业支持的代码的事务(关于这家公司的详细情况清参考他们的网站<a href="http://www.bsdi.com">http://www.bsdi.com</a>)。和其他群体一样，他们开始追加缺少的那6个文件，像Bill Jolitz为386/BSD发行版作的那样。BSDI从1992年1月开始以$995的价格出售他们的系统，包括源代码和编译好的代码。他们于是开始发布广告，吹捧他们的系统相对System V包含源代码的二进制系统之间99%的差价。有兴趣的读者可以拨打1-800-ITS-Unix。</p>
		<p>BSDI开始他们的销售战之后不久，他们就收到了来自Unix系统实验室(USL, 一个基本上属于AT&amp;T的，开发和销售Unix的机构)。这封信要求他们停止以“Unix”的名义推广他们的产品，包括他们“欺骗性的”电话号码。虽然电话号码很快被停用，而且他们的公告也解释了他们的产品和Unix只见的区别，USL仍然不满意，并且撰写了起诉书，要求禁止BSDI出售他们的产品。起诉书宣称BSDI出售的产品中含有属于USL的代码。USL同时要求在诉讼宣判之前，中止BSDI的销售，声称BSDI继续销售会给USL造成不可挽回的损失。</p>
		<p>调查听证会中，BSDI指出他们只是简单地使用了来自加州大学的免费发行的代码，以及六个附加的文件。他们愿意就这六个文件展开调查，但不希望承担加州大学发行的代码的责任。法官同意了BSDI的主张，并通知USL他们需要修改他们的起诉书，否则将驳回起诉。认识到针对六个文件的起诉将没有意义， USL决定重新撰写起诉书，起诉BSDI和加州大学。和他们先前作的一样，USL要求加州大学停止发布Networking Release 2，当然，也包括BSDI公司的商业产品。</p>
		<p>由于禁令的迫近，人们开始积极地准备。CSRG的所有成员和BSDI几乎所有的雇员都宣誓作证。律师们针锋相对,互不相让。Keith Bostic和我不得不亲自撰写材料，我自己也不得不为各种陈词写上几百页的材料。</p>
		<p>1992年12月，美国众议院新泽西州选区法官Dickinson R. Debevoise受理了关于发布禁令的要求。尽管法官通常会立即发布禁令，但他认为这样的禁令需要经过深思熟虑。六周后的一个星期五，他签署了一份四十页的意见，表示他拒绝禁令，并驳回除两条之外的其他主张。余下的两条诉求被局限于最近的版权和可能泄漏商业机密的问题。他建议这一案件应当在联邦法院之前被州立法院系统受理。</p>
		<p>加州大学根据这一决定，立即在周一提出对USL的反诉。除了加利福尼亚州之外，大学还为联邦法庭的诉讼进行了准备。宪法要求所有州的文件必须在一个州准备，以防止诉讼者自己带着厚重的提包为准备50份材料——每州一份。其结果是，如果USL希望在联邦法庭对大学提起诉讼，他们必须在加州，而不是新泽西做同样的事情。</p>
		<p>大学的诉讼声称USL没有尽到作为BSD代码作者尽到的责任，因为System V中BSD代码的署名权已经在先前的许可证中规定了。如果这项主张被证明是有效的，那么大学要求USL重印他们所有的手册，并在主要出版物，如华尔街时报、财富杂志刊登整夜的广告以通知整个商业界。</p>
		<p>其后不久，USL被Novell从AT&amp;T买走。Novell的CEO, Ray Noorda，公开表示他宁可在市场上，而不是在法庭上进行较量。1993年夏谈判开始，然而不幸的是，双方都已经陷得很深，以至于谈判进行的异常缓慢。最后，USL一边在Ray Noorda的领导下在一些关键问题上做出了让步，最终于1994年1月达成了协议，其结果是组成Networking Release 2的18,000个文件中的3个被删除，并对其他一些文件进行了细微的修改。同时，加州大学同意在大约70个文件中加入USL的版权，尽管他们仍然被免费分发。</p>
		<p>4.4BSD</p>
		<p>曲折之后，一个新版本4.4BSD-Lite在1994年6月发布。其许可条款同 Networking releases一样。特别地，条款允许以源代码和二进制的形式自由发行,只要完整保留加洲大学版权声明，并且其他人使用时也能得到这个版权声明。同时，发行完全的系统4.4BSD-Encumbered版本, 仍然需要使用者有一份USL源代码许可。</p>
		<p>纠纷结果还规定：USL不得控告任何使用4.4BSD-Lite作为他们系统的基础的组织。如此,那时所有发行BSD的团体，包括BSDI， NetBSD 和FreeBSD，必须以4.4BSD-Lite作为他们的代码来源，然后整合系统，提高系统性能。虽然这次重新以4.4BSD-Lite为基础延误了各个团体开发系统的时间，但更幸运的是，Networking Release 2发行三年内，如同CSRG一样，各个分支团体的开发工作必须重新同步。</p>
		<p>4.4BSD-Lite, Release 2</p>
		<p>由 4.4BSD-Encumbered 和 4.4BSD-Lite release版本发行得到的经费，用来赞助一个兼职的工作人员，来修改臭虫和提高系统性能。这样长达二年的工作，持续到臭虫的比率一直下降和性能已不能提高为止。最终的改变促成4.4BSD-Lite版本在1995年6月发行。这些大多数的变化都是以后其他系统的源代码的基矗</p>
		<p>4.4BSD-Lite第二版的发布以后，CSRG同时也被解散。在领航BSD的二十多年中，我们感觉应该让其在新思想和无限的热情中生存和发展。当它可能有单一集中的权威监督系统发展像是最好的时候，用一些团体不同的特许状的主意确定那许多不同的接近将会被尝试。因为系统被以来源代码形式发行, 最好的结果就是它能够容易地被其他团体接受。如果某些改变特别地有效，他们可能最后变成占优势的系统。</p>
		<p>今天，开源软件运动正在得到更多的注意和尊敬。虽然Linux系统非常有名，但是其中大约一半以上的程序都来自BSD的发行版本。Linux发布很严重地依赖编译器、调试器以及其他由自由软件基金会所写的开发工具。</p>
		<p>总而言之，CSRG，自由软件基金会（Free Software Foundation）和Linux内核开发者已经投身开源软件运动，并以此建立了基础平台。我很骄傲有机会提倡开源软件运动。我盼望有一天，无论身处何处的用户和公司在开发和购买软件的时候都愿意采取这种方式。</p>
<img src ="http://www.cnitblog.com/zhy010/aggbug/22820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhy010/" target="_blank">张海英</a> 2007-02-08 13:24 <a href="http://www.cnitblog.com/zhy010/articles/22820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>走向Linux高手之路---教你编译内核</title><link>http://www.cnitblog.com/zhy010/articles/22819.html</link><dc:creator>张海英</dc:creator><author>张海英</author><pubDate>Thu, 08 Feb 2007 05:20:00 GMT</pubDate><guid>http://www.cnitblog.com/zhy010/articles/22819.html</guid><wfw:comment>http://www.cnitblog.com/zhy010/comments/22819.html</wfw:comment><comments>http://www.cnitblog.com/zhy010/articles/22819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhy010/comments/commentRss/22819.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhy010/services/trackbacks/22819.html</trackback:ping><description><![CDATA[
		<p style="TEXT-INDENT: 2em">
				<b>下载源代码</b>
		</p>
		<p style="TEXT-INDENT: 2em">Linux内核总是不断发展的，最新的内核Kernel2.6.0对USB2.0予以正式的支持，以及内核模块文件后缀最显著的一个变化由*.o到*.ko等等，我们可以从www.kernel.org下载到tarball的源代码包。 </p>
		<p style="TEXT-INDENT: 2em">
				<b>前期准备</b>
		</p>
		<p style="TEXT-INDENT: 2em">大家都知道的要先升级“module-init-tools“软件包，否则的话，等你安装内核模块文件的时候，系统会提示你：Warning: you may need to install module-init-tools See http://www.codemonkey.org.uk/post-h...4.21-23.src.rpm。 </p>
		<p style="TEXT-INDENT: 2em">进入下载目录下并安装: </p>
		<p style="TEXT-INDENT: 2em" mce_keep="true"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table class="" cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
						<tbody>
								<tr>
										<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>　　#rpm -e --nodeps modutils （强行卸载原有的modutilsRPM包）
　　#rpm -ivh modutils-2.4.21-23.src.rpm （把源代码包安装到了
    /usr/src/redhat目录下）
　　#cd /usr/src/redhat/SPECS （进入规范文件目录下）
　　#rpmbuild --bb modutils.spec （生成二进制的RPM包）
　　#cd ../RPMS/i386 （转入刚生成的二进制的RPM包所在位置）
　　#rpm -ivh modutils*.rpm （刚生成两个[modutils-2.4.21-23.i386.rpm
    与modutils-debuginfo-2.4.21.23.i386.rpm]二进制的RPM包，一起安装吧！）</ccid_code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>　　 
<p style="TEXT-INDENT: 2em">因为是在RedHat9.0的平台，RedHat的用户可能还会遇到一些麻烦，我会慢慢说的，除了要以上的升级之外，还有个文件（/etc/rc.d/rc.sysinit）可能有缺陷，因为/proc/ksyms文件在新内核（Kernel2.6.0)中已经没有了，打开文件命令如下： </p><p style="TEXT-INDENT: 2em" mce_keep="true"> </p><center><ccid_nobr></ccid_nobr><table class="" cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"><pre><ccid_code>　　#vi /etc/rc.d/rc.sysinit
　　找到：
　　if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2&gt;/dev/null
    &amp;&amp; [ -f /proc/ksyms ]; then
　　USEMODULES=y
　　fi
　　替换成：
　　if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2&gt;/dev/null; then
　　USEMODULES=y
　　fi</ccid_code></pre></td></tr></tbody></table></center>　　 
<p style="TEXT-INDENT: 2em">也就是把“&amp;&amp; [ -f /proc/ksyms ]”去掉，保存文件（操作之前最好做备份以免删错，这个文件是系统初始脚本，重要的很），这样子内核才能加载模块，当然能启动iptable防火墙了，否则防火墙在新内核中启动时红色的“failed“非常醒目。（请在新内核中核查/proc/sys/kernel/modprobe中的内容是不是： /sbin/modprobe，也可手工注入指令：#echo "/sbin/modprobe" &gt; /proc/sys/kernel/modprobe）。下面开始构造新内核。 </p><p style="TEXT-INDENT: 2em"><b>一、准备源代码</b></p><p style="TEXT-INDENT: 2em">1、下载到tarball包之后，将内核tarball包复制到/usr/src目录下，假定包在当前目录中，运行以下命令： </p><p style="TEXT-INDENT: 2em">#cp linux-2.6.0.tar.gz /usr/src </p><p style="TEXT-INDENT: 2em">2、转到/usr/src目录并解开tarball包。 </p><p style="TEXT-INDENT: 2em" mce_keep="true"> </p><center><ccid_nobr></ccid_nobr><table class="" cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"><pre><ccid_code>　　#cd /usr/src
　　#tar xvzf linux-2.6.0.tar.gz</ccid_code></pre></td></tr></tbody></table></center><p style="TEXT-INDENT: 2em">3、如果你还下载了补丁包，则打上补丁，你也可以运行scripts/patch-kernel脚本文件自动打上补丁（准备好补丁包）或 #zcat patch-2.6.0.gz|patch -p1。 </p><p style="TEXT-INDENT: 2em"><b>二、定制内核</b></p><p style="TEXT-INDENT: 2em">定制内核是门很大的学问，需要大量的硬件知识，特别是2.6.0的内核，如果你从 2.4.N配置文件装载进去的，的确，很多人遇到过麻烦。我是重新配置文件（X窗口服务器进行），配制内核之前请清理源代码树，如果还没有进入 /usr/src/linux-2.6.0目录，请进入此目录，命令如下： </p><p style="TEXT-INDENT: 2em" mce_keep="true"> </p><center><ccid_nobr></ccid_nobr><table class="" cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"><pre><ccid_code>　　#make mrproper (刚解开的tarball包不需此步骤）
　　#make gconfig (需要Gtk开发库的支持）
　　或make config
　　或make xconfig(需要Qt开发库的支持)</ccid_code></pre></td></tr></tbody></table></center><p style="TEXT-INDENT: 2em">　　 </p><p style="TEXT-INDENT: 2em">注意：如果你是ext3文件系统，则在定制内核配置文件时把对Ext3、Ext2文件的支持直接编译进内核，否则，等你启用新内核时机器就会当掉，出错信息如下：kernel panic : no init found ,try passing init = option to kernel......或者是：kernel panic:VFS:Unable to mount root fs on unknown-block(0,0),我一开始不知道，编译了好几次，系统总给我冷板凳坐，最后把对Ext3、Ext2文件系统的支持直接编译进内核，才解决此问题，还有把对“Module unloading“选项也选上，否则的话，你在新内核环境下无法卸载内核模块（rmmod命令不能用）。 </p><p style="TEXT-INDENT: 2em"><b>三、编译内核及模块</b></p><p style="TEXT-INDENT: 2em">定制好的内核配置文件（/usr/src/linux- 2.6.0/.config)之后，激动的时刻到来了，编译内核及模块，#make (此命令已完成make bzImage及make modules的工作）,bzImage内核文件在arch/i386/boot目录中，你的CPU不同内核文件存放位置也不同，我是Intel的 CPU。 </p><p style="TEXT-INDENT: 2em">注意：我在RedHat7.2平台时曾出现无法编译的出错信息，出错信息如下: </p><p style="TEXT-INDENT: 2em" mce_keep="true"> </p><center><ccid_nobr></ccid_nobr><table class="" cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"><pre><ccid_code>　　/tmp/cc2Hu7sH.s:3: Error: Unknown pseudo-op: `.incbin'
　　make[1]: *** [usr/initramfs_data.o] Error 1
　　make: *** [usr] Error 2，</ccid_code></pre></td></tr></tbody></table></center><p style="TEXT-INDENT: 2em">　　 </p><p style="TEXT-INDENT: 2em">重新装了个9.0的才解决此问题。说明：make命令在我的1.6GHz，128MB的机器上跑了足足27分钟。 </p><p style="TEXT-INDENT: 2em"><b>四、安装模块及内核文件</b></p><p style="TEXT-INDENT: 2em">#make modules_install install </p><p style="TEXT-INDENT: 2em">以上这个命令可以分解成make modules_install与make install，make modules_install安装内核模块到/lib/modules/2.6.0下。make install完成mkinitrd命令及内核（bzImage)和System.map的拷贝，请查看/boot目录，文件名是有区别的，如是GRUB 引导器，make install命令已帮你自动修改了引导选项，对于LILO则要手工修改，重写引导记录。 </p><p style="TEXT-INDENT: 2em">说明：make modules_install install这个命令在我的1.6GHz,128M的机器上只跑了三十几秒，很快的哦。 </p><p style="TEXT-INDENT: 2em"><b>五、后记</b></p><p style="TEXT-INDENT: 2em">最后的工作就是重启系统（#shutdown -r now),检验一下你的劳动成果吧。差点忘了还有一点，可能对你很重要，进入新内核之后我发现rpm命令不能用了，原来这是RPM的一个Bug，特别是对于RH9的用户，请打开/etc/profile文件，命令如下： </p><p style="TEXT-INDENT: 2em" mce_keep="true"> </p><center><ccid_nobr></ccid_nobr><table class="" cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"><pre><ccid_code>　　#vi /etc/profile （在文件的末尾加上几句如下）
　　if [`uname -r`="2.6.0" ];then
　　export LD_ASSUME_KERNEL=2.2.5
　　fi</ccid_code></pre></td></tr></tbody></table></center><p style="TEXT-INDENT: 2em">　　 </p><p style="TEXT-INDENT: 2em">也就是给系统加上一个全局的环境变量，也可直接键入#export LD_ASSUME_KERNEL=2.2.5。 </p><p style="TEXT-INDENT: 2em">使用新内核可能出现的问题及对策： </p><p style="TEXT-INDENT: 2em">1、新内核根本起不来，解决方法：重新配置内核（学问挺大），也许还根引导记录有关（很少了）。 </p><p style="TEXT-INDENT: 2em">2、新内核模块无法加载，会导致很多问题，比如了防火墙没法工作了，mount不上光盘和vfat及ntfs文件系统，其解决方法：升级module-init-tools软件包（我是modutils-2.4.21- 23.src.rpm包），RedHat的用户可能还要修改/etc/rc.d/rc.sysinit文件。 </p><p style="TEXT-INDENT: 2em">3、RedHat用户rpm命令不能使用，解决办法：请把变量在全局配置文件中声明。</p><img src ="http://www.cnitblog.com/zhy010/aggbug/22819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhy010/" target="_blank">张海英</a> 2007-02-08 13:20 <a href="http://www.cnitblog.com/zhy010/articles/22819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>