level 13
Linux所支持的硬件的最新信息和最新的完整清单,请查阅 http://tldp.org/HOWTO/HOWTO-INDEX/howtos.html 你可以将Linux直接装到一台裸机上,也可以让其于其它操作系统并存。 从光盘安装Linux操作系统,请在BIOS中将引导顺序设为CD-ROM最先。然后用Linux的安装光盘引导电脑。一般的Linux安装光盘都自带引导功能。继续下去一步一步走就行了。 从硬盘安装Linux有些麻烦。我假设你现在正在使用MS-DOS操作系统。 你首先得将下载下来的Linux文件包解压到硬盘的一个目录下。 然后准备一张软盘,以制作Linux的引导盘。一般在Linux的安装目录下有一个dosutils子目录。在下面找到boot.bat,执行这个批处理文件以制作引导盘。 请注意,根据Linux版本的不同,这一步所用到的工具也不同。有可能是boot.bat。也有可能是其它文件。不过一般,这样的文件,文件名会起得一目了然。如果你有疑问,找一下readme.txt等帮助文件。 然后在BIOS里将引导顺序设为软驱最先。用刚才做好的引导盘启动机器。进入Linux的安装界面。定位安装文件后即可开始安装。其余步骤与光盘安装差不多。 安装Linux基本上有如下几个步骤。 * 选择用户使用的语言,现在除Redflag之外,还有一些Linux也支持中文。 * 选择用户使用的输入设备。 * 选择安装模式(工作站,NFS服务器,Web服务器,News服务器,等等) * 为硬盘分区 * 设置根用户(root)口令,并增加其它用户。 * 选择用户其它的硬件。如显卡,声卡,显示器等等。 * 设置网络。包括IP地址,网关,DNS等等 * 选择用户要安装的软件包 值得注意的是以下几点: Linux使用ext2或者ext3文件系统。安装Linux的时候最少要有两个分区。一个是ext2/ext3格式的,将会挂装为/(/即根目录),一个是交换分区。交换分区大小一般为物理内存大小的二倍。 使用MS-DOS或者Windows系统的朋友应该理解硬盘分区这个概念。比方说你只有一个硬盘,但是你却有C驱,D驱,E驱。这里的C,D,E三个驱动器就是你的硬盘的分区。他们具有各自独立的文件系统,一个分区的损坏不影响另外的分区,从而保证了数据的安全。 在Linux下,分区不是像DOS那样分成C,D那样的驱动器。而是做为一个目录挂装在根目录下(根目录本身也是一个分区)从而形成一个文件系统。如下图: /--- | |---usr/---| | |---include/ | |---lib/ | ... ... |---home/---| | |---syuui/ | |---user001/ ... ... 你可以分出多个区来。比方说分三个ext2。一个挂装到/,一个挂装到/usr,一个挂装到/home。具体按实际需要及个人喜好而定。有些系统默认的目录如/home,/usr,/bin等等,如果你没有挂装一个分区到这个目录,那么系统会自动在根分区下建一个这样的目录。 Linux主要通过TCP/IP协议与其它机器联网。如果你对TCP/IP不了解,可以选择如下设置: IP地址(IP adress) 192.168.0.* (*为1-254间的值) 子网掩码(subnet mask) 255.255.255.0 网关(gateway) 192.168.0.1 网络地址(network adress) 192.168.0.0 广播地址(broadcast adress) 192.168.0.255 主DNS(Primate DNS) 可不设 从DNS(Second DNS) 可不设 或者咨询你的网络管理员。 安装软件包的时候,建议不要安装那些不需要的软件包。下面一些软件包建议安装: * gcc (编译器,安装某些程序的时候可能需要) * X Windows(图形界面。初学者对于深奥的Linux控制台可能无所适从) * samba(使Linux能通过网络被Windows访问的组件。如果你有另一台计算机装了Windows并且两台机器互联的话,可以考虑安装)。 如果你的电脑上同时还拥有别的操作系统,那么你还需要注意以下两点: 1、也许你的Linux的根目录分在了硬盘的1024柱面以后。这样可能造成你的Linux无法启动。建议你分一个大小约为64M的ext2分区,放在硬盘的最先头,并将其挂装为/boot分区。或者你也可以在想使用Linux的时候,用Linux的启动软盘启动。 2、为了避免出现安装完Linux后原来的操作系统(如Windows98)无法启动的现象,注意在安装的时候设置LILO(LInux LOader)。一般在安装Linux的过程中,会要求用户设置LILO。 你也可以用VM虚拟机,在Windows下虚拟安装一个Linux。同样,你也可以在Linux下虚拟出来一个Windows。
2007年11月30日 02点11分
3
level 13
http://post.baidu.com/f?kz=132755644楼
2007年11月30日 02点11分
6
level 13
第四章 运行程序 前面,我们说过ls,cp等命令。其实,这些命令全是系统某目录中的一个文件。如果你愿意,你也可以做一个这样的命令。 Linux命令的格式与DOS相仿。 $ command -switch1 -switch2 ... ... argument1 argument2 switch是命令的开关,以 - 开头(DOS下是以/开头)。argument是命令的参数。 有的命令可以省略开关甚至参数,有的则不可。如 $ ls $ cp myfile1 myfile2 $ rm -r mydir 如果一个文件,其执行属性为真,也就是说当 ls -l mycommand (mycommand是那个命令)的时候,r-xr-xrwx那一列中有x属性的话,那么就可以称它为一个命令。 DOS下,一个可以被执行的文件通常有如下扩展名: .exe .com .bat …… 这是因为DOS是按扩展名来分辨文件的属性的。而Linux下,扩展名只是文件的一部分。系统是不按照扩展名来区分文件属性的。所以,在Linux下不要看到一个.exe就认为这一定是一个可执行文件(Linux下实在也看不到.exe,除非你硬要重命名一个)。 在DOS下,直接输入可执行文件名,省去扩展名也可以执行该文件。而在Linux下,必须输入完整文件名。 这里我们得谈一下$PATH问题。 Linux下,有很多系统变量和环境变量。用set命令可以显示出系统中所有的系统变量。如下例: $ set autologout 60 cwd /home/syuui file /home/syuui/.i18n path (/usr/local/bin /bin /usr/bin /usr/X11R6/bin /home/syuui/bin) 这只是表示的一小部分。用setenv命令,则可以显示出系统中所有的环境变量。如下例: $ setenv REMOTEHOST=192.168.0.111 HOME=/home/syuui PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/syuui/bin SHELL=/bin/tcsh MAIL=/var/mail/syuui LOGNAME=syuui PWD=/home/syuui USER=syuui 可能大家注意到了。系统变量用的变量名,一般是小写字母。而环境变量则一般用的是大写字母。不过这也不是绝对的。 系统变量,一般是用户用来简单设置某些系统参数,或者系统用来显示当前设置的变量。环境变量,则是为应用程序等等提供了一些额外的设置。 系统变量和环境变量以$开头,后跟变量名。如$cwd,$PATH等等。用set或者setenv看到的只是变量名。如果想要查看一个单一的变量的值,可以用echo命令显示其值 $ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/syuui/bin MS -DOS下有一个autoexec.bat自动批处理文件,用来每次启动时设定一些常用的东西。同样地,Linux下也有这样的shell脚本文件,用来在一个用户登陆的时候设定一些设置。管理员可以设定一个公用的脚本,供每个用户使用,这个脚本一般是/etc/profile。每个用户也可以建立自己的登录脚本,放在自己的主目录下,其文件命根据shell的不同而不同,如tcsh的登陆脚本一般是.cshrc,而bash的则是. bash_profile。 如果在登陆后修改了登陆脚本,并且想马上执行这个脚本,可以选择重新登陆一次,也可以用source命令。如 $ source $HOME/.cshrc 言归正传,这里我提请大家注意在环境变量中有这样的一行: PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/syuui/bin 这一行是根据系统变量中的 path (/usr/local/bin /bin /usr/bin /usr/X11R6/bin /home/syuui/bin) 得来的。当对系统变量path做改动的时候,相应地,环境变量的PATH也会改动。 这个变量,代表着当用户要求执行一个命令的时候,系统的搜索路径。也就是说,当用户输入一个命令,shell判定这个命令不是一个内部命令(集成在 shell中的命令)的话,则会照着$PATH中规定的路径依次寻找该命令的文件。如在上例中,如果输入 gcc 命令,shell将会寻找 /usr/local/bin 在/usr/local/bin下没有gcc这个文件,于是继续寻找 /bin 在/bin下也没有gcc这个文件
2007年11月30日 02点11分
9
level 13
/usr/bin 在/usr/bin/gcc下找到gcc这个文件,执行此文件,然后不再继续查找。 这样,我们就不需要每一次输入命令的时候都输入命令的完整路径了。通常情况下,每一个普通用户的$PATH中都包含了常用的命令所在的路径。通常是 /bin和/usr/bin,以及有的时候还有/usr/local/bin。这样一来,我们只需要简单地输入命令名则可以执行命令。如前几章所说的 /bin/ls命令。我们在确定/bin在自己的路径变量$PATH中之后,只需要输入ls即可执行该命令了。 不要把当前目录 ./ 放在$PATH中!! Linux 与DOS有点不同:DOS是首先判断这是否是一个内部命令。如果不是,则在当前目录下寻找命令文件,然后再依次到规定的路径中去寻找。而Linux是先判断这是否是一个内部命令。如果不是的话,则依次到规定的路径中去寻找这个命令的文件,找不到则报错——Linux不会自动在当前目录下寻找的。所以,如果你想执行当前目录下的命令文件(比如你自己写的C程序),你需要这样输入: $ ./myprog 一般,用户登录之后,系统会自动为一部分变量赋值。如$USER,$HOME等等。然而你也可以为一部分变量赋值,甚至定义自己使用的环境变量等。 set命令或者setenv命令也可以用来为单个变量赋值。如: $ set path=($path /home/user01/bin) 则将变量path后面加上了一个/home/user01/bin。而 $ unset path 则删除此变量path。 $ setenv MYENV "This is my env" 设定环境变量MYENV的值为"This is my env"。而删除则要用到 $ unsetenv MYENV 在Linux下,一行中可以输入多个命令,命令之间用分号隔开。 与DOS同样,Linux下也有输入、输出重定向及管道操作。所谓输入输出重定向解释如下: Linux 将输入,输出和错误,看成是一个流式文件。分别用stdin,stdout和stderr来表示。亦即:标准输入,标准输出,标准报错三个。其中,标准输入是默认为从键盘输入。标准输出和标准报错都是默认为输出到显示。然而,Linux可以将标准输入输出、标准报错这三个流重定向到一个文件,或者其它的什么地方。输入输出重定向要用到 < 和 > 这两个重定向操作符 重定向标准输入,可以使用 < 这个操作符。如下例: $ cat < dir.c /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- dir.c : search file Copyright (C) 2003 by syuui . All rights reserved . Usage : dir
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ #include
#include
#include
#include
#include
cat 这个命令,本来是用来显示文本文件的内容。如果cat后面带文件名,则显示这些文件。如果不带,则将标准输入的输入内容回显。上例中,< 及其后面的部分,不做为cat的参数(因为shell以其有特殊的解释——重定向操作符)。也就是说,cat命令后面没有带参数。如上所说:cat后面不带参数的时候应该显示的是从标准输入输入进来的东西。然而我们可以看到:我们上面命令的执行结果不是标准输入中的内容,而是dir.c文件的内容。 这是为什么呢?是因为,<这个输入重定向操作符,将标准输入暂时重定向到了dir.c这个文件中。这样cat就不再从标准输入读取内容,而是从dir.c中读取内容了。当命令结束后,标准输入自动回复到键盘。 同理,输出也可以用 > 来重定向。如下: $ ls -l > list.txt $ cat list.txt 总用量 28 drwxrwxr-x 2 syuui syuui 4096 1月 2 01:16 bin drwxrwxr-x 2 syuui syuui 4096 12月 9 21:17 include drwxrwxr-x 2 syuui syuui 4096 12月 16 17:16 lib -rw-rw-r-- 1 syuui syuui 0 1月 4 22:31 list.txt drwxrwxr-x 4 syuui syuui 4096 12月 12 04:49 okdata
2007年11月30日 02点11分
10
level 13
第五章 Linux使用基础-管理进程 上一章我们讨论了在Linux下运行程序。本章继续上一章的话题,讨论一下在Linux下管理进程。 所谓进程(Process),简单地说,就是指“运行中的程序”,包括这个程序所占用的内存,CPU时间片等资源。 Linux是一个多用户多任务的操作系统。多任务,是指一个用户登录后,可以同时运行很多程序,多用户是指同一个时间内可以有很多人登陆上来工作。无论是多用户,还是多任务,都必须同时执行多个程序,也就是,使用多个进程。 在Linux下,进程有四个状态,即:运行,等待,停止,僵死。 运行状态,是指该进程正在被CPU处理中,正在被执行的进程。 等待状态,是指该进程正在等待,也许是在等CPU的使用权,也许是在等读写硬盘结束,也许是在等待网络传输……等等。 停止状态,是指进程由于接收到信号等等原因,临时停止一段时间(如用Ctrl+Z停止一个进程)。需要注意的是,这个进程虽然停止,但是仍可继续运行。 僵死状态,是指该进程完成工作,但是由于某些原因,暂时还没有结束的进程。 在Linux下,用户同时可以使用多个进程。每一个进程都可以看成是单独执行的。然而,用户可能希望两个或者多个进程共同完成一个任务,这样就需要各个进程之间互相通信。如同你是老板,你要求手下两个员工分别做两项工作。也许这两个员工需要互相沟通以便完成工作,这样你就需要提供某种机制,使得两个员工可以互相交流。Linux提供了许多机制供进程间互相通信,称为“进程间通信(IPC)”。信号和管道,以及消息队列,是比较常见的三种。注意:这里提到的 “管道”,不是以前面说的 | 操作符来实现的,但原理相同。 在Linux这个多用户的操作系统下,系统的安全问题显得至关重要。某些操作,必须要有一定权限的用户才可以进行。同样,某些资源,也只有一定权限的用户才可以使用。前面曾说过,在Linux下每一个文件都有一个权限标志符,根据这个标志符,系统判断用户对该文件拥有何种权限(读、写、执行)。 同样,系统中每一个用户,每一个组都有自己的权限。前面说过,系统中的用户都有一个唯一的编号,称为UID,每一个组也有一个唯一的编号,称为GID,系统正是根据这些编号来区分用户是否有权限进行某种操作的。 在Linux系统中,进程也有自己的ID,称为PID(Process ID)。而且,进程也有自己的权限标志。这个权限标志通常是根据进程的开创者的 UID来决定的。也就是说,如果一个用户没有权限读某个文件(如/etc/shadow),那么他开创的进程,他所执行的程序,通常也没有权限去读这个文件。 进程在系统中也是被看成文件。进程文件一般存放在/proc下,每一个进程的文件存放在与PID同名的子目录里。 查看当前系统中的进程,可以用 /bin/ps 。如: $ ps PID TTY TIME CMD 2583 pts/0 00:00:00 tcsh 2607 pts/0 00:00:00 ps 可以看到,当前用户执行中的进程有两个。一个PID为2583,命令名为tcsh。另一个则是刚刚执行的PID为2607的ps命令。 $ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Jan08 ? 00:00:04 init mysql 1686 1656 0 Jan08 ? 00:00:00 [mysqld] apache 1775 1732 0 Jan08 ? 00:00:00 [httpd] syuui 2651 2583 0 04:42 pts/0 00:00:00 ps -ef 可以看到执行者,PID,命令名等信息。 如果有某个程序进入死循环,或者其它非正常,且不能用Ctrl+C停止的话,我们可以用ps命令找到其PID,然后用 /bin/kill 命令杀死这个进程。 $ ps PID TTY TIME CMD 2583 pts/0 00:00:00 tcsh 2655 pts/0 00:00:00 ls 2657 pts/0 00:00:00 ps 我们看到有一个ls命令(其实这是笔者故意中止的一个进程。该进程处于停止状态,但仍可继续执行),其PID为2655。想要杀掉他,则可以: $ kill 2655 这样就杀死了这个进程(实际上,这个进程应该进入僵死状态,直到下一次运行ps等命令查看进程的时候才真正结束。 有一些进程,即使使用kill命令也无法杀死。对于这些顽固的进程,可以在 kill 后面加上 -9 参数,强行干掉它。 Linux系统运行程序的时候,分为“前台运行”和“后台运行”。所谓前台运行,是指在这个程序运行的时候,不出现系统提示符,用户的全部精力全放在等待进程结束。而后台运行,则是执行命令之后马上回到提示符下,用户可以继续运行其它命令进行其它工作。 上一章我们讨论过在Linux控制台下执行命令的方法。这种方法是前台执行。如果要后台执行也好办:在命令行最尾处加上一个 & 符号。如: $ ls & [1] 2662 $ bin include lib list.txt okdata OkProg src test 注意,上面有两个提示符,第一个提示符下我们输入了 ls & 命令,第二个提示符后不是我输入的,而是ls命令的输出。这个时候你也可以输入命令而不会理会它的输入。只是看上去乱一些罢了。 后台执行的命令不可以有键盘输入!如果命令要求从键盘输入的话,则会自动变回前台执行。 前台与后台可以相互切换。一个前台命令执行的时候,可以用组合键Ctrl+z停止该进程运行,然后用 bg 命令将其放到后台执行。用 jobs 命令则可以查看后台执行的进程。然后可以用 fg 命令,将后台执行的进程转至前台执行。 [1] Done ls --color=tty 说到这时,我们再顺便说说虚拟终端的问题。 一个终端,可以近似地看成是一个键盘和一个显示器。键盘接收命令,传送给主机执行后将结果返回到显示器上。 终端这个词,最初是用在大型机上的。一个大型机带很多台终端,用户通过终端登陆到主机上进行工作。而现在有很多telnet软件,可以将一台PC虚拟成一个终端。 Linux可以虚拟出六个终端来,注意是必须在安装Linux的机器上才能够使用这些虚拟终端。你可以同时使用这六个终端,通过Alt+F1至Alt+F6进行切换。
2007年11月30日 02点11分
12