楚雄的鱼_列表_Linux博客/红联Linux博客 - powered by X-Spac...

来源:百度文库 编辑:神马文学网 时间:2024/04/25 16:28:45
1. man 对你熟悉或不熟悉的命令提供帮助解释
eg:man ls 就可以查看ls相关的用法
注:按q键或者ctrl+c退出,在linux下可以使用ctrl+c终止当前程序运行。
2. ls 查看目录或者文件的属*,列举出任一目录下面的文件
eg: ls /usr/man
ls -l
a.d表示目录(directory),如果是一个"-"表示是文件,如果是l则表示是一个连接文件(link)
b.表示文件或者目录许可权限.分别用可读(r),可写(w),可运行(x)。
3. cp 拷贝文件
eg: cp filename1 filename2 //把filename1拷贝成filename2
cp 1.c netseek/2.c //将1.c拷到netseek目录下命名为2.c
4. rm 删除文件和目录
eg: rm 1.c //将1.c这个文件删除
5. mv 移走目录或者改文件名
eg: mv filename1 filename2 //将filename1 改名为filename2
mv qib.tgz ../qib.tgz //移到上一级目录
6. cd 改变当前目录 pwd 查看当前所在目录完整路径
eg: pwd //查看当前所在目录路径
cd netseek //进入netseek这个目录
cd //退出当前目录
7. cat,more命令
将某个文件的内容显示出来。两个命令所不同的是:cat把文件内容一直打印出来,而 more则分屏显示
eg; cat>1.c //就可以把代码粘帖到1.c文件里,按ctrl+d 保存代码。
cat 1.c 或more 1.c //都可以查看里面的内容。
gcc -o 1 1.c //将1.c编译成.exe文件,我们可以用此命编译出代码。
8.chmod 命令 权限修改 用法:chmod 一位8进制数 filename。
eg: chmod u+x filenmame //只想给自己运行,别人只能读
//u表示文件主人, g 表示文件文件所在组。 o 表示其他人 ;r 表可读,w 表可写,x 表可以运行
chmod g+x filename //同组的人来执行
9. clear,date命令
clear:清屏,相当与DOS下的cls;date:显示当前时间。
10. mount 加载一个硬件设备
用法:mount [参数] 要加载的设备 载入点
eg: mount /dev/cdrom
cd /mnt/cdrom //进入光盘目录
11. su 在不退出登陆的情况下,切换到另外一个人的身份
用法: su -l 用户名(如果用户名缺省,则切换到root状态)
eg:su -l netseek (切换到netseek这个用户,将提示输入密码)
12.whoami,whereis,which,id
//whoami:确认自己身份
//whereis:查询命令所在目录以及帮助文档所在目录
//which:查询该命令所在目录(类似whereis)
//id:打印出自己的UID以及GID。(UID:用户身份唯一标识。GID:用户组身份唯一标识。每一个用户只能有一个唯一的UID和 GID)
eg: whoami //显示你自已登陆的用户名
whereis bin 显示bin所在的目录,将显示为:/usr/local/bin
which bin
13. grep,find
grep:文本内容搜索;find:文件或者目录名以及权限属主等匹配搜索
eg: grep success * /*查找当前目录下面所有文件里面含有success字符的文件
14. kill 可以杀死某个正在进行或者已经是dest状态的进程
eg; ps ax
15. passwd 可以设置口令
16. history 用户用过的命令
eg: history //可以显示用户过去使用的命令
17. !! 执行最近一次的命令
18. mkdir命令
eg: mkdir netseek //创建netseek这个目录
19. tar 解压命令
eg: tar -zxvf nmap-3.45.tgz //将这个解压到nmap-3.45这个目录里
20. finger 可以让使用者查询一些其他使用者的资料
eg: finger //查看所用用户的使用资料
finger root //查看root的资料
查看(53)评论(0)收藏推荐
linux系统管理简介
2007-08-01 22:08:03
每个Linux系统都至少有一个人负责系统的维护和操作,这就是系统管理员。对于PC机用户来说,可以身兼数职,既是用户,又是系统管理员。系统管理员的职责就是保证系统平稳的操作和执行各种需要特权的任务。具体说来,系统管理员要做以下几方面的工作:
设置整个计算机系统,包括硬件和软件,如安装硬件设备、安装操作系统和软件包、为用户建立账户等。
做适当的备份(系统中常规文件拷贝)和需要时的恢复。
处理由于计算机有限资源的使用(如磁盘空间、进程数目等)而遇到的问题。
排除由于连接问题而造成的系统通信(网络)阻塞。
进行操作系统的升级和维护。
为用户提供常规支持。
依据系统的规模和用户数目的多少,系统管理的工作可多可少,可以是日常随时要做的工作,也可能是每天一次甚至每月一次的维护工作。如果系统较小,则维护工作就可以不断地进行。系统管理员必须认真负责地工作,他手中握有控制系统运行的特权,若粗心应付,必然影响系统的性能,甚至使系统崩溃。
用户和工作组管理
所有新用户要想进入Linux系统,必须由系统管理员预先在该系统中建立一个账户。用户账户可帮助系统管理员记载使用系统的人们,并控制他们对系统资源的存取。账户管理也有助于组织用户文件和控制其它用户对它们的访问。这样,管理和维护用户的账号、口令及权限也就成为系统管理员日常工作的一个重要组成部分。
用户账号
用户在使用Linux时,必须确保自己是系统授权的合法用户。对于用户的账号、口令、访问权限的管理是Linux系统管理员日常工作中的一个重要组成部分。
在Unix/Linux系统中,用户账号的概念具有多种意义,其中最主要的是基于身份鉴别和安全的原因。系统必须对使用机器的人加以区别,账号概念给系统提供了一种区别用户的方法。系统中每个用户有一个个人账号,每个账号有着不同的用户名和口令。用户可以为自己的文件设置保护,允许或限制别人访问它们。
除了一般个人账号之外,系统上还必须存在能够管理系统的高级用户,如root账号就是系统管理员用于维护系统的缺省账号。另外,系统中还存在一些不能与人交互的特殊账号,如bin、sync等。
1.passwd文件)
通常在Linux系统中,用户的关键信息被存放在系统的/etc/passwd文件中,系统的每一个合法用户账号对应于该文件中的一行记录。这行记录定义了每个用户账号的属性。下面是一个passwd文件的示例(部分摘录):
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......
desktop:x:80:80:desktop:/var/lib/menu/kde:/sbin/nologin
mengqc:x:500:500:mengqc:/home/mengqc:/bin/bash
在该文件中,每一行用户记录的各个数据段用“:”分隔,分别定义了用户的各方面属性。各个字段的顺序和含义如下:
注册名:口令:用户标识号:组标识号:用户名:用户主目录:命令解释程序
(1)注册名(login_name):用于区分不同的用户。在同一系统中注册名是惟一的。在很多系统上,该字段被限制在8个字符(字母或数字)的长度之内;并且要注意,通常在Linux系统中对字母大小写是敏感的。这与MS DOS/Windows是不一样的。
(2)口令(passwd):系统用口令来验证用户的合法性。超级用户root或某些高级用户可以使用系统命令passwd来更改系统中所有用户的口令,普通用户也可以在登录系统后使用passwd命令来更改自己的口令。
现在的Unix/Linux系统中,口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个“x”来代替,将 /etc/shadow作为真正的口令文件,用于保存包括个人口令在内的数据。当然shadow文件是不能被普通用户读取的,只有超级用户才有权读取。
此外,需要注意的是,如果passwd字段中的第一个字符是“*”的话,那么,就表示该账号被查封了,系统不允许持有该账号的用户登录。
(3)用户标识号(UID):UID是一个数值,是Linux系统中惟一的用户标识,用于区别不同的用户。在系统内部管理进程和文件保护时使用 UID字段。在Linux系统中,注册名和UID都可以用于标识用户,只不过对于系统来说UID更为重要;而对于用户来说注册名使用起来更方便。在某些特定目的下,系统中可以存在多个拥有不同注册名、但UID相同的用户,事实上,这些使用不同注册名的用户实际上是同一个用户。
(4)组标识号(GID):这是当前用户的缺省工作组标识。具有相似属性的多个用户可以被分配到同一个组内,每个组都有自己的组名,且以自己的组标识号相区分。像UID一样,用户的组标识号也存放在passwd文件中。在现代的Unix/Linux中,每个用户可以同时属于多个组。除了在 passwd文件中指定其归属的基本组之外,还在/etc/group文件中指明一个组所包含用户。
(5)用户名(user_name):包含有关用户的一些信息,如用户的真实姓名、办公室地址、联系电话等。在Linux系统中,mail和finger等程序利用这些信息来标识系统的用户。
(6)用户主目录(home_directory):该字段定义了个人用户的主目录,当用户登录后,他的Shell将把该目录作为用户的工作目录。在 Unix/Linux系统中,超级用户root的工作目录为/root;而其它个人用户在/home目录下均有自己独立的工作环境,系统在该目录下为每个用户配置了自己的主目录。个人用户的文件都放置在各自的主目录下。
(7)命令解释程序(Shell):Shell是当用户登录系统时运行的程序名称,通常是一个Shell程序的全路径名,如/bin/bash。
当用户登录后,将启动这个程序来接收用户的输入,并执行相应的命令。从Linux核心的角度看来,Shell就是用户和核心交流的一种中间层面,用于将用户输入的命令串解释为核心所能理解的系统调用或中断子例程,同时又将核心的工作结果解释为用户能理解的可视化输出结果。所以,对用户而言, Shell被称为命令解释程序;而对于核心而言,Shell又被称为外壳程序。
需要注意的是,系统管理员通常没有必要直接修改passwd文件,Linux提供一些账号管理工具帮助系统管理员来创建和维护用户账号。
2.shadow文件
目前,在大多数Unix/Linux系统中,利用/etc/shadow文件存放用户账号的加密口令信息和口令的有效期信息。下面示例是shadow文件中的几条记录(与上面的passwd文件相对应):
root:$1$Vfcp2rdI$R0bDID/CvD3FfTeTtnk7u.:12489:0:99999:7:::
bin:*:12489:0:99999:7:::
daemon:*:12489:0:99999:7:::
......
desktop:!!:12489:0:99999:7:::
mengqc:$1$pNPtXOsd$gk5mQEfx5hJfPzpmgQ78k/:12489:0:99999:7:::
在Linux系统的shadow文件中,为每个用户提供一条记录,各个字段用“:”隔开,这9个字段按先后顺序分别是:
◆注册名;
◆密文口令;
◆上次更改口令时间距1970年1月1日的天数;
◆口令更改后,不可以更改的天数;
◆口令更改后,必须再次更改的天数(即口令的有效期);
◆口令失效前警告用户的天数;
◆口令失效后距账号被查封的天数;
◆账号被查封时间距1970年1月1日的天数;
◆保留字段。
Unix/Linux修改口令的机制很简单:用户修改口令时使用passwd命令,该命令通常位于/usr/bin。普通用户只能修改自己的口令,而且必须回答老的口令;root可以修改系统中任何用户的口令,并且此时系统不会询问老的用户口令。
建立和删除账号
对系统而言,创建一个用户账号需要完成以下几个步骤:
第一步,添加一个记录到/etc/passwd文件;第二步,创建用户的主目录;第三步,在用户的主目录中设置用户的默认配置文件(如.bashrc)。
在几乎所有的Linux系统中都提供了useradd或adduser命令,它们能完成以上这一系列工作。通常这两个命令没有区别。另外,root 用户可以使用KDE桌面系统为新用户建立账号和口令。其过程是“控制面板”→“用户和组群”→“添加新用户”,按照屏幕上的提示要求输入相应的参数,包括用户名、描述信息(可选)、密码及确认,然后设置用户-组的关系。
要删除已经存在的用户账号,必须从/etc/passwd文件中删除此用户的记录项,从/etc/group文件中删除提及的此用户,并且删除用户的主目录及其它由该用户创建或属于此用户的文件。这些工作可以使用userdel命令来完成,也可以使用桌面系统“控制面板”→“用户和组群”,在“本地用户和组”的窗口中选定要删除的用户,然后单击“删除”小图标,并予以“确定”。
某些时候,需要临时使某个账号失效,例如用户没有付费,或者是系统管理员怀疑黑客得到了某个账户的口令,解除限制后,该账号仍旧可以登录,这就是所谓的查封账号。当需要查封某个账号时,可以将用户记录从/etc/passwd文件中去掉,但是保留该用户的主目录和其它文件;或者在 /etc/passwd (或/etc/shadow)文件中,在相关用户记录的passwd字段的首字符前加上符号“*”,例如,希望查封前面提到过的用户账号mengqc,则在/etc/shadow文件中将该用户记录修改如下:
mengqc:*$1$pNPtXOsd$gk5mQEfx5hJfPzpmgQ78k/:12489:0:99999:7:::
这样,就限制了该用户账号的登录。
但是要注意,这样做会使得用户弄不清发生了什么事情。为了避免引起不必要的误会,管理员还可以使用另一种方法来查封用户:将用户账号的Shell设置成一个特定的、只打印出一条信息的程序。用这种方法,任何想登录此账号的人将无法登录,并能得知具体原因。该信息还可以告诉用户应与系统管理员联系,以处理相关问题。
下面就是这样一个用于取代用户Shell程序的“tail scrīpts”示例程序:
#!/usr/bin/tail +2
This account has been closed due to a security breach.
Please call 36 and wait for the men in black to arrive.
上面代码中前2个字符(#!)告诉核心,本行的其它部分是解释本文件要运行的命令。这样,tail命令将在屏幕上显示除第一行外的所有东西。通常这种tail scrīpts被存放在独立于用户目录的路径中,以免和用户命令产生混淆。
工作组管理
利用工作组可以方便地把相关用户账号逻辑地组织在一起。在组的支持下,允许用户在组内共享文件。Linux系统中每一个文件都有一个用户和一个组的属主,也就是说系统中任何一个文件都归属于某个组中的一个用户。使用“ls -l”的命令可以看到文件所属的用户和组,例如/home/mengqc目录下存在文件ex1,运行“ls -l”将输出如下结果:
$ ls -l ex1
-rwxr-x--- 1 mengqc mengqc 31 3月27 09:18 ex1
每个用户至少属于一个组,这种从属关系对应于系统/etc/group文件中的GID字段,但是一个用户可以从属于多个组。类似于/etc/passwd文件,系统中的每个组都对应/etc/group文件中一行记录。记录的各字段属性依次定义如下:
组名:口令:组标识号:用户列表
其中,各个字段的含义如下:
◆组名(group_name):顾名思义,组名就是工作组的名字。
◆口令(passwd):组的口令,但口令字段不常用,允许不在这个组中的其它用户用newgrp命令来访问属于这个组的资源。
◆组标识号(GID):GID是系统用来区分不同组的标识号,它在系统中是惟一的。在/etc/passwd文件中,用户的组标识号字段就是用这个数字来指定用户的缺省组。
◆用户列表(user_list):用户列表是用“,”分隔的用户注册名集合,列出了这个组的所有成员。但是需要注意的是,这些被列出的用户在 /etc/passwd文件中对应的GID字段(即用户的缺省组)与当前/etc/group文件中相应的GID字段是不同的。也就是说,组的默认用户不必列在该字段中。
下面是从一个/etc/group文件中摘录的部分记录项:
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
......
desktop:x:80:
mengqc:x:500:
在Linux系统中,root和bin都是管理组。系统中很多文件都属于这两个组。mengqc是一个普通的用户组。
在实际的应用中,口令字段是完全没有必要的。事实上,很多系统没有提供设置组口令的工具。这是因为要使一个用户成为多个组的成员,只需要把用户注册名加入到这些组的用户列表字段中。
用户可以使用groups命令列出当前用户所属的所有组的名称。
当用户登录时,被自动赋予/etc/passwd文件中的GID属性,也自动成为/etc/group文件中列出该用户组的成员。
对于工作组的设置主要包括以下几项工作:
◆创建和删除工作组;
◆修改组的属性;
◆调整用户所属组;
◆组权限的设定。
添加组的命令是groupadd,删除组的命令是groupdel,修改组属性的命令是groupmod,也可以利用桌面系统实现上述功能。
设置用户登录环境
以上是用户基本属性的设置。但是,用户在使用Linux系统的时候,还需要相关的工作环境。为此,管理员应为用户设置登录环境。
当用户登录Linux系统后,通常接触的第一个软件环境就是bash命令解释程序,这是除了系统核心之外最重要的软件环境。在Linux系统中,软件环境的配置信息通常都存放在一些配置文件中。
以下是一些较为重要的Shell环境配置文件:
◆/etc/bashrc 包含系统定义的命令别名和bash的环境变量定义。
◆/etc/profile 包含系统的环境定义,并指定启动时必须运行的程序。
◆/etc/inputrc 包含系统的键盘设定,以及针对不同终端程序的键位配置信息。
◆$HOME/.bashrc 包含为用户定义的命令别名和bash的环境变量定义。
◆$HOME/bash_profile 包含为用户定义的环境变量,并指定用户登录时需要启动的程序。
◆$HOME/.inputrc 包含用户的键盘设定,以及针对用户终端的键位配置信息。
这些文件都是采用Shell语言编写的系统脚本文件,通常用户目录下的配置文件与/etc目录中相对应的文件大致相同。
用户磁盘空间限制
在Linux系统中,系统管理员可以控制用户对硬盘的使用。也就是说,能够限定用户使用的硬盘空间的大小,其好处是可以将整个硬盘资源公平合理地进行分配,从而不会出现某个用户或某些用户占用过多的硬盘空间,而导致其它用户工作不便的现象。
Linux系统是通过quota(磁盘限额)机制来实现对用户使用硬盘资源的控制。quota可以从两个方面来限制用户使用硬盘资源:
◆用户所能够支配的索引节点数;
◆用户可以存取的硬盘分区数。
quota机制的功能是强制用户在大部分时间内保持在各自的硬盘使用限制下,取消用户在系统上无限制地使用硬盘空间的权力。
该机制是以用户和文件系统为基础的。如果用户在一个以上的文件系统上创建文件,那么必须在每个文件系统上分别设置quota。
通常quota的配置过程如下:
(1)首先应该确保在Linux核心中提供对quota的支持。也就是说在配置核心时,对于以下核心开关选项:
quota support(CONFIG_QUOTA)
应该设置为“Y”,使核心提供对quota机制的支持。
(2)安装与quota相关的软件包。通常的Linux系统(例如,红旗Linux 服务器版)在系统安装时会缺省地安装相关的软件包,包的命名方式一般为quota-x.xx-x.i386.rpm。如果系统没有安装过该软件包,可以使用以下命令将该包安装上:
rpm -ivh quota*.rpm
(3)修改用户的系统初启脚本文件,使之能够检查quota并在系统初启时开启quota功能。以下是一个初启脚本文件示例:
#检查quota程序并且开启quota磁盘限额功能
if [ -x /sbin/quotacheck ]
then
echo "Cheching quotas......"
/sbin/quotacheck -avug
echo "[Done]"
fi
if [ -x /sbin/quotaon ]
then
echo "Turning on quota......"
/sbin/quotaon -avug
fi
上面这段脚本可以添加到文件/etc/rc.d/rc.sysinit或/etc/rc.d/rc.local中。但是需要注意,必须在加载用户 /etc/fstab中指定的文件系统后,才能启动quota;否则quota将不会运行。这是因为quota是依赖于文件系统的,只有为用户加载文件系统后,才能为用户设置quota。
(4)修改初启时文件系统的支持
前面介绍对quota初启脚本的编写时曾提到过,在使用脚本文件开启quota功能之前,必须在加载/etc/fstab文件中指定了文件系统。这是因为为了在系统每次初启时使文件系统上的硬盘限额是有效的,/etc/fstab文件也需要进行相应的修改。
在/etc/fstab文件中,没有启用quota的分区一般如下所示:
/dev/hda1 / ext2 defaults 1 1
/dev/hdb2 /work ext2 defaults 1 2
如果要在文件系统中加入用户quota功能,则应在包含“defaults”选项的后面加上“usrquota”。例如,我们要为/dev/hdb2上的文件系统设置quota,则修改如下:
/dev/hdb2 /work ext2 defaults,usrquota 1 2
如果用户需要启动文件系统中对用户组quota的支持,则需要在包含“defaults”选项的后面加上“grpquota”:
/dev/hdb2 /work ext2 defaults,grpquota 1 2
如果需要同时支持用户quota与组quota,则修改如下:
/dev/hdb2 /work ext2 defaults,usrquota,grpquota 1 2
(5)建立quota.user和quota.group文件
在上面(3)所述脚本中,命令“quotacheck -avug”的作用是检查需要打开磁盘限额的目录下的所有子目录,并建立quota.user和quota.group配置文件。这两个文件用于记录 quota的配置信息,以及当前quota目录下硬盘的使用情况。第一次执行这样的检查过程可能会比较慢。
如果是第一次安装quota,则必须先定位到要设定quota的目录中,上面的示例目录是/work,在该目录中执行“quotacheck- avug” 命令,让系统自动生成quota.user和quota.group文件。这两个文件的内容相对较为简单,读者可一目了然。
文件系统及其维护
Linux系统对于它能够识别的所有文件系统类型提供了一个通用界面,所以对用户来说,文件存储的精确格式和方式并不重要。Linux可以支持的主要文件系统类型有ext2和ext3文件系统,用于存储Linux文件;MS DOS文件系统,允许Linux访问MS DOS/Win9x分区和软盘上的文件;其它文件系统包括CD ROM使用的ISO 9660文件系统等。
作为系统管理员,应该掌握以下这样一些知识和技能:
◆清楚Linux上文件系统的组织方式,以及文件的存储原理;
◆熟悉关于分区和文件系统的配置文件;
◆在软盘上创建文件系统,以及在硬盘上添加新的文件系统;
◆使用各种工具检查和修复文件系统;
◆此外还应该熟悉访问文件系统上文件的各种命令。
如前所述,文件系统是操作系统用于在磁盘上组织文件的机制,其载体是软盘或硬盘分区。一个软盘或硬盘分区在作为文件系统使用时必须要初始化,并将如何组织文件的数据结构写到这些介质上,这个过程就是建立文件系统过程。通常一个操作系统的大部分程序都是基于该操作系统环境下文件系统的,当转移到别的文件系统上就不能正常工作。
在Linux中,每个文件系统占据硬盘的一个独立分区。Linux系统可以拥有多个文件系统。因此,在安装Linux系统之前,至少需要准备好一个文件系统,用来存放Linux本身。一般来说,建议在安装Linux系统时,最好为其提供多个文件系统,因为这样能够提供较好的系统安全性。
也就是说,当系统某个分区上的文件系统被损坏了,Linux其它分区上的文件系统不会受到影响。相反,如果把所有文件都存放在根文件系统下,那么,当该文件系统损坏时,所有的Linux文件都将丢失。
此外,使用多文件系统的另一个原因是,需要在多个硬盘上分配存储空间。就是说,可以将多个硬盘上的空间划分为多个分区供Linux使用,以便充分利用系统的硬盘空间。
建立文件系统
当硬盘完成分区后,应该在该分区上建立文件系统。这一步工作是通过mkfs工具来完成的。实际上,对每种文件系统Linux都提供一个相应的工具来做这个工作。mkfs使用参数-t fstype来指定所要建立的文件系统类型。通常创建文件系统的操作会将原来该分区上的数据清除掉,并且该过程是不可逆的。
mkfs命令的一般格式如下:
mkfs [-t fstype] [-cv] device_or _mount_point [blocks]
其中,-t fstype选项用于指定所需创建的文件系统类型。缺省情况下,是ext2文件系统。如果要建立MS DOS文件系统,应使用参数msdos。选项-c用于查找分区中的坏块,并初始化坏块列表。通常初次安装系统时,建议使用该选项。
例如,如果需要在分区/dev/hda1上建立ext2文件系统,并检查坏块,应该使用以下命令:
# mkfs -c /dev/hda1
使用文件系统
创建文件系统后,需要使用命令mount将该文件系统安装到主文件系统中。命令mount有三个主要参数:
(1)需要安装的文件系统类型,用-t fstype选项来指定,这与mkfs中的-t选项是一样的。
(2)所需访问的文件系统所在分区名,通常是位于目录/dev中的特别设备文件;如果需要安装网络文件系统时,就使用该服务器上输出的目录名。
(3)安装新文件系统的路径名,也就是放置新文件系统的安装点(Mount Point)。通常这是一个空目录名,并且是专门为安装新文件系统而准备的。在Linux系统下,目录/mnt是常用的文件系统安装目录,缺省情况下, CD ROM和软盘驱动器都分别安装在其子目录下。当然,文件系统也可以被安装到其它空目录中。需要注意的是,不要将一个文件系统安装到一个非空的目录中。如果那样做,该目录中原有的内容会被新安装的文件系统内容所遮盖。
例如,需要将MS DOS文件系统分区/dev/hda1安装到系统的空目录/dos中,应该使用以下命令:
# mount -t msdos /dev/hda1 /dos
安装所需的文件系统后,可以使用不带参数的mount命令来查看当前安装的文件系统。文件系统的安装情况记录在文件/etc/mtab中。每次使用mount或umount(卸装文件系统)命令都会修改该文件,从而使该文件的内容与系统中文件系统的实际安装情况保持一致。
Linux使用了一个/etc/fstab文件,该文件列出在系统初启时需要自动安装的所有分区。此外,该文件也可以向mount命令传递参数。 Linux系统在初启时会执行脚本/etc/rc.d/rs.sysinit,该脚本使用fsck命令检查所需安装Linux分区,在没有发现错误后,将读取/etc/fstab文件中的内容,并根据该文件中指定的参数,自动安装该文件中指定的文件系统。
在关闭系统之前,为了保证文件系统的完整性,所有安装的文件系统都必须被卸载。通常在/etc/fstab文件中定义的文件系统都能够自动卸载。但是,对于手工mount的文件系统,在关闭系统之前必须手工卸载该文件系统。有时候也需要在系统工作过程中手工卸载某个文件系统。手工卸载文件系统必须使用 umount命令。umount命令将分区名或分区的安装点作为参数,格式如下:
umount <分区名或分区的安装点>
例如,需要将已经安装到/mnt/floppy目录下的软盘卸载,可以使用以下命令:
# umount /mnt/floppy
要注意,对于正在使用的文件系统,不能使用umount命令卸载。另外,为了安全起见,在Linux系统中通常只能由系统管理员root来完成硬盘分区、格式化分区、安装文件系统或卸载文件系统等工作。
维护文件系统
1.修复损坏的文件系统
当Linux文件系统由于人为因素或是系统本身的原因(如用户不小心冷启动系统、磁盘关键磁道出错或机器关闭前没有来得及把cache中的数据写入磁盘等)而受到损坏时,都会影响到文件系统的完整性和正确性。这时,就需要系统管理员进行维护。
对Linux系统中常用文件系统的检查是通过fsck工具来完成的。fsck命令的一般格式如下:
fsck [options] file_system [...]
在通常情况下,可以不为fsck指定任何选项。例如,要检查/dev/hda1分区上的文件系统,可以用以下命令:
# fsck /dev/hda1
应该在没有mount该文件系统时才使用fsck命令检查文件系统,这样能保证在检查时该文件系统上没有文件被使用。如果需要检查根文件系统,应该利用启动软盘引导,而且运行fsck时应指定根文件系统所对应的设备文件名。对于普通用户来说,为了安全起见,不要使用fsck来检查除ext2之外的文件系统。
fsck在发现文件系统有错误时可以修复它。如果需要fsck修复文件系统,必须在命令行中使用选项-A和-P。当修复文件系统后,应该重新启动计算机,以便系统读取正确的文件系统信息。
fsck对文件系统的检查顺序是从超级块开始,然后是已经分配的磁盘块、目录结构、链接数,以及空闲块链接表和文件的I节点等。用户一般不需要手工运行fsck,因为引导Linux系统时,如果发现需要安装的文件系统有错,会自动调用fsck。
2.避免可能导致系统崩溃的文件系统的错误
为了避免因为文件系统错误而导致系统崩溃的情况,可以考虑采取以下的措施和注意事项:
(1)在正确安装Linux系统后,制作系统备份;
(2)创建对应当前Linux核心的启动盘;
(3)在软盘上做一些重要文件的备份;
(4)对关键服务器最好使用UPS,预防突然掉电;
(5)定期使用fsck或badblocks检查磁盘,一旦发现错误,必须要做备份;
(6)一般情况下,不要以root身份登录到Linux系统;
(7)不要在完成任务后直接关闭系统的电源开关,最好使用shutdown命令;
(8)不要让无用的程序或数据占满硬盘空间。
这样可以将因文件系统错误而导致的损失降到最小。
3.其它一些管理文件系统的命令
du//统计当前目录下子目录的磁盘使用情况,主要是统计其子目录和所有子目录下文件的大小
df//统计文件系统中空闲的磁盘空间,缺省情况下显示所有安装文件系统的磁盘使用信息
in//用来在目录或文件间建立链接
find//用于查找Linux系统上的文件或目录
tar//是一个文件管理工具,用于将文件归档,或者从归档中恢复文件
gzip//GNU文件压缩工具,用于压缩Linux文件,通常与tar一起使用
文件系统的后备
系统管理员的主要任务之一是确保系统中所存信息的持续完整性。维护完整性的一种方法是定期后备系统中的数据。
系统后备(备份)是保护用户不受数据损坏或丢失之苦的一种非常重要的手段。如果系统的硬件出现了问题,或者是用户不小心删除了重要的文件,都有可能造成数据损坏或丢失,尤其在服务器应用环境中所造成的损失更是难以预计。经常进行数据备份可以使偶然破坏造成的损失减小到最低程度,而且能够保证系统在最短的时间内从错误状态中恢复。
在Linux系统中,造成数据丢失或数据损坏的原因有多种:第一种原因是用户误操作,强行删除或覆盖了一些重要的文件;第二种原因是硬件发生故障,导致数据的丢失;第三种原因是因为软件本身存在故障,而造成数据丢失。系统中数据的丢失和损坏轻则破坏用户关键数据,重则导致系统不能正常工作。所以,定期进行系统和用户数据的备份是系统管理员的基本职责。
对于备份来说,管理员需要考虑备份介质的选择、备份策略的选择、备份工具的选择。目前,比较常用的备份介质有软盘、磁带、光盘和硬盘等,通常有完全备份、增量备份和更新备份三种备份策略。
备份策略
1.完全备份
也称为简单备份,即每隔一定时间就对系统做一次全面的备份,这样在备份间隔期间出现了数据丢失或破坏,可以使用上一次的备份数据将系统恢复到上一次备份时的状态。但是,这样每次备份的工作量相当大,需要很大的存储介质空间。
因此,不可能太频繁地进行这种系统备份,只能每隔一段较长的时间(例如一个月)才进行一次完全备份。然而,在这段相对较长的时间间隔内(整个月) 一旦发生数据丢失现象,则所有更新的系统数据都无法被恢复。
2.增量备份
在这种备份策略中,首先进行一次完全备份,然后每隔一个较短的时间段进行一次备份,但仅仅备份在这段时间间隔内修改过的数据。然后,当经过一段较长的时间后,再重新进行一次完全备份,依照这样的周期反复执行。增量备份的工作量较小,也能够进行较为频繁的备份。例如,可以以一个月为备份周期,每个月进行一次完全备份,每天下班后或是业务量较小时进行当天的增量数据备份。
3.更新备份
这种备份方法与增量备份相似。首先每隔一段时间进行一次完全备份,然后每天进行一次更新数据的备份。但不同的是,增量备份是备份当天更改的数据,而更新备份是备份从上次进行完全备份后至今更改的全部数据文件。一旦发生数据丢失,首先可以恢复前一个完全备份,然后再使用前一个更新备份恢复到前一天的状态。
更新备份的缺点是,每次作小备份工作的任务比增量备份的工作量要大。但是,其好处在于,增量备份每天都保存当天的备份数据,需要过多的存储量;而更新备份只需要保存一个完全备份和一个更新备份就行了。另外在进行恢复工作的时候,增量备份要顺序进行多次备份的恢复,而更新备份只需要恢复两次。因此,更新备份的恢复工作相对较为简单。
备份时机
备份需要定期进行,通常应该选择在系统比较空闲时进行,以免影响系统的正常工作,并且此时系统中数据更新频度较低,一般选择在半夜零点之后进行备份。可以考虑写一个脚本并且加入到系统的cron自动任务中去(有关cron的详情,请利用man命令参考cron的手册页)。不过需要注意的是,对于系统备份应该根据具体的系统数据更新情况和用户使用系统的情况,决定具体的系统备份方案。
备份工具
选定了备份策略后,可以使用tar、cpio、dump等备份工具软件将数据进行备份。对于一般的备份,使用tar就足够了。通常用tar备份的命令格式如下所示:
tar cvfpsz <生成的备份文件> <所需备份的目录>
用于备份时,可以将tar命令和其它命令联合使用。例如,需要查找过去7天更新过的文件,并使用tar的-T参数指定需要备份的文件,进行所需备份:
# find / -mtime -7 -print >/tmp/filelist
# tar -c -T /tmp/filelist -f /dev/nrsa0
此外,也可以使用类似于tar的cpio命令进行备份。cpio对数据的压缩要比tar命令更有效,因为它是为备份任何文件集而设计的,而tar命令主要是为备份子目录设计的;cpio能够处理跨多个磁带的备份,并且能够跳过磁道上的坏区继续工作,而tar不能。
恢复后备文件
一般说来,在备份文件系统的时候,只要备份/etc、/root、/var、/home、/usr/local和X11R6目录下的内容即可。此外,如果用户还自定义了一些文件和子目录的话,也需要做备份。
以后当系统出现某些故障时,就需要恢复先前保存的后备文件。对备份文件进行恢复是一件很容易的事情。首先,必须确定待恢复的文件所在的位置。接着使用 tar -xp或cpio -im命令就行了。tar的-p及cpio中的-m选项用来确保所有的文件属性与文件一起被恢复。因为这些命令较为简单,这里就不一一举例了。要注意的是,当使用cpio恢复目录时,-d选项将用来创建子目录;而tar命令则自动完成创建子目录的工作。
系统安全管理
Linux系统安全管理包括多个要素,例如,普通用户的系统安全、超级用户的系统安全、文件系统的安全、进程安全,以及网络安全等。只有以上各个要素协调配合,才能真正地保证系统不易受到致命的打击。
安全管理的目标和要素
安全管理的目标包括防止非法操作、防止未获得授权的人进入系统或无合法权限的人员越权操作;数据保护,防止已授权或未授权的用户存取对方重要的个人信息;正确管理用户,一个系统不应被一个恶意的、试图使用过多资源的用户损害;保证系统的完整性,保证系统的完整性;记账,通过确认用户身份和记录下用户所做的操作,并根据这些记录查出哪些操作比较可疑,以及哪些用户对系统进行了破坏,从而采取相应的防范措施;系统保护,阻止任何用户冻结系统资源,如果某个用户占用某一系统资源的时间过长,必须有相应的措施剥夺其使用权;否则会影响其它用户使用,甚至导致系统崩溃。
Linux系统安全包括三个要素,即物理安全管理、普通用户安全管理和超级用户安全管理。
1.物理安全
一般来说,物理安全应该包括以下几个方面:
(1)保证放置计算机机房的安全,必要时应添加报警系统。同时应提供软件备份方案,把备份好的软件放置在另一个安全地点。
(2)保证所有的通信设施(包括有线通信线、电话线、局域网、远程网等)都不会被非法人员监听。
(3)钥匙或信用卡识别设备、用户口令钥匙分配、文件保护、备份或恢复方案等关键文档资料要保存在安全的位置。
2.普通用户安全管理
Linux系统管理员的职责之一是保证用户资料安全,其中一部分工作是由用户的管理部门来完成的。但作为系统管理员,有责任发现和报告系统的安全问题。
系统管理员可以定期随机抽选一用户,将该用户的安全检查结果发送给他及其管理部门;此外,用户的管理部门应该强化安全意识,制定完善的安全管理规划。
3.超级用户安全管理
超级用户可以对系统中任何文件和目录进行读写,超级用户口令一旦丢失,系统维护工作就很难进行,系统也就无安全性可言。
超级用户在安全管理方面需要注意的地方包括:
(1)在一般情况下最好不使用root账号,应使用su命令进入普通用户账号。
(2)超级用户不要运行其它用户的程序。
(3)经常改变root口令。
(4)精心地设置口令时效。
(5)不要把当前工作目录排在PATH路径表的前面,以避免“特洛依木马”的入侵。
(6)不要未退出系统就离开终端。
(7)建议将登录名root改成其它名称。
(8)注意检查不寻常的系统使用情况。
(9)保持系统文件安全的完整性。
(10)将磁盘的备份存放在安全的地方。
(11)确保所有登录账号都有用户口令。
(12)启动记账系统。
用户口令的管理
计算机安全包括物理安全和逻辑安全。通过加强机房管理、保证通信线路安全、建立完整的备份制度等措施,一般情况下都能保证物理安全。另外,建立和完善逻辑安全同样是一个很重要的问题,其中包括用户口令的管理、用户账号的管理、文件和目录权限的管理及维护系统日志。
1.用户口令的管理
用户口令的管理包括设置好的用户口令、采用正确的用户口令管理策略、设置用户口令的时效机制、执行安全的用户口令操作。
一个好的用户口令至少有6字符,口令中不要包含个人信息,例如生日、名字、门牌号码等。用户口令中最好有一些非字母(即数字、标点等)字符,最好应便于记忆。
用户口令的安全性随着时间的推移而变弱,所以,经常改变用户口令有利于系统安全。系统管理员可以通过修改/etc/shadow文件实现。
多数情况下用户口令丢失都与用户误操作有关。为保证用户口令安全必须注意以下几点:
(1)不要将用户口令写下来;
(2)用户在输入口令时,应避免被别人看到;
(3)保证用户一人一个口令,避免多人使用同一个账号;
(4)不要重复使用同一口令;
(5)不要在不同系统上使用同一口令;
(6)不要通过网络或Modem来传送口令。
2.用户账号的管理
用户账号的管理包括如何保证系统中每个用户账号的安全、如何管理这些账号,以及如何处理对系统安全有威胁的账号。
保证系统有一个安全的/etc/passwd文件是十分必要的,维护该文件时应注意以下问题:
(1)尽量避免直接修改/etc/passwd文件。
(2)在用户可以容忍的情况下,尽量使用比较复杂的用户账号名。
(3)尽量将passwd文件中UID号为0的人数限制在一到两个人内。如果发现存在管理员以外的UID为0时,就表示系统被攻破。以下命令可以显示passwd文件中ID为0的用户:
# grep '[^:]*[^*]*:0*' /etc/passwd
(4)保证passwd文件中没有口令相同的用户账号。下面的命令用来查询该文件中是否有ID=110的用户:
# grep 110 /etc/passwd
(5)保证passwd文件中每个用户的口令字段不为空,可以使用下面的命令:
# grep '[^:]*[^::]:*' /etc/passwd
(6)注意系统特殊用户使用的Shell字段,保证他们使用专用程序,而非一般用户的Shell。
(7)除非在必要的情况下,最好不要使用组口令。
(8)对于新用户最好先为之提供rsh(Restricted Shell),让他们在受限的环境中使用系统。
(9)当一个账号长时间不用时,可通过记账机制发现该账号,并将该账号查封。
3.安全问题
文件和目录权限的管理涉及重要目录的安全问题,包括以下目录:
/bin、/boot、/dev、/etc和$HOME。
/bin目录保存引导系统所需的全部可执行程序及常用的Linux命令。该目录只允许超级用户进行修改。同时,应把目录设置在PATH环境变量的最前面。例如:
PATH=/bin:/usr/bin:/usr/local/bin:/home/mengqc/bin
如果设置在最后,用户mengqc可以在自己的目录下放置一个名为su的特洛伊木马程序。超级用户执行su命令时,mengqc就可以获取超级用户口令。
/boot用来存放Linux初启时所需的一些数据和文件。如该目录被破坏,系统就不能启动。
/dev目录包含有链接硬件设备的文件,它的存取权限应当是775,并且应属root所有。设备文件使用权限设置不当,能给系统安全带来影响。例如/dev/mem是系统内存,用cat命令就可以在终端上显示系统内存中的内容。
/etc目录下的passwd、group、shadow 、inittab、cshrc和xinitrc等文件是系统正常工作时所用的。大多数情况下,/etc中的文件是黑客首选的攻击目标。
$HOME目录是各个用户的主目录,一般位于/home目录下。该目录的名称一般与用户的登录名相同。超级用户的主目录在/root下。
如果没有正确设置用户主目录的权限,就会给该用户带来危险。例如,假设其他人可以写一个用户的主目录,那么,可以通过修改该用户主目录中的.bash_profile文件来获取与该用户相同的身份。
4.对系统日志进行日常维护
系统管理员另一个复杂的任务是对系统日志进行日常维护。系统日志记录提供了对系统活动的详细审计信息,这些日志用于评估、审查系统的运行环境和各种操作。对于一般情况,日志记录包括记录用户登录时间、登录地点、进行什么操作等内容。使用得当的话,日志记录能向管理员提供有关危害安全的侵害或入侵企图的信息。
这些审计信息通常由守护程序自动产生,是系统默认设置的一部分,能帮管理员寻找系统存在的问题,对系统维护十分有用。还有一些日志需要管理员设置才能生效。大部分日志存放在/var/log目录中。
系统性能优化
对系统性能的优化主要包括以下几个方面的内容:
◆对于磁盘I/O性能的优化;
◆对文件系统的有机调整;
◆进程的执行调度;
◆系统守护进程任务的管理。
使用工具iostat监测磁盘I/O的性能 iostat检查各个磁盘的输入和输出,并产生各个磁盘的数据吞吐量、传输请求的统计数据。下面是一个使用iostat命令的示例:
# iostat -d 2
该命令将以2秒为时间间隔,产生对系统磁盘使用情况的统计输出。使用该工具得到各个硬盘的繁忙情况,就能根据数据吞吐量得出系统磁盘的性能。此时,系统管理员应该得出以下结论:
(1)当前磁盘的I/O性能是否已经影响到整个系统的性能,比如说,经常出现CPU等待I/O操作而出现CPU idle状态。
(2)用户的工作是否已经受到影响,例如,当使用NFS服务时,文件服务器是否经常不能及时处理用户请求。
(3)对于硬盘系统,当前的I/O是否集中在某一个或某几个磁盘上,造成任务请求不均衡。
对于这些问题,系统管理员应该有针对性地采用以下措施:
◆采用RAID技术提高硬盘I/O性能;
◆采用高性能硬盘来解决I/O瓶颈;
◆采用更先进、更快速的硬盘接口技术;
◆对文件系统进行调整,对执行进程进行调度。
对进程进行调度
进程在其运行过程中需要占有系统资源,如果用户执行的进程耗用资源过多,将有可能造成系统性能的瓶颈现象。这时,就需要对这样的进程进行调度。一种情况是与用户协商,将这个进程从系统中删除,这时需要系统管理员使用kill命令;另一种情况是需要对该进程的优先级别或调度时间进行调整,可以通过 nice命令及at命令等完成。
要想让系统很好服务,必须管理好系统。作为系统管理员权力至上,职责也重大。以上介绍了系统管理的基本知识,然而,要想让系统始终处于良好工作状态,除了深入掌握管理知识外,还需在实践中不断积累经验。
查看(285)评论(12)收藏推荐
掌握linux的目录结构
2007-08-01 22:04:25
Linux的目录结构与Windows不同,而且在Windows下看不到Linux的目录,反过来,Linux也看不到Windows下的目录。Linux下各目录的含义如下:
"目录名称" "意义"
/vmlinuz 该目录中存放的是系统内核
/bin 该目录中存放Linux的常用命令,在有的版本中是一些和根目录下相同的目录。
/boot 该目录下存放的都是系统启动时要用到的程序,当用lilo引导Linux时,会用到这里的一些信息
/dev 该目录包含了Linux系统中使用的所有外部设备,它实际上是访问这些外部设备的端口,你可以访问这些外部设备,与访问一个文件或一个目录没有区别。例如在系统中键入“cd /dev/cdrom”,就可以看到光驱中的文件;键入“cd /dev/mouse”即可看鼠标的相关文件。
/cdrom 该目录在刚安装系统时是空的,你可以将光驱文件系统挂在这个目录下, 例如“mount /dev/cdrom /cdrom”
/etc
该目录存放了系统管理时要用到的各种配置文件和子目录,例如网络配置文件、文件系统、X系统配置文件、设备配置信息、设置用户信息等。
/sbin 该目录用来存放系统管理员的系统管理程序。
/home 如果建立一个名为“xx”的用户,那么在/home目录下就有一个对应的“/home/xx”路径,用来存放该用户的主目录。
/lib 该目录用来存放系统动态连接共享库,几乎所有的应用程序都会用到该目录下的共享库
/lost+found 该目录在大多数情况下都是空的。但当突然停电、或者非正常关机后,有些文件就临时存放在这里。
/mnt 该目录在一般情况下也是空的,你可以临时将别的文件系统挂在该目录下。
/proc 可以在该目录下获取系统信息,这些信息是在内存中由系统自己产生的
/root 如果你是以超级用户的身份登录的,这个就是超级用户的主目录
/tmp 用来存放不同程序执行时产生的临时文件
/usr 用户的很多应用程序和文件都存放在该目录下
查看(23)评论(0)收藏推荐
linux开机流程分析
2007-08-01 22:03:06
开机不是只要按一下电源钮而关机只要关掉电源钮就可以了吗?有何大学问?话是这样没错啦,但是由于 Linux 是一套多人多任务的操作系统,你难保你在关机时没有人在线上,如果你关机的时候碰巧一大群人在线上工作,那会让当时在线上工作的人马上断线的!那不是害死人了!一些资料可以无价之宝哩!另外,与 DOS 环境不同的是, Linux 在执行的时候,虽然你在画面上只会看到黑压压的一片,完全没有任何画面,但其实他是有很多的程序在背景底下执行的,例如邮件程序、浏览器主机程序等,你如果随便关机的话,是很容易伤害硬盘及数据传输的动作的!所以在 Linux 下关机可是一门大学问喔
既然开机是很严肃的一件事,呵呵,那我们来了解一下整个开机的过程吧!好让大家比较容易发现开机过程里面发生错误的地方,与解决之道!不过,由于开机的过程中,那个 Boot Loader 使用的软件可能不一样,例如 Mandrake 9.0 已经同时提供 Lilo 与 Grub 这两个开机管理程序,虽然 lilo 与 grub 的激活过程或许有点不太相同,但是他的原理则都是一样的哩!这里我们先介绍较老牌的 Lilo 啰! Lilo 是什么?!简单的说,他是 LInux LOader 的缩写,就是 Linux 开机时候加载的咚咚就对了!这东西可是控制了你的多重开机的命脉!底下的篇幅会再分别介绍这两套开机管理程序!底下先开始来谈谈 Linux 是如何开机的呢?基本的流程为:
1. 加载 BIOS 的硬件信息;
2. 读取 MBR 的 Kernel Loader (亦即是 lilo, grub, spfdisk 等等)开机信息;
3. 加载 Kernel 的操作系统核心信息;
4. Kernel 执行 init 程序并取得 run-level 信息;
5. init 执行 /etc/rc.d/rc.sysinit 档案;
6. 激活核心的外挂式模块 (/etc/modules.conf);
7. init 执行 run-level 的各个批次档( scrīpts );
8. init 执行 /etc/rc.d/rc.local 档案;
9. 执行 /bin/login 程序;
10. 登入之后开始以 Shell 控管主机。
大概的流程就是上面写的那个样子啦,而每一个程序的内容主要是在干嘛呢?底下就分别来谈一谈吧!
· 寻找 BIOS 加载硬件信息:
稍微有 PC 硬件经验的人们大概都知道 BIOS ( Basic Input/Output Setup ) 的作用!他是第一个被加载计算机的资料!你主机的 CPU 资料、开机顺序、硬盘大小、芯片组工作状态、PnP 的开启与否、内存的时脉等等等...这都记录在 BIOS 当中!所以啦,开机之后,系统会先去找这个东西;
· 可开机硬盘的 MBR 读取 Kernel loader:
再来呢?呵呵!当然就是硬盘的开机资料啰!由于个人计算机的系统在读完 BIOS 之后,会先去读取第一个开机硬盘的第一个扇区(就是 master boot record, MBR 啰!),还记得这个 MBR 吗?嗄!忘记了?赶紧回到第二篇好好的再复习一遍ㄋㄟ?。而这个扇区主要就是在记录开机的信息!还记得上面提到的 Lilo 及 grub 吧?他的纪录就是在这里啰!所以啰,这个时候 Lilo 纪录的信息就会被读出来,系统并依 Lilo 的信息去不同的系统开机,这也就是多重开机设定的地方啦。
好了,先再来回忆一下,如果你是以 grub 程序开机的话,那么在开机的时候会显示什么资料呢?呵呵!会显示蛮多的开机选单,没错?就是『选单』,然后选择了你的选择项目之后,系统就会跑到该扇区去读取该操作系统的核心啰!呵呵!所以一个好的 boot loader 会具有两个功能,就是:
o 选单功能 ( menu )
o 指向功能 ( pointer )
那么为何要有 loader 呢?我想,我们得先来探讨一下这个话题才行!要探讨之前先来了解一下,晓不晓得 Windows 与 Linux 的档案格式一不一样?!呵呵!当然不一样对不对,好了,那么再来说一说,请问,你的计算机怎么知道你的硬盘的资料是什么系统?哈哈!那就是 loader 的主要功能啰!在你能使用系统之前,一定需要加载核心对吧!?但是怎样让你的硬件认识核心呢?那就是 kernel loader 的主要功能了!所以这里需要提出的是, Linux 的 loader ( lilo 或 grub ) 是可以认识 windows 的核心档案的,但是 Windows 的 loader 却不认识 Linux 的核心档案,因此,作为一个多重开机的设定 loader ,就无法使用 Windows 所提供的 loader 啰!由于需要让系统认识你的 kernel ,因此,就需要 kernel loader 啦!这样想就对啦!
· 加载核心( Kernel ):
好了,等我们在 grub 的选单中选择了 Linux 这个系统,然后主机跑到 Linux 所在的硬盘之下,就开始将他的核心加载啰。在 Linux 的系统下,通常开机的核心都摆在 /boot 底下,因此,这个时候的 boot loader 就会到 /boot 去寻找相关的核心。我们的 kernel 名称通常就是 /boot/vmlinuz-xxxx 的格式,目前 Mandrake 9.0 的核心版本为 2.4.19,而 Mandrake 自行释出的版本为 2.4.19-16mdk ,所以,使用 uname –r 会出现 2.4.19-16mdk 呦!然后 MDK 9.0 预设核心档案就是: /boot/vmlinuz-2.4.19-16mdk 这一个!好了,加载这个档案再往下继续吧!
· 核心执行 init 并由 /etc/inittab 取得系统登入状态:
核心加载之后,由核心执行的第一个程序就是 /sbin/init 啰!而这个程序第一个目标当然就是确定主机是要以怎样的情况登入!这个时候就必须要以 /sbin/init 来加载 /etc/inittab 的信息啦!而 Linux 共有几种登入模式呢?嗯!这里似乎有需要说明一下 Linux 有哪些登入的状态!如果你进入 Linux 的 /etc/inittab 档案的话( 可以使用 vi 啦 ),你应该会看到如下的信息:
[root @test /root]# vi /etc/inittab #  0 - halt (Do NOT set initdefault to this) 关机 #  1 - Single user mode 单人使用(系统有问题时候的登入状况) #  2 - Multiuser, without NFS (The same as 3, if you do not have networking) 多人但无网络 #  3 - Full multiuser mode 文字界面登入的多人系统 #  4 - unused 系统保留 #  5 - X11  X-Windows 图形界面登入的多人系统 #  6 - reboot (Do NOT set initdefault to this) 重新开机 # id:3:initdefault:
·
上面显示的就是目前可以登入的状态了(就是 run-level 啦!),共有 0?6 的登入状态,其中,我们比较常使用的是 3 与 5 , 因为我们需要 Linux 是多人多任务的情况,而较常登入的状态就是文字与图形界面啦!所以这里需要设定成 3 或者是 5 ,千万不要设定成 0 或者是 6 喔!不然系统会一直直接重新开机或者是直接关机....预设的系统登入在上面这个表格的最底下一行纪录着!就是『id:3:initdefault 』那一行!注意喔!因为 VBird 预设是以文字界面来登入,所以才会是 3 ,如果你要改成图形界面登入的话(请确定你的 X-windows 没有问题),那么就将 /etc/inittab 里面的上面那一行,将 3 改成 5 即可啰!
那么什么是『单人维护模式 ( run-level 为 1 )』?如果你有玩过 Windows 的话,那么你在开机的时候如果按下 F8 时,不是会出现一些什么『安全模式』啦、『正常开机』啦或『 MS-DOS 模式』等等的进入 Windows 的状态吗?尤其是当你不正常关机的时候, Windows 预设就会以『安全模式』来激活 Windows 啰!Windows 的『安全模式』几乎不加载一些复杂的模块,让你的 Windows 一定可以开机成功!那么 Linux 的维护模式状态即是使用单人模式( 就是 run_level 为 1 啦!)所以说, Linux 的登入情况是如何呢?呵呵!没错,就是在这里加载的啦!
· init 的第一个执行内容 /etc/rc.d/rc.sysinit :
确定了登入状态之后,再来当然就是需要将主机的信息给他读进去 Linux 系统啰!而 Linux 系统的第一个资料内容就是 /etc/rc.d/sysinit 这个档案啦!如果你有空进入这个档案去看看的话,会发现这个档案的内容包括了==>设定预设路径( PATH )、设定主机名称、执行 /etc/sysconfig/network 所记录的网络信息、挂载 /proc 这个保存在内存当中的主机基本讯息、以及其它几个 Linux 操作系统最基本的几个信息!大抵来说,他的基本工作是:
1. 设定预设路径:( PATH )
2. 设定网络状态:系统会再去读取 /etc/sysconfig/network,并将该档案内的资料,如 NETWORKING, FORWARD_IPV4, HOSTNAME, DOMAINNAME, GATEWARY, GATEWAYDEV 等等的设定读入系统中。
3. 激活系统的置换空间(简单的可以想成是虚拟内存): swapping
4. 检查档案系统:这个时候系统会去检查一些可能会存在的目录,例如 /fsckoptions 与 /forcfsck 及 /fastboot 等等的目录,当你的系统有不正常关机的现象时(例如突然的断电等等),那么 Linux 将会自动的强制去检查 root 的档案系统 ( checking root filesystems )。简单的想一想,就好象是 Windows 系统下,当你不正常关机时,在开机的过程中就会出现扫瞄硬盘的情况相同啦!
5. 周边设定与系统设定的参数 ( /proc ):在 Linux 或者是 Unix 系统中,你会在根目录中发现一个很奇怪的扇区,那就是 /proc 啰!其实这个目录是记录在内存当中的,每次开机的时候就会被建置起来。他的主要功能是记录主机的一些接口设备的最新资料状况!例如网络周边啦、输入输出周边啦等等的。没事的话,不要到里面乱砍喔!会有问题
6. 设定 Plug and Play ( PNP )的一些参数资料;
7. 清除 /etc/mtab ;
8. mount root 及 /proc 档案系统 :好了,将一些资料都设定好之后,当然就是需要将资料写下来啰!这个时候就会将 root 与 /proc 资料给他 mount 上档案系统啦!
9. 决定是否使用模块, 加载模块
10. 检查档案系统 :与前面相同的,当前面的 /fastboot 检查的旗标开启之后,就会以 fsck 检查你的其它扇区啰! ( 使用 fsck )
11. 挂上其它档案系统
12. 设定 console 字型
13. 打开 quota
14. 清除不必要的档案, 如 lock, pid
15. 设定 clock
16. serial port 初始化
17. 将开机讯息经由 dmesg 放入 /var/log/dmesg 中
如此一来,在 /etc/rc.d/rc.sysinit 就已经将基本的系统设定资料都写好了,也将系统的资料设定完整!而如果你想要知道到底开机的过程中发生了什么事情呢?那么就使用第十六章学会的 dmesg 就可以知道啰
· 激活核心的外挂式模块 (/etc/modules.conf):
由于我们的核心越来越聪明,所以呢,我们可以选择使用模块的型态 ( 这个在后面也会继续说明 ) 来进行驱动程序的加载!那么如果系统原本找不到的模块 ( 例如早期的 via-rhine 芯片组 ) 就可以在这个档案里面 /etc/modules.conf 写入呢!
· init 执行 run-level 的各个 scrīpts :
由于不同的 run-level 所需要加载的模块并不相同,所以系统早就为不同的 run-level 设定了一些批次档( scrīpts )来做这件事啰!而 run-level 早就在前面的时候以 /etc/inittab 当中取得啰!好了,如果你知道如何进入到 /etc/rc.d 的目录中的话,那么你将会看到该目录下应该有八个目录跟三个档案,目录 rc0.d ~ rc6.d 分别代表了各个 run-level 的 scrīpts !而在这些目录中的档案都是以 S 及 K ( 大写 ) 为开头的档案,并接两位数的数字与该服务的名称所组合而成的!如下所示为 Mandrake 9.0 的 /etc/rc.d/rc3.d 的内容:
[root @test /root]# ll /etc/rc.d/rc3.d total 0 lrwxr-xr-x1 root root  16 Oct 19 11:05 K55routed -> ../init.d/routed* lrwxr-xr-x1 root root  18 Oct 19 10:58 S03iptables -> ../init.d/iptables* lrwxr-xr-x1 root root  17 Oct 19 11:26 S10network -> ../init.d/network* lrwxr-xr-x1 root root  16 Oct 19 11:26 S12syslog -> ../init.d/syslog* lrwxr-xr-x1 root root  16 Oct 19 11:26 S20random -> ../init.d/random* lrwxrwxrwx1 root root  13 Oct 28 15:22 S40atd -> ../init.d/atd* lrwxr-xr-x1 root root  19 Oct 19 10:59 S40saslauthd -> ../init.d/saslauthd* lrwxrwxrwx1 root root  14 Oct 19 21:28 S55ntpd -> ../init.d/ntpd* lrwxrwxrwx1 root root  14 Oct 19 12:11 S55sshd -> ../init.d/sshd* lrwxrwxrwx1 root root  16 Oct 19 12:00 S56xinetd -> ../init.d/xinetd* lrwxr-xr-x1 root root  18 Oct 19 11:26 S75keytable -> ../init.d/keytable* lrwxr-xr-x1 root root  17 Oct 19 11:12 S80prelude -> ../init.d/prelude* lrwxr-xr-x1 root root  17 Oct 19 11:03 S85numlock -> ../init.d/numlock* lrwxr-xr-x1 root root  18 Oct 19 11:35 S89internet -> ../init.d/internet* lrwxr-xr-x1 root root  15 Oct 19 11:26 S90crond -> ../init.d/crond* lrwxr-xr-x1 root root  17 Oct 19 11:26 S95kheader -> ../init.d/kheader* lrwxr-xr-x1 root root  14 Oct 19 11:38 S99adsl -> ../init.d/adsl* lrwxr-xr-x1 root root  19 Oct 19 11:04 S99linuxconf -> ../init.d/linuxconf* lrwxr-xr-x1 root root  11 Oct 19 10:41 S99local -> ../rc.local*
·
在这个目录下的档案都是连结档,均指向到 /etc/rc.d/init.d 这个目录下,而这个 /etc/rc.d/init.d 目录则是以 Linux 的 rpm 安装方法时,设定一些服务的激活目录。举个例子来说,如果你要重新激活 sendmail 的话,而且你的 sendmail 是以 rpm 来安装的,那么下达 /etc/rc.d/init.d/sendmail restart 就可以直接激活 sendmail 啰!所以你即可知道 /etc/rc.d/init.d 里面档案的主要功能!因此,当你的 run-level 内的 scrīpts 要激活哪写服务呢,呵呵!就将档案连结到该 init.d 目录下的档案并加以激活即可啰!也就是说『当你以 文字模式 ( run-level=3 ) 激活 Linux 时,你的系统在经过 BIOS、 MBR、 Kernel、 init、/etc/rc.d/rc.sysinit 之后,就会进入 /etc/rc.d/rc3.d 来激活一些服务』啰!不过,需要注意的是,在 rc3.d (或其它目录下 rc0.d ~ rc6.d )目录中 S 开头的档案为执行该服务, K 为开头的档案则是杀掉该服务的意思。那么那些数字代表的意义为何?那就是激活的顺序啦!例如S12syslog 会比S90crond 更早被执行呢!那么为什么要有这些顺序呢?这是有原因的!例如您的主机有要激活 WWW 好了,那么您的网络设定应该要先激活才对吧!所以啰,如果 WWW 先激活,才驱动网络,那么 WWW 自然就一定起不来啦!所以各项服务的激活顺序也是相当重要的!目前 Mandrake 当中,可以使用 chkconfig 来设定开机要激活的服务选项呢!
· init 执行 /etc/rc.d/rc.local
在 DOS 或 Windows 的系统中,对于 autoexec.bat 与 config.sys 这两个档案您应该不陌生吧?!这两个档案是 DOS 或 Windows 在完成开机之后,第一个要去读取的内容!那么 Linux 有没有该档案?!有的!在 Linux 系统执行完了大部分的开机程序之后,接着下来就是要执行你的 Linux 主机的个人化设定啰!举个例子来说,由于 Red Hat 7.2 预设是将 CDROM 视为一个模块激活的装置,因此你的 cdrom 将必须要加载两个模块之后才能使用,分别是 modprobe cdrom, modprobe ide-cd 这两个指令!而如果你想每次都使用 cdrom 的话,那么你每次开机都必须记得手动加载这两个模块!粉累耶....这个时候就可以将这两行指令加入到 /etc/rc.d/rc.local 当中去啰!也就是说,不论你有什么需要在开机的时候写进去的指令,都可以在这里写入喔! ( 通常为了避免麻烦,我们都将开机完之后必须要做的几件事情,例如激活 NAT 主机的命令,使用 tarball 安装的一些软件的激活指令都写在这个档案来,那么系统开机完成之后,你所需要执行的指令也都执行完毕啰!)
前面的步骤都被主机执行之后,开机的程序就已经完全的激活完毕了!也就是说,如果你已经有网络的服务激活的话(通常在 /etc/rc.d/init.d 时就加载啰),那么你的主机已经在 Internet 上面提供服务了!所以根本就不需要你登入 Linux 系统你的主机也能正确的提供相关的服务喔!
· 开机设定档 /etc/sysconfig
不过,在开机的过程中,到底使用了多少设定档呢?呵呵!使用最多的设定档大多放置在 /etc/sysconfig 这个目录底下呢!来看一下 Mandrake 9.0 在这个设定档底下有哪些东西?
[root @test root]# ll /etc/sysconfig total 100 -rw-r--r--1 root root 511 Sep 19 17:48 alsa -rw-r--r--1 root root 239 Sep 19 17:48 autofsck -rwxr-xr-x1 root root  41 Oct 19 11:39 autologin* -rwxr-xr-x1 root root  36 Oct 19 11:35 clock* drwxr-xr-x4 root root 4096 Oct 19 11:27 console/ -rw-------1 root root  35 Oct 19 11:35 drakconnect -rw-------1 root root  29 Oct 19 11:35 drakconnect.adsl_pppoe -rw-------1 root root 363 Oct 19 11:35 drakconnect.netc -rwxr-xr-x1 root root 275 Oct 19 11:47 i18n* -rw-r--r--1 root root 952 Sep 19 17:47 init -rw-r--r--1 root root 1407 Sep 19 17:48 installkernel -rwxr-xr-x  1 root root 446 Aug 26 23:37 ipvsadm* -rwxr-xr-x1 root root  39 Oct 19 11:27 keyboard* -rwxr-xr-x1 root root 114 Oct 18 11:43 mouse* -rwxr-xr-x1 root root  53 Oct 19 11:39 msec* -rw-r--r--1 root root0 Sep 17 22:16 msec.rpmnew -rwxr-xr-x1 root root 100 Oct 19 13:35 network* drwxr-xr-x5 root root 4096 Oct 19 10:41 networking/ drwxr-xr-x2 root root 4096 Oct 19 13:36 network-scrīpts/ -rwxr-xr-x1 root root  10 Oct 19 11:26 pcmcia* -rw-r--r--1 root root 153 Jul 25 2000 rawdevices -rw-r--r--1 root root 336 Jul 26 20:35 saslauthd -rw-r--r--1 root root 455 Aug 14 09:30 syslog -rwxr-xr-x1 root root  56 Oct 19 11:39 system* -rw-r--r--1 root root 337 Sep 19 17:48 usb -rw-r--r--1 root root  41 Aug 22 18:11 xinetd
·
上面具有黄色字体的哪几个项目尤其重要!
o clock 在设定我们 Linux 主机的时区,可以使用格林威治时间,也就是标准时间,也可以使用台湾的本地时间 ( local );
o i18n 在设定一些语系的使用方面,例如最麻烦的文字接口下的日期显示问题!如果您是以中文安装的,那么预设语系会被选择 big5 ,所以在纯文字接口之下,你的档案日期显示就会呈现乱码!这个时候就需要更改一下这里啦!更动这个 i18n 的档案,将里面的 LC_TIME 改成 en 即可!!
o Keyboard 与 mouse 就是在设定键盘与鼠标的形式;
o network 可以设定主机名称,以及 GATEWAY 这两个重要信息呢!
o 至于 network-scrīpts 里面的档案,则是主要用在设定网络卡~这部份我们在网络架设篇才再次提到!
总之,这个目录下的档案都是很重要的啦!
变换预设的登入模式
刚刚在上面说了登入主机的方式最少有六种,不过常使用的是 run-level 3 的文字接口模式与 run-level 5 的图形接口模式!如果你在安装的过程中选择了文字接口登入,但是后来却想以图形接口登入系统,应该怎么做?!简单的很!就直接修改 /etc/inittab 这个档案的内容即可!如何做呢?!以 vi 或者是其它的文书编辑软件,进入 /etc/inittab 这个档案,档案的内容有点像这样:
# Default runlevel. The runlevels used by Mandrake Linux are: #  0 - halt (Do NOT set initdefault to this) #  1 - Single user mode #  2 - Multiuser, without NFS (The same as 3, if you do not have networking) #  3 - Full multiuser mode #  4 - unused #  5 - X11 #  6 - reboot (Do NOT set initdefault to this) # id:3:initdefault: # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 # Things to run in every runlevel. ud::once:/sbin/update # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6
在上面的资料中,将 id:3:initdefault: 里头的 3 改成 5 ,那么在下次的登入时就会变成是图形接口啰!同理,要由图形接口变成文字接口来登入时,也是将上面那行改成 3 即可!此外,不知道您有没有经验,在你的 Linux 主机当中, Linux 共提供了六个终端机接口与 一 个图形接口的登入点,你可以按下 『 Ctrl 』+ 『 Alt』 加上『F1』 ~ 『F6』 功能键 来变换不同的文字接口登入点!至于图形接口则仅使用于『 Ctrl + Alt + F7 』这一个喔!不过,如果你只想要提供四个文字接口呢?该如何是好?!呵呵!只要将上面的最后两行删掉,只剩下 1:2345:....至 4:2345:...,只剩下这四行然后重新开机之后,你的 F5 与 F6 功能键的作用就会消失啰!就这么简单啦!不过,需要注意的是,图形接口只有一个,当你使用图形接口登入时,那么将直接进入 tty7 那一个图形接口的登入屏幕喔!而当你在 tty1 输入 startx 激活 X-Windows 时,你的控制权将会跑到 tty7 (就是在 F7 功能键),此时,若您的 X-windows 挂了!那么直接按下『 Ctrl + Alt + F1 』 回到 tty1 之后,直接删除该 X-Windows 的程序即可关闭 X-Windows 啰!很不错吧!
Lilo
好了,要开始来搞定 boot loader 啰!第一个介绍的事较老牌的 lilo 这个玩意儿!他算是最标准的 Linux boot loader 啰!目前我的几部主机里面,用的也大部分都是他呢!Lilo 的设定与安装方面必需要分成两个步骤,分别是设定 /etc/lilo.conf 这个设定档,设定完毕之后,还必需要给他改写进去 MBR 或者是 Super block 才行!
· 设定档 /etc/lilo.conf
基本上, lilo 是加载 Linux 核心的重要开机资料的安装程序,他的参数设定档案就放在 /etc/lilo.conf 里头,那么我们来看一看里面有什么设定参数吧,基本上他的设定参数有点像底下这样,可以分为两部分,一个是整体的设定方面,一个则是每一个开机设定的核心档案:
[root @test linux]# vi /etc/lilo.conf # 第一部份,整体的设定部分 prompt<==强制出现 boot 的开机讯息啰! Compact  <==可以整合一些读取的扇区,可以保持 map 较小,相当适合软盘开机时使用 delay=50 <==如果有多重开机的话,可以设定这个延迟时间,单位0.1秒 timeout=50 <==与 delay 有类似的关系!也是 0.1 秒,如果 5 秒内没有按键盘,直接以第一个 image 开机。 default=linux-2.4.18 <==如果开机的过程中,出现了boot之后,使用者没有动作, 则以此设定的核心开机,与底下的label需对应 boot=/dev/had <==Lilo 的开机信息写入到 /dev/hda 这颗硬盘的 MBR 当中。 map=/boot/map <==用来说明 local 主机的地图信息啰! install=/boot/boot.b <==关于开机区的讯息(boot sector),不用理他没关系! Linear<==在较大容量的硬盘使用时,可以加入这一个参数试试看! lba32 <==这个东西也是在大容量的硬盘使用时候会需要的参数! password=1234567 <==设定密码!如果为了安全起见,可以设定您的 lilo 密码哩! message=/boot/message <==那个 LILO 的讯息就是在里面出现的啦! # 第二部分,个别的开机设定部分,一个 image 或 other 均代表一个开机设定! image=/boot/vmlinuz-2.4.7-10 <==核心档案啦! label=linux-2.4.7<==请注意!label 前面以 [tab] 按键来作为分隔!这个字眼则是显示在 boot 里头挑选项目。 initrd=/boot/initrd-2.4.7-10.img read-only  <==开机扇区挂载为只读!这是预设状况,实际在 挂加载 Linux 系统时,会重新挂载成可写! root=/dev/hda1  <==挂载成 / 这个 root 目录的磁盘! other=/dev/hdb1 <==如果是『非 Linux 核心』就以 other 来设定 开机的磁盘扇区! label=Windows2k <==同样的要有 label 来表示这个开机扇区的名称!
·
注意一下上面那几个咚咚:
o delay 与 timeout 的设定是 0.1 秒,所以 delay=50 表示延迟时间为 5 秒!
o linear 与 lba32 通常用在 SCSI 或者是较大的硬盘,例如扇区超过 1024 磁道的硬盘,可以使用这个项目来除错!不过,如果是小于 8GB 的硬盘,这两个东西有没有设定就没有什么影响了!
o default 需要设定成底下几个 image 或者是 other 的 label 才成!这个地方最常被忘记!因为常常会记得修改 label ,但是忘记跟着改变 default 的内容!此外,如果你想要修正开机预设的操作系统选项,在这里改啦!
o password 的用途在于安全防护方面,不过有个困扰,就是『如果你的计算机因为不正常关机(如断电后重开)而在电源恢复的时候重新开机时,则会卡在这个阶段无法直接进入 Linux 系统』,因为你必须提供 password 才能继续的工作呀!
o boot 显示的是开机的扇区选择! 这里也蛮重要的,如果你想要安装在 MBR 里面的话,如同上面的书写模式,就是写入 /dev/hda ,后面不要加上每个 partition 的代码!但是,如果你是想写入 Super Block ,例如我想要写入的是 had5 这个 Logical 的 partition 时,那么这里就必需要改写为 /dev/hda5 啰!所以,您应该只要一看到这个 boot 后面接的内容,就会知道那个安装的扇区是 MBR 还是 Super Block 啰!
o image 可以设定成多数个!如果你的 Linux 系统有多个核心档案的时候,例如我们刚刚编译完成的一个新的核心,然而你又不想丢掉旧核心,就可以设定成两个不同核心的开机系统啰!
大致上就是这样吧!其它不明了是什么东西的选项,可以使用 man lilo.conf 来看看里头的设定!因为还有很多开机时后需要加载的参数可以来设定一番呢!
· 以预设的 lilo.conf 新增一个开机档
好啦!为了测试一下您是否已经知道了 lilo.conf 的设定方式,所以我们来做个实验吧!请在您的『实验主机』上面,不要在提供服务的主机上面完呦!否则死掉了不要怪我没警告您…我们先试图安装在 super block 上面好了!以下面为例,黄色字体的部分是经过我的修改之后的结果,您的 /etc/lilo.conf 应该会长的跟我的差不多才是!
boot=/dev/hda1 map=/boot/map vga=normal default=linux keytable=/boot/us.klt prompt nowarn timeout=100 message=/boot/message menu-scheme=wb:bw:wb:bw image=/boot/vmlinuz label=linux root=/dev/hda1 initrd=/boot/initrd.img append="devfs=mount" read-only image=/boot/vmlinuz label=failsafe root=/dev/hda1 initrd=/boot/initrd.img append="devfs=nomount failsafe" read-only image=/boot/vmlinuz <==就给他新增加一个 label ,但是内容不变! label=linux-test root=/dev/hda1 initrd=/boot/initrd.img append="devfs=mount" read-only
·
这样就设定好了!接着下来看一下怎么安装他吧!
·
· 安装 lilo
既然设定好了,自然就是要安装他啰!安装的方式很简单,直接输入 lilo 即可!
[root @test root]# lilo Added linux *  <==有打星号的是『预设的开机设定档!』 Added failsafe Added linux-test
·
看到没有!要像上面这样才是安装成功呦!如果出现了错误的讯息,那么肯定是有地方没有安装好!这个时候请特别的再重新设定一次 /etc/lilo.conf 呢!有打星号的是『预设的开机设定档!』
· 而如果您还要看看更多的讯息,那么就需要这样:
[root @test root]# lilo -v LILO version 22.3.2, Copyright (C) 1992-1998 Werner Almesberger Development beyond version 21 Copyright (C) 1999-2002 John Coffman Released 11-Jul-2002 and compiled at 21:48:42 on Aug 13 2002. Reading boot sector from /dev/hda1 Using MENU secondary loader Calling map_insert_data Mapping message file /boot/message -> message-text Calling map_insert_file Boot image: /boot/vmlinuz -> vmlinuz-2.4.19-16mdk Mapping RAM disk /boot/initrd.img -> initrd-2.4.19-16mdk.img Added linux * Boot image: /boot/vmlinuz -> vmlinuz-2.4.19-16mdk Mapping RAM disk /boot/initrd.img -> initrd-2.4.19-16mdk.img Added failsafe Boot image: /boot/vmlinuz -> vmlinuz-2.4.19-16mdk Mapping RAM disk /boot/initrd.img -> initrd-2.4.19-16mdk.img Added linux-test /boot/boot.0301 exists - no backup copy made. Writing boot sector.
·
如果你需要更多的讯息,那么就使用『 lilo –v –v –v 』多一点 –v 就对啦!
·
· 一些问题的解决之道
好了! lilo 安装完成之后,总是会有一些问题会发生吧!那么如何来解决问题呢?嗯!可以看一下底下的一些解决之道:
o 我要如何选择不同的开机设定档?开机的时候我只看的到 boot: 而已?
开机之后,如果是以 lilo 来激活 kernel 时,那么他会出现 boot: 的字样,出现这个字样之后,马上按下 按键,那么就会出现目前 lilo 所记忆的开机设定文件啰!然后在 boot 后面输入想要的开机档案,就可以啰!
o 安装好了 Linux 之后,在开机的过程中却只出现『 LI 』就停止了!该如何是好?
这个问题可能发生的原因是 Lilo 没有设定好,或者是由于 Linux 安装在非 /dev/hda ( MBR )的硬盘之中,解决的方法可以如下:
1. 用 Linux 光盘开机,然后在出现 boot: 处输入
linux root=/dev/hda1 (这个与你的 Linux 安装的 partition 有关)
顺利开机之后,以 vi 修改 /etc/lilo.conf 将
linear
这一行取消(如果没有这一行的话,那就在 lilo.conf 中加入吧!)然后执行
lilo
再取出光盘并重新开机试试看;
2. 进入 BIOS ,将硬盘的 mode 改成 LBA 试看看;
3. 将Linux往前面一点的扇区安装,例如你可能安装在 /etc/hdc1 ,那你可以重新安装 Linux 在 /dev/hda2 试看看
o 安装Linux完成之后,却是出现 010101... 等数字在屏幕上,无法进入 Linux ...
这个问题的发生很有可能是硬盘出了问题了!这个时候可以使用 fsck 来扫瞄啰!
1. 用软盘或者是光盘开机后,使用fsck这个硬盘修正软件扫瞄一下您的 root partition ,例如:fsck /dev/hda1
2. 进入 BIOS ,将硬盘的 mode 改成 LBA 试看看;
o 我们知道 DOS 需要在第一颗硬盘的第一个扇区才能正常开机使用!那要是他并非在第一个扇区呢?例如当 DOS 系统在 /dev/hdb1 (第一条排线的 slave )?
解决知道就是以 lilo 修正磁盘的配置啦!如下所示来修改 /etc/lilo.conf
other=/dev/hdb1
label=DOS
map_drive=0x80
to=0x81
map_drive=0x81
to=0x80
然后再执行 lilo 写入 MBR 当中!
o 我不要玩 Linux 了,如何移除 lilo ?
只要以 Windows 的开机片开机,然后以 Windows 系统的 fdisk 下达:
fdisk /mbr
就可以将 Lilo 自 MBR 当中移除啰!
o 无法正常的进入 Lilo 怎么办?
这的时候开机片就很重要啦!使用开机片,在出现 boot: 的时候,输入
linux -s
就可以进入啦!这里请特别留意!那个 linux 指的是 label 呢!就像刚刚我们有三个 label ,分别是 linux, linux-test 与 failsafe ,那么如果我要以 linux-test 这个开机设定文件的单人维护模式登入,就必需要改写成
linux-test –s
linux-test single
请特别留意!!
Grub
grub 是较新的 boot loader 程序,他具有相当多的优点,这里不一一列举啦!无论如何, lilo 能做的, grub 几乎都可以做的到,包括选单、密码、指向等等的功能!不过, grub 比 lilo 要先进的几点是:
1. 他可以让您在开机的时候『自行编辑与修改开机设定项目』,有点像是 bash 的指令模式;
2. 他可以自动『动态寻找设定文件』,亦即他可以依据 /boot/grub/menu.lst 的设定而改变其设定!因此,修改设定只要改 /boot/grub/menu.lst 即可,不需要再重新安装 grub !
很棒吧!不过,在设定底下的工作之前,请先确认您的 grub 这个套件已经安装上来来!如果还没有安装的话,那么先查阅一下 RPM 的安装方法再说!底下假设 grub 这个套件已经安装在您的主机上啰!
· 设定档 /boot/grub/menu.lst
Grub 的设定档也很简单,就是 /boot/grub/menu.lst 这个档案,请注意,那个 lst 是 L 的小写呢!如果有兴趣的话,可以使用 info grub 好好的去看一下他的所有功能,底下仅列出一些我们常用的功能与设定而已喔!
o 关于硬盘的代号:
在 grub 里面,有一点是比较让人觉得不适应的,那就是他的硬盘代号与 lilo 还有 Linux 传统的代号不一样~他的代号主要有点像这样:
(hd0,0)
hd 指的是 IDE 的硬盘,而里面的 0,0 代表什么呢?第一个 0 代表他是第一个 IDE 的 master ,而第二个 0 代表他是第一块 partition 的代号,所以呢,这个代号就是 hda1 啦!所以,我们可以得到底下这个对应表:
装置 Lilo Grub
IDE1 master hda, hda1, hda2 (hd0), (hd0,0), (hd0,1)
IDE1 slave hdb, hdb1, hdb2 (hd1), (hd1,0), (hd1,1)
IDE2 master hdc, hdc1, hdc2 (hd2), (hd2,0), (hd2,1)
IDE2 slave hdd, hdd1, hdd2 (hd3), (hd3,0), (hd3,1)
这里需要先记忆一下啰!
·
好了,那么将我的 menu.lst 列出来一下吧先!
[root @test root]# vi /boot/grub/menu.lst timeout 10<==多久之后键盘没有动静,就直接以 default 的设定开机,这里是秒数! Color black/cyan yellow/cyan <==设定颜色的参数 i18n (hd0,0)/boot/grub/messages <==设定 i18n 多国语系的讯息提示 keytable (hd0,0)/boot/us.klt<==设定键盘形式,通常使用美规的键盘即可! Default 0<==预设的开机选项,依照底下的排序,第一个为 0 ! title linux <==这是第一个开机设定档,亦即排序为 0 号! kernel (hd0,0)/boot/vmlinuz root=/dev/hda1 devfs=mount initrd (hd0,0)/boot/initrd.img <==上面两个则是开机设定档的基本内容,分别是核心档案所在地与 Ramdisk 的设定内容! title failsafe  <==这是第二个开机设定档,亦即排序为 1 号! kernel (hd0,0)/boot/vmlinuz root=/dev/hda1 devfs=nomount failsafe initrd (hd0,0)/boot/initrd.img title windows chainloader (hd1,0) +1
·
o default 与 title 的计算方式:
基本的说明已经在上表当中了,这里需要在说明的是关于 default 开机档的计算。如果今天我有四个开机设定档,那么 default 算的是什么呢?就是『排序』啦!假如我底下依序出现的设定档 title 分别是 linux, linux-test, windows, failsafe 的话,那么开机的时候, grub 的选单就会显示:
linux
linux-test
windows
failsafe
其中,linux 就是 0 ,而 failsafe 就是 3 ,如果您要调整开机时后的选单顺序,就在 /boot/grub/menu.lst 修改一下他们的顺序即可!但是记得 default 要跟着变,因为他也是依据排序而变的呦!这点请不要忘记了?
o title 内容的设定方式:
基本上,如果是一般的硬盘环境中,我们仅需要两行就可以设定好 title 的内容了,分别是:
root   [开机根目录 / 所在的磁盘代号] kernel [开机档案的所在地完整档名] [root=/dev/硬盘代号] 范例: root  (hd0,0) kernel /boot/vmlinuz-2.4.19-16mdk root=/dev/hda1 设定上面就是这样而已!所以,开机完毕之后,请将您的 kernel 文件名称(完整檔名)与开机的根目录所在的磁盘代号记忆一下,那么下次就可以手动设定开机设定项目呢!但如果是 windows 方面的设定时,那就直接使用 chainloader 这个项目即可,有点像这样: chainloader [硬盘代号] +1 范例: chainloader (hd1,0) +1
·安装 grub 在系统中
要安装 grub 跟 /boot/grub/menu.lst 并没有相关性!因为刚刚我们就提过了, grub 为动态去搜寻设定文件的,所以写入 MBR 或 super block 时,并没有将 menu.lst 写入ㄋㄟ?好了,那我们就来安装看看吧!安装的方式主要也是分为安装在 MBR 与 super block 呢!底下我们就来谈谈这两种安装的方式:基本上的动作就是:
1.使用 root [磁盘代号] 选择开机根目录 / 所在磁盘代号;
2.使用 setup [磁盘代号] 选择 MBR 或 Super block 直接安装进去!
3.使用 quit 就可以离开 grub 了!
[root @test root]# grub # 先安装在 Super Block 底下试看看: grub> root (hd0,0) <==这里输入我要的 root 硬盘扇区! Filesystem type is ext2fs, partition type 0x83 grub> setup (hd0,0) <==实际安装上来!使用 setup 指令! Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/e2fs_stage1_5" exists... yes Running "embed /boot/grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal) Running "embed /boot/grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal) Running "install /boot/grub/stage1 (hd0,0) /boot/grub/stage2 p /boot/grub/menu .lst "... succeeded Done. # 再安装在 MBR 试看看: grub> root (hd0,0) Filesystem type is ext2fs, partition type 0x83 grub> setup (hd0) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/e2fs_stage1_5" exists... yes Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 17 sectors are embedded. succeeded Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded Done. grub> quit <==离开 grub 啰!
这样就安装进去啰!很方便吧!并不难吧!
·开机手动设定选项
事实上,每次动手修改完 /boot/grub/menu.lst 就已经完成了 grub 的设定啰!因为他相当的聪明!但是,如果我设定错误怎么办?没关系!有很多的方法可以使用呢!如果您可以顺利的以硬盘进入 grub 画面,那么恭喜您,可以继续下面的行动了!但是如果您的 Linux 竟然无法顺利的开机了,也就是说,使用硬盘开不了机!那么也没有关系,别担心,就直接给他使用 CD 开机,然后在进入 grub 画面之后,再继续下面的动作!
o在 grub 画面下进行手动加入的动作:
在 grub 画面中,通常画面的最下方都会显示一些基本的讯息,例如下方的 Mandrake 预设文字接口 grub 登入图标:

在这个画面中,您可以输入 e 或 c 来选择『编辑』或『进入指令列模式』,无论如何,这两个选项将使您进入指令列模式当中啦!所以您就可以看到一个大大的 grub> 提示字符,然后就可以修改或者是自订一些项目啦!而这些修改或者设定的项目,并不会主动的去覆盖您的 /boot/grub/menu.lst ,而是这次登入所做的修改而已呢!通常我都是选择 e 进入编辑的画面,然后选择 kernel 与 root 那两项内容进行编辑即可!例如我们上面提过的,我的 root 与 kernel 已经知道了正确的讯息,所以我就可以按下 c 来输入底下的字样:
grub> root (hd0,0)
grub> kernel /boot/vmlinuz-2.4.19-16mdk root=/dev/hda1
这样就可以进入我们的主机了呢!很厉害吧!
--------------------------------------------------------------------------------
可开机磁盘与救援磁盘制作
不论任何时候,制作可以开机的磁盘与救援的磁盘,都是一件很值得鼓励的事情!这里我们提供简单的方式来让您的磁盘可以开机呦!
# 制作软盘开机片:
[root @test root]# mkbootdisk --device /dev/fd0 `uname -r`
Insert a disk in /dev/fd0. Any information on the disk will be lost.
Press to continue or ^C to abort:
# 制作救援磁盘:
[root @test root]# mkrescue --device /dev/fd0
不过, mkrescue 比较麻烦的一点是,这个程序仅支持 lilo 这个 loader 的 image file ,所以如果刚刚您是使用 grub 来设定 MBR 的话,那么 mkrescue 就无法动作了?
查看(57)评论(0)收藏推荐
什么是linux
2007-08-01 22:00:45
什么是 Linux ?什么是操作系统?
要了解 Linux 之前,就不能不知道什么是操作系统 ( Operation System, OS ),所以,首先我们来简单的说一说什么是操作系统吧!先来想一想,当我们使用计算机时,屏幕上面显示的咚咚是由哪里来的?嗯!是由显示卡与屏幕显像的;那么你现在可以藉由网络看到这篇文章,则是藉由 Internet 、网络卡、网络线以及所有相关的电子器材与网络器材所完成的一项任务!如果你要看 VCD 呢?那么就需要光驱、光盘、声卡的发声等等的支持。这么说来的话,所以在『工作』的东西都是『硬件』的工作呀!对了!就是这些计算机硬件在工作的。那么硬件怎么工作呢?那就是藉由『操作系统』来达成的啰!这个操作系统就是在沟通你这个使用者跟硬件之间的讯息传递啦!也就是说,没有操作系统,那么你的计算机硬件就只是一堆废铁,什么工作都不能做的!
那么操作系统里面含有什么东西呢?简单的来说,操作系统主要分为两个东西,一个是『核心』、一个是『一堆核心提供的工具』我们以使用者常使用的 Windows 计算机来做一个简单的说明好了。大家应该都使用过 Windows 计算机里面的档案总管吧?那么当你开启档案总管的时候,他是否会显示你硬盘当中的资料?这个显示硬盘里面的资料,就是『核心』帮你做的,但是,你要核心去显示硬盘哪一个目录下的资料,则是由『档案总管』这个『工具』帮你达成的!这样可以理解吗?再来,如果您曾经使用过 Windows 2000 或 Windows XP 的话,那就更好了!你就应该听过有所谓的『FAT32 与 NTFS 档案格式』吧?在 Windows 98 这个早期的 Windows 版本中,他并无法读取或者是找到 Windows XP 的 NTFS 档案格式的硬盘,为什么呢?因为他的『核心』本来就不认识 NTFS 啊!所以,即使你有档案总管,但是由于核心根本不认识 NTFS ,所以,档案总管也是没有能力帮你达到你想要做的事情!这样应该就更清楚了吧?没错!你的整个硬件是由核心来管理的,而如果核心不认识你的硬件,那么你将无法使用该硬设备,例如上面提到的 NTFS 档案格式的硬盘!核心就是『 Kernel 』,他是一个操作系统的最底层的东西,由他来掌管整个硬件资源的工作状态,而 Linux 有 Linux 自己的核心, Windows 也有他自己的核心。所以说,当有新的硬件加入到你的系统中的时候,那么若你的『 Kernel 』并没有支持他的时候,呵呵,这个新的硬件就肯定无法工作的,因为控制他的 Kernel 并不认识他呀!这样了解了吗?!先有个概略性的了解,后面我们提到『核心编译』的时候会在更详细的谈到他!
一般来说,Kernel 管理的事项有:
System call interface :一些服务与 kernel 沟通之后,将硬件的资源进一步的利用;
Process control :系统过程控制中心,所以核心编的越小越好;
Memory management :控制整个系统的内存管理;
File system management :档案系统的管理,例如 I/O 等等的工作啦!还有不同档案格式的支持啦等等,如果你的核心不认识某个档案系统,那么您将无法使用该档案格式的档案啰!例如上面提到的 Windows 98 不认识 NTFS 档案格式的硬盘;
Device drivers :就如同上面提到的,硬件的管理是 Kernel 的主要工作之一,当然啰,装置的驱动程序就是核心需要做的事情啦!好在目前都有所谓的『可加载模块』功能,可以将驱动程序编辑成模块,就不需要重新的编译核心啦!这个也会在后续的核心编译当中提到的!
所以啦!所有硬件的资源都是他来管理的!至于我们要达成一些工作时,除了藉由核心本身提供的功能 ( 例如上面提到的档案总管 ) 之外,还可以藉由其它的应用软件来达成喔!举个例子来说,你要看 VCD 影片是吧!那么除了 Windows 提供的媒体播放程序之外,你也可以自行安装 VCD 播放程序来播放 VCD 啰!这个播放程序就是应用软件啰,而这个应用软件可以帮你去控制核心来工作 ( 就是放映影片啰 ) ,因此,我们可以这样说,核心是控制整个硬件支持的咚咚,也是一个操作系统的最底层,然而要让整个操作系统更完备的话,那还需要含有相当丰富的核心提供的工具,以及核心相关的应用软件来支持!
OK!提到这里那么您知道 Linux 是什么了吗?呵呵!对啦!其实 Linux 就是一个操作系统,这个操作系统里头含有最主要的 kernel 以及 kernel 提供的工具啦!他提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构,这个架构是沿袭 Unix 良好的传统来的,所以相当的稳定而功能强大!此外,由于这个优良的架构可以在目前的个人计算机 ( X86 系统 ) 上面跑,所以很多的软件开发者将他们的工作心血移转到这个架构上面,那就是很多的应用软件啦!虽然 Linux 仅是其核心与核心提供的工具,不过,由于核心、核心工具与这些软件开发者提供的软件的整合,使得 Linux 成为一个更完整的、功能强大的操作系统啰!我们可以将 Linux 的系统与使用者的相关性看成底下的图标:
图一、使用者、使用者接口与核心工具、核心、与硬件之相关性
查看(12)评论(0)收藏推荐
shell命令
2007-08-01 21:58:28
命令行
用户登录到linux系统时,可以看到一个shell提示符,标识了命令行的开始。用户可以在提示符后面输入任何命令及参数。例如:
$ date
二 11 23 01:34:58 cst 1999
$
用户登录时,实际进入了shell,它遵循一定的语法将输入的命令加以解释并传给系统。命令行中输入的第一个字必须是一个命令的名字,第二个字是命令的选项或参数,命令行中的每个字必须由空格或tab隔开,格式如下:
$ command option arguments
■ 选项和参数
选项是包括一个或多个字母的代码,它前面有一个减号(减号是必要的,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
注意:命令行中选项先于参数输入。
■ 命令行特征
命令行实际上是可以编辑的一个文本缓冲区,在按回车之前,可以对输入的文本进行编辑。比如利用backspace键可以删除刚键入的字符,可以进行整行删除,还可以插入字符,使得用户在输入命令,尤其是复杂命令时,若出现键入错误,无须重新输入整个命令,只要利用编辑操作,即可改正错误。
利用上箭头可以重新显示刚执行的命令,利用这一功能可以重复执行以前执行过的命令,而无须重新键入该命令。
bash保存着以前键入过的命令的列表,这一列表被称为命令历史表。按动上箭头,便可以在命令行上逐次显示各条命令。同样,按动下箭头可以在命令列表中向下移动,这样可以将以前的各条命令显示在命令行上,用户可以修改并执行这些命令。这一特征将在10.4节中进行详细的论述。
在一个命令行中还可以置入多个命令,用分号将各个命令隔开。例如:
$ ls -f;cp -i mydata newdata
也可以在几个命令行中输入一个命令,用反斜杠将一个命令行持续到下一行。
$ cp -i \
mydata \
newdata
上面的cp命令是在三行中输入的,开始的两行以反斜杠结束,把三行作为一个命令行。
shell中的特殊字符
shell中除使用普通字符外,还可以使用一些具有特殊含义和功能的特殊字符。在使用它们时应注意其特殊的含义和作用范围。下面分别对这些特殊字符加以介绍。
■ 通配符
通配符用于模式匹配,如文件名匹配、路经名搜索、字符串查找等。常用的通配符有*、?和括在方括号[ ]中的字符序列。用户可以在作为命令参数的文件名中包含这些通配符,构成一个所谓的“模式串”,在执行过程中进行模式匹配。
查看(21)评论(0)收藏推荐
linux下的shell编成
2007-08-01 21:55:38
linux下的shell编成

Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是 Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统的关键。可以说,shell使用的熟练程度反映了用户对 Linux使用的熟练程度。
一、什么是shell
当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shell(外壳)的程序。那么,shell是什么呢?确切一点说,shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。
当用户使用Linux时是通过命令来完成所需工作的。一个命令就是用户和shell之间对话的一个基本单位,它是由多个字符组成并以换行结束的字符串。shell解释用户输入的命令,就象DOS里的command.com所做的一样,所不同的是,在DOS中,command.com只有一个,而在 Linux下比较流行的shell有好几个,每个shell都各有千秋。一般的Linux系统都将bash作为默认的shell。
二、几种流行的shell
目前流行的shell有ash、bash、ksh、csh、zsh等,你可以用下面的命令来查看你自己的shell类型:
#e cho $SHELL
$SHELL是一个环境变量,它记录用户所使用的shell类型。你可以用命令:
#shell-name
来转换到别的shell,这里shell-name是你想要尝试使用的shell的名称,如ash等。这个命令为用户又启动了一个shell,这个shell在最初登录的那个shell之后,称为下级的shell或子shell。使用命令:
$exit
可以退出这个子shell。
使用不同的shell的原因在于它们各自都有自己的特点,下面作一个简单的介绍:
1.ash
ash shell是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。
2.bash
bash是Linux系统默认使用的shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的缩写,内部命令一共有40个。Linux使用它作为默认的shell是因为它有诸如以下的特色:
(1)可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令。
(2)自动通过查找匹配的方式给出以某字符串开头的命令。
(3)包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。
3.ksh
ksh是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。
4.csh
csh是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共有52个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,也就是说,csh其实就是tcsh。
5.zch
zch是Linux最大的shell之一,由Paul Falstad完成,共有84个内部命令。如果只是一般的用途,是没有必要安装这样的shell的。
三、shell程序设计(基础部分)
其实作为命令语言交互式地解释和执行用户输入的命令只是shell功能的一个方面,shell还可以用来进行程序设计,它提供了定义变量和参数的手段以及丰富的程序控制结构。使用shell编程类似于DOS中的批处理文件,称为shell scrīpt,又叫shell程序或shell命令文件。
1.shell基本语法
shell的基本语法主要就是如何输入命令运行程序以及如何在程序之间通过shell的一些参数提供便利手段来进行通讯。
(1)输入输出重定向
在Linux中,每一个进程都有三个特殊的文件描述指针:标准输入(standard input,文件描述指针为0)、标准输出(standard output,文件描述指针为1)、标准错误输出(standard error,文件描述指针为2)。这三个特殊的文件描述指针使进程在一般情况下接收标准输入终端的输入,同时由标准终端来显示输出,Linux同时也向使用者提供可以使用普通的文件或管道来取代这些标准输入输出设备。在shell中,使用者可以利用“>”和“<”来进行输入输出重定向。如:
command>file:将命令的输出结果重定向到一个文件。
command>&file:将命令的标准错误输出一起重定向到一个文件。
command>>file:将标准输出的结果追加到文件中。
command>>&file:将标准输出和标准错误输出的结构都追加到文件中。
command
(2)管道pipe
pipe同样可以在标准输入输出和标准错误输出间做代替工作,这样一来,可以将某一个程序的输出送到另一个程序的输入,其语法如下:
command1| command2[| command3...]
也可以连同标准错误输出一起送入管道:
command1| &command2[|& command3...]
(3)前台和后台
在shell下面,一个新产生的进程可以通过用命令后面的符号“;”和“&”来分别以前台和后台的方式来执行,语法如下:
command
产生一个前台的进程,下一个命令须等该命令运行结束后才能输入。
command &
产生一个后台的进程,此进程在后台运行的同时,可以输入其他的命令。
2。shell程序的变量和参数
像高级程序设计语言一样,shell也提供说明和使用变量的功能。对shell来讲,所有变量的取值都是一个字符串,shell程序采用$var的形式来引用名为var的变量的值。
Shell有以下几种基本类型的变量:
(1)shell定义的环境变量
shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,这些变量用户还可以重新定义,常用的shell环境变量有:
HOME:用于保存注册目录的完全路径名。
PATH:用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。
TERM:终端的类型。
UID:当前用户的标识符,取值是由数字构成的字符串。
PWD:当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。
PS1:主提示符,在特权用户下,缺省的主提示符是“#”,在普通用户下,缺省的主提示符是“$”。
PS2:在shell接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后回车,或者当用户按回车键时shell判断出用户输入的命令没有结束时,显示这个辅助提示符,提示用户继续输入命令的其余部分,缺省的辅助提示符是“>”。
(2)用户定义的变量
用户可以按照下面的语法规则定义自己的变量:
变量名=变量值
要注意的一点是,在定义变量时,变量名前不应加符号“$”,在引用变量的内容时则应在变量名前加“$”;在给变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字符串都要用双引号括起来。
在编写shell程序时,为了使变量名和命令名相区别,建议所有的变量名都用大写字母来表示。
有时我们想要在说明一个变量并对它设定为一个特定值后就不在改变它的值,这可以用下面的命令来保证一个变量的只读性:
readly 变量名
在任何时候,建立的变量都只是当前shell的局部变量,所以不能被shell运行的其他命令或shell程序所利用,export命令可以将一局部变量提供给shell执行的其他命令使用,其格式为:
export 变量名
也可以在给变量赋值的同时使用export命令:
export 变量名=变量值
使用export说明的变量,在shell以后运行的所有命令或程序中都可以访问到。
(3)位置参数
位置参数是一种在调用shell程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数。位置参数之间用空格分隔,shell取第一个位置参数替换程序文件中的$1,第二个替换$2,依次类推。$0是一个特殊的变量,它的内容是当前这个shell程序的文件名,所以,$0不是一个位置参数,在显示当前所有的位置参数时是不包括$0的。
(4)预定义变量
预定义变量和环境变量相类似,也是在shell一开始时就定义了的变量,所不同的是,用户只能根据shell的定义来使用这些变量,而不能重定义它。所有预定义变量都是由$符和另一个符号组成的,常用的shell预定义变量有:
$#:位置参数的数量
$*:所有位置参数的内容
$?:命令执行后返回的状态
$$:当前进程的进程号
$!:后台运行的最后一个进程号
$0:当前执行的进程名
其中,“$?”用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)。
“$$”变量最常见的用途是用作临时文件的名字以保证临时文件不会重复。
(5)参数置换的变量
shell提供了参数置换能力以便用户可以根据不同的条件来给变量赋不同的值。参数置换的变量有四种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经设置类决定变量的取值,它们的语法和功能分别如下。
a. 变量=${参数-word}:如果设置了参数,则用参数的值置换变量的值,否则用word置换。即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于word的值。
b. 变量=${参数=word}:如果设置了参数,则用参数的值置换变量的值,否则把变量设置成word然后再用word替换参数的值。注意,位置参数不能用于这种方式,因为在shell程序中不能为位置参数赋值。
c. 变量=${参数?word}:如果设置了参数,则用参数的值置换变量的值,否则就显示word并从shell中退出,如果省略了word,则显示标准信息。这种变量要求一定等于某一个参数的值,如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示。
d. 变量=${参数+word}:如果设置了参数,则用word置换变量,否则不进行置换。
所有这四种形式中的“参数”既可以是位置参数,也可以是另一个变量,只是用位置参数的情况比较多。
接下来以bash为例向大家介绍shell程序设计的高级部分:shell编程的流程控制、调试方法及shell程序的运行方法,顺便也向大家介绍一下bash的内部命令。
四、shell程序设计的流程控制
和其他高级程序设计语言一样,shell提供了用来控制程序执行流程的命令,包括条件分支和循环结构,用户可以用这些命令建立非常复杂的程序。
与传统的语言不同的是,shell用于指定条件值的不是布尔表达式而是命令和字符串。
1.test测试命令
test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,其测试符和相应的功能分别如下:
(1)数值测试:
-eq:等于则为真
-ne:不等于则为真
-gt:大于则为真
-ge:大于等于则为真
-lt:小于则为真
-le:小于等于则为真
(2)字符串测试:
=:等于则为真
!=:不相等则为真
-z字符串:字符串长度伪则为真
-n字符串:字符串长度不伪则为真
(3)文件测试:
-e文件名:如果文件存在则为真
-r文件名:如果文件存在且可读则为真
-w文件名:如果文件存在且可写则为真
-x文件名:如果文件存在且可执行则为真
-s文件名:如果文件存在且至少有一个字符则为真
-d文件名:如果文件存在且为目录则为真
-f文件名:如果文件存在且为普通文件则为真
-c文件名:如果文件存在且为字符型特殊文件则为真
-b文件名:如果文件存在且为块特殊文件则为真
另外,Linux还提供了与(“!”)、或(“-o)、非(“-a”)三个逻辑操作符用于将测试条件连接起来,其优先级为:“!”最高,“-a”次之,“-o”最低。
同时,bash也能完成简单的算术运算,格式如下:
$[expression]
例如:var1=2
var2=$[var1*10+1]
则:var2的值为21。
2.if条件语句
shell程序中的条件分支是通过if条件语句来实现的,其一般格式为:
if条件命令串
then
条件为真时的命令串
else
条件为假时的命令串
fi
3.for循环
for循环对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表的形式提供,也可以在程序以外以位置参数的形式提供。for循环的一般格式为:
for变量名
[in数值列表]
do
若干个命令行
done
变量名可以是用户选择的任何字符串,如果变量名是var,则在in之后给出的数值将顺序替换循环命令列表中的$var。如果省略了in,则变量var的取值将是位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表。
4.while和until循环
while和until命令都是用命令的返回状态值来控制循环的。While循环的一般格式为:
while
若干个命令行1
do
若干个命令行2
done
只要while的“若干个命令行1”中最后一个命令的返回状态为真,while循环就继续执行do...done之间的“若干个命令行2”。
until命令是另一种循环结构,它和while命令相似,其格式如下:
until
若干个命令行1
do
若干个命令行2
done
until循环和while循环的区别在于:while循环在条件为真时继续执行循环,而until则是在条件为假时继续执行循环。
Shell还提供了true和false两条命令用于建立无限循环结构的需要,它们的返回状态分别是总为0或总为非0
5.case条件选择
if条件语句用于在两个选项中选定一项,而case条件选择为用户提供了根据字符串或变量的值从多个选项中选择一项的方法,其格式如下:
case string in
exp-1)
若干个命令行1
;;
exp-2)
若干个命令行2
;;
……
*)
其他命令行
esac
shell通过计算字符串string的值,将其结果依次和表达式exp-1、exp-2等进行比较,直到找到一个匹配的表达式为止,如果找到了匹配项则执行它下面的命令直到遇到一对分号(;;)为止。
在case表达式中也可以使用shell的通配符(“*”、“?”、“[ ]”)。通常用“*”作为case命令的最后表达式以便使在前面找不到任何相应的匹配项时执行“其他命令行”的命令。
6.无条件控制语句break和continue
break用于立即终止当前循环的执行,而contiune用于不执行循环中后面的语句而立即开始下一个循环的执行。这两个语句只有放在do和done之间才有效。
7.函数定义
在shell中还可以定义函数。函数实际上也是由若干条shell命令组成的,因此它与shell程序形式上是相似的,不同的是它不是一个单独的进程,而是shell程序的一部分。函数定义的基本格式为:
functionname
{
若干命令行
}
调用函数的格式为:
functionname param1 param2……
shell函数可以完成某些例行的工作,而且还可以有自己的退出状态,因此函数也可以作为if、while等控制结构的条件。
在函数定义时不用带参数说明,但在调用函数时可以带有参数,此时shell将把这些参数分别赋予相应的位置参数$1、$2、...及$*。
8.命令分组
在shell中有两种命令分组的方法:“()”和“{}”,前者当shell执行()中的命令时将再创建一个新的子进程,然后这个子进程去执行圆括弧中的命令。当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、当前工作目录等)的改变影响到下面语句的执行时,就应该把这些命令放在圆括弧中,这样就能保证所有的改变只对子进程产生影响,而父进程不受任何干扰;{}用于将顺序执行的命令的输出结果用于另一个命令的输入(管道方式)。当我们要真正使用圆括弧和花括弧时(如计算表达式的优先级),则需要在其前面加上转义符(\)以便让shell知道它们不是用于命令执行的控制所用。
9.信号
trap命令用于在shell程序中捕捉到信号,之后可以有三种反应方式:
(1)执行一段程序来处理这一信号
(2)接受信号的默认操作
(3)忽视这一信号
trap对上面三种方式提供了三种基本形式:
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双引号中的命令串。
trap 'commands' signal-list
trap "commands" signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令允许忽视信号:
trap " " signal-list
注意:
(1)对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储。
(2)在trap中可以定义对信号0的处理(实际上没有这个信号),shell程序在其终止(如执行exit语句)时发出该信号。
(3)在捕捉到signal-list中指定的信号并执行完相应的命令之后,如果这些命令没有将shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令,这样将很容易导致shell程序无法终止。
另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若 commands是用单引号括起来的话,那么shell不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体的值来替换。
五、运行shell程序的方法
用户可以用任何编辑程序来编写shell程序。因为shell程序是解释执行的,所以不需要编译装配成目标程序,按照shell编程的惯例,以 bash为例,程序的第一行一般为“#!/bin/bash”,其中#表示该行是注释,叹号“!”告诉shell运行叹号之后的命令并用文件的其余部分作为输入,也就是运行/bin/bash并让/bin/bash去执行shell程序的内容。
执行shell程序的方法有三种:
(1)sh shell程序文件名
这种方法的命令格式为:
bash shell程序文件名
这实际上是调用一个新的bash命令解释程序,而把shell程序文件名作为参数传递给它。新启动的shell将去读指定的文件,执行文件中列出的命令,当所有的命令都执行完结束。该方法的优点是可以利用shell调试功能。
(2)sh
格式为:
bash
这种方式就是利用输入重定向,使shell命令解释程序的输入取自指定的程序文件。
(3)用chmod命令使shell程序成为可执行的
一个文件能否运行取决于该文件的内容本身可执行且该文件具有执行权。对于shell程序,当用编辑器生成一个文件时,系统赋予的许可权限都是644(rw-r-r--),因此,当用户需要运行这个文件时,只需要直接键入文件名即可。
在这三种运行shell程序的方法中,最好按下面的方式选择:当刚建立一个shell程序,对它的正确性还没有把握时,应当使用第一种方式进行调试。当一个shell程序已经调试好时,应使用第三种方式把它固定下来,以后只要键入相应的文件名即可,并可被另一个程序所调用。
六、bash程序的调试
在编程过程中难免会出错,有的时候,调试程序比编写程序花费的时间还要多,shell程序同样如此。
shell程序的调试主要是利用bash命令解释程序的选择项。调用bash的形式是:
bash -选择项shell程序文件名
几个常用的选择项是:
-e:如果一个命令失败就立即退出
-n:读入命令但是不执行它们
-u:置换时把未设置的变量看作出错
-v:当读入shell输入行时把它们显示出来
-x:执行命令时把命令和它们的参数显示出来
上面的所有选项也可以在shell程序内部用“set -选择项”的形式引用,而“set +选择项”则将禁止该选择项起作用。如果只想对程序的某一部分使用某些选择项时,则可以将该部分用上面两个语句包围起来。
1.未置变量退出和立即退出
未置变量退出特性允许用户对所有变量进行检查,如果引用了一个未赋值的变量就终止shell程序的执行。shell通常允许未置变量的使用,在这种情况下,变量的值为空。如果设置了未置变量退出选择项,则一旦使用了未置变量就显示错误信息,并终止程序的运行。未置变量退出选择项为“-u”。
当shell运行时,若遇到不存在或不可执行的命令、重定向失败或命令非正常结束等情况时,如果未经重新定向,该出错信息会打印在终端屏幕上,而 shell程序仍将继续执行。要想在错误发生时迫使shell程序立即结束,可以使用“-e”选项将shell程序的执行立即终止。
2.shell程序的跟踪
调试shell程序的主要方法是利用shell命令解释程序的“-v”或“-x”选项来跟踪程序的执行。“-v”选择项使shell在执行程序的过程中,把它读入的每一个命令行都显示出来,而“-x”选择项使shell在执行程序的过程中把它执行的每一个命令在行首用一个“+”加上命令名显示出来。并把每一个变量和该变量所取的值也显示出来,因此,它们的主要区别在于:在执行命令行之前无“-v”则打印出命令行的原始内容,而有“-v”则打印出经过替换后的命令行的内容。
除了使用shell的“-v”和“-x”选择项以外,还可以在shell程序内部采取一些辅助调试的措施。例如,可以在shell程序的一些关键地方使用echo命令把必要的信息显示出来,它的作用相当于C语言中的printf语句,这样就可以知道程序运行到什么地方及程序目前的状态。
七、bash的内部命令
bash命令解释程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由shell本身提供。常用的内部命令有:echo、eval、exec、export、readonly、read、shift、wait和点(.)。下面简单介绍其命令格式和功能。
1.echo
命令格式:echo arg
功能:在屏幕上打印出由arg指定的字符串。
2.eval
命令格式:eval args
功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。
3.exec
命令格式:exec命令命令参数
功能:当shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程,也就是最初的shell就终止了,所以shell程序中exec后面的语句将不再被执行。
4.export
命令格式:export变量名或:export变量名=变量值
功能:shell可以用export把它的变量向下带入子shell从而让子进程继承父进程中的环境变量。但子shell不能用export把它的变量向上带入父shell。
注意:不带任何变量名的export语句将显示出当前所有的export变量。
5.readonly
命令格式:readonly变量名
功能:将一个用户定义的shell变量标识为不可变的。不带任何参数的readonly命令将显示出所有只读的shell变量。
6.read
命令格式:
read变量名表
功能:从标准输入设备读入一行,分解成若干字,赋值给shell程序内部定义的变量。
7.shift语句
功能:shift语句按如下方式重新命名所有的位置参数变量:$2成为$1,$3成为$2……在程序中每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数“$#”减一,直到减到0。
8.wait
功能:是shell等待在后台启动的所有子进程结束。Wait的返回值总是真。
9.exit
功能:退出shell程序。在exit之后可有选择地指定一个数字作为返回状态。
10.“.”(点)
命令格式:. Shell程序文件名
功能:使shell读入指定的shell程序文件并依次执行文件中的所有语句。
查看(64)评论(0)收藏推荐
echo命令
2007-08-01 20:21:19
下面主要用例子说明用法(bash环境下测试)
1)echo显示字符串
普通字符串可以在echo后直接输入字符串,但这样当要输出某些字符如\时会有问题(这种写法的时候\是被当作继行符处理过滤掉的,要输出一个\必须打\ \,跟c语言printf输出的要求相象),所以一般最好用'string' 或"string"的格式,这样即使是\也可以输出,方便直观。
#echo  hello world
hello world
#echo hello\ world
hello world
#echo hello\\ world
hello\ world
#echo 'hello\\ world' 或者: echo "hello\\ world"
hello\\ world
2)echo的转义显示: 加上-e参数
输出多行
#echo -e 'hello\nworld'
hello
world
输出ascii字符: echo -e \NNN    (NNN为ascii字符的八进制码号,不符合八进制的将会按照字面意义进行打印)
#echo -e '\61 \62 \101 \141'
1 2 A a
查看(28)评论(0)收藏推荐
linux echo命令详解
2007-08-01 20:19:28
linux echo命令详解
功能说明:显示文字。
语   法:echo [-ne][字符串]或 echo [--help][--version]
补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。
参   数:-n 不要在最后自动换行
-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般
文字输出:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
--help 显示帮助
--version 显示版本信息
查看(1938)评论(4)收藏推荐
linux命令大全
2007-08-01 20:03:41
df查看硬盘还有多少空间。
1,查看帮助命令:df --help
2,df -T文件系统属性
3,df -a  查看文件大小,
4,df -i以I结点来显视文件(一般是一个文件占一个I结点)
5,df -x fat不显示分区
du检查一个目录所占用的空间
1,du -s /root系统文件的总数
2,du -a 提规显视
3,du /root分别显示
mnt 挂仔点
1,monut -t auto /dev/sdb1/ mnt/usb自动搜索USB
cal万年历
1,cal 11 1986    1986年11月份的万年历
dmesg
uname -a查看系统所有的版本信息
man 是linux中查看命令参考手册
二linux的常用指命
1,ls显示文件
参数ls -l列出文件的属性
ls -a 显示所有文件包括隐藏文件
ls -R 列出目录下的子目录
ls -la 以列表的方式列出所有文件的目录
2,clear 清屏
3,翻页shift+pageup或shift=pagedown
4,cd
cd..到根目录(蓝色代表是目录)
cd.当前目录
cd /home 到home 目录下
cd - 返回到上一个目录
5,mkdir新建目录后面可接相对路经和绝对路经mkdir -p/加很多目录
6,删目录rmdir后面可接相对路经和绝对路经
6,touch 创建文件命令,
8,mv移动命令也起重命名的作用.
9,删除文件命令rm  rm -f 直接删除不作任何提示rm /加很多目录
10,拷贝文件命令cp
对文件操作命令
1,阅读文件的命令more 跟路经
2,阅读文件的命令
编辑文件vi
1,是最强大的编辑器,可以编辑任何文件
改文件的权限chmod加八进制,
chmod 777 install.log
2,chown改文件的用户
3,chgrp改文件的组
4,file显示文件属性的一条命令.
二压缩与解压缩
1,gz压缩的用法gzip -v{显示压缩进度} 加压缩文件
解压方法 gunzip -f(无条件代替原文件不提示) 解压文件
gzip -d(解压参数) 接解压缩文件与gunzip的作用一样
compress很少用,压缩质量不怎么行。
2,zip的使用方法
zip 压缩成的文件名 原文件名
3,unzip
4,bzip2 接压缩的原文件。压为.bz2的压缩格式(最近linux新兴起的一种压缩格试)
解包方法bunzip2 接原文件
5.tar包的使用方法
tar -cvf 打包后的文件名接原文件名(可以进行整个目录进行打包)
c  那一个新的包。v 显示打进去的文件   f输出到默认的设备
解包方法tar zcf  解压文件 x 展开文件
一次性打成.tar.gz的方法 tar zcvf 要打成的文件名原文件名
解.tar.gz 包的方法 tar zxvf 解压文件
5,tgz格式.其实根 .tar.gz是一样的解包与tar zcvf一样
三文件的安装
1,.tat.gz的安装方法先解压后安装(要记得改权限)
2,rpm包的安装方法
a.rpm -i 安装一个新的软件包
b,rpm -F更新一个软件包,不在就不进行安装
c,rpm -U升级一个系统中已经存在的系统包(存在就升级,不存在就进行安装)
d,rpm -v 显示系统安装中提示的各种信息 (安装路经也显示)
e,rpm -h 显示安装的进程条
f,rpm -e 用来删除一个软件包后面跟要删的软件包名字。(只是软件的名字,不是包的名字)
g,rpm -q列出用户已安装的安装包名字一定要正确
h,rpm -qa列出所有安装包
四源代码包的安装方法
1,configure的配置方法   ./configure --help
2,make install
3,./configure make install
五复原root的密码
光盘起动按F5 能后linux rescue
六,linux用户及组的管理
etc/passwd用户管理信息
etc/shadow和用户密码相关的一些信息
etc/login.defs建立用户的时候和系统默认的一些信息
六修改用户信息的几个命令
1,useradd用户添加
-u用户ID -g组id -G另外一个组ID
-d 用户的主目录 -s(命令解释器一般是/bin/bash)   -p 是密码后面接密码。。
七删除用户跟密码
1, 用别进   etc/passwd   和etc/shadow里面把相关的信息删掉就可以了。
2,到home 文件下删除两个文件的目录用rm -rf命令
3,到cd /var/spool/mail下把相关信息也删掉就OK了
八linux下的进程管理
1,w 与who 查看本几有多少用户登陆
2,who -u显示该用户的进程号
3,last用登陆的一些记录
4,top 看资源使用情况
5,ps查看进程命令
6,pa -aux查看,更详细
7,关闭进程用kill  kill -9(无条件杀死了一个进程) 后面接进和ID
1,bunzip2 接文件(里面全是源代码)
九linux下的日志的管理。
1,日志下的配置文件
vi /etc/syslog.conf
查看(199)评论(0)收藏推荐
几个linux命令
2007-08-01 19:06:03
几个linux命令
mv
用户可以使用mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中。该命令如同MSDOS下的ren和move的组合。
语法:mv [选项] 源文件或目录 目标文件或目录
说明:视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv先拷贝,再将原有文件删除,而链至该文件的链接也将丢失。
rm
用户可以用rm命令删除不需要的文件。该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是断开了链接,原文件保持不变。
rm命令的一般形式为:
rm [选项] 文件…
如果没有使用- r选项,则rm不会删除目录。
该命令的各选项含义如下:
- f 忽略不存在的文件,从不给出提示。
- r 指示rm将参数中列出的全部目录和子目录均递归地删除。
- i 进行交互式删除。
使用rm命令要小心。因为一旦文件被删除,它是不能被恢复的。了防止这种情况的发生,可以使用i选项来逐个确认要删除的文件。如果用户输入y,文件将被删除。如果输入任何其他东西,文件则不会删除
find
find 是高级的寻找文件工具,可不像 whereis 那么“阳春白雪”。但也因为它太高级了,复杂到很多人用不熟练。我们尽量只举简单的例子。
最简单的格式如下:
find / -name my* -print
这个意思是请它从最底层的主目录开始找,找出文件名是 my 开头的文件,把它显示出来。-print 选项是显示,您可把它当做固定要加上的项目。
但它还可以用时间来找,例如:
find /usr -atime 3 –print
会从 /usr 目录开始往下找,找最近3天之内存取过的文件。
find /usr -ctime 5 –print
会从 /usr 目录开始往下找,找最近5天之内修改过的文件。
find /doc -user jacky -name 'j*' –print
会从 /doc 目录开始往下找,找jacky 的、文件名开头是 j的文件。
find /doc \( -name 'ja*' -o- -name 'ma*' \) –print
会从 /doc 目录开始往下找,找寻文件名是 ja 开头或者 ma开头的文件。
find /doc -name '*bak' -exec rm {} \;
会从 /doc 目录开始往下找,找到凡是文件名结尾为 bak的文件,把它删除掉。-exec 选项是执行的意思,rm 是删除命令,{ } 表示文件名,“\;”是规定的命令结尾。
chmod 改变属性
r - 4
w - 2
x - 1
查看(48)评论(0)收藏推荐
vi编辑器命令详解
2007-08-01 18:55:58
vi编辑器命令详解
vi命令是unix下常用而重要命令,可在全屏幕方式下编辑一个或多个文件。若在vi执行时
没有指定一个文件,那么vi命令会自动产生一个无名的空的工作文件。若指定的文件不存在,
那么就按指定的文件名创建一个新的文件。若对文件的修改不保存的话,v i命令并不改变原
来文件的内容。
注意:vi命令并不锁住所编辑的文件,因此多个用户可能在同时编辑一个文件,那么最后
保存的文件版本将被保留。
下面是vi命令使用的一些选项及含义:
-c sub-command 在对指定的文件编辑前,先执行指定的命令 sub-command .
-r filename 恢复指定的文件filename .
-R 将指定的文件以只读的方式放入编辑器中,这样不会保存对文件的任何修 改。
-y number 将编辑窗口的大小设为number行。
下面是vi编辑所处的三种模式:
.命令模式 进入vi时所处的模式。在此模式下用户可输入各种子命令对进行*作,如删除行、
粘贴行、移向下一个字、移向不同行等。
.文本输入模式 在此模式下可以修改一行的内容并增添新行。在命令模式下键入a 、i 或
c键可进入文本输入模式,按Escape键可返回命令模式。
.命令项模式 在此模式下,可以通过子命令输入更多的参数。如:w子命令要求输入一文
件名,"/"子命令要求输入一个查找项。用户使用Escape键返回命令模式。
下面是自命令模式下执行的,在同一行上移动的自命令:
h 将光标左移一格。
l 将光标右移一格。
j 将光标下移一格。
k 将光标上移一格。
w 将光标移到下一个小字的前面。
W 将光标移到下一个大字的前面。
b 将光标移到前一个小字的前面。
B 将光标移到前一个大字的前面。
e 将光标移到下一个小字的后面。
E 将光标移到前一个大字的后面。
fc 把光标移到同一行的下一个c字符处。
Fc 把光标移到同一行的前一个c字符处。
tc 把光标移到同一行的下一个字符c的前一格。
Tc 把光标移到同一行的前一个字符c的后一格。
number| 把光标移到递number列上。
下面是命令模式下在行间移动的子命令:
+或Enter 把光标移至下一行第一个非空白字符。
- 把光标移至上一行第一个非空白字符。
0 把光标移到当前行的第一个字符处。
$ 把光标移到当前行的最后一个字符处。
H 把光标移到屏幕最顶端一行。
L 把光标移到屏幕最底端一行。
M 把光标移到屏幕中间。
下面是命令模式下改变屏幕显示的子命令:
z- 把当前行作为屏幕的最后一行,并重新显示屏幕。
z. 把当前行作为屏幕的中间一行,并重新显示屏幕。
Ctrl+l 重新显示屏幕当前内容。
/pattern/z- 寻找pattern的下一个位置,并把所在行设为屏幕的最后一行。
下面是在命令模式下用来显示页面的子命令:
Ctrl + f向后滚一页。
Ctrl + d向后滚半页。
Ctrl + b向前滚一页。
Ctrl + u向前滚半页。
Ctrl + e屏幕向下滚一行。
Ctrl + y屏幕项上滚一行。
下面是在命令模式下用来查找字符串所使用的子命令:
/pattern 向后寻找指定的pattern ,若遇到文件尾,则从头再开始。
?pattern 向前寻找指定的pattern ,若遇到文件头,则从尾再开始。
n 在上次指定的方向上,再次执行上次定义的查找。
N 在上次指定的方向的相反方向上,再次执行上次定义的查找。
/pattern/+number 将光标停在包含pattern的行后面第number行上。
/pattern/-number 将光标停在包含pattern的行前面第number行上。
% 移到匹配的"()"或"{}"上。
下面是在文本输入模式下用来输入文本的子命令(用户可在任何时候按Escape返回到命令模式):
a 在光标之后开始输入文本。
A在行尾开始输入文本。
i在光标之前开始输入文本。
I在行首第一个非空白字符前输入文本。
o在光标所在行后插入一空行。
O在光标所在行前插入一空行。
下面是在命令模式下改变文本所使用的子命令(用户可在任何的时候按Escape键返回到命令模式):
cc或S 修改一整行。
C 改变一行光标位置以后的部分。
cw 改变光标所在单词。
dd删除当前行。
D 删除光标所在行光标后面的内容。
dw删除光标所在的单词。
J 把下一行内容加到本行行尾。
rc把光符所在字符替换成c .
R 覆盖本行内容。
u恢复上一次的修改。
x删除光标所在的字符。
~ 改变光标所在出字符的大小写。
. 重复上一个*作。
<<把当前行移到左边。
>>把当前行移到右边。
下面是用于文件中拷贝文本的字命令:
p 将缓冲区内容取到光标所在行的下面一行。
P 将缓冲区内容取到光标所在行的上面一行。
"bd 将文本删除至有名缓冲区b .
"bp 张贴有名缓冲区b中内容。
yy把当前行放入缓冲区。
Y 把当前行放入缓冲区。
Yw把光标所在的单词放入缓冲区。
下面是用于保存文件的子命令:
:w 回写修改后的文件。
:w filename 当filename不存在时,把修改后的文件存为文件filename ,当文件filename
存在时,报错。
!w filename 如果文件filename存在时,把修改后的文件保存为文件filename .
下面列出了在vi编辑的多个文件之间切换所用的子命令:
:n开始编辑vi激活的文件列表中的下一个文件。
:n filenames 指定将被编辑的新的文件列表。
下面列出了用于在当前文件和另外一个文件间切换的子命令:
:e filename 使用filename激活vi (在vi中装入另一个文件filename)。
e!重新装入当前文件,若当前文件有改动,则丢弃以前的改动。
:e+filename 使用filename激活vi ,并从文件尾部开始编辑。
:e+number filename 使用filename激活vi ,并在第number行开始编辑。
:e# 开始编辑另外一个文件。
下面是在本文件中加入其他文件代码所使用的子命令:
:r filename读取filename文件,并将其内容加到当前文件后。
:r ! command执行command文件,并将其输出加到当前文件后。
下面是vi中其他的子命令:
ctrl+g 取得正在编辑文件的有关信息。
:sh启动sh ,从sh中返回可用exit或ctrl+d .
:! Command 执行命令command .
!!重新执行上次的:! Command子命令。
:q退出vi ,若用户对编辑的文件有所修改,系统不会让用户使用q命令退出。
:q!退出vi而不管是否对文件有改动。
ZZ或:wq 保存对文件的修改并退出vi .
用户可在一个特殊的文件.exrc中定义特殊的vi命令。在vi中使用这些命令时,必须在该
命令前加上一个冒号( :) 。
命令状态:
2007-06-05  15:37命令状态:
j,k,h,l:上下左右
0: 行首
$: 行尾
i,I :插入命令,i 在当前光标处插入 I 行首插入
a,A:追加命令,a 在当前光标后追加,A 在行末追加
o,O:打开命令,o 在当前行下打开一行,O在当前行上插入一行
r,R :替换命令,r 替换当前光标处字符,R从光标处开始替换
数字s: 替换指定数量字符
x: 删除光标处字符
dd: 删除当前行
d0: 删除光标前半行
d$: 删除光标后半行
ctrl+f :后翻页
ctrl+b:前翻页
G : 文件尾
数字G: 数字所指定行
/string 查找字符串
n 继续查找
N 反向继续查找
% 查找对应括号
u 取消上次操作
ex命令状态
:set number 显示行号
:set smd 显示显示状态
:0 文件首
:1,5 copy 7 块拷贝
:1,5 del 块删除
:1,5 move 7 块移动
:1,$s/string1/string2/g 全文件查找string1并替换为string2
:wq! 存盘退出
查看(170)评论(0)收藏推荐
linux基础教程之命令的使用
2007-07-31 11:10:22
从零开始:Linux基础教程之命令的使用
对于 Linux 新手,或者那些想要重新审视或改进自己对基本 Linux 概念(比如:复制和移动文件、创建符号和硬链接、设置文件系统对象所有权和权限以及同管道和重定向一起使用 Linux 的标准文本处理命令)的理解的人来说,本系列连载文章之一是理想的教材。沿着这个方向,我们将一起分享很多心得、技巧和窍门,使该教程甚至对于那些具有丰富经验的 Linux 老手来说都是“有血有肉”,并且是实用的。
对于初学者而言,本系列文章的许多内容都很新颖,而更有经验的 Linux 用户可能会发现本教程是使他们基本的 Linux 技能“炉火纯青”的有效途径。
介绍 bash
shell
如果您使用过 Linux 系统,那么您知道当登录时,将会看到像这样的提示符:
$
您所看到的特殊的提示符可能看起来很不一样。它可能包含系统的主机名、当前的工作目录名,或者两者都有。但是不管这个特殊的提示符看起来像什么,有一件事是肯定的。打印出这个提示符的程序叫“shell”,极有可能您的特殊的 shell 是一个叫 bash 的程序。
您在运行 bash 吗?
您可以通过输入下面的命令来检查您是否正在运行 bash:
$ echo $SHELL
/bin/bash
如果上面的命令行报错或者不会类似地响应我们的示例,那么您可能正在运行一个不同于 bash 的 shell。
关于 bash
Bash 是“Bourne-again shell”的首字母缩写,它是大多数 Linux 系统缺省的 shell。shell 的任务是执行您的命令,使您能够与 Linux 系统进行交互。当您输完命令,您可以通知 shell 执行 exit 或 logout 命令,在此您将返回到登录提示符。顺便提一下,您还可以通过在 bash 提示符下按 control-D 来注销。
使用“cd”
您可能已经发现,目不转睛地盯着bash提示符可不是世界上最让人感到有劲的事。那么,让我们来开始用 bash 来浏览我们的文件系统。在提示符下,输入下面的命令(不包括 $):
$ cd /
我们只告诉 bash 您想在 /(也称为根目录)中工作;系统上的所有目录形成一棵树,/ 被认为是这棵树的顶部,或者是根。cd设置当前您正在工作的目录,也称为“当前工作目录”。
路径
要看 bash 的当前工作目录,您可以输入:
$ pwd
/
在上面的示例中,cd 的 / 参数叫做路径。它告诉 cd 我们要转到什么地方。特别是,/ 参数是一个绝对路径,意味着它指定了相对于文件系统树的根的位置。绝对路径这里有几个其它的绝对路径:
/dev
/usr
/usr/bin
/usr/local/bin
您可以看到,所有绝对路径有一个共同点就是,它们都以/开头。通过路径/usr/local/bin,我们告诉 cd 进入 / 目录,接着进入这个目录之下的usr目录,然后再进入 local 和 bin。绝对路径总是通过是否以 / 开头来判断。
相对路径
另一种路径叫相对路径。在 Bash 中,cd 以及其它命令总是解释那些相对于当前目录的路径。相对路径绝不会以 / 开头。这样,如果我们在 /usr 中:
$ cd /usr
那么,我们可以使用相对路径来转到 /usr/local/bin 目录:
$ cd local/bin
$ pwd
/usr/local/bin
使用“..”
相对路径还可以包含一个或多个 .. 目录。.. 目录是指向父目录的专门目录。那么,继续前面的示例:
$ pwd
/usr/local/bin
$ cd ..
$ pwd
/usr/local
您可以看到,现在我们的当前目录是 /usr/local。我们能够“后退”到相对于我们所在的当前目录的一个目录。此外,我们还可以将 \\\\\"..\\\\\\" 添加到一个现有的相对路径中,使我们可以进入与我们已在目录并排的目录,例如:
$ pwd
/usr/local
$ cd ../share
$ pwd
/usr/share
相对路径示例
相对路径可以变得相当复杂。这里有几个示例,所有的都没有显示出结果的目标路径。请试着推断一下,输入这些命令后,您最终将会转到什么地方:
$ cd /bin
$ cd ../usr/share/zoneinfo
$ cd /usr/X11R6/bin
$ cd ../lib/X11
$ cd /usr/bin
$ cd ../bin/../bin
现在,试验一次,看看您的推断是否正确。
理解“.”
在我们结束 cd 的介绍之前,我们还需要讨论一些更多的内容。首先,还有另一个叫 . 的专门的目录。它表示“当前目录”。然而该目录不为 cd 命令使用,它通常用来执行一些当前目录中的程序,如下所示:
$ ./myprog
在上面的示例中,驻留在当前工作目录中的 myprog 可执行文件将被执行。
cd 和主目录
如果我们想要转到主目录,我们可以输入:
$ cd
没有参数,cd 将转到主目录,对于超级用户来说是 /root,对于一般用户来说通常是/home/username。但是,如果我们想要指定一个主目录中的文件,将会怎样呢?可能我们想要将一个文件参数传给 myprog 命令。如果该文件在主目录中,我们可以输入:
$ ./myprog /home/drobbins/myfile.txt
但是,使用像这样的绝对路径并不总是很方便。幸好,我们可以使用 ~(代字符)字符来完成同样的事:
$ ./myprog ~/myfile.txt
其他用户的主目录Bash 将把单独的 ~ 扩展为指向主目录,然而您还可以用它来指向其他用户的主目录。例如,如果我们想要引用 fred 的主目录中的名为 fredsfile.txt 的文件,可以输入:
$ ./myprog ~fred/fredsfile.txt
介绍 ls
现在,我们将快速地看一看 ls 命令。很可能,您已经很熟悉 ls,并且知道只输入 ls 本身将列出当前工作目录的内容: $">[b]通过指定 -a 选项,您可以看到目录中的所有文件,包括隐藏文件 — 那些以 . 开头的文件。您可以在下面的示例中看到,ls -a 将显示 . 和 .. 专门的目录链接:$">[b]递归和索引节点清单。
您可以使用 -d 来查看目录本身,而您还可以用 -R 来完成相反的工作 — 不仅只查看一个目录内部,而且要递归地查看该目录内所有的目录内部!我们将不会有对应该选项的任何示例输出(因为它一般占很大的篇幅),但是为了感觉一下它是怎样工作的,您可以试几个 ls -R 和 ls -Rl 命令。最后,ls 的 -i 选项可以用来在清单中显示文件系统对象的索引节点号:
$ ls -i /usr
1409 X11R6 314258 i686-linux
43090 libexec 13394 sbin
1417 bin 1513 i686-pc-linux-gnu
5120 local 13408 share
8316 distfiles 1517 include
776 man 23779 src
43 doc 1386 info 93892 portage
36737 ssl
70744 gentoo-x86 1585 lib 5132
portage.old 784 tmp
理解索引节点,第 1 部分
文件系统的每个对象都分配到一个独一无二的索引,叫做索引节点号。这可能看起来微不足道,但是理解索引节点对于理解许多文件系统操作来说很重要。例如,请考虑出现在每个目录中的 . 和 .. 链接。为了完全理解 .. 目录实际上是什么,我们将先来看一看 /usr/local 的索引节点号:
$ ls -id /usr/local
5120 /usr/local
/usr/local
目录有一个 5120 索引节点号。现在,我们来看一 看 /usr/local/bin/.. 的索引节点号:
$ ls -id /usr/local/bin/..
5120 /usr/local/bin/..
您可以看到,/usr/local/bin/..具有和/usr/local相同的索引节点号!这就是我们抓住的问题的实质。过去,我们认为 /usr/local 是这个目录本身。
现在,我们发现索引节点 5120实际上是这个目录,并且我们发现了指向该索引节点的两个目录条目(叫做“链接”)。/usr/local 和 /usr/local/bin/..都链接到索引节点 5120。虽然索引节点 5120 只在磁盘中的一地方存在,但是多个目录条目都链接到它上面。事实上,通过使用 ls -dl 命令,我们可以看到索引节点 5120 被引用的总次数
$ ls -dl /usr/local
drwxr-xr-x 8 root root 240 Dec 22 20:
57 /usr/local
如果我们看一看从左起的第二栏,我们可以看到目录 /usr/local(索引节点 5120)被引用了 8 次。在我的系统中,引用该索引节点的不同路径有这些:
/usr/local
/usr/local/.
/usr/local/bin/..
/usr/local/games/..
/usr/local/lib/..
/usr/local/sbin/..
/usr/local/share/..
/usr/local/src/..
mkdir
我们来快速地看一看 mkdir 命令,它可以用来创建新目录。下面的示例创建了三个新目录:tic、tac 和 toe,都在 /tmp 下:
$ cd /tmp
$ mkdir tic tac toe
缺省情况下,mkdir 不会为您创建父目录;邻接的上一元素的完整路径必须存在。因此,如果您想要创建目录 won/der/ful,您将需要发出三个单独的 mkdir 命令:
$ mkdir won/der/ful
mkdir: cannot create directory
`won/der/ful': No such file or directory
$ mkdir won
$ mkdir won/der
$ mkdir won/der/ful
mkdir -p
然而,mkdir有一个很方便的-p选项,该选项告诉mkdir创建所有缺少的父目录,如下所示:
$ mkdir -p easy/as/pie
总之,非常简单。要学习更多关于 mkdir 命令的知识,请输入 man mkdir 来阅读手册页。除 cd(它内置在 bash 中)之外,这几乎适用于这里所涉及的所有命令(比如 man ls)。
touch
现在,我们将要快速地看一看 cp 和 mv 命令,这些命令用来复制、重命名以及移动文件和目录。为了开始该概述,我们将首先用 touch 命令在 /tmp 中创建一个文件:
$ cd /tmp
$ touch copyme
如果文件存在,touch 命令将更新文件的“mtime”(请回想 ls -l 输出中的第六栏)。如果文件不存在,那么将创建一个新的空文件。现在您应该有一个大小为零的 /tmp/copyme 文件。
echo 和重定向
既然文件存在,我们来把一些数据添加到文件中。我们可以使用echo命令来完成,它带有自己参数,并且把这些参数打印到标准输出。首先,单独的 echo 命令是这样的:
$ echo \"firstfile\"
firstfile
带有输出重定向的同样的 echo 命令为:
$ echo \"firstfile\" > copyme
大于符号告诉 shell 将 echo 的输出写到名为 copyme 的文件中。如果该文件不存在,将创建这个文件;如果该文件存在,将覆盖这个文件。通过输入 ls -l,我们可以看到 copyme 文件为 10 个字节长,因为它包括 firstfile 这个词和换行符:
$ ls -l copyme
-rw-r--r-- 1 root root 10 Dec 28 14:13 copyme
cat 和 cp
为了在终端显示文件的内容,要使用 cat 命令:
$ cat copyme
firstfile
现在,我们可以使用 cp 命令的基本调用来由原始的 copyme 文件创建 copiedme 文件:
$ cp copyme copiedme
通过观察,我们发现它们确实是相互独立的文件;它们的索引节点号不同:
$ ls -i copyme copiedme
648284 copiedme 650704 copyme
mv
现在,我们来用“mv”命令将“copiedme”重命名为“movedme”。其索引节点号将仍然是同一个;但是,指向该索引节点的文件名将改变。
$ mv copiedme movedme
$ ls -i movedme
648284 movedme
只要目标文件和源文件驻留在同一文件系统上,被移动的文件的索引节点号就将仍然不变。在本教程系列的第 3 部分,我们将进一步看一下文件系统。
创建链接和删除文件
硬链接
当谈及目录条目和索引节点之间关系时,我们提到了链接这个术语。Linux 实际有两种链接。到此为止我们所讨论的这种链接叫硬链接。一个给定的索引节点可以有任意数目的硬链接,该索引节点一直存在于文件系统,直到所有的硬链接消失。可以使用 ln 命令来创建新的硬链接
$ cd /tmp
$ touch firstlink
$ ln firstlink secondlink
$ ls -i firstlink secondlink
15782 firstlink 15782 secondlink
您可以看到,硬链接工作于索引节点级别,指向特殊的文件。在 Linux 系统上,硬链接有几个局限性。第一,您只能给文件建立硬链接,而不能给目录建立硬链接。的确如此;即便 . 和 .. 是系统给目录创建的硬链接,也不允许您(“root”用户也不行)创建任何您自己的硬链接。
硬链接的第二个局限性是它们不能跨文件系统。这意味着,如果您的 / 和 /usr 存在于不同的文件系统,您不能创建从 /usr/bin/bash 到 /bin/bash 的链接。
符号链接
实际上,符号链接(symbolic link,或“symlinks”)比硬链接更常用到。符号链接是一种专门的文件类型,在这种文件类型中,链接通过名称引用另一个文件,而不是直接引用索引节点。符号链接不阻止文件被删除;如果目标文件消失,那么符号链接仅仅是不可用,或“被破坏”。
通过将 -s 选项传给 ln,可以创建符号链接。
$ ln -s secondlink thirdlink
$ ls -l firstlink secondlink thirdlink
-rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:
08 firstlink
-rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:
08 secondlink
lrwxrwxrwx 1 agriffis agriffis 10 Dec 31 19:
39 thirdlink -> secondlink
在 ls -l 输出中,可以用三种方式区分符号链接和一般文件。第一,请注意第一栏包含一个 l 字符的输出表明是符号链接。第二,符号链接的大小是目标文件(本例是 secondlink)的字符数。第三,输出的最后一栏显示目标文件名。
符号链接通常比硬链接更灵活。您可以给任何类型的文件系统对象(包括目录)创建符号链接。又因为符号链接的实现是基于路径的(而不是索引节点),所以创建指向另一个文件系统上的对象的符号链接是完全可行的。但是,这一事实也使符号链接理解起来很复杂。请考虑我们想要在/tmp中创建一个指向 /usr/local/bin的链接的情况。我们应该输入:
$ ln -s /usr/local/bin bin1
$ ls -l bin1
lrwxrwxrwx 1 root root 14 Jan 1 15:
42 bin1 -> /usr/local/bin
或者还可以输入:
$ ln -s ../usr/local/bin bin2
$ ls -l bin2
lrwxrwxrwx 1 root root 16 Jan 1 15:
43 bin2 -> ../usr/local/bin
您可以看到,两个符号链接都指向同一目录。但是,如果我们的第二个符号链接在任何时刻被移动到另一个目录,由于相对路径的缘故,它将遭到“破坏”。
$ ls -l bin2
lrwxrwxrwx 1 root root 16 Jan 1 15:
43 bin2 -> ../usr/local/bin
$ mkdir mynewdir
$ mv bin2 mynewdir
$ cd mynewdir
$ cd bin2
bash: cd: bin2: No such file or directory
因为/tmp/usr/local/bin这个目录不存在,我们不能再把目录转到bin2;换句话说,bin2 现在被破坏了。
由于这个原因,有时避免用相对路径信息来创建符号链接是个好主意。但是,在许多情况下,相对的符号链接很管用。请考虑一个示例,在这个示例中您想要给 /usr/bin 中的一个程序创建一个别名:
# ls -l /usr/bin/keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain
作为 root 用户,您可能想要给“keychain”创建一个别名,比如“kc”。在这个示例中,我们有 root 访问权,由 bash 提示符改变为“#”可以证明。我们之所以需要 root 访问权是因为一般用户不能在 /usr/bin 中创建文件。作为 root 用户,我们可以像下面这样给 keychain 创建一个别名:
# cd /usr/bin
# ln -s /usr/bin/keychain kc
当这个解决方法起作用时,如果我们想要把两个文件都移到 /usr/local/bin 时,它将会出现问题。
# mv /usr/bin/keychain
/usr/bin/kc /usr/local/bin
因为在符号链接中,我们使用了绝对路径,而我们的kc符号链接仍然指向/usr/bin/keychain,它已不存在了——另一个被破坏的符号链接。符号链接中的相对路径和绝对路径都各具优点,您应该使用适合于您的特殊应用的路径类型。一般情况下,相对路径或绝对路径都能工作得很好。在这种情况下,下面的示例将起作用:
# cd /usr/bin
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx 1 root root 8 Jan 5 12:
40 kc -> keychain
rm
既然我们知道怎样使用 cp、mv 和 ln,现在我们该学习怎样把对象从文件系统中删除了。通常,这用 rm 命令来完成。要删除文件,只需在命令行中指定它们:
$ cd /tmp
$ touch file1 file2
$ ls -l file1 file2
-rw-r--r-- 1 root root 0 Jan 1 16:41 file1
-rw-r--r-- 1 root root 0 Jan 1 16:41 file2
$ rm file1 file2
$ ls -l file1 file2
ls: file1: No such file or directory
ls: file2: No such file or directory
rmdir
要删除目录,您有两种选择。您可以删除目录中所有的对象,然后使用 rmdir 来删除目录本身:
$ mkdir mydir
$ touch mydir/file1
$ rm mydir/file1
$ rmdir mydir
rm 和目录
或者,您可以使用 rm 命令的 recursive force选项来告诉rm删除您指定的目录以及目录中包含的所有对象:
$ rm -rf mydir
一般情况下,rm -rf 是删除目录树的首选方法。在使用 rm -rf 时要十分小心,因为它的功能可以被很好地利用,也可能会因使用不当造成恶果。
介绍通配符
在您日常的 Linux 使用中,有很多时候您可能需要一次对多个文件系统对象执行单一操作(比如 rm)。在这些情况下,在命令行中输入许多文件通常让人感到厌烦,为了解决这个问题,您可以利用 Linux 内置的通配符支持。这种支持也叫做“globbing”(由于历史原因),允许您通过使用通配符模式一次指定多个文件。
Bash 和其它 Linux 命令将通过在磁盘上查找并找到任何与之匹配的文件来解释这种模式。因此,如果在当前工作目录中,您有从 file1 到 file8 的文件,那么您可以输入下面的命令来删除这些文件:
$ rm file[1-8]
或者,如果您只想要删除文件名以 file 开头的所有文件,您可以输入:
$ rm file*
理解不匹配
或者,如果您想要列出 /etc 中以 g 开头的所有文件系统对象,您可以输入:
$ ls -d /etc/g*
/etc/gconf /etc/ggi /etc/gimp /etc/gnome
/etc/gnome-vfs-mime-magic /etc/gpm
/etc/group /etc/group-
现在,如果您指定了没有任何文件系统对象与之匹配的模式,会怎么样呢?在下面的示例中,我们试图列出 /usr/bin 中以 asdf 开头并且以 jkl 结尾的所有文件:
$ ls -d /usr/bin/asdf*jkl
ls: /usr/bin/asdf*jkl:
No such file or directory
这里是对所发生情况的说明。通常,当我们指定一种模式时,该模式与底层系统上的一个或多个文件匹配,bash 以空格隔开的所有匹配对象的列表来替换该模式。
但是,当模式不能找到匹配对象时,bash 将不理会参数、通配符等等,保留原样。因此,当“ls”不能找到文件 /usr/bin/asdf*jkl 时,它会报错。此处的有效的规则是:glob 模式只在与文件系统中的对象匹配时才可以进行扩展。
楚雄的鱼_列表_Linux博客/红联Linux博客 - powered by X-Spac... 从“却月阵”看刘裕的军事才能_冰翼新视野_凤凰博客 - powered by X-Spac... 电信改变生活 - 彭雪飞的博客 - 中国通信人博客 - Powered by X-Spac... 穷人和富人的区别 - 天一直销博客网 - 泛直銷網 - powered by X-Spac... 形意三十六诀 - 李茹的个人空间 - MACD博客 - Powered by X-Spac... 朝鲜战争得失谈 - 宋鲁郑的个人空间 - 环球博客 - Powered by X-Spac... 一生有你_列表_银沙博客 - powered by X-Space 家庭朗姆酒(糖酒)酿造法 - 独行者 - 天天博客 - Powered by X-Spac... 战争逼近,美韩频发危险信号 - 丁咚 - 环球博客 - Powered by X-Spac... 学习共同体的昨天_关注数字时代的学习_在线教育资讯 - powered by X-Spac... 关于诽谤官员的全民大讨论_木鱼桥-流浪_随笔南洋网 - powered by X-Spac... 转)美国感叹:预测不断落空 真的不瞭解中国!_lgcshenx的蓝色夜空_Linux博客/红联Linux博客 政治现代化 - 悠闲人的个人空间 - 中青社区门户 - powered by X-Spac... 沙枣花 - 汪洋船_193的个人空间 - 社区门户 - powered by X-Spac... 大六壬心镜 - ldy12345的个人空间 - MACD博客 - Powered by X... 大六壬秘本 - ldy12345的个人空间 - MACD博客 - Powered by X... 大六壬秘本 - ldy12345的个人空间 - MACD博客 - Powered by X... 关于PTT--转载_你要笑哦!_人力资源博客-谷逸HR博客 - powered by X-... 【原创】大牌明星们的显赫家世_化雪无尘的个人空间_凤凰博客 - powered by X-... 【转载】中国人民爱吃的十道菜(图)_高山流水_凤凰博客 - powered by X-Sp... 【转载】中国人民爱吃的十道菜(图)_高山流水_凤凰博客 - powered by X-Sp... 【原创】刘晓庆:换了八个男人而且越换越小_凤天祥的个人空间_凤凰博客 - powered by X-Space 【原创】最聪明的女人——张欣_俞艾彤_凤凰博客 - powered by X-Space 【原创】《奋斗》:中国版的穷爸爸富爸爸_文化先锋_凤凰博客 - powered by X-...