星期四, 三月 29, 2007

linux下的一些软件

http://www.linuxeq.com/

The Linux Equivalent Project

Powered by ScribeFire.

EasyWine+Wine+IE6


EasyWine+Wine+IE6
Originally uploaded by yoyoliyang.

EasyWine安装IE6

axel http://software.lupaworld.com/pub/deman/EasyWine4G.sh
axel http://software.lupaworld.com/pub/deman/plug.tar.bz2 (wine配置时需要的插件)
该注意的是下载的wine版本要为9.22,否则在EasyWine配置wine 时出错。
axel http://wine.budgetdedicated.com/archive/ubuntu/dapper/wine_0.9.22~winehq0~ubuntu~6.06-1_i386.deb 此为dapper的deb包,edgy同样使用。
安装wine
sudo dpkg -i wine_0.9.22~winehq0~ubuntu~6.06-1_i386.deb
安装 EasyWine
./EasyWine4G.sh
bash EasyWine,配置Wine以及安装IE6。


关于 WINE 在 UTF-8 环境下运行缓慢的修正:
sudo gedit /usr/share/X11/locale/zh_CN.UTF-8/XLC_LOCALE

(用 # 注释掉 GBK 段)

# fs3 class (Chinese Han Character GBK)
fs3 {
charset {
name GBK-0:GLGR
}
font {
primary GBK-0:GLGR
substitute GB13000.1993-1:GLGR
}
}


修改为

# fs3 class (Chinese Han Character GBK)
###fs3 {
### charset {
### name GBK-0:GLGR
### }
### font {
### primary GBK-0:GLGR
### substitute GB13000.1993-1:GLGR
### }
###}

http://www.linuxeq.com/

The Linux Equivalent Project

Powered by ScribeFire.

星期三, 三月 28, 2007

Screenshot-aiglx


Screenshot
Originally uploaded by yoyoliyang.

星期二, 三月 20, 2007

Linux下主流软件安装方法


软件安装常用方法

1、软件安装卸载,分几种情况:

A:RPM包,这种软件包就像windows的EXE安装文件一样,各种文件已经编译好,并打了包,哪个文件该放到哪个文件夹,都指定好了,安装非常方便,在图形界面里你只需要双击就能自动安装。
==如何卸载:
1、打开一个SHELL终端
2、因为LINUX下的软件名都包括版本号,所以卸载前最好先确定这个软件的完整名称。
查找RPM包软件:rpm -qa **×*
注意:**×指软件名称开头的几个字母,不要求写全,但别错,*就是通配符号“*”,即星号,如你想查找机子里安装的REALPLAYER软件,可以输入:rpm -qa realplay*
3、找到软件后,显示出来的是软件完整名称,如firefox-1.0.1-1.3.2
执行卸载命令:rpm -e firefox-1.0.1-1.3.2
===安装目录,执行命令查找:rpm -ql firefox-1.0.1-1.3.2
===参考文章:http://blog.chinaunix.net/article.p...178

B:tar.gz(bz或bz2等)结尾的源代码包,这种软件包里面都是源程序,没有编译过,需要编译后才能安装,安装方法为:
1、打开一个SHELL,即终端
2、用CD 命令进入源代码压缩包所在的目录
3、根据压缩包类型解压缩文件(*代表压缩包名称)
tar -zxvf ****.tar.gz
tar -jxvf ****.tar.bz(或bz2)
4、用CD命令进入解压缩后的目录
5、输入编译文件命令:./configure(有的压缩包已经编译过,这一步可以省去)
6、然后是命令:make
7、再是安装文件命令:make install
8、安装完毕
===如何卸载:
1、打开一个SHELL,即终端
2、用CD 命令进入编译后的软件目录,即安装时的目录
3、执行反安装命令:make uninstall
====安装目录:注意make install命令过程中的安装目录,或者阅读安装目录里面的readme文件,当然最好的办法是在安装的过程中指定安装目录,即在./configure命令后面加参数--prefix=/**,
如:./configure --prefix=/usr/local/aaaa,即把软件装在/usr/local/路径的aaaa这个目录里。一般的软件的默认安装目录在/usr/local或者/opt里,可以到那里去找找

C:以bin结尾的安装包,这种包类似于RPM包,安装也比较简单
1、打开一个SHELL,即终端
2、用CD 命令进入源代码压缩包所在的目录
3、给文件加上可执行属性:chmod +x ******.bin(中间是字母x,小写)
3、执行命令:./******.bin(realplayer for linux就是这样的安装包)
===如何卸载:把安装时中选择的安装目录删除就OK
===执行安装过程中可以指定,类似于windows下安装。

2、安装完软件后如何执行。 安装完软件后可以有好多种方法执行软件:
A、有些软件安装后会自动在应用程序列表里加上快捷键,和windows一样,到那里找就行了。
B、如果在应用程序列表里找不到的话,可以直接在/开始/运行命令里输入命令:启动命令一般就是软件名,如firefox,realplay,xmms等
C、也可以打开一个shell终端,输入软件名,和在“运行命令”里一样。如果不知道命令全程的话,可以输入开头的字母,然后按tab键查找,系统会自动显示以输入字母开头的所有命令/
D、你也可以直接到安装目录下运行启动文件,linux下的可执行图标和shell终端图标很像
E、到/usr/bin目录里找安装的软件启动文件执行命令。linux系统把所有可执行的文件命令在/usr/bin目录里都作了启动连接,你可以去那个目录寻找你安装的文件的启动命令,双击启动.

powered by performancing firefox

星期六, 三月 10, 2007

公主日记 4

周三的晚上,公主要穿过一条街道去另一个校区上歌剧课。夏天还没有结束,天黑得很慢。她路国操场时,头顶的天空突然呈现好看的橙红色。操场那么大,有那么多人,偏偏她就看见他了。她行色匆匆地赶路,他则慢悠悠地散步,在她无意转头的一瞬间,他也转过脸来。一时间她还犹豫着,但他已经举起手来打招呼,嗨!她本能地微笑并举起手,向他摇了摇。公主本来这样答应自己,下一次看到他时,无论如何,问他的名字。但上文说了,公主是个循规蹈矩的乖女孩,她就要迟到了。歌剧是她钟爱的课,于是她又往前赶了。但这一回眸,已让她激动不已。她想,当你决心关注一个人的时候,直觉总会让你在人群中找到他。
这不是个简单的爱情故事会,仅仅发生在一个星期之内,却让我们的女主角看穿了人性的丑陋。
那堂歌剧课结束,公主快乐地唱着歌回去,她又找到了那天在图书馆巧遇时的心情。夜色柔和得像一袭柔软的天鹅绒,她笑眯眯得想,我真是个幸福的人。但是她是公主,是要有一定的勇气和魄力的、她不满足于这样凭运气巧遇,是的,她已经爱上了他。单纯的、不谙世事的公主,却又超乎凡人的决心。夜深了,她躺在自己的小床上想了一会儿,怀着这样的心情沉沉睡去。
星期四,意识公主和王子相识的第六天了。这一天,她决心知道他的名字。
晚上八点,外院又响起了琴声。那曲调公主听了两遍就记下来了。没人上课,外语楼冷冷清清的,只有一个男生在唱着:
。。。。
依依不舍的我向着年少挥一挥手
再回首平房变成了高楼
时间给了我孤独
也夺走了我的简单
不知道那一张旧洋画还在不在她的身边
那理想勇往直前
快乐被落在身边
老树没变却不能带我回到从前
。。。。
公主忐忑地推开了门,轻手轻脚地走了进去。只有钢琴上方的灯亮着,他穿着一件浅浅淡淡的粉色T恤,自弹自唱。但公主马上敏锐地感觉到了敌意,另一个女孩站在钢琴旁边,目光像一桶冷水把公主浇了个湿透。曲终,王子笑着说,鼓掌!于是他和那个女孩便笑嘻嘻地拍起手来。他站起了身,说,还你弹了。于是那个女孩就从容地扫了公主一眼,坐下开始弹。王子终于转身看到公主了。
同学,公主并不在意越来越响的琴声,她已下定决心,从未如此坚定。同学,她径直向他走了过 去,问,能告诉我你的名字么?
他站在讲台前,看了她一眼,突然扭过头对弹钢琴的女生说,你手错了,那里有切分。公主又耐心地问了一遍,同学,能告诉我你的名字么?他定定地看着他,突然显得局促起来,声音变小了,说,我叫刘畅。公主在心地默念了一遍:刘畅。那你能告诉我你的手机号码么?她又问道。刘畅迟疑了一下,公主面色平静,但其实已经开始流汗。我可是要成为他女朋友的!她对自己说然后目光毫不避讳地直视他。他说,哦,你记一下。啊!事情居然进展这么快这么顺利。公主看了那女孩一眼,又看了她心爱的王子一眼,满意地离开了。
剩下的事情交给短信了,公主这样计划着。她也不是一个没有魅力的女孩,需要的只是时间,她会打动他的。但是公主啊公主,你还是太傻了。
谢谢你告诉我电话号码。你很给人面子,我还担心你不肯说呢!
呵呵,给人面子是一种美德。我大四了,你呢?
大二。你考研么?大四真清闲啊天天弹琴,今晚那个是你女朋友么?
我考研啊,考本校本专业,她是我徒弟。
考本校啊?真好,我又能多听两年了。那首歌自己写的么?什么时候给我份歌词。
《老树下》,我自己写的。还没问你叫什么呢?
等你给歌词了我再告诉你名字。
你可真逗,那我现在发过来给你。
公主一边发着短信一边感慨现代通讯给人带来的方便。最后他们交换了名字,照片。公主累了,说,晚安。但是过了很久,刘畅并没有回复什么。她想大概是睡去了,于是关了手机也睡去了。
公主在上外国文学的时候听老师说,命运是强大的。人可以积极地反抗命运,但是却始终受命运掌控。古希腊人絮絮叨叨地在公主耳边讲述着命运的故事,她心底突然有一丝不安。她是个熟悉星座知识的女孩,一般来说,水瓶和摩羯是一对相克的星座。摩羯的男子冷酷又花心,星占书上一字一字地写着这两个座的人有多么的不合。公主一贯相信古老的占星术,但她这一次却开始怀疑了。

待续 转载自 潘雯晶 《公主日记》 萌芽



powered by performancing firefox

公主日记 3

但是这个周末,公主是徒劳的。刚过八点,教室里便涌进了许多校外前来进修的学生。他们乱哄哄的挤进教室,大声说话,搬动桌椅,公主安静的世界被搅乱了,他不得已地收拾书本离开了那里,心里的无奈像一张大网罩住了她。她是个公主哎,却只能安静的离开。她在图书馆里待到了下午一点。这段时间里,她抄了两份乐谱,完成了一个短篇,睡了二十分钟,看了三本几米的漫画。等她再度返回那间教室时,门已被锁上了,前门后门,都打不开。里面很安静,她想他大概不在吧?

星期一照例是个好天,公主照例来到那间教室上政治课。老钢琴一动不动地立在墙角,果然像个严肃的一言不发的国王。她听了半节课就开始发呆,忘不了那一双手和一脸的微笑。她的表情是平静的,正如她的身份一般让人不敢玩笑,但她的心情像一条流淌着忧伤的小河,水声不绝于耳。

星期二照例是个好天,公主换上了黑色麻质裤子和白短袖——今天她有一堂羽毛球课。中午短暂的休息时间,她到图书馆找一本关于美学的书。在借书处把那手续的时候,她站直了身子望窗外看,突然,一个身影映入眼帘——饮水机旁站着她的王子!没错,是他!他今天穿着藏蓝色的短袖和牛仔裤,这个人看上去利落极了!公主的体温骤然升高,她突然想大叫,这种情感要爆发时被压抑的感觉可不太好。但是公主是理智的水平座女生,她控制住自己了。戒了书后像一只快乐的小鸟一般,紧紧跟在了王子身后。王子原来找了个这么隐蔽的座位,在图书馆一个很不起眼的角落。公主把自己藏在书架后头,透过码放整齐的书看她的王子。哦,她一直笑啊笑啊,肌肉都要僵硬了。周围那么多安静看书的人,长长的垂下来的浅黄色窗帘,摆在墙角的红色灭火器罐子,还有那些散发古旧气息的书,这一切都在瞬间美好起来。她明白,只因那个男生。

后来公主想起当初的热情,几乎要嘲笑自己了。



待续 转载自 潘雯晶 《公主日记》 萌芽





powered by performancing firefox

星期四, 三月 08, 2007

公主日记 2

    那架钢琴很古老了,被放在教室里一个阳光照不到的角落,棕色的琴身有很多地方都掉漆了,低音的音质仿佛是生了结石般沉涩,不好听。但在此时公主眼里,一切都是黯淡的,所有的光辉都自动汇集到那架琴和哪个人身上。于是她走近了,穿过那些桌椅,站到了那人背后。音符一个一个从他手里飞出来,音高的的飞到天上去,音低的沉的往地上淌。那是个男孩。公主浅浅地笑了,他转过身来,颇为紧张地冲公主点一点头。她说,我可以坐你旁边吗?他说,啊,可以的。于是公主搬来一张椅子,挨着男孩有不失礼节地保持着距离,坐下。他谈起了一段她所不知道的旋律,修长的十指灵活地在琴键上跳跃。很难说在那一刻公主是爱音乐还是爱上他了,但是公主迷迷糊糊地认为,自己是爱上了这个弹钢琴的王子了。她对王子说,你的手指很好看。她有低头看了看自己的手,匆匆忙忙地把它们放到身后去了。
    第一次见面,王子显得十分安静和自信。他说,弹一首我自己写的曲子给你听吧。公主说哦,然后竖起了耳朵,仿佛她身上的每一个毛孔都张开了,为了让自己记住那旋律。原来,那就是王子十分喜欢的《老树下》。公主始终带着笑,那一刻她的心是满的,快乐的,活蹦乱跳的。一曲终了,王子指着钢琴说,你玩吗?我还有点事,先走了。
他也是笑眯眯的。公主深吸了一口气,啊,他笑起来真好看,眼睛眉毛嘴角都摆到了适当的位置。正是一张如暖人的阳光的脸。公主说,哦,我先玩一会儿。于是起身做到了他刚才坐到的位子上,手指划过他抚摸的琴键。王子走了,还体贴的观赏了门。他们没有互通姓名,不知道对方的年纪、专业,更别说手机号了。公主心底有一点点遗憾。那天她只弹了一小会儿就走了。她没学过钢琴,你会一点点零星的《天空之城》和《天鹅》,弹起来是来那么费力完全像个笨拙的小学生。于是她泄气地想,还是走吧。
    第二天便是周末。公主早早就起床了,认认真真地洗脸梳头,还用了电妈妈给的遮瑕膏,掩盖住了右颊上的几颗小痘痘。她是个公主,但也是个平凡的女孩,有着所有女孩都有的小心思。她收拾好了书包,兴冲冲地赶到了外院钢琴教室,心里得意又忐忑不安地想,如果今天遇到了,就要把该问的都问一遍。于是进了教室,她就从容地打开灯,跳了一个靠前的座位坐下,掏出一些书来看。其实,是在等待。

待续 转载自 潘雯晶 《公主日记》 萌芽

公主日记

日子仿佛一下子掉进了牛奶里,又从牛奶掉进了墨水里,混浊不堪,令人心生厌恶。

公主爱上的似乎是个王子吧?王子叫做刘畅,习惯上午九点才起床——因为他已经大四了,并没有像公主那么繁重的学业。正因为这样清闲,他才能常常把整个下午耗在钢琴教室里。那个教室可以容纳一百八十人,有两个门。刘畅常常等人走光了之后,把自己反锁在里面,弹一首他自己写的叫做《老树下》的曲子,陶醉起来还会大声哼唱。那些词也是他自己写的。公主看过一些《老树下》的词,最喜欢其中的一句:再回首平方变成了高楼。

刘畅对公主说过最多的一句话,就是“你可真逗”。公主不明白自己逗在哪里。公主是个循规蹈矩的乖女孩,七点起床,在路上解决掉早饭,八点上课,下课了会去自习。她是个靠文字和音乐活着的女孩,心里有事就写下来。不久前她申请了一个博客,写一点她自己的心情和身边的事。公主嘴不笨,但她的文字比语言更富有表现力。

公主下课了,星期五的下午四点。这座北方城市被夏末的阳光暖着,空气仿佛是金色天鹅绒上抖下来的灰。她高高兴兴地去外语楼,报名参加一个日语班。下楼的时候她听见钢琴教室里有声响,有人弹琴。

公主似乎有那么点特别吧?她轻轻推开后门走了进去。一个穿白色T恤的人坐在钢琴前面,留给她一个背影。公主一时间愣住了——那个人让人无法辨别性别:头发比男生长比女生短,个子别男生矮比女生高——距离有点远,中间隔着四十张桌椅。公主心里突然很激动。她每周一要在这个教室和一些成熟理智的大四学长学姐们一起上一堂枯燥的政治课,唯一给她安慰的就是这个教室里有台钢琴。其实是外院合唱团专用的。公主并没有学过钢琴,钢琴是乐器王国的国王,她学的是王后。国王和王后注定要在一起的,公主和王子呢?

待续

转载自 潘雯晶 《公主日记》  萌芽

星期一, 三月 05, 2007

NINJA RYUUKENDEN 3




玩了好几年(实际上在高三到大一根本没再玩过,到了大二才开始继续)的忍者龙剑,总算玩到了最后一关。
真的是非常难玩的游戏,不过忍者龙剑是我在FC中最喜欢的游戏了。而且据说忍者龙剑是当时非常成功的8位游戏。很另人着迷。

星期六, 三月 03, 2007

Etoile桌面环境安装指南


==============
Etoile INSTALL
==============


Required software
-----------------


You need to have the GNUstep core libraries installed in order to
compile and use Etoile. The core packages are, at a minimum:


* gnustep-make 1.13 or higher


* gnustep-base 1.13 or higher


* gnustep-gui 0.11 or higher


* gnustep-back 0.11 or higher


See <http://www.gnustep.org/> for further information.


You need some extra libraries if you intend to build a complete Etoile
environment or the whole repository:

* libpng (IconKit)


* zlib (LuceneKit)

See <http://www.zlib.net/> for further information.

* OniGuruma 3.8.6 or higher (OgreKit)

See <http://www.geocities.jp/kosako3/oniguruma/> for further information.
This dependency is also available in trunk/Dependencies/oniguruma (within
Etoile repository).

* sqlite3 (SQLiteClient)

See <http://www.sqlite3.org> for further information.

* SQLClient (SQLiteClient)

See <http://www.gnustep.org/> for further information.



Notation
--------


In the following text, square brackets "[ ]" are used to indicate an
optional parameter, while "*" at the beginning of a line indicates a
command.



Build and Install
-----------------


Warning! At this time, the install process is broken when run with 'sudo', then
you probably have to use 'su root'. Moreover if you encounter path related
error, you can source GNUstep.sh or GNUstep.csh in your shell, read the GNUstep
documentation to know more about this topic.


Steps to build:


* make
* [sudo] make install
* ./setup.sh


setup.sh script takes care of various operations mandatory to have a ready to
use environment that includes:


* the environment startup tool (named 'etoile_system')
* Nesedah theme
* Horizontal menu bar
* X11 session support (to start Etoile with KDM, GDM etc.)


This involves to copy or link various elements and set several preferences
(called 'defaults' in GNUstep terminology).
The script will ask you whether you want to set up the environment for the
current user only or for the whole machine.



Uninstall
---------


Steps to uninstall:


* [sudo] make uninstall
* ./setdown.sh


setdown.sh script allows to get rid of what has been installed or configured by
setup.sh. In other words, it reverts the effect of setup.sh script.


Take note, you can use it alone without running 'make uninstall' first. This is
useful when you want to disable temporarily Etoile theme, horizontal menu etc.
and get back to the GNUstep look & feel. Then you can return to the usual
Etoile look & feel by running setup.sh again.


However it's important to note that setdown.sh doesn't disable only Camaelon
(theme engine) and WildMenus (horizontal menu engine). You won't be able
to log in from KDM or GDM once setdown.sh has been run, and Etoile specific
applications may fail because of missing elements or daemons not launched.



Custom Build and Install
------------------------


In order to build and install the whole project (with the exception of
developers tools like UnitKit), you can just type in the root directory (named
Etoile):


* make
* [sudo] make install


Warning! The following section isn't up-to-date. At this time, it isn't
possible to build only one module by typing 'make modulename=yes'. This
should be fixed to match the documentation below.


Which is the equivalent for the build system of asking to build the etoile
module:


* make etoile=yes
* [sudo] make etoile=yes install


Indeed, you can choose to build only a specific module. Simply follow 'make'
with the module's name (in lowercase) set to yes. For example:


* make camaelon=yes
* make camaelon=yes install


Will only build and install Camaelon.


You can combine more than one module:


* make camaelon=yes lucenekit=yes


And even use custom set of modules, like desktop-base. Here is a list of the
current sets of modules:


* desktop-base --> camaelon, bookmarkkit, iconkit, preferenceskit
* user-base --> installer (for now that's all)
* developer-base --> unitkit, unittests, examples
* etoile-extensions --> lucenekit, extendedworkspacekit, trackerkit,
servicesbarkit, servicesbar


The 'etoile' option semantic is a bit special:


* etoile=yes --> desktop-base, user-base, etoile-extensions, workspace
* etoile=no --> desktop-base, developer-base // everything which is not
bound to Etoile itself


Finally you can combine these module sets with specific module options, like:


* make developer-base=yes camaelon=yes // build developer-base and camaelon
* make desktop-base=no camaelon=yes // build user-base, etoile-extensions,
workspace and camaelon (but not other desktop-base stuff)
* make etoile=no etoile-extensions=yes extendedworkspacekit=no



You can use the 'make' command with all the available options from every
projects directory.


You can also build test bundles for any specified modules by adding an option
'test=yes', in future you should be able to run every test bundles with 'make
check' but this not implemented currently.



Trouble
-------


Give us feedback! Tell us what you like; tell us what you think
could be better. Send bug reports and patches to <etoile-track@gna.org>.


数百种 Windows 软件的免费替代品列表

数百种 Windows 软件的免费替代品列表

用CDlinux做防火墙和上网共享(z)

用CDlinux做防火墙和上网共享

为什么要选用linux?

因为linux稳定,安全,对计算机硬件要求低。


何为CDlinux?
CDlinux为在linux基础上制作的,针对光盘运行的linux,但其还可以安装到硬盘、优盘上。详见http://cdlinux.berlios.de/

为什么要选用CDlinux?
因为CDlinux体积小(仅需20M硬盘空间),易定制(软件包采用标准tgz包),又基本具备完整linux的所有功能,理论上你可以安装任何linux版本的软件,而且内核更新很快(0.4.7版内核为2.4.23,0.4.8版内核为2.4.25),用其做防火墙完全可以满足需要。

硬件配置586,24M内存,40M硬盘两块网卡。

1、先从http://cdlinux.berlios.de/下载cdlinux。然后按其帮助文档将其安装到硬盘上。


2、建立/etc/rc.d/rc.local脚本

内容如下:
#!/bin/sh
/etc/rc.d/netshare
#执行网卡配置
/etc/rc.d/firewall
#执行防火墙脚本


3、建立/etc/rc.d/netshare脚本

内容如下:
#!/bin/sh
if [ -f \"/etc/dhcpc/dhcpcd-eth0.pid\" ] ; then
rm /etc/dhcpc/dhcpcd-eth0.pid -rf
fi
#eth0为对外网卡,我们的上网方式是动态ip,如果你的不是那得改成......
#判断是否已经运行过dhcpcd,如果是,删除生成的dhcpcd-eth0.pid文件,重新获得ip地址
dhcpcd eth0
ifconfig eth1 192.168.0.254
#192.168.0.254是对内网关地址,eth1为对内网卡
if [ -f \"/etc/dhcpc/dhcpcd-eth0.pid\" ] ; then
rm /etc/dhcpc/dhcpcd-eth0.pid -rf
fi
dhcpcd eth0

#我的系统,第一次获得ip好像有些不正常,所以又执行了一次,你看情况吧

4、建立/etc/rc.d/firewall防火墙脚本

防火墙脚本,iptables的功能十分强大,就不给出内容了,你可以参考别人的脚本建立。


5、删除系统默认用户ok,并修改root口令,这一步很重要哦,否则........


6、如果为0.4.7版,请将dhcpcd-1.3.22-pl4-cdl.tgz(在586cpu上运行有问题),iptables-1.2.9-cdl.tgz包替换为0.4.8版中的对应包(我没有具体试过,我是在0.4.7基础上修改包的,如果有问题干脆直接用0.4.8版)。

删除用不到的包(必须,因为机子的内存才24M,否则不正常可别怪我没有告诉你),保留以下包:

cce-0.50-20031205-cdl.md(如果希望显示和输入汉字)
dcron-2.3.3-cdl.tgz(如果想根据时间来控制防火墙,应保留)
dhcpcd-1.3.22-pl4-cdl.tgz(必须)
iptables-1.2.9-cdl.tgz(必须)
kernel-modules-2.4.23-cdl.md(必须)
smbmount-samba-2.2.8a-cdl.tgz(与网内机子沟通方便,但不利于安全。防火墙配置好后,建议去掉)
ssh-1.2.33-cdl.tgz(可以进行远程管理)
system-extra-cdl.tgz(必须)

7、以上的配置完成了,为了以后管理方便,请制作以下脚本:

#!/bin/sh
chmod +x /etc/rc.d/netshare /etc/rc.d/firewall /etc/rc.d/rc.local /root/NetShareConfig

if [ -f \"/mnt/CDlinux/cdlinux/extra/rc.local-cdl.tgz\" ] ; then
rm /mnt/CDlinux/cdlinux/extra/rc.local-cdl.tgz
fi
#删除原来的包rc.local-cdl.tgz


if [ -f \"/mnt/CDlinux/cdlinux/extra/netshare-cdl.tgz\" ] ; then
rm /mnt/CDlinux/cdlinux/extra/netshare-cdl.tgz
fi
#


if [ -f \"/mnt/CDlinux/cdlinux/extra/root-cdl.tgz\" ] ; then
rm /mnt/CDlinux/cdlinux/extra/root-cdl.tgz
fi

#

tar czPfc /mnt/CDlinux/cdlinux/extra/rc.local-cdl.tgz /etc/rc.d/rc.local
#生成新的包rc.local-cdl.tgz
tar czPfc /mnt/CDlinux/cdlinux/extra/netshare-cdl.tgz /etc/rc.d/netshare /etc/rc.d/firewall /usr/local/lib

#
netshare为网卡初始化脚本,firewall为防火墙脚本,lib为库连接文件=>/usr/lib(为CDlinux0.4.7版本iptables的一个bug,在CDlinux0.4.8版本不需要)
tar czPfc /mnt/CDlinux/cdlinux/extra/root-cdl.tgz /etc/passwd /etc/shadow /root/NetShareConfig

#passwd,shadow为修改过用户后的口令相关文件(很重要),NetShareConfig为本文件自身(否则下次就不能使用了)

将其保存为/root/NetShareConfig

执行sh /root/NetShareConfig (执行后NetShareConfig就具备可执行属性,下次直接执行就可以了),程序会生成以下文件并放置于硬盘cdlinux\\extra目录下

netshare-cdl.tgz
rc.local-cdl.tgz
root-cdl.tgz

注意:修改任意配置文件,请保证测试正常后,一定执行本脚本,否则启动后配置文件会丢失。

8、重新启动计算机,看是否一切都正常。

当然,作为linux的CDlinux同标准linux一样,功能远不止这些,你还可以在其上安装各种代理软件,将其建成功能强大的集防火墙、透明代理为一身的系统。它还会常常被用来维护系统。至于你用它来作什么,全由你决定。

内核编译

下载源代码

Linux内核总是不断发展的,最新的内核Kernel2.6.0对USB2.0予以正式的支持,以及内核模块文件后缀最显著的一个变化由*.o到*.ko等等,我们可以从www.kernel.org下载到tarball的源代码包。

前期准备

大家都知道的要先升级“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。

进入下载目录下并安装:



  #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包,一起安装吧!)


  
因为是在RedHat9.0的平台,RedHat的用户可能还会遇到一些麻烦,我会慢慢说的,除了要以上的升级之外,还有个文件(/etc/rc.d/rc.sysinit)可能有缺陷,因为/proc/ksyms文件在新内核(Kernel2.6.0)中已经没有了,打开文件命令如下:



  #vi /etc/rc.d/rc.sysinit
  找到:
  if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null
&& [ -f /proc/ksyms ]; then
  USEMODULES=y
  fi
  替换成:
  if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null; then
  USEMODULES=y
  fi


  
也就是把“&& [ -f /proc/ksyms ]”去掉,保存文件(操作之前最好做备份以免删错,这个文件是系统初始脚本,重要的很),这样子内核才能加载模块,当然能启动iptable防火墙了,否则防火墙在新内核中启动时红色的“failed“非常醒目。(请在新内核中核查/proc/sys/kernel/modprobe中的内容是不是: /sbin/modprobe,也可手工注入指令:#echo "/sbin/modprobe" > /proc/sys/kernel/modprobe)。下面开始构造新内核。

一、准备源代码

1、下载到tarball包之后,将内核tarball包复制到/usr/src目录下,假定包在当前目录中,运行以下命令:

#cp linux-2.6.0.tar.gz /usr/src

2、转到/usr/src目录并解开tarball包。



  #cd /usr/src
  #tar xvzf linux-2.6.0.tar.gz


3、如果你还下载了补丁包,则打上补丁,你也可以运行scripts/patch-kernel脚本文件自动打上补丁(准备好补丁包)或 #zcat patch-2.6.0.gz|patch -p1。

二、定制内核

定制内核是门很大的学问,需要大量的硬件知识,特别是2.6.0的内核,如果你从 2.4.N配置文件装载进去的,的确,很多人遇到过麻烦。我是重新配置文件(X窗口服务器进行),配制内核之前请清理源代码树,如果还没有进入 /usr/src/linux-2.6.0目录,请进入此目录,命令如下:



  #make mrproper (刚解开的tarball包不需此步骤)
  #make gconfig (需要Gtk开发库的支持)
  或make config
  或make xconfig(需要Qt开发库的支持)


  

注意:如果你是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命令不能用)。

三、编译内核及模块

定制好的内核配置文件(/usr/src/linux- 2.6.0/.config)之后,激动的时刻到来了,编译内核及模块,#make (此命令已完成make bzImage及make modules的工作),bzImage内核文件在arch/i386/boot目录中,你的CPU不同内核文件存放位置也不同,我是Intel的 CPU。

注意:我在RedHat7.2平台时曾出现无法编译的出错信息,出错信息如下:



  /tmp/cc2Hu7sH.s:3: Error: Unknown pseudo-op: `.incbin'
  make[1]: *** [usr/initramfs_data.o] Error 1
  make: *** [usr] Error 2,


  

重新装了个9.0的才解决此问题。说明:make命令在我的1.6GHz,128MB的机器上跑了足足27分钟。

四、安装模块及内核文件

#make modules_install install

以上这个命令可以分解成make modules_install与make install,make modules_install安装内核模块到/lib/modules/2.6.0下。make install完成mkinitrd命令及内核(bzImage)和System.map的拷贝,请查看/boot目录,文件名是有区别的,如是GRUB 引导器,make install命令已帮你自动修改了引导选项,对于LILO则要手工修改,重写引导记录。

说明:make modules_install install这个命令在我的1.6GHz,128M的机器上只跑了三十几秒,很快的哦。

五、后记

最后的工作就是重启系统(#shutdown -r now),检验一下你的劳动成果吧。差点忘了还有一点,可能对你很重要,进入新内核之后我发现rpm命令不能用了,原来这是RPM的一个Bug,特别是对于RH9的用户,请打开/etc/profile文件,命令如下:



  #vi /etc/profile (在文件的末尾加上几句如下)
  if [`uname -r`="2.6.0" ];then
  export LD_ASSUME_KERNEL=2.2.5
  fi


  

也就是给系统加上一个全局的环境变量,也可直接键入#export LD_ASSUME_KERNEL=2.2.5。

使用新内核可能出现的问题及对策:

1、新内核根本起不来,解决方法:重新配置内核(学问挺大),也许还根引导记录有关(很少了)。

2、新内核模块无法加载,会导致很多问题,比如了防火墙没法工作了,mount不上光盘和vfat及ntfs文件系统,其解决方法:升级module-init-tools软件包(我是modutils-2.4.21- 23.src.rpm包),RedHat的用户可能还要修改/etc/rc.d/rc.sysinit文件。

3、RedHat用户rpm命令不能使用,解决办法:请把变量在全局配置文件中声明。

修改内核添加设备驱动(Z)

Linux设备驱动概述

1. 内核和驱动模块

操作系统是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。正如我们查看屏幕上的文档时,不用去管到底使用nVIDIA芯片,还是ATI芯片的显示卡,只需知道输入命令后,需要的文字就显示在屏幕上。硬件驱动程序是操作系统最基本的组成部分,在Linux内核源程序中也占有较高的比例。

Linux内核中采用可加载的模块化设计(LKMs ,Loadable Kernel Modules),一般情况下编译的Linux内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中,其它的代码可以选择是在内核中,或者编译为内核的模块文件。

如果需要某种功能,比如需要访问一个NTFS分区,就加载相应的NTFS模块。这种设计可以使内核文件不至于太大,但是又可以支持很多的功能,必要时动态地加载。这是一种跟微内核设计不太一样,但却是切实可行的内核设计方案。

我们常见的驱动程序就是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,而Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM(高级电源管理)、VFS等驱动程序则编译在内核文件中。有时也把内核模块就叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。

理解这一点很重要。因此,加载驱动时就是加载内核模块。下面来看一下有关模块的命令,在加载驱动程序要用到它们:lsmod、modprob、insmod、rmmod、modinfo。

lsmod 列出当前系统中加载的模块,例如:

#lsmod (与cat /proc/modules 得出的内容是一致的)
Module Size Used by Not tainted
radeon 115364 1
agpgart 56664 3
nls_iso8859-1 3516 1 (autoclean)
loop 12120 3 (autoclean)
smbfs 44528 2 (autoclean)
parport_pc 19076 1 (autoclean)
lp 9028 0 (autoclean)
parport 37088 1 (autoclean) [parport_pc lp]
autofs 13364 0 (autoclean) (unused)
ds 8704 2
yenta_socket 13760 2
pcmcia_core 57184 0 [ds yenta_socket]
tg3 55112 1
sg 36940 0 (autoclean)
sr_mod 18104 0 (autoclean)
microcode 4724 0 (autoclean)
ide-scsi 12208 0
scsi_mod 108968 3 [sg sr_mod ide-scsi]
ide-cd 35680 0
cdrom 33696 0 [sr_mod ide-cd]
nls_cp936 124988 1 (autoclean)
nls_cp437 5148 1 (autoclean)
vfat 13004 1 (autoclean)
fat 38872 0 (autoclean) [vfat]
keybdev 2976 0 (unused)
mousedev 5524 1
hid 22212 0 (unused)
input 5888 0 [keybdev mousedev hid]
ehci-hcd 20104 0 (unused)
usb-uhci 26412 0 (unused)
usbcore 79392 1 [hid ehci-hcd usb-uhci]
ext3 91592 2
jbd 52336 2 [ext3]




上面显示了当前系统中加载的模块,左边数第一列是模块名,第二列是该模块大小,第三列则是该模块使用的数量。

如果后面为unused,则表示该模块当前没在使用。如果后面有autoclean,则该模块可以被rmmod -a命令自动清洗。rmmod -a命令会将目前有autoclean的模块卸载,如果这时候某个模块未被使用,则将该模块标记为autoclean。如果在行尾的[ ]括号内有模块名称,则括号内的模块就依赖于该模块。例如:

cdrom 34144 0 [sr_mod ide-cd]


其中ide-cd及sr_mod模块就依赖于cdrom模块。

系统的模块文件保存在/lib/modules/2.4.XXX/kerne目录中,根据分类分别在fs、net等子目录中,他们的互相依存关系则保存在/lib/modules/2.4.XXX/modules.dep 文件中。

需要注意,该文件不仅写入了模块的依存关系,同时内核查找模块也是在这个文件中,使用modprobe命令,可以智能插入模块,它可以根据模块间依存关系,以及/etc/modules.conf文件中的内容智能插入模块。比如希望加载ide的光驱驱动,则可运行下面命令:

# modprobe ide-cd


此时会发现,cdrom模块也会自动插入。

insmod也是插入模块的命令,但是它不会自动解决依存关系,所以一般加载内核模块时使用的命令为modprobe。

rmmod可以删除模块,但是它只可以删除没有使用的模块。

Modinfo用来查看模块信息,如modinfo -d cdrom,在Red Hat Linux系统中,模块的相关命令在modutils的RPM包中。

2.设备文件

当我们加载了设备驱动模块后,应该怎样访问这些设备呢?Linux是一种类Unix系统,Unix的一个基本特点是“一切皆为文件”,它抽象了设备的处理,将所有的硬件设备都像普通文件一样看待,也就是说硬件可以跟普通文件一样来打开、关闭和读写。

系统中的设备都用一个设备特殊文件代表,叫做设备文件,设备文件又分为Block(块)型设备文件、Character(字符)型设备文件和Socket(网络插件)型设备文件。Block设备文件常常指定哪些需要以块(如512字节)的方式写入的设备,比如IDE硬盘、SCSI硬盘、光驱等。

而Character型设备文件常指定直接读写,没有缓冲区的设备,比如并口、虚拟控制台等。Socket(网络插件)型设备文件指定的是网络设备访问的BSD socket 接口。

#ls -l /dev/hda /dev/video0 /dev/log
brw-rw---- 1 root disk 3, 0 Sep 15 2003 /dev/hda
srw-rw-rw- 1 root root 0 Jun 3 16:55 /dev/log
crw------- 1 root root 81, 0 Sep 15 2003 /dev/video0


上面显示的是三种设备文件,注意它们最前面的字符,Block型设备为b,Character型设备为c,Socket设备为s。

由此可以看出,设备文件都放在/dev目录下,比如硬盘就是用/dev/hd*来表示,/dev/hda表示第一个IDE接口的主设备,/dev/hda1表示第一个硬盘上的第一个分区;而/dev/hdc 表示第二个IDE接口的主设备。可以使用下面命令:

#dd if=/dev/hda of=/root/a.img bs=446 count=1


把第一个硬盘上前446个字节的MBR信息导入到a.img文件中。

对于Block和Character型设备,使用主(Major)和辅(minor)设备编号来描述设备。主设备编号来表示某种驱动程序,同一个设备驱动程序模块所控制的所有设备都有一个共同的主设备编号,而辅设备编号用于区分该控制器下不同的设备,比如,/dev/hda1(block 3/1)、/dev/hda2(block 3/2 )和/dev/hda3( block3/3 )都代表着同一块硬盘的三个分区,他们的主设备号都是3,辅设备号分别为1、2、3。 这些设备特殊文件用mknod命令来创建:

# mknod harddisk b 3 0


我们就在当前位置创建出一个与 /dev/hda一样的、可以访问第一个IDE设备主硬盘的文件,文件名叫做harddisk。

使用下面命令可以查看设备编号:

#file /dev/hda
/dev/hda: block special (3/0)


其中Block代表/dev/hda是系统的Block型(块型)设备文件,它的主设备编号为3,辅设备编号为0。

#ls -l /dev/hda /dev/hdb
brw-rw---- 1 root disk 3, 0 Sep 15 2003 /dev/hda
brw-rw---- 1 root disk 3, 64 Sep 15 2003 /dev/hdb


使用ls -l也可以看到设备编号,/dev/hdb代表第一个IDE接口的从设备(Slave)也是Block设备,编号为(3/64),还有另外一种设备文件是/dev/tty*。使用如下命令:

#echo "hello tty1" > /dev/tty1


将字符串“hello tty1”输出到/dev/tty1代表的第一个虚拟控制台上,此时按“Alt + F1”可以看到该字符出现在屏幕上,这个特殊的文件就代表着我们的第一虚拟控制台。

#file /dev/tty1
/dev/tty1: character special (4/1)


由上可以看到,它的类型为Character 型(字符型)设备文件,主设备号为4,辅设备号为1。同样,/dev/tty2代表着第二个虚拟控制台,是Character设备,编号为 (4/2)。

当将/dev/cdrom加载到/mnt/cdrom中时,只要访问/mnt/cdrom系统就会自动引入到/dev/cdrom对应的驱动程序中,访问实际的数据。

有关设备文件的编号可以看内核文档/usr/src/linux-2.*/Documentation/devices.txt 文件(在Kernel的源文件解包后的Documentation目录中),其中详细叙述了各种设备文件编号的意义。

3.使用/proc目录中的文件监视驱动程序的状态

通过设备文件怎样访问到相应的驱动程序呢?它们中间有一个桥梁,那就是proc文件系统,它一般会被加载到/proc目录。访问设备文件时,操作系统通常会通过查找/proc目录下的值,确定由哪些驱动模块来完成任务。如果proc文件系统没有加载,访问设备文件时就会出现错误。

Linux系统中proc文件系统是内核虚拟的文件系统,其中所有的文件都是内核中虚拟出来的,各种文件实际上是当前内核在内存中的参数。它就像是专门为访问内核而打开的一扇门,比如访问/proc/cpuinfo文件,实际上就是访问目前的CPU的参数,每一次系统启动时系统都会通过/etc/fstab中设置的信息自动将proc文件系统加载到/proc目录下:

# grep proc /etc/fstab
none /proc proc defaults 0 0


此外,也可以通过mount命令手动加载:

# mount -t proc none /proc


通过/proc目录下的文件可以访问或更改内核参数,可以通过/proc目录查询驱动程序的信息。下面先让我们看一下/proc目录中的信息:

# ls /proc
1 4725 5032 5100 5248 5292 crypto kcore partitions
14 4794 5044 5110 5250 5293 devices kmsg pci
2 4810 5075 5122 5252 5295 dma ksyms self
3 4820 5079 5132 5254 5345 driver loadavg slabinfo
4 4831 5080 5151 5256 6 execdomains locks stat
4316 4910 5081 5160 5258 7 fb lvm swaps
4317 4912 5082 5170 5262 70 filesystems mdstat sys
4318 4924 5083 5180 5271 8 fs meminfo sysrq-trigger
4319 4950 5084 5189 5287 9 ide misc sysvipc
4620 4963 5085 5232 5288 apm interrupts modules tty
4676 5 5086 5242 5289 bus iomem mounts uptime
4680 5005 5087 5244 5290 cmdline ioports mtrr version
4706 5018 5088 5246 5291 cpuinfo irq net


需要知道的是,这些文件都是实时产生的虚拟文件,访问它们就是访问内存中真实的数据。这些数据是实时变化产生的,可以通过以下命令来查看文件的具体值:

# cat /proc/interrupts
CPU0
0: 50662 XT-PIC timer
1: 3 XT-PIC keyboard
2: 0 XT-PIC cascade
5: 618 XT-PIC ehci-hcd, eth1
8: 1 XT-PIC rtc
9: 0 XT-PIC usb-uhci, usb-uhci
11: 50 XT-PIC usb-uhci, eth0
12: 16 XT-PIC PS/2 Mouse
14: 8009 XT-PIC ide0
15: 0 XT-PIC ide1
NMI: 0
ERR: 0


其它文件的含意见表1所示。

/proc/sys目录下的文件一般可以直接更改,相当于直接更改内核的运行参数,例如:

# echo 1 > /proc/sys/net/ipv4/ip_forward


上面代码可以将内核中的数据包转发功能打开。

另外,Linux系统中提供一些命令来查询系统的状态,如free可以查看目前的内存使用情况,ide_info可以查看ide设备的信息,例如: #ide_info /dev/had。类似的命令还有scsi_info,可以查看SCSI设备的信息。这些命令一般也是查询/proc目录下的文件,并返回结果。

系统初始化过程驱动程序的安装

在Linux安装过程中,系统上的硬件会被检测,基于检测到的结果安装程序会决定哪些模块需要在引导时被载入。Red Hat的安装程序为anaconda,它提供了自动检测硬件,并且安装的机制。

但是,如果计算机内的某些硬件没有默认的驱动程序,比如一块SCSI卡,我们可以在启动后的boot提示符下,输入“linux dd”,在加载完内核后,系统会自动提示插入驱动盘,这时就有机会把该硬件的Linux驱动程序装入。

如果在安装系统时,某种硬件总是因为中断冲突(ISA总线的设备较常见,比如一块ISA网卡)没法正常驱动,或者是缺少驱动程序,那么可以在boot提示符下输入“linux noprobe”。在这种模式下,安装程序不会自动配置找到的硬件,可以自己来选择现有驱动,配置驱动程序的参数,或者选择用光盘或软盘加载驱动程序。

定制引导盘

系统启动时是如何加载驱动的?下面让我们来看一下Red Hat的安装光盘是怎样引导的。当Linux安装光盘启动时,加载位于光盘上isolinux中的内核文件vmlinuz,内核运行完毕后,又将initrd.img的虚拟文件系统加载到内存中。这个文件为ext2文件系统的镜像,经过gzip压缩,可以通过以下步骤查看该镜像中的内容:

# mount /mnt/cdrom
# mkdir /mnt/imgdir
# gunzip < /mnt/cdrom/isolinux/initrd.img > /ext2img
# mount -t ext2 -o loop /ext2img /mnt/imgdir
# cd /mnt/imgdir
# ls -F
bin@
dev/
etc/
linuxrc@
lost+found/
modules/
proc/
sbin/
tmp/
var/
# cd modules
# ls
module-info
modules.cgz
modules.dep
modules.pcimap
pcitable


其中modules.dep为模块的注册文件,同时有各种模块的依存关系。modules.cgz为cpio的打包文件,实际的各种驱动模块就在该文件中。我们可以通过以下命令解包:

# cpio -idmv < modules.cgz


由此可以看到,解包出来的目录2.4.21-4XXX。进入该目录下的i386目录,就可以看到当前启动盘中支持的所以驱动程序:

# ls
3c59x.o
3w-xxxx.o
8139cp.o
8139too.o
8390.o
aacraid.o
acenic.o
aic79xx.o
……


若希望在系统中加入需要的驱动程序,可以相应地修改这些文件,比如在modules.dep中加入该模块的名字和依存关系,将编译好的驱动模块文件加入modules.cgz中,这样就可以制定自己的安装光盘。

硬盘上的系统启动过程与上面类似,但是initrd的镜像文件要更简单些,一般在initrd-2.4.XXX.img的虚拟文件系统中,只会在/lib目录下包含ext3.o jbd.o lvm-mod.o等少数文件,用来驱动硬盘上的ext3的文件系统。加载文件系统后,就可以使用/lib/modules/2.4.XXX/下的modules.dep文件及Kernel目录中的各种驱动文件。

自动配置安装

如果安装完Linux系统后,又添加了新的硬件,那么系统必须载入正确的驱动程序才可以使用它。在Red Hat Linux中,可以使用kudzu来配置硬件。这是PnP设备的检测程序,当系统使用新硬件引导后,运行kudzu(默认会自动运行),如果新硬件被支持,那么它就会被自动检测到。该程序还会为它配置驱动模块,把结果写入到文件/etc/sysconfig/hwconf中,kudzu可以通过对比这个文件发现新安装的硬件,并进行配置;也可以通过编辑模块配置文件/etc/modules.conf来手工指定加载模块。

Kudzu服务默认每次启动时都要运行,如果需要缩短启动时间,使用下面命令可以停止系统启动时的kudzu服务:

# chkconfig kudzu off


如果要安装新的硬件,可以手动运行kudzu程序。

# kudzu


那么kudzu程序如何认识硬件的呢?可以查看/usr/share/hwdata/目录下的文件,根据这些文件中的PnP信息,kudzu可以识别各种硬件设备。

以上介绍了Linux下驱动程序的大体结构、主要的加载方式和相关配置文件,在安装Linux时加载驱动程序,并且根据需要定制自己的引导盘,在安装完成后安装新的、即插即用硬件。下一讲开始,我们将学习具体硬件驱动的安装方法。

用户和Linux之间的接口:shell命令

shell是用户和Linux操作系统之间的接口。Linux中有多种shell,其中缺省使用的是Bash。本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性。

什么是shell

Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。

shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。

shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。

有一些命令,比如改变工作目录命令cd,是包含在shell内部的。还有一些命令,例如拷贝命令cp和移动命令rm,是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。

shell首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序,如xv,或者是自由软件,如emacs)。然后shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。

shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。

当普通用户成功登录,系统将执行一个称为shell的程序。正是shell进程提供了命令行提示符。作为默认值(TurboLinux系统默认的shell是BASH),对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。

一旦出现了shell提示符,就可以键入命令名称及命令所需要的参数。shell将执行这些命令。如果一条命令花费了很长的时间来运行,或者在屏幕上产生了大量的输出,可以从键盘上按ctrl+c发出中断信号来中断它(在正常结束之前,中止它的执行)。

当用户准备结束登录对话进程时,可以键入logout命令、exit命令或文件结束符(EOF)(按ctrl+d实现),结束登录。

我们来实习一下shell是如何工作的。

$ make work

make:***No rule to make target ‘work’. Stop.

$

注释:make是系统中一个命令的名字,后面跟着命令参数。在接收到这个命令后,shell便执行它。本例中,由于输入的命令参数不正确,系统返回信息后停止该命令的执行。

在例子中,shell会寻找名为make的程序,并以work为参数执行它。make是一个经常被用来编译大程序的程序,它以参数作为目标来进行编译。在“make work”中,make编译的目标是work。因为make找不到以work为名字的目标,它便给出错误信息表示运行失败,用户又回到系统提示符下。

另外,用户键入有关命令行后,如果shell找不到以其中的命令名为名字的程序,就会给出错误信息。例如,如果用户键入:

$ myprog

bash:myprog:command not found

$

可以看到,用户得到了一个没有找到该命令的错误信息。用户敲错命令后,系统一般会给出这样的错误信息。

shell的种类

Linux中的shell有多种类型,其中最常用的几种是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。三种shell各有优缺点。Bourne shell是UNIX最初使用的shell,并且在每种UNIX上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。Linux操作系统缺省的shell是Bourne Again shell,它是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。

C shell是一种比Bourne shell更适于编程的shell,它的语法与C语言很相似。 Linux为喜欢使用C shell的人提供了Tcsh。Tcsh是C shell的一个扩展版本。Tcsh包括命令行编辑、可编程单词补全、拼写校正、历史命令替换、作业控制和类似C语言的语法,它不仅和Bash shell是提示符兼容,而且还提供比Bash shell更多的提示符参数。

Korn shell集合了C shell和Bourne shell的优点并且和Bourne shell完全兼容。Linux系统提供了pdksh(ksh的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。

Linux并没有冷落其他shell用户,还包括了一些流行的shell如ash、zsh等。每个shell都有它的用途,有些shell是有专利的,有些能从Internet网上或其他来源获得。要决定使用哪个shell,只需读一下各种shell的联机帮助,并试用一下。

用户在登录到Linux时由/etc/passwd文件来决定要使用哪个shell。例如:

# fgrep lisa /etc/passwd

lisa:x:500:500:TurboLinux User:/home/lisa:/bin/bash

shell被列每行的末尾(/bin/bash)。

由于Bash是Linux上缺省的shell,本章主要介绍Bash及其相关知识。

shell命令

命令行c

用户登录到Linux系统时,可以看到一个shell提示符,标识了命令行的开始。用户可以在提示符后面输入任何命令及参数。例如:

$ date

二 11 23 01:34:58 CST 1999

$

用户登录时,实际进入了shell,它遵循一定的语法将输入的命令加以解释并传给系统。命令行中输入的第一个字必须是一个命令的名字,第二个字是命令的选项或参数,命令行中的每个字必须由空格或TAB隔开,格式如下:

$ Command Option Arguments

1. 选项和参数

选项是包括一个或多个字母的代码,它前面有一个减号(减号是必要的,Linux用它来区别选项和参数),选项可用于改变命令执行的动作的类型。例如:

$ ls

motd passwd

$

这是没有选项的ls命令,可列出当前目录中所有文件,只列出各个文件的名字,而不显示其他更多的信息。

$ ls -l

total 2

-rw-r--r-- 2 wzh book 22 Apr 20 20:37 motd

-rw-r--r-- 2 wzh book 796 Apr 20 20:37 passwd

$

加入-l选项,将会为每个文件列出一行信息,诸如数据大小和数据最后被修改的时间。

大多数命令都被设计为可以接纳参数。参数是在命令行中的选项之后键入的一个或多个单词,例如:

$ ls -l text

-rw-r--r-- 2 wzh book 22 Apr 20 20:37 motd

-rw-r--r-- 2 wzh book 796 Apr 20 20:37 passwd

$

将显示text目录下的所有文件及其信息。

有些命令,如ls可以带参数,而有一些命令可能需要一些最小数目的参数。例如,cp命令至少需要两个参数,如果参数的数目与命令要求不符,shell将会给出出错信息。例如:

$ cp -i mydata newdata

注意:命令行中选项先于参数输入。

2. 命令行特征

命令行实际上是可以编辑的一个文本缓冲区,在按回车之前,可以对输入的文本进行编辑。比如利用BACKSPACE键可以删除刚键入的字符,可以进行整行删除,还可以插入字符,使得用户在输入命令,尤其是复杂命令时,若出现键入错误,无须重新输入整个命令,只要利用编辑操作,即可改正错误。

利用上箭头可以重新显示刚执行的命令,利用这一功能可以重复执行以前执行过的命令,而无须重新键入该命令。

bash保存着以前键入过的命令的列表,这一列表被称为命令历史表。按动上箭头,便可以在命令行上逐次显示各条命令。同样,按动下箭头可以在命令列表中向下移动,这样可以将以前的各条命令显示在命令行上,用户可以修改并执行这些命令。这一特征将在10.4节中进行详细的论述。

在一个命令行中还可以置入多个命令,用分号将各个命令隔开。例如:

$ ls -F;cp -i mydata newdata

也可以在几个命令行中输入一个命令,用反斜杠将一个命令行持续到下一行。

$ cp –i

mydata

newdata

上面的cp命令是在三行中输入的,开始的两行以反斜杠结束,把三行作为一个命令行。

shell中的特殊字符

shell中除使用普通字符外,还可以使用一些具有特殊含义和功能的特殊字符。在使用它们时应注意其特殊的含义和作用范围。下面分别对这些特殊字符加以介绍。

1. 通配符

通配符用于模式匹配,如文件名匹配、路经名搜索、字符串查找等。常用的通配符有*、?和括在方括号[ ]中的字符序列。用户可以在作为命令参数的文件名中包含这些通配符,构成一个所谓的“模式串”,在执行过程中进行模式匹配。

* 代表任何字符串(长度可以不等),例如:“f*”匹配以f打头的任意字符串。但应注意,文件名前的圆点(.)和路经名中的斜线(/)必须显式匹配。例如“*”不能匹配.file,而“.*”才可以匹配.file。

? 代表任何单个字符。

[] 代表指定的一个字符范围,只要文件名中[ ]位置处的字符在[ ]中指定的范围之内,那么这个文件名就与这个模式串匹配。方括号中的字符范围可以由直接给出的字符组成,也可以由表示限定范围的起始字符、终止字符及中间的连字符(-)组成。例如,f [a- d] 与f [abcd]的作用相同。Shell将把与命令行中指定的模式串相匹配的所有文件名都作为命令的参数,形成最终的命令,然后再执行这个命令。

下面我们给出表10-1说明这些通配符的具体含义。

表10-1 通配符含义举例

模式串

意 义

*

当前目录下所有文件的名称。

*Text*

当前目录下所有文件名中包含有Text的文件的名称。

[ab-dm]*

当前目录下所有以a、b、c、d、m开头的文件的名称。

[ab-dm]?

当前目录下所有以a、b、c、d、m开头且后面只跟有一个字符的文件的名称。

/usr/bin/??

目录/usr/bin下所有名称为两个字符的文件的名称。

特别需要注意的是,连字符“-”仅在方括号内有效,表示字符范围,如在方括号外面就成为普通字符了。而*和?只在方括号外面是通配符,若出现在方括号之内,它们也失去通配符的能力,成为普通字符了。例如,模式“- a[*?]abc”中只有一对方括号是通配符,*和?均为普通字符,因此,它匹配的字符串只能是- a*abc和- a?abc。

最后说明一下使用通配符时需要注意的一些问题。由于*、?和[ ]对于shell来说具有比较特殊的意义,因此在正常的文件名中不应出现这些字符。特别是在目录名中不要出现它们,否则Shell匹配起来可能会无穷的递归下去。另外要注意的一点是:如果目录中没有与指定的模式串相匹配的文件名,那么Shell将使用此模式串本身作为参数传给有关命令。这可能就是命令中出现特殊字符的原因所在。

2. 引号

在shell中引号分为三种:单引号,双引号和反引号。

* 单引号 ‘

由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。例如:

$ string=’$PATH’

$ echo $string

$PATH

$

可见$保持了其本身的含义,作为普通字符出现。

* 双引号 “

由双引号括起来的字符,除$、、’、和”这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。对于$来说,就是用其后指定的变量的值来代替这个变量和$;对于而言,是转义字符,它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可。可以想见,在双引号中需要在前面加上的只有四个字符$,,’和”本身。而对”号,若其前面没有加,则Shell会将它同前一个”号匹配。

例如,我们假定PATH的值为.:/usr/bin:/bin,输入如下命令:

$ TestString=”$PATH\”$PATH”

$ echo $TestString

.:/usr/bin:/ bin”$PATH

$

读者可以自己试一下在第二个双引号之前不加会产生什么结果。

* 反引号 `

反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。例如:

$ pwd

/home/xyz

$ string=”current directory is `pwd`”

$ echo $string

current directour is /home/xyz

$

shell执行echo命令时,首先执行`pwd`中的命令pwd,并将输出结果/home/xyz取代`pwd`这部分,最后输出替换后的整个结果。

利用反引号的这种功能可以进行命令置换,即把反引号括起来的执行结果赋值给指定变量。例如:

$ today=`date`

$ echo Today is $today

Today is Mon Apr 15 16:20:13 CST 1999

$

反引号还可以嵌套使用。但需注意,嵌套使用时内层的反引号必须用反斜线()将其转义。例如:

$ abc=`echo The number of users is `who| wc-l``

$ echo $abc

The number of users is 5

$

在反引号之间的命令行中也可以使用shell的特殊字符。Shell为得到``中命令的结果,它实际上要去执行``中指定的命令。执行时,命令中的特殊字符,如$,”,?等又将具有特殊含义,并且``所包含的可以是任何一个合法的Shell命令,如:

$ ls

note readme.txt Notice Unix.dir

$ TestString=”`echo $HOME ` ` ls [nN]*`”

$ echo $TestString

/home/yxz note Notice

$

其他情况,读者可自行试之。

1. 注释符

在shell编程中经常要对某些正文行进行注释,以增加程序的可读性。在Shell中以字符“#”开头的正文行表示注释行。

此外还有一些特殊字符如:用于输入/输出重定向与管道的<、>、<<、>>和|;执行后台命令的&;命令执行操作符&&和||及表示命令组的{}将在下面各小节中加以介绍。

来源:赛迪论坛