2007年2月25日星期日

基于Linux的学习方法

基于Linux的学习方法
2001-01-08 21:39:37· 魏星·CPCW
--------------------------------------------------------------------------------

关于我:

  我是一名普通的计算机软件人员,接受过普通的计算机科学教育,有6年工作经验,由于工作原因接触过的系统包括DOS、Windows、Windows NT、Digital UNIX、VMS、Linux、IRIX,在一个比较封闭但是比较安静的环境里自学使用Linux两年多的时间,使用过程中逐步系统了自己的计算机观点,清楚了许多在多年以前老师没有讲清楚或是自己没有想清楚的东西,同样也试着把自己的一点经验和同事们进行探讨,具备一定的Linux支持的经验,自我感觉学习Linux的过程给了我一笔非常宝贵的财富,是一个非常明智的决定。

目的:

  一直有一种想法,就是把自己的学习经验和别人进行探讨,让别人不要重复自己的错误,在学习和使用Linux的过程中少走弯路,以一种比较轻松的态度来对待Linux系统,并且我也希望能够为新手提供指路,希望有一天我们的大学生中也能够出现几个象Linus一样的程序员,实际上,中国有足够的人是应该能够做到这点的,对于国家有这样的程序设计人员或是振臂一呼应者如云的工程管理人员是一件幸事。

  GNU/Linux的学习实际上是一个不断实践的过程,根据自己的需要不断地选择系统中的软件根据其相关文档在系统中付诸实施的过程,制定一个自己满意的目标可能效果更好。参考的目标可能以学习为主更好,倘若你有一定的基础制定一个基于GNU/Linux系统解决方案也不错;参考的应用范围开始以作为服务器运行更好,而不是作为和Windows 95一样的作桌面系统,比较理想的环境就是有一台Windows95的机器作为客户端而把Linux作为服务器,我接触Linux很偶然完全是想看一看免费的UNIX的样子,学习Linux是的目标开始很简单,就是实现类似于Windows NT中的IIS的功能。

  我把GNU/Linux的学习分为以下三个部分,并根据自己的经验提出注意的事项。

  1、系统安装

  对于熟悉Windows环境的人来说GNU/Linux的安装是一个非常痛苦的过程,对于安装过程中遇到的问题足以让许多闻风而动的人放弃了GNU/Linux的使用。安装过程中比较典型的问题是硬件不支持,如声卡和显示卡,其中显示卡的问题一般是希望安装X-WINDOW环境而引起的,并且常常引起系统重启或安装失败。所以,我给大家的第一个提示就是可以考虑不安装X-WINDOW软件包; 其次如果你不是使用的Sound ast系列的声卡,可以考虑不安装声卡;如果你的网络卡不识别可以考虑更换一块廉价的NE2000兼容网络卡,保证网络的正常工作对于调试客户/服务器方式的应用程序是必须的,网络服务启动成功但不能正常访问多是由于缺省的路由(default route)没有指定为网卡的地址引起。由于现在的硬件制造商还没有普遍提供Linux下的驱动程序,所以希望提供象Windows环境一样的硬件兼容的确有些困难。另外,建议做好可能要数次格式化硬盘的准备,实际上当你使用Linux系统一段时间后,就会发现以前频繁格式化硬盘实际上是错误的。当然,由一个具有Linux使用经验的人进行指导安装是最好的选择。同样,有一本关于Linux系统指南的手册是入门时不错的参考,不过不用太厚的著作因为许多的著作涉及的软件介绍实际多是对软件文档的复制,最好的文档实际就在你的/usr/doc目录下,当然其文档主要是英文不过都不是太深奥,毕竟很多软件的作者并不是用英文作为母语,并且开始是可以从/usr/doc/HOWTO开始,如可读性极强的《DOS-TO-Linux HOWTO》《NET-3-HOWTO》等文档。在不熟悉UNIX命令的情况下,可以使用一个类似pctools的软件mc,通过他你可以完成许多的文件操作,如文件的浏览、编辑、删除等,当然熟悉UNIX的基本命令可能是开始时的主要工作,UNIX的命令有一个比较特殊的地方就是有太多的选择项,其实开始只要会它的基本功能就行。系统的安装和配置是一个不断积累经验的过程,急于求成可能效果不好,和Windows入门容易深造难刚好相反Linux是入门困难而深造容易。

  2、系统管理

  由于Linux是一个多用户多任务的操作系统,系统管理对于在Windows 95环境下的用户可能是一个陌生的事情,在熟悉了基本的文件操作命令之后就可以考虑进行系统管理,系统管理的工作主要分为用户管理、资源管理、软件安装、服务配置和网络。当你使用linuxconf进行系统管理时,你会发现他许多真正优秀的地方。系统管理是相通的,只要是多用户的系统都存在这样的问题,实现的方法也是大同小异,通过linuxconf进行管理实际是调用了许多的UNIX命令,就象mc一样。Linux的通常使用的命令一般放在/usr/sbin、/usr/bin、/sbin、/bin目录下,可以抽点时间看看到底他们都包含了些什么东西,并且使用man 看一下他该怎么使用。资源管理的一个特色是文件系统的限额功能,这是UNIX系统普遍具有的功能而在微软的Windows NT 4没有实现的功能。软件安装实际就是使用RPM软件或是直接使用tar,其中RPM包格式的软件更容易安装和使用。我对服务的理解是系统的驻留程序,要配置Linux的各种服务需要了解涉及的程序和多半在/etc目录下配置文件的作用,/etc目录和Windows的注册表文件类似,包含了系统启动和相关软件的配置信息,在集中管理方面应该说Windows做得更好,不过/etc的文件多半是文本文件,你可以使用编辑器打开他们,其中很多文件里包含了详细的配置帮助,配置服务的过程有时可能就是去掉它的注释符号,实际上Linux下的服务和商用UNIX提供的服务很相似。和在Windows环境相比,最好的是一般修改一个服务后不需要重新启动系统,而只是重新启动该服务。网络是Linux给我最多收获的部分,由于Linux是一个互联网上诞生的系统,支持完整的TCP/IP网络协议族,其网络应用软件非常丰富,并且很多网络应用软件都系出名门且广泛使用,如BIND、apache、wu-ftp、sendmail、telnetd、NFS、NIS等,并且有非常完备的文档和例子支持,通过配置其网络服务你可以深入了解TCP/IP协议,构造一个非常不错的内部网环境,相关的文章比较多,在此便不再赘述。同样,支持Linux的大型关系数据库也不少,目前各大数据库厂商(Oracle、Sybase、Informix)为了对抗微软的操作系统垄断,均将产品向Linux移植,主要的目的是为大家提供使用和学习的机会,他们对一般对产品的限制是不能应用于商业领域,同时支持Linux的免费数据库系统也不少如PostgreSQL、MySQL等,由于SQL数据库涉及数据的并发控制、安全管理、备份等问题,掌握它能够让你在管理员的角度思考你的数据共享的问题,并且SQL作为一个标准其通用性较强,所以把Linux作为一个数据库服务器平台是很理想的。同时,将数据库和Web服务器结合起来,利用PHP3或是其他的CGI工具便能够实现一个基于Web的数据库环境,并且是能够被你自由控制的环境。

  3、程序设计

  目前GNU/Linux系统是一个为程序员提供的操作系统和编程环境,因为其操作系统核心源代码和应用软件的源代码都是公开的,并且你可以根据你的爱好选择编程语言,你可以通过大量的应用软件源代码理解进程、线程、文件、设备、网络、RPC、IPC等原来比较抽象的概念。和Windows环境下的可视开发环境相比,Linux下的编程可能会困难一些,但是如果只是完成特定的服务端应用,就比较简单和高效,你开了集成环境可能需要的是多开几个虚拟控制台,方便对库函数的参考。由于应用软件主要是C语言程序,有C语言基础是比较好的,并且应用软件的注释都比较好,可以比较方便地修改。当然,用JAVA也比较好,可以充分享受其跨平台的优势,还有就是可以使用以前只是听过而没有用过的Ada、Lisp等语言。基于GNU/Linux的程序设计可以让你充分感受选择的自由,没有必要大家都去研究核心程序,毕竟计算机是工具,能够为具体应用服务才是计算机软件人员的职责,仅有系统核心也是不够的。不过,在Linux下编写驱动程序不是象想象的那么困难,原因主要是我们的设计者为我们提供了详细的指南,感受最深刻的是在/usr/src/linux/drivers/net/skeleton.c程序,它描述了网卡驱动程序的框架,并且相关的文档非常多如KHG等,相比Windows就更为开放和容易。我不是程序设计的高手,通过GNU/Linux的使用知道一些有用的方法,学会了欣赏别人的程序,如果让我做一个程序我的第一步可能就是找到相关的程序并查看他们的编程方法。同样,如果能够真正使用互联网,你可以发现更多的程序设计的参考。

  两年的实践给了我一种驾驭系统的轻松,因为我知道很多东西没有想象的那么难以接受,最重要的是"try again"。实际上,你能够真切地感受到各种系统是相通的,如同水是相通的一样;学习不应该是一种负担,而是根据自己的实际情况去解决实际的问题,兴趣是一种不可忽视的因素。我想象不出如果能够根据大学计算机专业的课程设置,同步提供Linux的实践,那么我们的大学生在毕业时会有怎样的技术水平?同样,我们的高校可能会有更多一些的可以为普通人接受的软件,而不是只是培养专家的科研成果,或是寥寥千套的获奖操作系统。没有理论的实践是盲目的,没有实践的理论是空洞的,而计算机软件是需要理论和实践紧密结合的。
1、不要“玩 Linux” 很多人用 Linux 的时候会感觉很迷茫,该用哪个发行呢?是不是我少装了什么?怎么升级这么快啊!怎么这么不稳定!每当遇到新的软件他就想试用,每当新的版本出现,他就更新,然后用鼠标在新的菜单里选择从来没见过的程序来用用。

其实你是为了Linux而使用Linux,而没有找到正确的理由来利用 Linux。你首先要明确用电脑的目的,你用它是为了解决你的实际问题,而不是为了学习安装操作系统,不是为了测试哪个版本好用,不是为了“赶上潮流”,更不是因为你硬盘太大了,你想多占点空间。

如果你启动了电脑之后不知道应该干什么,那么最好先不要用电脑,因为你可能有更重要的事情需要做。

2、不用挑剔发行版本

很多人刚开始用 Linux 的时候,总是在怀疑别的发行版本是否比自己正在用的这个好,总是怀疑自己以后时候会失去支持,不得不换用别的发行。所以很多人今天是 Redhat,明天又换成了 debian, 一会儿又是 gentoo, …… 甚至有的人在一台机器上装了两个版本的 Linux,然后比较哪一个好。

其实你完全没有必要这样做,任何发行,只要你熟悉了,你在上面的工作方式几乎是不会受到任何影响的。你常常听说 Debian 的更新比 Redhat 快,包比 Redhat 多,但是你可以比 Debian 更新还要快,直接到你需要的程序的主站点下载源码来编译就是了。

Debian, TurboLinux, SuSE, Redhat, Gentoo, ... 任何一个版本都是不错的。

3、不要当“传教士”

很多人在讨论区不断的引起 "Linux vs. Windows" 之类的讨论,甚至争的面红耳赤,这是没有必要的。因为各人的需要不同,生活的环境不同,你不可能得到一个定论。我们需要尊重别人的选择,这是你在进行任何对工具的讨论前需要提醒自己的事情。面对一些容易引起争论的东西:Word 和 TeX;Emacs 和 VIM;MAXIMA,Mathematica 和 Maple;Gnome,FVWM 和 KDE;Mutt 和 Pine …… 一定要冷静。

你需要关心的不是你的工具是什么,而是你用它做了什么。精通 Linux 并不说明任何问题,因为它只是一个工具而已。如果你用 Windows 能很好的完成你的任务,那你就没有必要费时间去熟悉 Linux。直到有一天你发现一项任务只有 Linux 才能完成的时候再换也不迟,因为你身边的 Linux 的爱好者一定会很乐意的帮助你。

并不是喜欢一种东西就必须反对其它的。世界需要多样性,人们都需要FUN。用自己的兴趣去压制别人的,就会毁掉所有的兴趣。个人喜欢什么就用什么,完全没必要为这个争论。

不要做“传教士”!你说我现在就是在“传教”?冤枉啊~

4、直接从源码安装程序

很多人放着最新的源码不用,等着有人帮他做出 rpm, deb, 才能安装。我说你为什么不用源码编译,这样版本比 rpm 高的多,有很多新功能,而没有烦人的依赖关系。可是他说:“要是我用源码编译安装,卸载的时候就不方便了,会留下很多垃圾。”

为什么程序还没有安装你就想到卸载?难道你不知道这个程序是用来做什么的?你应该改变到处找程序来试用的作法,而应该先了解一下到底那些程序有同样的功能,听听别人的意见,看看它们各有什么长处和短处,然后挑一个最适合你的程序来用。

从源码编译安装程序,不但比你装rpm更适合自己的机器设置,而且它们一般会装到 /usr/local 目录,这样你以后如果换硬盘重装系统,也可以把以前 /usr/local 下的程序原封不动拷贝过去用。我的 /usr/local 下有 2G 之多的程序,你想要是我有一台新机器要重新安装,然后配置,得花费多少时间?实际上我曾经通过网络把它们传到一台新机器上,然后就出去吃晚饭,回来时我就得到了另一台一摸一样的 Linux 机器。

确实要卸载 make install 的程序怎么办呢?答案是直接删掉。别以为直接删掉程序会留下垃圾,引起“系统不稳定”。(btw: 这是谁教你的啊?呵呵。) make install 无非就是把可执行程序放在 /usr/local/bin, 把某些函数库放在 /usr/local/lib,把数据文件放在 /usr/local/share 下一个它自己的目录,你把这些东西都删掉就行了,不会留下垃圾,即使真的留下一点文件没有删掉也占不了多少空间,更不可能引起系统不稳定。UNIX 就是这么简单

但是有几个程序不建议从源码安装,它们是 Mozilla, Open Office, ... 它们编译时会占用你几个G的空间和好几个小时的时间,这种花费我觉得是不值得的,因为你不能从编译得到更多好处,不如直接安装编译好的版本。

5、不要盲目升级

不知道这是心理作用还是什么,有的人看到比较大的版本号,就会很想换成那个。很多人的 Redhat 本来配置的很舒服了,可是一旦 Redhat 发行新的版本,他们就会尽快下载过来,然后选择升级安装。结果很多时候把自己原来修改得很好的配置文件给冲掉了。新的软件又带来了新的问题,比如有一次我的 rxvt 升级到 2.7.8 就跟 miniChinput 冲突了,升级到 Redhat 8.0,发现 xmms 居然缺省不能放mp3了,XFree86 的 xtt 模块在 I810 上有新的 bug,会导致 Mozilla 突然退出。

如果你已经配置好了一切,千万别再整体升级了,这会浪费你很多很多时间的,不值得。如果需要的话,你可以只把某些部件升级,比如内核,glibc, gcc, XFree86,...

使用 UNIX 的经典程序

好的程序一般都是可以很方便的在很多种 UNIX 上移植的,bash, VIM, Emacs, Mutt, FVWM, xterm, 都是这样。如果你用这些程序,你就可以在 Sun, HP, ... 等工作站上也装上,这样你在各种机型上的工作环境就几乎完全一样了!你不需要在 Sun 上面用 CDE,在PC上又换成 KDE,在它们上面都装一个 FVWM,使用相同的配置文件,就能得到一致的界面。

这些程序大部分都是久经考验的,是经过很多人多年开发的结果。它们功能完善,各种情况都考虑周全,绝对是你的好助手。

6、不要配置你不需要的东西

如果你只想做一个像我这样的普通用户,主要目的是用 Linux 来完成自己的科研任务和日常工作,那就可以不用系统管理员或者网络管理员的标准来要求自己,因为当一个系统和网络管理员确实很辛苦。普通用户学习那些不经常用到的复杂的维护系统的工具,其实是浪费时间,学了不用是会很快忘记的!

我不是一个合格的网络管理员,我的服务器都只设置了我自己需要的功能,设置好 ssh, ftp 已经足够了,那样可以省去我很多麻烦。我从来不过度考虑“安全”,因为 Linux 缺省已经很安全了。我没有磁带机,就不用管 tar 的那些稀奇古怪的参数了,czf, xzf, ztf 已经可以满足我所有的需要。sed, awk, ... 我也只会几种常用的命令行。

7、不用忙着看内核源码

除非你想研究操作系统,否则还是先把怎么使用 Linux 掌握好再说吧。我以前看了那么多内核源代码,写了驱动程序,结果最后发现我还是一只很多事情不能用 Linux 解决的菜鸟 吸取我的教训吧,你应该首先掌握 shell,Xwindow 的使用和原理,它们可不比内核简单。

没有评论: