跳至主要内容

【转】走进Linux世界:文件管理

发布时间:2004.12.02 10:41     来源:赛迪网-开放系统世界    作者:北京信息工程学院 孟庆昌

    摘要:本讲介绍Linux系统中文件管理的概念,包括常用命令格式、文件类型、目录结构、文件系统及其安装。

    众所周知,我们上机时是通过用户界面与计算机打交道。用户界面定义了用户与计算机交流的不同方式,常见的有图形界面、命令界面及程序界面。每个人喜欢什么样的用户界面取决于教育背景及经验。Linux提供了几种不同的用户界面,其中,命令界面是Linux系统下最简单、但也是功能最强的用户界面。

    我们经常要利用文件来存放信息和数据、创建/删除文件、打开/关闭文件、读/写文件等,用户最常用的操作几乎都与文件相关。

    常用命令格式

    Linux提供了几百条命令,虽然这些命令的功能不同,但它们的使用方式和规则都是统一的。

    Linux命令的一般格式是:
    命令名 [选项] [参数1] [参数2]……

    ◆命令名由小写的英文字母构成,往往是表示相应功能的英文单词或单词的缩写。例如,date表示日期;who表示谁在系统中;cp是copy的缩写,表示拷贝文件等。
    ◆方括号中的部分表明对命令行来讲不是必须的,即可有可无。例如,可以直接在提示符后面输入命令date,显示当前的日期和时间;也可以在date命令名后面带有选项和参数,如“date -s 15:30:00”,设置系统时间为下午3点30分。
    ◆选项是对命令的特别定义,以“-”开始,多个选项可用一个“-”连起来,如“ls -l -a”与“ls -la”相同。
    ◆命令行的参数提供命令运行的信息,或者是命令执行过程中所使用的文件名。通常参数是一些文件名,告诉命令从哪里可以得到输入,以及把输出送到什么地方。
    ◆如果命令行中没有提供参数,命令将从标准输入文件(即键盘)接受数据,输出结果显示在标准输出文件(即显示器)上,而错误信息则显示在标准错误输出文件(即显示器)上。可使用重定向功能对这些文件进行重定向。
    ◆命令在正常执行后返回一个0值,表示执行成功;如果命令执行过程中出错,没有完成全部工作,则返回一个非零值(在Shell中可用变量$?查看)。在Shell脚本中,可用命令返回值作为控制逻辑的一部分。
    ◆Linux操作系统的联机帮助对每个命令的准确语法都做了说明,可以使用命令man来获取相应命令的联机说明,如“man ls”。

    文件系统概念

    磁盘上的文件系统是层次结构的,由若干目录和其子目录组成,最上层的目录称作根(root)目录,用“/”表示。

    1.文件与目录的定义
    ◆文件系统 是磁盘上有特定格式的一片区域,操作系统通过文件系统可以方便地查寻和访问其中所包含的磁盘块。
    ◆文件 文件系统中存储数据的一个命名的对象。一个文件可以是空文件(即没有包含用户数据),但是它仍然为操作系统提供了其它信息。
    ◆目录 目录文件中包含许多文件的目录项,每个目录项包含相应文件的名字和I节点号。在I节点中存放该文件的控制管理信息。目录支持文件系统的层次结构。文件系统中的每个文件都登记在一个(或多个)目录中。
    ◆子目录 被包含在另一个目录中的目录。包含子目录的目录称作父目录。除了root目录以外,所有的目录都是子目录,并且有它们的父目录。root目录就作为自己的父目录。
    ◆文件名 用来标识文件的字符串,它保存在一个文件目录项中。
    ◆路径名 通过斜线字符(/)结合在一起的一个或多个文件名的集合。路径名指定一个文件在分层树型结构(即文件系统)中的位置。
    ◆当前工作目录 查看文件系统要使用一个参考点目录,它就称作当前工作目录。

    用ls命令可以列出当前工作目录中所包含的文件和子目录的名字,这是默认方式。

    文件名按照ASCII码顺序列出,以数字开头的文件名列在前面,然后是以大写字母开头的文件名,最后是以小写字母开头的文件名。

    2.文件结构
    文件是Linux操作系统处理信息的基本单位。所有软件都组织成文件。

    (1)文件的成分 无论文件是一个程序、一个文档、一个数据库,或者是一个目录,操作系统都会赋予它如下所示的同样的结构:
    ◆索引节点 又称I节点,在文件系统结构中,包含有关相应文件的信息的一个记录,这些信息包括文件权限、文件主、文件大小、存放位置、建立日期等。
    ◆数据 文件的实际内容,它可以是空的,也可以非常大,并且有自己的结构。

    (2)命名文件 文件名保存在目录文件中。Linux的文件名几乎可以由ASCⅡ字符的任意组合构成,文件名最长可多达255个字符(某些较老的文件系统类型把文件名长度限制为14个字符)。下面的惯例会使管理文件更加方便。
    ◆文件名应尽量简单,并且应反映出文件的内容。文件名几乎没有必要超过14个字符。
    ◆除斜线(/)和空字符(ASCII字符\0)以外,文件名可以包含任意的ASCⅡ字符,因为那两个字符被操作系统当作表示路径名的特殊字符来解释。
    ◆习惯上允许使用下线符“_”和句点“.”来区别文件的类型,使文件名更易读。但是应避免使用以下字符,因为对系统的Shell来说,它们有特殊的含义。这些字符是:“;”、“|”、“<”、“>”、“`”、“″”、“′”、“$”、“!”、“%”、“&”、“*”、“?”、“\”、“(”、“)”、“[”、“]”。文件名应避免使用空格、制表符或其它控制字符。
    ◆同类文件应使用同样的后缀或扩展名。
    ◆Linux系统区分文件名的大小写,例如,名为letter的文件与名为Letter的文件不是同一个文件。
    ◆以圆点“.”开头的文件名是隐含文件,默认方式下使用ls命令并不能把它们在屏幕上显示出来。同样,在默认情况下,Shell通配符并不匹配这类文件名。

    (3)文件名通配符 为了能一次处理多个文件,Shell提供了几个特别字符,称为文件名通配符(也称作扩展字符)。通过使用通配符可以让Shell查询与特别格式相符的文件名;用作命令参数的文件或目录的缩写;以简短的标记访问长文件名;可以用于任意的命令行。

    主要的文件名通配符有:
    ◆星号(*) 与0个或多个任意的字符相匹配,例如,le*可以代表letter、 lease或le。星号匹配的是当前目录下的所有文件,但以点“.”开头的隐含文件除外。.*只与隐含文件匹配。
    ◆问号(?) 问号只与一个任意的字符匹配,可以使用多个问号。例如,file?与文件file1、file2匹配,但不与file、file10匹配;而name.??? 与文件name.abc、name.xyz匹配,但不与文件name.ab匹配。
    ◆方括号([ ]) 与问号相似,只与一个字符匹配。它们的区别在于,问号与任意一个字符匹配,而方括号只与括号中列出的字符之一匹配。例如letter [123]只与文件letter1、letter2或letter3匹配,但不与文件 letter12匹配。可以用短横线代表一个范围内的字符,而不用将它们一一列出。例如,letter[1-3]是letter[123]的简写形式。但是,要注意范围内的字符都按升序排列,即[A-Z]是有效的,而[Z-A]是无效的。方括号中可以列出多个范围,如[A-Za-z]可以和任意大写或小写的字符相匹配。方括号中如果以惊叹号“!”开始,表示不与惊叹号后的字符匹配。

    上面介绍的所有符号都可以混和使用,例如,[!A-Z]*.?代表所有不以大写字母开头,但倒数第二个位置是.的文件名。

    文件类型

    Linux操作系统支持普通文件、目录文件、特别文件及符号链接文件等文件类型。

    1.普通文件
    普通文件也称作常规文件,包含各种长度的字节串。核心对这些数据没有进行结构化,只是作为有序的字节序列把它提交给应用程序。应用程序自己组织和解释这些数据,通常把它们归并为下述类型之一:
    ◆文本文件,由ASCII字符构成。例如,信件、报告和称作脚本(Script)的命令文本文件,后者由shell解释执行。
    ◆数据文件,由来自应用程序的数字型和文本型数据构成。例如,电子表格、数据库,以及字处理文档。
    ◆可执行的二进制程序,由机器指令和数据构成。例如,上面所说的系统提供的命令。

    使用file命令可以确定指定文件的类型。该命令可以将任意多个文件名当做参数,其一般使用格式是:file 文件名 [文件名...]

    2.目录
    目录是一类特殊的文件,利用它可以构成文件系统的分层树型结构。如同普通文件那样,目录文件也包含数据;但目录文件与普通文件的差别是,核心对这些数据加以结构化,它是由成对的“I节点号/文件名”构成的列表。
    ◆I节点号是检索I节点表的下标,I节点中存放有文件的状态信息。
    ◆文件名是给一个文件分配的文本形式的字符串,用来标识该文件。在一个指定的目录中,任何两项都不能有同样的名字。

    每个目录的第一项都表示目录本身,并以“.”作为它的文件名。每个目录的第二项的名字是“..”,表示该目录的父目录。

    应注意:以“.”开头的文件名表示隐含文件,使用带-a选项的ls命令可以列出它们。

    当把文件添加到一个目录中的时候,该目录的大小会增长,以便容纳新文件名。当删除文件时,目录的尺寸并不减少,而是核心对该目录项做上特殊标记,以便下次添加一个文件时重新使用它。ls命令不会列出这些未被使用的项。

    3.设备文件
    在Linux系统中,所有设备都作为一类特别文件对待,用户像使用普通文件那样对设备进行操作,从而实现设备无关性。但是,设备文件除了存放在文件I节点中的信息外,它们不包含任何数据。系统利用它们来标识各个设备驱动器,核心使用它们与硬件设备通信。

    有两类特别设备文件,它们对应不同类型的设备驱动器:
    ◆字符设备 最常用的设备类型,允许I/O传送任意大小的数据,取决于设备本身的容量。使用这种接口的设备包括终端、打印机及鼠标。
    ◆块设备 这类设备利用核心缓冲区的自动缓存机制,缓冲区进行I/O传送总是以1KB为单位。使用这种接口的设备包括硬盘、软盘和RAM盘。

    设备文件的一个示例是当前正在使用的终端,tty命令可以显示出这个文件名。例如:

$ tty /dev/tty01

    通常,设备文件在/dev目录之下。

目录及其操作命令

    在Linux系统中,除根目录(root)以外,所有文件和目录都包含在相应的目录文件中。下面介绍Linux系统的目录结构及主要的操作命令。

    1.目录结构
    Linux文件系统采用带链接的树形目录结构,即只有一个根目录(通常用“/”表示),其中含有下级子目录或文件的信息;子目录中又可含有更下级的子目录或者文件的信息。这样一层一层地延伸下去,构成一棵倒置的树,如图1所示。


图1 Linux树型目录结构

    在目录树中,根节点和中间节点(用圆圈表示)都必须是目录,而普通文件和特别文件只能作为“叶子”出现。当然,目录也可以作为叶子。

    (1)用户主目录
    当注册进入系统时,主目录就是当前工作目录。主目录往往位于/home目录之下,并且与注册名相同,例如,/home/mengqc。通常主目录包含子目录、数据文件,以及用于注册环境的配置文件。

    (2)路径名
    迄今为止,所看到的文件仅是主目录下的文件。其实,还可以利用路径名访问在层次结构文件系统中任何地方的文件和目录。

    为了访问文件,必须告诉系统文件在什么地方,即保存在哪个目录下。路径名描述了文件系统中通向任意文件的路径。有绝对路径和相对路径两种路径名。当为命令指定文件路径名时,需要指定两种路径形式的一种,不管它有多长或有多复杂。

    ◆绝对路径名
    在Linux操作系统中,每一个文件有惟一的绝对路径名,它是沿着层次树、从根目录开始、到达相应文件的所有目录名连接而成,各目录名之间以斜线字符(/)隔开。例如,/home/mengqc/lib/func/file1。

    绝对路径名总是以斜线字符(/)开头,它表示根目录。如果要访问的文件在当前工作目录之上,那么,使用绝对路径名往往是最简便的方法。

    绝对路径名也称作全路径名,使用pwd命令可以在屏幕上显示出当前工作目录的绝对路径名。例如:

$ pwd /home/mengqc


图2 路径名类型

    图2示出路径名的类型。绝对路径名为/home/mengqc/lib/func/file1;相对路径名(当前目录是 /home/mengqc/lib)为func/file1。

    ◆相对路径名
    相对路径名利用相对当前工作目录的路径指定一个文件。

    为了访问当前工作目录或其任意子目录中的文件,可以使用相对路径名。例如,如果工作目录是/home/mengqc/lib,为了列出目录/home/mengqc/lib/func中的文件file1,可以使用下述命令:ls -l func/file1

    注意,相对路径名不能以斜线字符(/)开头。

    为了访问在当前工作目录中和当前工作目录之上的文件,可以在相对路径名中使用特殊目录名“.”和“..”。“.”目录表示本目录自身,而“..”目录代表该目录的父目录。例如,当前工作目录是/home/mengqc/lib,想列出/home/liu目录的内容,可使用命令:ls ../../liu

    提醒注意,在每个目录中都有“..”目录文件。在上面示例中,/home/mengqc/lib的父目录是/home/mengqc,后者的父目录是/home。也可以连续使用“../” 形式表示父目录,直至根目录。所以,系统中的每个文件都可以利用相对路径名来命名。

    (3) 正确使用路径名
    什么情况下使用绝对路径名,什么情况下使用相对路径名,取决于哪种方式涉及到的目录更少。路径短,不仅键盘输入少,而且节省系统搜索路径的时间,提高执行效率。例如,当前的工作目录是/etc/conf/cf.d,如果需要访问系统口令文件/etc/passwd,那么使用绝对路径名是/etc/passwd,使用相对路径名是../../passwd。绝对路径名/etc/passwd涉及的目录有2个,而相对路径名../../passwd涉及的目录却是3个。此时,使用绝对路径名更有效。

    但是,如果当前工作目录是/home/mengqc/lib,要访问在func目录之下的file1文件,那么使用绝对路径名是/home/mengqc/lib/func/file1,使用相对路径名是func/file1。绝对路径名/home/mengqc/lib/func/file1涉及的目录有5个,而相对路径名涉及的目录只有2个。此时,使用相对路径名更有效。

    如果不清楚当前工作目录与其它目录之间的关系,那么最好使用绝对路径名。

    2.链接文件
    Linux具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的或不同的目录下。如果在同一目录下,二者必须有不同的文件名,而不用在硬盘上为同样的数据重复备份;如果在不同的目录下,那么被链接的文件可以与原文件同名,只要对一个目录下的该文件进行修改,就可以完成对所有目录下同名链接文件的修改。对于某文件的各个链接文件,我们可以给它们指定不同的存取权限,以控制对信息的共享和增强安全性。

    文件链接分为硬链接和符号链接两种形式。
    (1) 硬链接
    建立硬链接时,是在另外的目录或本目录中增加目标文件的一个目录项,这样,一个文件就登记在多个目录中。图3中所示的m2.c文件就在目录mub1和liu中都建立了目录项。


图3 文件链接

    创建硬链接后,已经存在的文件的I节点号(inode)会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件的链接数为1。

    ln命令用来创建链接。默认情况下,ln命令创建硬链接。ln命令会增加链接数,rm命令会减少链接数。一个文件除非链接数为0,否则不会物理地从文件系统中被删除。

    对硬链接有如下限制:
    ◆不能对目录文件做硬链接。
    ◆不能在不同的文件系统之间做硬链接。也就是说,链接文件和被链接文件必须位于同一个文件系统中。

    (2)符号链接
    符号链接也称软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上,它只是一个小文本文件(如图3中的abc文件),其中包含它所链接的目标文件的绝对路径名,如图3中虚线箭头所示。被链接文件是实际上包含所有数据的文件。所有读写文件的命令,当它们涉及符号链接文件时,将沿着链接方向前进,找到实际的文件。

    和硬链接不同的是,符号链接确实是一个新文件,它具有与目标文件不同的I节点号;而硬链接并没有建立新文件。

    符号链接没有硬链接的限制,可以对目录文件做符号链接,也可以在不同文件系统之间做符号链接。

    用“ln -s”命令建立符号链接时,最好源文件用绝对路径名,这样可以在任何工作目录下进行符号链接。当源文件用相对路径时,如果当前的工作路径和你要创建的符号链接文件所在路径不同时,就不能进行链接。

    请注意,符号链接与源文件或目录之间的区别:
    ◆删除源文件或目录时,只删除了数据,不会删除链接。一旦以同样文件名创建了源文件,链接将继续指向该文件的新数据。
    ◆在目录长列表中,符号链接作为一种特殊的文件类型显示出来,其第一个字母是l。
    ◆符号链接的大小是其链接文件的路径名中的字节数。
    ◆当用“ls -l”命令列出文件时,可以看到符号链接名后有一个箭头指向源文件或目录,例如:lrwxrwxrwx ... 14 Jun 20 10:20 /etc/motd->/original_file

    上面代码中,表示“文件大小”的数字“14”恰好表示源文件名“/original_file”由14个字符构成。

    ln命令的一般格式:
    ln [选项] 源文件 [目标文件]

    链接的对象可以是文件,也可以是目录。如果链接指向目录,用户就可以利用该链接直接进入被链接的目录,而不用给出到达该目录的一长串路径。这样,即使删除这个链接,也不会破坏原来的目录。

    选项-s表示建立符号链接,而不是硬链接。

    注意,符号链接文件不是一个独立的文件,它的许多属性依赖于原文件,所以给一个符号链接文件设置存取权限是没有意义的。

    (3)示例
    ◆将目录/home/mengqc/mub1下的文件m2.c链接到目录/home/liu下的文件a2.c:

$ cd  /home/mengqc $ ln  mub1/m2.c  /home/liu/a2.c

    在执行ln命令之前,目录/home/liu中不存在a2.c文件。执行ln之后,在/home/liu目录中才有a2.c这一项,表明m2.c和a2.c已经链接起来。注意,二者在物理上是同一个文件。利用“ls -l”命令可以看到链接数的变化。

    ◆在目录/home/liu下建立一个符号链接文件abc,使它指向目录/home/mengqc/mub1:
    $ ln -s /home/mengqc/mub1 /home/liu/abc

    执行该命令后,/home/mengqc/mub1代表的路径将存放在名为/home/liu/abc的文件中。
3.文件或目录的存取权限
    使用文件命令对文件进行操作的前提是拥有相应的权限。下面我们介绍如何控制这些权限。

    (1)用户和权限
    Linux为每个文件都分配了一个文件所有者,称为文件主,并赋予文件主惟一的注册名。对文件的控制取决于文件主或超级用户(root)。文件或目录的创建者对创建的文件或目录拥有特别使用权。

    文件的所有关系是可以改变的,可以将文件或目录的所有权转让给其它用户,但只有文件主或root用户才有权改变文件的所有关系。文件的所有权的标志是用户ID(UID)。

    利用chown 命令可以更改某个文件或目录的所有权。例如,超级用户把自己的一个文件myfile拷贝给用户xu。为了让用户xu能够存取这个文件,超级用户(root)应该把这个文件的属主设为xu,否则,用户xu无法存取这个文件,命令如下:
    chown xu myfile

    如果改变了文件或目录的所有权,原文件主将不再拥有该文件或目录的权限。

系统管理员经常使用chown命令,以便将文件拷贝到另一个用户的目录下以后,让该用户拥有使用该文件的权限。

    (2)用户组
    在Linux下,每个文件又同时属于一个用户组。当创建一个文件或目录时,系统会赋予它一个用户组关系,用户组的所有成员都可以使用此文件或目录。
    文件用户组关系的标志是GID。文件的GID只能由文件主或超级用户(root)来修改。chgrp命令可以改变文件的GID。

    (3)用户和权限
    Linux系统中的每个文件和目录都有存取许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。

    Linux系统中规定了四种不同类型的用户,即文件主(owner)、同组用户(group)、可以访问系统的其它用户(others)、超级用户(root),具有管理系统的特权。

    存取权限规定三种访问文件或目录的方式:读(r)、写(w)、可执行或查找(x)。

    当用“ls -l”命令显示文件或目录的详细信息时,最左边的一列为文件的存取权限,其中各位的含义如图4所示。


图4 文件权限表示

    ◆文件的存取权限
    读权限(r)表示只允许指定用户读取相应文件的内容,而禁止对它做任何的更改操作。将所访问的文件的内容作为输入的命令都需要有读的权限。例如cat、more等。
    写权限(w)表示允许指定用户打开并修改文件。例如命令vi、cp等。
    执行权限(x)表示允许指定用户将该文件作为一个程序执行。

    ◆目录的存取权限
    在ls命令后加上-d选项,可以了解目录文件的使用权限。
    读权限(r)表示可以列出存储在该目录下的文件,即读目录内容列表。这一权限允许Shell使用文件扩展名列出相匹配的文件名。
    写权限(w)表示允许用户从目录中删除或添加新的文件,通常只有文件主才有写权限。
    执行权限(x)表示允许用户在目录中查找,并能用cd命令将工作目录改到该目录。

    (4)chmod命令
    chmod命令用于改变或设置文件或目录的存取权限。只有文件主或超级用户root才有权用chmod改变文件或目录的存取权限。

    根据表示权限的方式不同,该命令有以符号模式改变权限和以绝对方式改变权限两种用法。

    ◆以符号模式改变权限
    chmod命令的一般格式是:chmod key 文件名

    其中,key由以下各项组成:

[who]   [操作符号]  [mode]  操作对象  who可以是下述字母中的任一个或它们的组合: u  表 示用户(user),即文件或目录的所有者。  g  表示同组(group)用户,即与文件属主有相同组ID的所有用户。  o  表示其它(others)用户。  a  表示所有(all)用户,它是系统默认值。  操作符号可以是下述符号:  +  添加某个权限。  -  取消某个权限。  =  赋予给定权限并取消其他所有权限(如果有的话)。  mode所表示的权限可用下述字母的任意组合: r  表示可读。 w  表示可写。  x  表示可执行。   X  表示只有目标文件对某些用户是可执行的,或者该 目标文件是目录时才追加x (可执行)属性。 s 在文件执行时把进程的属主或组ID置为该文件的文件 属主。方式“u+s”设置文件的用户ID位, “g+s”设置组ID位。 t  保存程序的文本到交换设备上。  u  与文件属主拥有一样的权限。  g  拥有与文件属主同组用户一样的权限。  o  与其它用户拥有一样的权限。

    上面这三部分必须按顺序输入,可以用多个key,但必须以逗号隔开。例如:
    $ chmod a+x ex1

    上面代码表示将文件ex1的权限改为所有用户都有执行权限。
    $ chmod u=r,ug=x ex1

    上面这行代码表示将文件ex1的权限重新设置为文件主可以读和执行,组用户可以执行,其它用户无权访问。

    ◆以绝对方式改变权限
    以绝对方式改变权限一般格式是:chmod mode 文件名

    用绝对方式设置或改变文件的存取权限就是用数字“1”和“0”表示图4中所示的9个权限位, 置为“1”表示有相应权限, 置为“0”表示没有相应权限。例如,某个文件的存取权限是文件主有读、写和执行的权限,组用户有读和执行的权限,其它用户仅有读的权限。用符号模式表示就是rwxr-xr--,用二进制数字表示就是111101100。

    为了方便记忆和表示,通常将这9位二进制数用等价的3个从0到7的八进制数表示,即从右到左3个二进制数换成一个八进制数。这样,上述二进制数就等价于八进制数“754”。

    也就是说,mode是以3位八进制数字出现的,最左位表示文件主权限,中间位表示组用户权限,最右位表示其它用户权限。

    例如,chmod 664 ex1使文件ex1的文件主和同组用户具有读写权限,但其它用户只可读。

    ◆umask命令
    umask命令用来设置限制新建文件权限的掩码。其一般格式是:umask mode

    当新文件被创建时,其最初的权限由文件创建掩码决定。用户每次注册进入系统时,umask命令都被执行,并自动设置掩码mode来限制新文件的权限。用户可以通过再次执行umask来改变默认值,新的权限将会把旧的覆盖掉。

    利用umask命令可以指定哪些权限将在新文件的默认权限中被删除。例如,可以使用下面的命令创建掩码,取消组用户的写权限以及其他用户的读、写和执行权限: umask u=,g=w,o=rwx

    执行该命令以后,下面所建新文件的文件主权限未作任何改变,而组用户没有写权限,其它用户的所有权限都被取消。

    应注意,在umask命令和chmod命令中,操作符“=”的作用恰恰相反。在chmod中,利用它来设置指定的权限,而其余权限都被取消;但是在umask命令中,它将在原有权限的基础上把指定的权限删除。

    不能直接利用umask创建一个可执行的文件,用户只能在其后利用chmod命令使它具有执行权限。假设执行了下面命令:
    umask u=,g=w,o=rwx

    虽然在命令行中,文件主和组用户的执行权限没有被删去,但默认的文件权限还是640(即rw-r-----),而不是750(rwxr-x---)。但是,如果创建的是目录,或者通过编译程序创建一个可执行文件,将不受此限制。在这种情况下,文件的执行权限会被设置。

    此外,也可以使用八进制数值来设置mode。在umask中所指定的权限表示要删除的权限,所以,如果一个文件原来的初始权限是777,那么执行命令umask 022以后, 那么该文件的权限将变为 755;如果该文件原来的初始权限是666, 那么该文件的权限将变为644。

    使用下面的命令可以检查新创建文件的默认权限:
    umask -s

    上面命令中,选项-s表示以字符形式显示当前的掩码。

    如果直接输入umask命令,不带任何参数,那么将以八进制形式显示当前的掩码。系统默认的掩码是0022。

    文件系统及其安装

    一个硬盘上可以同时存在多个文件系统,每个文件系统占据硬盘的一个独立分区。Linux文件系统可以根据需要随时装卸,从而实现文件存储空间的动态扩充和信息安全。在系统初启时,往往只有一个文件系统被安装上,即根文件系统,其上的文件主要是保证系统正常运行的操作系统的代码文件,以及若干语言编译程序、命令解释程序和相应的命令处理程序等构成的文件,此外,还有大量的用户文件空间。根文件系统一旦安装上,则在整个系统运行过程中是不能卸下的,它是系统的基本部分。

    其它的文件系统(例如,由软盘构成的文件系统)可以根据需要(如从硬盘向软盘复制文件),作为子系统动态地安装到主系统中,如图5所示。其中,mnt是为安装子文件系统而特设的安装节点。


图5 文件系统安装

    经过安装之后,主文件系统与子文件系统就构成一个有完整目录层次结构的、容量更大的文件系统。这种安装可以高达几级。就是说,若干子文件系统可以并列安装到主文件系统上,也可以一个接一个地串连安装到主文件系统上。

    已安装的子文件系统也可从整个文件系统上卸下来,恢复安装前的独立状态。

    1.建立文件系统
    当硬盘完成分区后,应该在该分区上建立文件系统。这一步工作是通过mkfs工具来完成的。例如,如果需要在分区/dev/hda1上建立ext2文件系统,并检查坏块,应该使用以下命令:
    # mkfs -c /dev/hda1

    注意,只有root用户才能建立或安装/卸下文件系统。

    2.安装文件系统
    创建文件系统后,需要使用命令mount将该文件系统安装到主文件系统中。命令mount有三个主要参数:
    ◆需要安装的文件系统类型,用“-t fstype”选项来指定,这与mkfs中的-t选项是一样的。
    ◆所需访问的文件系统所在分区名,通常是位于目录/dev中的特别设备文件;如果需要安装网络文件系统时,就使用该服务器上输出的目录名。
    ◆安装新文件系统的路径名,也就是放置新文件系统的安装点(Mount Point)。通常这是一个空目录名,并且是专门为安装新文件系统而准备的。在Linux系统下,目录/mnt是常用的文件系统安装目录,缺省情况下,CDROM和软盘驱动器都分别安装在其子目录下。当然,文件系统也可以被安装到其它空目录中。例如,需要将MSDOS文件系统分区/dev/hda1安装到系统的空目录/dos中,应该使用以下命令:
    # mount -t msdos /dev/hda1 /dos

    3.卸载文件系统
    在关闭系统之前,为了保证文件系统的完整性,所有安装的文件系统都必须被卸载。通常在/etc/fstab文件中定义的文件系统都能够自动卸载。但是,对于手工mount的文件系统,在关闭系统之前必须手工卸载。有时候也需要在系统工作过程中手工卸载某个文件系统。手工卸载文件系统必须使用umount命令,umount命令将分区名或分区的安装点作为参数,格式如下:

umount  <分区名或分区的安装点>

    例如,需要将已经安装到/mnt/floppy目录下的软盘卸载,可以使用以下命令:
    # umount /mnt/floppy

    要注意,对于正在使用的文件系统,不能使用umount命令卸载。

本讲我们介绍了有关Linux系统中常用命令格式、文件和目录的概念、文件类型、目录结构、文件的存取权限、文件系统的概念及其安装命令等。有关文件操作的命令很多,读者可以通过上机学习各种命令的使用方法,掌握其基本功能。(T111)

 

评论

此博客中的热门博文

【转】VxWorks中的地址映射

在运用嵌入式系统VxWorks和MPC860进行通信系统设计开发时,会遇到一个映射地址不能访问的问题。 缺省情况下,VxWorks系统已经进行了如下地址的映射:   memory地址、bcsr(Board Control and Status)地址、PC_BASE_ADRS(PCMCIA)地址、Internal Memory地址、rom(Flach memory)地址等,但是当你的硬件开发中要加上别的外设时,如(falsh、dsp、FPGA等),对这些外设的访问也是通过地址形式进行读写,如果你没有加相应的地址映射,那么是无法访问这些外设的。   和VxWorks缺省地址映射类似,你也可以进行相应的地址映射。   如下是地址映射原理及实现:   1、 地址映射结构 在Tornado\target\h\vmLib.h文件中 typedef struct phys_mem_desc { void *virtualAddr; void *physicalAddr; UINT len; UINT initialStateMask; /* mask parameter to vmStateSet */ UINT initialState; /* state parameter to vmStateSet */ } PHYS_MEM_DESC; virtualAddr:你要映射的虚拟地址 physicalAddr:硬件设计时定义的实际物理地址 len;要进行映射的地址长度 initialStateMask:可以初始化的地址状态: 有如下状态: #define VM_STATE_MASK_VALID 0x03 #define VM_STATE_MASK_WRITABLE 0x0c #define VM_STATE_MASK_CACHEABLE 0x30 #define VM_STATE_MASK_MEM_COHERENCY 0x40 #define VM_STATE_MASK_GUARDED 0x80 不同的CPU芯片类型还有其特殊状态 initialState:实际初始化的地址状态: 有如下状态: #define VM_STATE_VALID 0x01 #define VM_STATE_VALID_NOT 0x00 #define VM_STATE_WRITA

【转】cs8900网卡的移植至基于linux2.6内核的s3c2410平台

cs8900网卡的移植至基于linux2.6内核的s3c2410平台(转) 2008-03-11 20:58 硬件环境:SBC-2410X开发板(CPU:S3C2410X) 内核版本:2.6.11.1 运行环境:Debian2.6.8 交叉编译环境:gcc-3.3.4-glibc-2.3.3 第一部分 网卡CS8900A驱动程序的移植 一、从网上将Linux内核源代码下载到本机上,并将其解压: #tar jxf linux-2.6.11.1.tar.bz2 二、打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。 (1)指定目标平台。 移植前:         ARCH?= $(SUBARCH) 移植后: ARCH            :=arm (2)指定交叉编译器。 移植前: CROSS_COMPILE ?= 移植后: CROSS_COMPILE   :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu- 注:这里假设编译器就放在本机的那个目录下。 三、添加驱动程序源代码,这涉及到以下几个方面。(1)、从网上下载了cs8900.c和cs8900.h两个针对2.6.7的内核的驱动程序源代码,将其放在drivers/net/arm/目录下面。 #cp cs8900.c ./drivers/net/arm/ #cp cs8900.h ./drivers/net/arm/ 并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句: __raw_writel(0x2211d110,S3C2410_BWSCON); __raw_writel(0x1f7c,S3C2410_BANKCON3); 注:其原因在"第二部分"解释。 (2)、修改drivers/net/arm/目录下的Kconfig文件,在最后添加如下内容: Config ARM_CS8900    tristate "CS8900 support" depends on NET_ETHERNET && A

【转】多迷人Gtkmm啊

前边已经说过用glade设计界面然后动态装载,接下来再来看看怎么改变程序的皮肤(主题)     首先从 http://art.gnome.org/themes/gtk2 下载喜欢的主题,从压缩包里提取gtk-2.0文件夹让它和我们下边代码生成的可执行文件放在同一个目录下,这里我下载的的 http://art.gnome.org/download/themes/gtk2/1317/GTK2-CillopMidnite.tar.gz     然后用glade设计界面,命名为main.glade,一会让它和我们下边代码生成的可执行程序放在同一个目录下边     然后开始写代码如下: //main.cc #include <gtkmm.h> #include <libglademm/xml.h> int main(int argc, char *argv[]) {     Gtk::Main kit(argc,argv);         Gtk::Window *pWnd;        gtk_rc_parse("E:\\theme-viewer\\themes\\gtk-2.0\\gtkrc");       Glib::RefPtr<Gnome::Glade::Xml> refXml;     try     {         refXml = Gnome::Glade::Xml::create("main.glade");     }     catch(const Gnome::Glade::XmlError& ex)     {         Gtk::MessageDialog dialog("Load glade file failed!", false,       \                                   Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK);         dialog.run();               return 1;     }         refXml->get_widget("main", pWnd);     if(pW