<fly>享受开源,享受自由………</fly>
-
如何判定你是否具备有学习Linux的素质{8.26修改版}【转】
2007-09-21 00:54:06
很高兴这篇文章受到广大Linux学习者的关注,各大网站也转载了这篇文章,本人现将对本文进行一次新的修改,本次修改主要是针对当初写作匆忙观点遗漏及不足,力求语言简洁通顺,观点明确,最重要的是考虑到尚未学习Linux的朋友在阅读本文后产生误导。CODE:对微软的Windows操作系统霸主地位形成挑战的“小企鹅”---Linux日益普及,在面临着巨大压力的小企鹅在网络技术日益发展的今天蓬勃发展, 它越来越受到用户的青睐。Linux最大的优点在于其作为服务器的强大功能,这也是众多用户选择使用它的根本原因。由于Linux通过Internet协 同开发,随着它健壮和稳定的网络功能不断壮大,毫无疑问它将越来越成为一种纯正的网络操作系统。最近几年Linux不但在服务器方面加强而且在桌面版上也 毫无逊色,这只被认为是小企鹅的操作系统正悄悄的走进用户的电脑中,由于Linux标榜自由和开放,所以我们有理由相信它有可能在近年内击败当今霸主地位 的Windows操作系统。
网络已成为人们生活当中信息来源不可缺少的一部分,网络的安全是每位用户必须了解的常识,可见人们追求的操作系统不仅仅是新鲜、易用,更多的是安全、 稳定、高效、免费、开源。在开源时代以Linux为主要代表的开源软件正符合用户追求的特点,有相当一部分朋友很希望体验这个被称为还很神秘的操作系统, 然而对于大多数人来说,驾驶Linux似乎是可望不可及的,还有很多用户否定了Linux,实际上归根结底就是认为Linux实用性不高,据作者发现造成 发生这种情况的原因是用户并没有在机子上安装Linux。开源浏览器Firefox号称是世界上更快速、更安全并且更有效率的浏览器,能够阻止病毒、间谍 软件和弹出窗口的侵扰。然而这些体验对于尚未安装Firefox的用户来说,您认为他会了解Firefox吗?您认为他有讨论Firefox的条件吗? Linux与Firefox一样,都是很有潜力的开源软件,安装Firefox显得很容易,而且从下载到安装用不了多长时间。如果你一定要把Linux与 Windows做一个对比的话,我认为你应该去对比Firefox与IE,为什么会发生这种情况,我也说不清楚,如果你很感兴趣,就继续往下看。CODE:如果你决定要试用或学习Linux,你应该具备怎样的条件{素质}?其实你只管在硬盘上安装Linux,不必听我的,但我没说错的话有相当一部分朋友很 快就放弃了使用Linux,兼容硬件成为了阻碍进一步体验Linux的根本原因,无法正常从图形界面安装,安装后无法正常进入图形窗口,声卡不发声,网卡 驱动不了等等,不可否定的确出现这些问题。虽一时无法解决这些问题,但一些安装前的常识能有效的避免这些问题。
其实你不须要什么理由的,喜欢用就用,不喜欢用就不要用。但从本文当中你可能有学习Linux的必要与潜力。
你需要学习Linux么?下列这些朋友很可能不需要。
1,钟情于游戏娱乐的朋友。
理由:Linux对游戏支持不好,比不上windows下的十分之一,可以这么说,Linux目前很难满足对游戏,娱乐要求高的朋友,只要你是游戏爱好者 而且体验过Linux你会深有体会,常常听歌看电影在Linux下恐怕没有多少人,当然你只需要低端的游戏,你可以用Linux。
2,还没试用Linux就认为难的朋友。
理由:如果没经过自己体验后随意听信别人观点的人,他有百分之九十九都是无法继续学习下去的,为什么?也许别人讲的是对的,但终归是别人的观点,一个从没 有电脑基础的人体验过二个系统后的话能影响到一个对电脑有相当了解的你这的确是让人无法相信的事实,不经过自己的验证就认定了这个观点,那么我建议你不需 要学习Linux,因为Linux的确有些操作上需要一定的时间去掌握。在这同时连安装体验的勇气都没有,那么有什么理由能够相信你能够去应用 Linux,当然这些年Linux已经很重视在桌面的应用性,因为任何一个好的软件,它所具备最基本的是容易被接受,任何人都应该明白,不是每个人都要去 研究操作系统的。
3,否定Linux会普及的朋友。
理由:windows系统的确在市场上占有绝大份额,但开源软件已成为软件业的潮流,这是有事实根据的。而Linux也很有可能成为软件业的趋势,如果否 定了Linux在市场上发挥的作用,那么他是不可能会去用Linux,没人会去关注一个没有长远发展力的软件。其实Linux会普及这的确是体验 Linux最好的理由,也许这种潮流的初期对广大已掌握Linux的人是相当有利的,比如就业、学习等都是很乐观的,利用Linux能获得好的收益。
4,没有坚强意志,抵挡不住诱惑的朋友。
理由:Linux与windows相比,很多人都认为根本无法比,首选会是windows,哪怕是有病毒的威协,windows系统很容易掌握,而 Linux的确不是给大多数人用的,对于目前来说这不算过分的说法。windows下太完美了,软件很成熟,Linux被看作是辛苦的,如果你在被安装某 个软件而束手无策时,这滋味不是每个人都要去克服的,谁都想从北京到西藏是坐飞机去而不是骑单车去,当然实在是付不起车费我看不是每个人都要去体验长征的 滋味的。
5,使用软件多及频繁的朋友。
理由:Linux下的确有很多常用软件,而且是免费的,但更多的人都会使用windows下的破解软件,为什么?看中的是它的软件成熟,毕竟技术架构发展 了很多年,可以说经典的软件都是老牌子,性能及质量都有保障。也许这个问题对于Linux的有些朋友难于接受,但毕竟要考虑到大多数的朋友,他们的确选择 了windows。不要用收费与免费来讨论这个问题,那是不实际的。经过长期交谈当中发现使用软件多的朋友很追求软件的成熟程度与实用,而且软件要具有很 快的更新,这些在Linux中很可能无法满足这些朋友的要求,他们很需要在体验各个软件中带来的愉快。
6,注重花哨的朋友。
理由:花销的人大多不会有很大的作为,虽然说Linux的桌面环境很酷,但相信这些朋友在windows下早已用上了美化软件,这些软件的操作方法还是很 简单的,注重花销的朋友一方面很重视事情的快速解决,一方面很想突出个性,在这方面Linux并不能长期的为他们提供这样的平台,所以他们不需要去学习一 个目前并不好用的Linux。
7,没有用过Firefox或很快放弃使用Firefox的朋友。
理由:相信Firefox对大多数都熟悉不过了,既然知道有个操作系统叫Linux,那么完全相信他也知道Firefox,Firefox的宣传很多,很 多网站都有这个软件的推介。其实Firefox浏览网站速度是很快的,同时也是很安全的,但同时我们应该承认IE内核的浏览器是很强大的,界面及操作都是 很人性化的。
8,对病毒概念不清的。
理由:很难相信现在电脑用户对病毒没有太多的了解,但的确这部分人是存在的,而且不在少数,一个对病毒了解不多的人他的电脑网络意识是很薄弱的。其实很多朋友进入Linux阵营的原因是因为安全问题,一个并不在意安全的朋友很难去应用Linux。
以上列出了八点,如果上面提到八种之一或更多都与你不符,那么,你很可能需要学习Linux,但不是绝对的,因为有很多我没列出来,如果你感兴 趣,慢慢去体会,当然很多进入Linux阵营的人都是误闯进来的,任何人都可能有学习Linux的潜力,有一些开发者也讲出了自己的心声,他们经验让我们 大吃一惊,刚开始只是好奇而已,而如今却是个Linux高手。CODE:你需要学习Linux么?下列这类朋友很可能需要。我知道很多人的任务栏中都有一只小企鹅,当有信息来时小企鹅就会向你发出提示,其实企鹅是代表着勇敢,能干,勤劳,执着,生命力强,自由的象征动物。
1,需要架接服务器的朋友。
理由:Linux最大的优点是作为其服务器强大功能,它成本低,相比windows它要安全多了,稳定等,这些都是应用Linux最好的理由,据有关信息显示Linux做服务器的安全性很高,很稳定,这些都是作为服务器先决条件,Linux正适合这些特点。
2,编程,开发爱好者。
理由:Linux是开源软件,运行在该系统的软件也是开源的,更重要的是,它有长远的发展潜力。在很多时候很多编程开发者很希望参考别人的开发思路历程,作为自己学习开发的参考。
3,电脑爱好者。
理由:Linux正在做稳做大,而且出现了大方位的缺少人才局面,它有巨大的发展潜力。很多朋友都把目光放在了软件业,最基本的软件操作系统当然是众多人 的焦点。应用Linux也将成为一种潮流,爱好者是不会放过有潮流的机会,而且在巨大发展潜力的初期所带来的效益是很大的。
4,对新事物感兴趣的朋友。
理由:Linux在很多人脑子里根本就不存在,也许现在有了一定的普及,他听说除了windows还有Linux,Linux的桌面是很酷的,很可能他们就有一种冲动,学习这系统,冲劲很足的时候我真希望他们不要碰到挫折。
5,很看中安全的朋友。
理由:windows与Linux桌面相比,谁更安全,我选择后者,相信很多朋友都是。如果说Linux桌面用户受到了病毒,网络入侵的烦恼,那么相信 windows用户会更惨,相比之下还是不要惨的好,当然碰到一个专注于Linux下制度混乱的人那只能认倒霉,不过这种情况是很少的。
6,现在正在使用的朋友及拥护Linux的朋友。
理由:对于使用者,我只能说的是希望他能把好的经验技巧传授给更多的人,在传授给别人的同时自己也会得到提高。
7,在windows中经常使用Firefox的朋友。
理由:相信Firefox与IE内核的浏览器你都应该知道其对比,如果长期受得了使用Firefox,那么我相信他也会转入使用Linux。
8,希望从事Linux管理员工作的。
理由:我实在不懂怎么去说,据很多信息指出,Linux人材在全国仍致全世界都有缺少现象。
给初学Linux的朋友的建议:先了解Linux,至少能知道什么是Linux,Linux有哪些特性,它的安装方法及一些基本知识,当然有必要逛逛各大Linux论坛,从别人的经验当中学到东西,加入讨论学习Linux的群也是一种极好的方法,与别人交流大致了解。
以上列出了八点,如果上面提到八种之一或更多都与你相符,那么,你很可能需要学习Linux,但不是绝对的,因为有很多我没列出来,如果你感兴趣,慢慢去体会。最后一个观点,任何东西使用它不须要什么理由,也不会有任何原因,喜欢用就用,不喜欢不理它就是了。CODE:总结:似乎从这篇文章当中你得到的启示并不多。但慢慢体会你会发觉,本文只是个学习的参考方向,很多情况都要根据自己来解定的,它只指出基本的,更多需 要结合你自身的情况去发掘。如果你找不出自身是否适合学习Linux,那么我建议你安静下来一句话也不用说,默默努力吧。
以上仅代表作者观点,如不妥望指正,希望大家把这篇文章当成学习的参考系。同时为了使本文更适合广大学习者阅读,有意修改本文使其更加的生动完美,请与我取得联系。 -
LINUX性能调优
2007-09-19 16:45:48
本文档从磁盘,文件及文件系统,内存和编译等方面详细的讲述了如何对Linux系统性能进行调谐。
一、磁盘调谐
优化的分区
对系统性能影响相对较大的分区置于磁盘的靠外部分,对内容经常改变的目录放在单独的分区
根据以上特点,需要如下分区策略:
分区1: /boot 200M
分区2: /swap 256M
分区3: /home 500M
分区4: /var 200M
分区5: /tmp 100M
分区6: /usr 800M
分区7: / 100M
分区8: /data leave
如果系统有多块硬盘,可以考虑使用多个交换分区。每个磁盘上划分一个交换分区。通过在/etc/fstab文件中设置pri 选项,可使多个交换分区具有同样的优先级。Linux系统即可并行地使用它们。这样即可提高交换分区的性能。
/dev/hda5 swap swap defaults,pri=5 0 0
/dev/hdc5 swap swap defaults,pri=5 0 0
使用elvtune调谐磁盘I/O
在Linux 内核2.4以后的版本中,可以通过磁盘I/O的调度操作,来控制磁盘I/O的响应间和吞吐量。通过调整I/O请求在队列中的最大等待时间,可以在响应时间 和吞吐量之间调谐。如果要求较少的响应时间,那么吞吐量将降低,反之,较长的响应时间则可以得到较大的吞吐量。可以使用工具 "/sbin/elvtune"来改变最大的响应时间值。使用方法如下:
查看当前的设置
# /sbin/elvtune /dev/sda1
修改当前的配置
# /sbin/elvtune -r 2000 -w 4000 /dev/hda1
其中-r参数针对读操作,-w参数针对写操作.
可 以通过命令"iostat -d -x /dev/hda1"得到的平均信息(包括平均请求大小和平均队列长度)来监视以上I/O配置的效果,并调整配置,以得到最佳的性能。一般来讲,对于读写 频繁,但操作的数据量较少的Linux服务器,且对实时性要求较高,那么可以将参数调小。反之如果对于读写不频繁,但要求具有较大的吞吐量的Linux服 务器,可以将参数调大,以获得较大的吞吐量。
二、文件及文件系统调谐
块大小
使用较大的块大小将得到较好 的性能。将ext2文件系统的块大小调整为4096byte而不是缺省的1024byte,可以减少文件碎片,另外,在ext2的文件系统中,为根目录保 留了5%的空间,对一个大的文件系统,除非用作日志文件,5%的比例有些过多。可以使用命令"# mke2fs -b 4096 -m 1 /dev/hda6"将它改为1%并以块大小4096byte创建文件系统。如果系统用作邮件或者新闻服务器,使用较大的块大小,虽然性能有所提高,但会 造成磁盘空间较大的浪费。比如文件系统中的文件平均大小为2145byte,如果使用4096byte的块大小,平均每一个文件就会浪费1951byte 空间。如果使用1024byte的块大小,平均每一个文件会浪费927byte空间。在性能和磁盘的代价上如何平衡,要看具体应用的需要。
调整缓冲区刷新参数
Linux内核中,包含了一些对于系统运行态的可设置参数。缓冲刷新的参数可通过
/proc/sys/vm/bdflush文件来完成,这个文件的格式是这样的:
# more /proc/sys/vm/bdflush
40 0 0 0 500 3000 60 0 0
第一个数:在"dirty"缓冲区达到多少的时候强制唤醒bdflush进程刷新硬盘,
第二个数:每次让bdflush进程刷新多少个dirty块。所谓dirty块是必须写到磁盘中的缓存块。接下的数:每次允许bd flush将多少个内存块排入空闲的缓冲块列表。
修改方法
# echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush 并将这条命令加到/etc/rc.d/rc.local文件中去。
以上的设置加大了缓冲区大小,降低了bdflush被启动的频度,同时也增加了万一系统崩溃丢失数据的危险性。VFS的缓冲刷新是Linux文件系统高效的重要原因之一。
调整文件句柄数和i-节点数
在Linux内核2.4.x中需要修改源代码,然后重新编译内核才生效。编辑Linux内核源代码中的
include/linux/fs.h文件,将 NR_FILE 由8192改为 65536,将NR_RESERVED_FILES 由10 改为 128。编辑fs/inode.c 文件将 MAX_INODE 由16384改为262144。
一般情况下,最大打开文件数比较合理的设置为每4M物理内存256,比如256M内存可以设为16384,而最大的使用的i节点的数目应该是最大打开文件数目的3倍到4倍。
三、其它方面的调谐
调谐buffermem
文件buffermen和内核虚拟内存子系统密切相关。文件/proc/sys/vm/buffermem控制多大内存被用于缓冲区(百分数表示)。内核2.4的缺省值为:: "2 10 60"。可以按如下方法修改:
# echo "70 10 60" >/proc/sys/vm/buffermem
并将之加到脚本文件/etc/rc.d/rc.local 中。或者在/etc/sysctl.conf文件中加入
vm.buffermem = 70 10 60
第一个参数 70意味着至少分配70%的内存用作缓冲区。后两个参数保持系统的默认值。第一个参数设置为多大合适,依赖于系统的内存大小和系统高负载时内存的使用情况(可用free监视)。
进程限制
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以设置超级用户root的最大进程数为无限。编辑.bashrc文件(vi /root/.bashrc)增加行"ulimit -u unlimited"即可消除超级用户的进程限制。
核心和系统对用户进程其它的一些限制也可以通过ulimit命令来查看和更改。"ulimit -a" 用来显示当前的各种用户进程限制。一些更改用户限制的例子如下:
ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
ulimit -m 4096 限制每个进程使用的内存数。
优化gcc编译
将优化标志放在/etc/profile文件中。在pentium III级的处理器上使用以下优化标志将得到最优的应用程序:
CFLAGS=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
再将如下行加到/etc/profile 更靠后的位置:
export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET使用以上的优化,gcc或者egcs编译的程序将得到最佳的性能。
-
Linux必学60个命令文件处理
2007-09-19 16:44:27
Linux系统信息存放在文件里,文件与普通的公务文件类似。每个文件都有自己的名字、内容、存放地址及其 它一些管理信息,如文件的用户、文件的大小等。文件可以是一封信、一个通讯录,或者是程序的源语句、程序的数据,甚至可以包括可执行的程序和其它非正文内 容。 Linux文件系统具有良好的结构,系统提供了很多文件处理程序。这里主要介绍常用的文件处理命令。
file
1.作用
file通过探测文件内容判断文件类型,使用权限是所有用户。
2.格式
file [options] 文件名
3.[options]主要参数
-v:在标准输出后显示版本信息,并且退出。
-z:探测压缩过的文件类型。
-L:允许符合连接。
-f name:从文件namefile中读取要分析的文件名列表。
4.简单说明
使用file命令可以知道某个文件究竟是二进制(ELF格式)的可执行文件, 还是Shell scrīpt文件,或者是其它的什么格式。file能识别的文件类型有目录、Shell脚本、英文文本、二进制可执行文件、C语言源文件、文本文件、DOS的可执行文件。
5.应用实例
如果我们看到一个没有后缀的文件grap,可以使用下面命令:
$ file grap
grap: English text
此时系统显示这是一个英文文本文件。需要说明的是,file命令不能探测包括图形、音频、视频等多媒体文件类型。
mkdir
1.作用
mkdir命令的作用是建立名称为dirname的子目录,与MS DOS下的md命令类似,它的使用权限是所有用户。
2.格式
mkdir [options] 目录名
3.[options]主要参数
-m, --mode=模式:设定权限<模式>,与chmod类似。
-p, --parents:需要时创建上层目录;如果目录早已存在,则不当作错误。
-v, --verbose:每次创建新目录都显示信息。
--version:显示版本信息后离开。
4.应用实例
在进行目录创建时可以设置目录的权限,此时使用的参数是“-m”。假设要创建的目录名是“tsk”,让所有用户都有rwx(即读、写、执行的权限),那么可以使用以下命令:
$ mkdir -m 777 tsk
grep
1.作用
grep命令可以指定文件中搜索特定的内容,并将含有这些内容的行标准输出。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
2.格式
grep [options]
3.主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
\:忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的单个字符。
* :有字符,长度可以为0。
正 则表达式是Linux/Unix系统中非常重要的概念。正则表达式(也称为“regex”或“regexp”)是一个可以描述一类字符串的模式 (Pattern)。如果一个字符串可以用某个正则表达式来描述,我们就说这个字符和该正则表达式匹配(Match)。这和DOS中用户可以使用通配符 “*”代表任意字符类似。在Linux系统上,正则表达式通常被用来查找文本的模式,以及对文本执行“搜索-替换”操作和其它功能。
4.应用实例
查 询DNS服务是日常工作之一,这意味着要维护覆盖不同网络的大量IP地址。有时IP地址会超过2000个。如果要查看nnn.nnn网络地址,但是却忘了 第二部分中的其余部分,只知到有两个句点,例如nnn nn..。要抽取其中所有nnn.nnn IP地址,使用[0-9 ]\{3 \}\.[0-0\{3\}\。含义是任意数字出现3次,后跟句点,接着是任意数字出现3次,后跟句点。
$grep '[0-9 ]\{3 \}\.[0-0\{3\}\' ipfile
补充说明,grep家族还包括fgrep和egrep。fgrep是fix grep,允许查找字符串而不是一个模式;egrep是扩展grep,支持基本及扩展的正则表达式,但不支持\q模式范围的应用及与之相对应的一些更加规范的模式。
dd
1.作用
dd命令用来复制文件,并根据参数将数据转换和格式化。
2.格式
dd [options]
3.[opitions]主要参数
bs=字节:强迫 ibs=<字节>及obs=<字节>。
cbs=字节:每次转换指定的<字节>。
conv=关键字:根据以逗号分隔的关键字表示的方式来转换文件。
count=块数目:只复制指定<块数目>的输入数据。
ibs=字节:每次读取指定的<字节>。
if=文件:读取<文件>内容,而非标准输入的数据。
obs=字节:每次写入指定的<字节>。
of=文件:将数据写入<文件>,而不在标准输出显示。
seek=块数目:先略过以obs为单位的指定<块数目>的输出数据。
skip=块数目:先略过以ibs为单位的指定<块数目>的输入数据。
4.应用实例
dd命令常常用来制作Linux启动盘。先找一个可引导内核,令它的根设备指向正确的根分区,然后使用dd命令将其写入软盘:
$ rdev vmlinuz /dev/hda
$dd if=vmlinuz of=/dev/fd0
上面代码说明,使用rdev命令将可引导内核vmlinuz中的根设备指向/dev/hda,请把“hda”换成自己的根分区,接下来用dd命令将该内核写入软盘。
find
1.作用
find命令的作用是在目录中搜索文件,它的使用权限是所有用户。
2.格式
find [path][options][expression]
path指定目录路径,系统从这里开始沿着目录树向下查找文件。它是一个路径列表,相互用空格分离,如果不写path,那么默认为当前目录。
3.主要参数
[options]参数:
-depth:使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容。
-maxdepth levels:表示至多查找到开始目录的第level层子目录。level是一个非负数,如果level是0的话表示仅在当前目录中查找。
-mindepth levels:表示至少查找到开始目录的第level层子目录。
-mount:不在其它文件系统(如Msdos、Vfat等)的目录和文件中查找。
-version:打印版本。
[expression]是匹配表达式,是find命令接受的表达式,find命令的所有操作都是针对表达式的。它的参数非常多,这里只介绍一些常用的参数。
—name:支持统配符*和?。
-atime n:搜索在过去n天读取过的文件。
-ctime n:搜索在过去n天修改过的文件。
-group grpoupname:搜索所有组为grpoupname的文件。
-user 用户名:搜索所有文件属主为用户名(ID或名称)的文件。
-size n:搜索文件大小是n个block的文件。
-print:输出搜索结果,并且打印。
4.应用技巧
find命令查找文件的几种方法:
(1)根据文件名查找
例如,我们想要查找一个文件名是lilo.conf的文件,可以使用如下命令:
find / -name lilo.conf
find命令后的“/”表示搜索整个硬盘。
(2)快速查找文件
根 据文件名查找文件会遇到一个实际问题,就是要花费相当长的一段时间,特别是大型Linux文件系统和大容量硬盘文件放在很深的子目录中时。如果我们知道了 这个文件存放在某个目录中,那么只要在这个目录中往下寻找就能节省很多时间。比如smb.conf文件,从它的文件后缀“.conf”可以判断这是一个配 置文件,那么它应该在/etc目录内,此时可以使用下面命令:
find /etc -name smb.conf
这样,使用“快速查找文件”方式可以缩短时间。
(3)根据部分文件名查找方法
有时我们知道只某个文件包含有abvd这4个字,那么要查找系统中所有包含有这4个字符的文件可以输入下面命令:
find / -name '*abvd*'
输入这个命令以后,Linux系统会将在/目录中查找所有的包含有abvd这4个字符的文件(其中*是通配符),比如abvdrmyz等符合条件的文件都能显示出来。
(4) 使用混合查找方式查找文件
find命令可以使用混合查找的方法,例如,我们想在/etc目录中查找大于500000字节,并且在24小时内修改的某个文件,则可以使用-and (与)把两个查找参数链接起来组合成一个混合的查找方式。
find /etc -size +500000c -and -mtime +1
mv
1.作用
mv命令用来为文件或目录改名,或者将文件由一个目录移入另一个目录中,它的使用权限是所有用户。该命令如同DOS命令中的ren和move的组合。
2.格式
mv[options] 源文件或目录 目标文件或目录
3.[options]主要参数
-i:交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答“y”或“n”,这样可以避免误覆盖文件。
-f:禁止交互操作。mv操作要覆盖某个已有的目标文件时不给任何指示,指定此参数后i参数将不再起作用。
4.应用实例
(1)将/usr/cbu中的所有文件移到当前目录(用“.”表示)中:
$ mv /usr/cbu/ * .
(2)将文件cjh.txt重命名为wjz.txt:
$ mv cjh.txt wjz.txt
ls
1.作用
ls命令用于显示目录内容,类似DOS下的dir命令,它的使用权限是所有用户。
2.格式
ls [options][2004108174040.htm]
3.options主要参数
-a, --all:不隐藏任何以“.” 字符开始的项目。
-A, --almost-all:列出除了“ . ”及 “.. ”以外的任何项目。
--author:印出每个文件著作者。
-b, --escape:以八进制溢出序列表示不可打印的字符。
--block-size=大小:块以指定<大小>的字节为单位。
-B, --ignore-backups:不列出任何以 ~ 字符结束的项目。
-f:不进行排序,-aU参数生效,-lst参数失效。
-F, --classify:加上文件类型的指示符号 (*/=@| 其中一个)。
-g:like -l, but do not list owner。
-G, --no-group:inhibit display of group information。
-i, --inode:列出每个文件的inode号。
-I, --ignore=样式:不印出任何符合Shell万用字符<样式>的项目。
-k:即--block-size=1K。
-l:使用较长格式列出信息。
-L, --dereference:当显示符号链接的文件信息时,显示符号链接所指示的对象,而并非符号链接本身的信息。
-m:所有项目以逗号分隔,并填满整行行宽。
-n, --numeric-uid-gid:类似-l,但列出UID及GID号。
-N, --literal:列出未经处理的项目名称,例如不特别处理控制字符。
-p, --file-type:加上文件类型的指示符号 (/=@| 其中一个)。
-Q, --quote-name:将项目名称括上双引号。
-r, --reverse:依相反次序排列。
-R, --recursive:同时列出所有子目录层。
-s, --size:以块大小为序。
4.应用举例
ls 命令是Linux系统使用频率最多的命令,它的参数也是Linux命令中最多的。使用ls命令时会有几种不同的颜色,其中蓝色表示是目录,绿色表示是可执 行文件,红色表示是压缩文件,浅蓝色表示是链接文件,加粗的黑色表示符号链接,灰色表示是其它格式文件。ls最常使用的是ls- l,见图1所示。
图1 使用ls-l命令
文 件类型开头是由10个字符构成的字符串。其中第一个字符表示文件类型,它可以是下述类型之一:-(普通文件)、d(目录)、l(符号链接)、b(块设备文 件)、c(字符设备文件)。后面的9个字符表示文件的访问权限,分为3组,每组3位。第一组表示文件属主的权限,第二组表示同组用户的权限,第三组表示其 他用户的权限。每一组的三个字符分别表示对文件的读(r)、写(w)和执行权限(x)。对于目录,表示进入权限。s表示当文件被执行时,把该文件的UID 或GID赋予执行进程的UID(用户ID)或GID(组 ID)。t表示设置标志位(留在内存,不被换出)。如果该文件是目录,那么在该目录中的文件只能被超级用户、目录拥有者或文件属主删除。如果它是可执行文 件,那么在该文件执行后,指向其正文段的指针仍留在内存。这样再次执行它时,系统就能更快地装入该文件。接着显示的是文件大小、生成时间、文件或命令名 称。
diff
1.作用
diff命令用于两个文件之间的比较,并指出两者的不同,它的使用权限是所有用户。
2.格式
diff [options] 源文件 目标文件
3.[options]主要参数
-a:将所有文件当作文本文件来处理。
-b:忽略空格造成的不同。
-B:忽略空行造成的不同。
-c:使用纲要输出格式。
-H:利用试探法加速对大文件的搜索。
-I:忽略大小写的变化。
-n --rcs:输出RCS格式。
cmp
1.作用
cmp(“compare”的缩写)命令用来简要指出两个文件是否存在差异,它的使用权限是所有用户。
2.格式
cmp[options] 文件名
3.[options]主要参数
-l: 将字节以十进制的方式输出,并方便将两个文件中不同的以八进制的方式输出。
cat
1.作用
cat(“concatenate”的缩写)命令用于连接并显示指定的一个和多个文件的有关信息,它的使用权限是所有用户。
2.格式
cat [options] 文件1 文件2……
3.[options]主要参数
-n:由第一行开始对所有输出的行数编号。
-b:和-n相似,只不过对于空白行不编号。
-s:当遇到有连续两行以上的空白行时,就代换为一行的空白行。
4.应用举例
(1)cat命令一个最简单的用处是显示文本文件的内容。例如,我们想在命令行看一下README文件的内容,可以使用命令:
$ cat README
(2) 有时需要将几个文件处理成一个文件,并将这种处理的结果保存到一个单独的输出文件。cat命令在其输入上接受一个或多个文件,并将它们作为一个单独的文件 打印到它的输出。例如,把README和INSTALL的文件内容加上行号(空白行不加)之后,将内容附加到一个新文本文件File1 中:
$ cat README INSTALL File1
(3)cat还有一个重要的功能就是可以对行进行编号,见图2所示。这种功能对于程序文档的编制,以及法律和科学文档的编制很方便,打印在左边的行号使得参考文档的某一部分变得容易,这些在编程、科学研究、业务报告甚至是立法工作中都是非常重要的。
图2 使用cat命令/etc/named.conf文件进行编号
对行进行编号功能有-b(只能对非空白行进行编号)和-n(可以对所有行进行编号)两个参数:
$ cat -b /etc/named.conf
ln
1.作用
ln命令用来在文件之间创建链接,它的使用权限是所有用户。
2.格式
ln [options] 源文件 [链接名]
3.参数
-f:链结时先将源文件删除。
-d:允许系统管理者硬链结自己的目录。
-s:进行软链结(Symbolic Link)。
-b:将在链结时会被覆盖或删除的文件进行备份。
链接有两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。
硬 连接指通过索引节点来进行的连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户 就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和 其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件才会被真正删除。
与硬连接相对应,Lnux系统中还存在另一种连接,称为符号连接(Symbilc Link),也叫软连接。软链接文件有点类似于Windows的快捷方式。它实际上是特殊文件的一种。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
动手联系
上面我们介绍了Linux文件处理命令,下面介绍几个实例,大家可以动手练习一下刚才讲过的命令。
1.利用符号链接快速访问关键目录
符 号链接是一个非常实用的功能。假设有一些目录或文件需要频繁使用,但由于Linux的文件和目录结构等原因,这个文件或目录在很深的子目录中。比如, Apache Web服务器文档位于系统的/usr/local/httpd/htdocs中,并且不想每次都要从主目录进入这样一个长的路径之中(实际上,这个路径也 非常不容易记忆)。
为了解决这个问题,可以在主目录中创建一个符号链接,这样在需要进入该目录时,只需进入这个链接即可。
为了能方便地进入Web服务器(/usr/local/httpd/htdocs)文档所在的目录,在主目录下可以使用以下命令:
$ ln -s /usr/local/httpd/htdocs gg
这样每次进入gg目录就可访问Web服务器的文档,以后如果不再访问Web服务器的文档时,删除gg即可,而真正的Web服务器的文档并没有删除。
2.使用dd命令将init.rd格式的root.ram内容导入内存
dd if=/dev/fd0 ōf=floppy.fd
dd if=root.ram ōf=/dev/ram0 #
3.grep命令系统调用
grep是Linux/Unix中使用最广泛的命令之一,许多Linux系统内部都可以调用它。
(1)如果要查询目录列表中的目录,方法如下:
$ ls -l | grep '∧d'
(2)如果在一个目录中查询不包含目录的所有文件,方法如下:
$ ls -l | grep '∧[∧d]'
(3)用find命令调用grep,如所有C源代码中的“Chinput”,方法如下:
$find /ZhXwin -name *.c -exec grep -q -s Chinput {} \;-print -
从程序员的角度看Linux和Windows的对比
2007-09-19 16:43:03
从程序员的角度看Linux和Windows的对比
作者 Bruce Zhao mailto:makeidea@21cn.com
笔者在Unix SYS5,DOS,Windows3.x,windows9.x/NT 和Linux几个不同时流行的OS
上写过程序.在Linux和windows的对比中,我主要是从一个程 序员的角度来看的
一 系统架构的对比
1 内核
(1) 内核的弹性
Linux的内核表现出了高度的可配置性和独立性,主要是完成:IO驱动设备管
理,TCP/IP,以及任务调度.Linux的标准内核发布版本有40~50MB,而我 现在在一些
评估板上试验的嵌入式Linux系统(使用Arm或M68K系列的CPU) 只用到了2MB,同样
实现了网络功能和完整的任务调度,这使得Linux可以适 用于从高端服务器到嵌入
式应用的各个等级的计算平台上,与之相比, windows 没有明确的内核概
念.windows只适合台式机,NT从未真正的打入高端服务器,WinCE也遇到了一些结构
性的困难.
(2) 内核的任务管理
衡量一个内核的重要指标是多任务环境下的安全性和任务调度的效率. Linux在这
方面继承了Unix的优点.而win9.x(包括winme)从来就没有实现过 安全的多任务环
境,NT/2K 勉强做到了安全性,但是效率还是不敢恭维,我曾 今将一个多串口并发
驱动的应用程序改写成多线程的方式,原本希望提高处 理速度,实际上速度降低
了2到3倍.这也就不难理解为什么同样的企业级应 用在低硬件的机器上跑得比高
硬件配置的NT/2k快.
2 系统的可增值性与历史兼容性
一个设计优良的操作系统应该有一个精简和一致的构造,在添加新的功能时 不必
破坏原有的结构,而且在后继发展中能够保持前后一致性.Unix由于当初 设计时的
科学性,以致于20多年的时间内,没有在设计思想上做过大的变动. 虽然Unix有很
多的版本,但是通过Posix标准,这些系统在源代码上保持高度 的兼容.与之相
比,windows的几乎每个操作系统的框架设计都显得十分的随 意,几乎不考虑硬件
有了新的发展后,会出现什么问题.windown16位和32位两 个时期的操作系统出现
明显的"代沟",作为一个好的os,这种硬件上的差异是 应该由其本身来考虑的,而
不是把问题交给二次开发者,比如定义一堆PSZ, LPSZ的指针,将来64位时代, 大概
要出现LLPSZ了:)
3 GUI 图形用户界面
Linux的GUI建立在X-WINDOWS的基础,这是与windows的GUI完全不同的一种架
构windows的GUI是通过应用程序直接调用winows底层的GUI函数.或者说这是 一种
垂直的关系.而Linux的GUI是应用程序通过socket向X-WINDOW server发 送请求实
现的,只有X server在真正的写屏幕.或者说这是一种平行的关系. 后者的方式
带来更高的系统稳定性,因为图形显示系统崩溃,对于Linux来 说,只不过是死掉
一个进程而已,而对windows来说会导致整个系统的崩溃.当然X-window的开销要
比windows的方式大,但是由于硬件的发展X-window在 稳定性上的优点会将会弥
补速度上微不足道的差异.
4 应用开发环境
Linux上的开发工具没有windows的容易入门,并不代表Linux上的开发环境
比windows 差,其实linux编程入门慢,但是一旦熟悉了,以后就很少需要补 充
新的概念,与之相比,微软用一些很“简便”的编程概念吸引你,然后很 快的淘
汰这些概念,强迫你学习新的概念,你发现很多时间花费在气喘嘘嘘 的跟着微软
后面跑.你在这方面花费的时间远远超过你去学习linux编程的时间.另一方面
,Linux上IDE的开发工具也在成长,最终会吸引更多的应用开发工 程师
5 技术上的发展潜力
windows现在的技术架构基本上走进了一个死胡同,很难有大的创新.除非提出一
个完全不同的系统,然后在里面做个win32子系统,以兼容现有的程序. 就像
在nt上搞win16子系统一样:),并且体积再扩大一倍. 对于linux来说,一个很
好的架构放在哪里,现在主要是填充内容,丰富应用. 在可以预见的时间内
,windows无法在架构上超过Linux.
6 多种平台互连的影响
如果linux在嵌入式应用中取得了成功,那么将来就会对台式机市场形成外 围的
压力.随着PC机的控制与网络能力逐步融合到家电和传统设备中去,这一天 一定
会出现的.微软以下压上的策略(用win9x的市场优势推win nt)会在Linux 上重
演 结束语 手也打酸了,最后我用最近看到的一段评论结束这篇文章,好像是
这么说的:linux就像internet一样,在开始的时候发展较慢,一旦过了起步阶段
, 就会取得惊人的发展. -
Linux启动过程综述
2007-09-19 16:41:39
一. Bootloader
二.Kernel引导入口
三.核心数据结构初始化--内核引导第一部分
四.外设初始化--内核引导第二部分
五.init进程和inittab引导指令
六.rc启动脚本
七.getty和login
八.bash
附:XDM方式登录 作者:杨沙洲
本文以Redhat 6.0 Linux 2.2.19 for Alpha/AXP为平台,描述了从开机到登录的
Linux 启动全过程。该文对i386平台同样适用。
一. Bootloader
在Alpha/AXP平台上引导Linux通常有两种方法,一种是由MILO及其他类似的引导程序引 导,另一种是由Firmware直接引导。MILO功能与i386平台的LILO相近,但内置有基本的磁盘
驱动程序(如IDE、SCSI等),以及常见的文件系统驱动程序(如ext2,iso9660等), firmware有ARC、SRM两种形式,ARC具有类BIOS界面,甚至还有多重引导的设置;而SRM则具
有功能强大的命令行界面,用户可以在控制台上使用boot等命令引导系统。ARC有分区 (Partition)的概念,因此可以访问到分区的首扇区;而SRM只能将控制转给磁盘的首扇区。
两种firmware都可以通过引导MILO来引导Linux,也可以直接引导Linux的引导代码。
“arch/alpha/boot”下就是制作Linux Bootloader的文件。“head.S”文件提供了对
OSF PAL/1的调用入口,它将被编译后置于引导扇区(ARC的分区首扇区或SRM的磁盘0扇区), 得到控制后初始化一些数据结构,再将控制转给“main.c”中的start_kernel(),
start_kernel()向控制台输出一些提示,调用pal_init()初始化PAL代码,调用openboot() 打开引导设备(通过读取Firmware环境),调用load()将核心代码加载到START_ADDR(见
“include/asm-alpha/system.h”),再将Firmware中的核心引导参数加载到ZERO_PAGE(0) 中,最后调用runkernel()将控制转给0x100000的kernel,bootloader部分结束。
“arch/alpha/boot/bootp.c”以“main.c”为基础,可代替“main.c”与“head.S”
生成用于BOOTP协议网络引导的Bootloader。
Bootloader中使用的所有“srm_”函数在“arch/alpha/lib/”中定义。
以上这种Boot方式是一种最简单的方式,即不需其他工具就能引导Kernel,前提是按照 Makefile的指导,生成bootimage文件,内含以上提到的bootloader以及vmlinux,然后将
bootimage写入自磁盘引导扇区始的位置中。
当采用MILO这样的引导程序来引导Linux时,不需要上面所说的Bootloader,而只需要 vmlinux或vmlinux.gz,引导程序会主动解压加载内核到0x1000(小内核)或0x100000(大
内核),并直接进入内核引导部分,即本文的第二节。
对于I386平台
i386系统中一般都有BIOS做最初的引导工作,那就是将四个主分区表中的第一个可引导 分区的第一个扇区加载到实模式地址0x7c00上,然后将控制转交给它。
在“arch/i386/boot”目录下,bootsect.S是生成引导扇区的汇编源码,它首先将自己 拷贝到0x90000上,然后将紧接其后的setup部分(第二扇区)拷贝到0x90200,将真正的内核
代码拷贝到0x100000。以上这些拷贝动作都是以bootsect.S、setup.S以及vmlinux在磁盘上 连续存放为前提的,也就是说,我们的bzImage文件或者zImage文件是按照bootsect,setup,
vmlinux这样的顺序组织,并存放于始于引导分区的首扇区的连续磁盘扇区之中。
bootsect.S完成加载动作后,就直接跳转到0x90200,这里正是setup.S的程序入口。 setup.S的主要功能就是将系统参数(包括内存、磁盘等,由BIOS返回)拷贝到
0x90000-0x901FF内存中,这个地方正是bootsect.S存放的地方,这时它将被系统参数覆盖。 以后这些参数将由保护模式下的代码来读取。
除此之外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。最 后,setup.S将系统转换到保护模式,并跳转到0x100000(对于bzImage格式的大内核是
0x100000,对于zImage格式的是0x1000)的内核引导代码,Bootloader过程结束。
对于2.4.x版内核
没有什么变化。
二.Kernel引导入口
在arch/alpha/vmlinux.lds的链接脚本控制下,链接程序将vmlinux的入口置于 "arch/alpha/kernel/head.S"中的__start上,因此当Bootloader跳转到0x100000时,
__start处的代码开始执行。__start的代码很简单,只需要设置一下全局变量,然后就跳转 到start_kernel去了。start_kernel()是"init/main.c"中的asmlinkage函数,至此,启
动过程转入体系结构无关的通用C代码中。
对于I386平台
在i386体系结构中,因为i386本身的问题,在"arch/alpha/kernel/head.S"中需要更多的设置,但最终也是通过call
SYMBOL_NAME(start_kernel)转到start_kernel()这个体系结构无关的函数中去执行了。
所不同的是,在i386系统中,当内核以bzImage的形式压缩,即大内核方式 (__BIG_KERNEL__)压缩时就需要预先处理bootsect.S和setup.S,按照大核模式使用$(CPP)
处理生成bbootsect.S和bsetup.S,然后再编译生成相应的.o文件,并使用 "arch/i386/boot/compressed/build.c"生成的build工具,将实际的内核(未压缩的,含
kernel中的head.S代码)与"arch/i386/boot/compressed"下的head.S和misc.c合成到一起,其中的head.S代替了"arch/i386/kernel/head.S"的位置,由Bootloader引导执行
(startup_32入口),然后它调用misc.c中定义的decompress_kernel()函数,使用 "lib/inflate.c"中定义的gunzip()将内核解压到0x100000,再转到其上执行
"arch/i386/kernel/head.S"中的startup_32代码。
对于2.4.x版内核
没有变化。
三.核心数据结构初始化--内核引导第一部分
start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。 这些动作有的是公共的,有的则是需要配置的才会执行的。
在start_kernel()函数中,
输出Linux版本信息(printk(linux_banner))
设置与体系结构相关的环境(setup_arch())
页表结构初始化(paging_init())
使用"arch/alpha/kernel/entry.S"中的入口点设置系统自陷入口(trap_init())
使用alpha_mv结构和entry.S入口初始化系统IRQ(init_IRQ())
核心进程调度器初始化(包括初始化几个缺省的Bottom-half,sched_init())
时间、定时器初始化(包括读取CMOS时钟、估测主频、初始化定时器中断等,time_init())
提取并分析核心启动参数(从环境变量中读取参数,设置相应标志位等待处理,(parse_options())
控制台初始化(为输出信息而先于PCI初始化,console_init())
剖析器数据结构初始化(prof_buffer和prof_len变量)
核心Cache初始化(描述Cache信息的Cache,kmem_cache_init())
延迟校准(获得时钟jiffies与CPU主频ticks的延迟,calibrate_delay())
内存初始化(设置内存上下界和页表项初始值,mem_init())
创建和设置内部及通用cache("slab_cache",kmem_cache_sizes_init())
创建uid taskcount SLAB cache("uid_cache",uidcache_init())
创建文件cache("files_cache",filescache_init())
创建目录cache("dentry_cache",dcache_init())
创建与虚存相关的cache("vm_area_struct","mm_struct",vma_init())
块设备读写缓冲区初始化(同时创建"buffer_head"cache用户加速访问,buffer_init())
创建页cache(内存页hash表初始化,page_cache_init())
创建信号队列cache("signal_queue",signals_init())
初始化内存inode表(inode_init())
创建内存文件描述符表("filp_cache",file_table_init())
检查体系结构漏洞(对于alpha,此函数为空,check_bugs())
SMP机器其余CPU(除当前引导CPU)初始化(对于没有配置SMP的内核,此函数为空,smp_init())
启动init过程(创建第一个核心线程,调用init()函数,原执行序列调用cpu_idle() 等待调度,init())
至此start_kernel()结束,基本的核心环境已经建立起来了。
对于I386平台
i386平台上的内核启动过程与此基本相同,所不同的主要是实现方式。
对于2.4.x版内核
2.4.x中变化比较大,但基本过程没变,变动的是各个数据结构的具体实现,比如Cache。
四.外设初始化--内核引导第二部分
init()函数作为核心线程,首先锁定内核(仅对SMP机器有效),然后调用 do_basic_setup()完成外设及其驱动程序的加载和初始化。过程如下:
总线初始化(比如pci_init())
网络初始化(初始化网络数据结构,包括sk_init()、skb_init()和proto_init()三部分,在proto_init()中,将调用protocols结构中包含的所有协议的初始化过程,sock_init())
创建bdflush核心线程(bdflush()过程常驻核心空间,由核心唤醒来清理被写过的内存缓冲区,当bdflush()由kernel_thread()启动后,它将自己命名为kflushd)
创建kupdate核心线程(kupdate()过程常驻核心空间,由核心按时调度执行,将内存缓冲区中的信息更新到磁盘中,更新的内容包括超级块和inode表)
设置并启动核心调页线程kswapd(为了防止kswapd启动时将版本信息输出到其他信息中间,核心线调用kswapd_setup()设置kswapd运行所要求的环境,然后再创建
kswapd核心线程)
创建事件管理核心线程(start_context_thread()函数启动context_thread()过程,并重命名为keventd)
设 备初始化(包括并口parport_init()、字符设备chr_dev_init()、块设备 blk_dev_init()、SCSI设备scsi_dev_init()、网络设备net_dev_init()、磁盘初始化及分区检查等等, device_setup())
执行文件格式设置(binfmt_setup())
启动任何使用__initcall标识的函数(方便核心开发者添加启动函数,do_initcalls())
文件系统初始化(filesystem_setup())
安装root文件系统(mount_root())
至 此do_basic_setup()函数返回init(),在释放启动内存段(free_initmem())并给内核解锁以后,init()打开 /dev/console设备,重定向stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参 数指定的程序),并使用
execve()系统调用加载执行init程序。
init()函数到此结束,内核的引导部分也到此结束了,这个由start_kernel()创建的第一个线程已经成为一个用户模式下的进程了。此时系统中存在着六个运行实体:
start_kernel()本身所在的执行体,这其实是一个"手工"创建的线程,它在创建了init()线程以后就进入cpu_idle()循环了,它不会在进程(线程)列表中出现
init线程,由start_kernel()创建,当前处于用户态,加载了init程序
kflushd核心线程,由init线程创建,在核心态运行bdflush()函数
kupdate核心线程,由init线程创建,在核心态运行kupdate()函数
kswapd核心线程,由init线程创建,在核心态运行kswapd()函数
keventd核心线程,由init线程创建,在核心态运行context_thread()函数
对于I386平台
基本相同。
对于2.4.x版内核
这一部分的启动过程在2.4.x内核中简化了不少,缺省的独立初始化过程只剩下网络 (sock_init())和创建事件管理核心线程,而其他所需要的初始化都使用__initcall()宏
包含在do_initcalls()函数中启动执行。
五.init进程和inittab引导指令
init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空 间内加载init程序,它的进程号是1。
init程序需要读取/etc/inittab文件作为其行为指针,inittab是以行为单位的描述性(非执行性)文本,每一个指令行都具有以下格式:
id:runlevel:action:process其中id为入口标识符,runlevel为运行级别,action为动作代号,process为具体的执行程序。
id一般要求4个字符以内,对于getty或其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。
runlevel 是init所处于的运行级别的标识,一般使用0-6以及S或s。0、1、6运行级别被系统保留,0作为shutdown动作,1作为重启至单用户模式,6 为重启;S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现,实际上,进入单用户模式时,init直接在控制台 (/dev/console)上运行/sbin/sulogin。
在一般的系统实现中,都使用了2、3、4、5几个级 别,在Redhat系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示XDM图形登录方 式。7-9级别也是可以使用的,传统的Unix系统没有定义这几个级别。runlevel可以是并列的多个值,以匹配多个运行级别,对大多数action 来说,仅当runlevel与当前运行级别匹配成功才会执行。
initdefault是一个特殊的action值,用于标识缺省的启动级别;当init由核心激活 以后,它将读取inittab中的initdefault项,取得其中的runlevel,并作为当前的运行级
别。如果没有inittab文件,或者其中没有initdefault项,init将在控制台上请求输入 runlevel。
sysinit、boot、bootwait等action将在系统启动时无条件运行,而忽略其中的runlevel,其余的action(不含initdefault)都与某个runlevel相关。各个action的定义在inittab的man手册中有详细的描述。
在Redhat系统中,一般情况下inittab都会有如下几项:
id:3:initdefault:
#表示当前缺省运行级别为3--完全多任务模式;
si::sysinit:/etc/rc.d/rc.sysinit
#启动时自动执行/etc/rc.d/rc.sysinit脚本
l3:3:wait:/etc/rc.d/rc 3
#当运行级别为3时,以3为参数运行/etc/rc.d/rc脚本,init将等待其返回
0:12345:respawn:/sbin/mingetty tty0
#在1-5各个级别上以tty0为参数执行/sbin/mingetty程序,打开tty0终端用于
#用户登录,如果进程退出则再次运行mingetty程序
x:5:respawn:/usr/bin/X11/xdm -nodaemon
#在5级别上运行xdm程序,提供xdm图形方式登录界面,并在退出时重新执行
六.rc启动脚本
上一节已经提到init进程将启动运行rc脚本,这一节将介绍rc脚本具体的工作。
一 般情况下,rc启动脚本都位于/etc/rc.d目录下,rc.sysinit中最常见的动作就是激活交换分区,检查磁盘,加载硬件模块,这些动作无论哪 个运行级别都是需要优先执行的。仅当rc.sysinit执行完以后init才会执行其他的boot或bootwait动作。
如 果没有其他boot、bootwait动作,在运行级别3下,/etc/rc.d/rc将会得到执行,命令行参数为3,即执行 /etc/rc.d/rc3.d/目录下的所有文件。rc3.d下的文件都是指向/etc/rc.d/init.d/目录下各个Shell脚本的符号连 接,而这些脚本一般能接受start、stop、restart、status等参数。rc脚本以start参数启动所有以S开头的脚本,在此之前,如果 相应的脚本也存在K打头的链接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先启动K开头的脚本,以stop 作为参数停止这些已经启动了的服务,然后再重新运行。显然,这样做的直接目的就是当init改变运行级别时,所有相关的服务都将重启,即使是同一个级别。
rc程序执行完毕后,系统环境已经设置好了,下面就该用户登录系统了。
七.getty和login
在rc返回后,init将得到控制,并启动mingetty(见第五节)。mingetty是getty的简化,不能处理串口操作。getty的功能一般包括:
打开终端线,并设置模式
输出登录界面及提示,接受用户名的输入
以该用户名作为login的参数,加载login程序
缺省的登录提示记录在/etc/issue文件中,但每次启动,一般都会由rc.local脚本根据系统环境重新生成。
注:用于远程登录的提示信息位于/etc/issue.net中。
login程序在getty的同一个进程空间中运行,接受getty传来的用户名参数作为登录的用户名。
如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。
只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。
当 用户登录通过了这些检查后,login将搜索/etc/passwd文件(必要时搜索 /etc/shadow文件)用于匹配密码、设置主目录和加载shell。如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为 /bin/sh。在将控制转交给shell以前,
getty将输出/var/log/lastlog中记录的上次登录系统的信息,然后检查用户是否有新邮件(/usr/spool/mail/{username})。在设置好shell的uid、gid,以及TERM,PATH
等环境变量以后,进程加载shell,login的任务也就完成了。
八.bash
运行级别3下的用户login以后,将启动一个用户指定的shell,以下以/bin/bash为例继续我们的启动过程。
bash 是Bourne Shell的GNU扩展,除了继承了sh的所有特点以外,还增加了很多特性和功能。由login启动的bash是作为一个登录shell启动的,它继承了 getty设置的TERM、PATH等环境变量,其中PATH对于普通用户为"/bin:/usr/bin:/usr/local/bin",对于 root
为"/sbin:/bin:/usr/sbin:/usr/bin"。作为登录shell,它将首先寻找/etc/profile
脚 本文件,并执行它;然后如果存在~/.bash_profile,则执行它,否则执行 ~/.bash_login,如果该文件也不存在,则执行~/.profile文件。然后bash将作为一个交互式shell执行~/.bashrc文件 (如果存在的话),很多系统中,~/.bashrc都将启动
/etc/bashrc作为系统范围内的配置文件。
当显示出命令行提示符的时候,整个启动过程就结束了。此时的系统,运行着内核,运行着几个核心线程,运行着init进程,运行着一批由rc启动脚本激活的守护进程(如
inetd等),运行着一个bash作为用户的命令解释器。
附:XDM方式登录
如果缺省运行级别设为5,则系统中不光有1-6个getty监听着文本终端,还有启动了一个XDM的图形登录窗口。登录过程和文本方式差不多,也需要提供用户名和口令,XDM
的 配置文件缺省为/usr/X11R6/lib/X11/xdm/xdm-config文件,其中指定了 /usr/X11R6/lib/X11/xdm/xsession作为XDM的会话描述脚本。登录成功后,XDM将执行这个脚本以运行一个会话管理器,比 如gnome-session等。
除了XDM以外,不同的窗口管理系统(如KDE和GNOME)都提供了一个XDM的替代品,如gdm和kdm,这些程序的功能和XDM都差不多。 -
GRUB菜单修复[收藏]
2007-09-19 16:22:53
Fedora 7为例GRUB菜单修复
硬盘分区:C盘XP、D盘工具、E盘备份、随后是ETX3和SWAP交换区
步骤一、下载GRUB4DOS于C盘根目录。
步骤二、使用explore2fs软件导出LINUX分区下的GRUB.CONF(BOOT/GRUB)。
我的内容如下:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,7)
# kernel /boot/vmlinuz-version ro root=/dev/sda8
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=1
timeout=5
splashimage=(hd0,7)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora (2.6.22.5-76.fc7)
root (hd0,7)
kernel /boot/vmlinuz-2.6.22.5-76.fc7 ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.22.5-76.fc7.img
title Fedora (2.6.20-2931.fc7xen)
root (hd0,7)
kernel /boot/xen.gz-2.6.20-2931.fc7
module /boot/vmlinuz-2.6.20-2931.fc7xen ro root=LABEL=/ rhgb quiet
module /boot/initrd-2.6.20-2931.fc7xen.img
title Fedora (2.6.22.4-65.fc7)
root (hd0,7)
kernel /boot/vmlinuz-2.6.22.4-65.fc7 ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.22.4-65.fc7.img
title Fedora (2.6.20-2925.9.fc7xen)
root (hd0,7)
kernel /boot/xen.gz-2.6.20-2925.9.fc7
module /boot/vmlinuz-2.6.20-2925.9.fc7xen ro root=LABEL=/ rhgb quiet
module /boot/initrd-2.6.20-2925.9.fc7xen.img
title WinXP
rootnoverify (hd0,0)
chainloader +1
找出最新的内核版本号为Fedora (2.6.22.4-65.fc7)位于(hd0,7)
步骤三、编辑位于C盘根目录下的MENU.LST文件。内容如下:
default 0
timeout 1
color cyan/blue white/blue
title Fedora (2.6.22.4-65.fc7)
root (hd0,7)
kernel /boot/vmlinuz-2.6.22.4-65.fc7 ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.22.4-65.fc7.img
boot
如果需要其他的内核版本,相应的添加即可。
步骤四、编辑C盘根目录下的BOOT.INI文件。内容如下:
[boot loader]
timeout=5
default=C:\grldr
[operating systems]
C:\grldr=Fedora (2.6.22.4-65.fc7)
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="DeepinXP V5.7" /noexecute=optin /fastdetect
重起即可进入FEDORA和XP双菜单启动了
注意事项
1、注意找准内核版本号
2、找准内核存放的硬盘分区。 -
为什么要用WINE
2007-09-17 12:44:19
既然都已经用LINUX了何必要模拟个WINDOWS呢。
我是从来不用WINE的,LINXU下的应用软件也可以应付一般的需求呀,至于
玩游戏就直接去WINDOWS好了
-
终于进入了LINUX的精彩世界
2007-09-17 12:14:22
终于可以摆脱MICROSOFT的束缚进入免费自由的LINUX社区,一定要好好学学LINUX技术!
我用的F7系统