第四章 文件和目录

    主要内容

          1.Linux中文件的概念

          2.使用和管理目录

          3.使用和管理文件

          4.链接文件与inode

          5.文件的权限

          6.Linux的目录结构

          7.文件系统 4.1 Linux中文件的概念 在Linux中,一个文件是一组数据的集合,可以被理解为一个字符流或字节流,Linux并不为文件设计内部结构,而把文件都理解为无结构的数据集合。在Linux中,“文件”这个概念包含了三类概念,即普通文件、目录和特殊文件。普通文件即我们平时说的狭义的“文件”,往往是一组特定数据的集合,像一张图片、一首MP3、一部电影或一个文档等。目录就是Windows中的“文件夹”,作用是存放其他目录或文件,Linux将所有的文件都存放在各个目录下,组成一棵目录树。在Linux中,所有的设备都有文件与之对应,这些文件就属于特殊文件。以上三类在Linux中均称为文件,即广义上的“文件”。

    Linux中的文件是通过文件名来访问的。文件名应该反映文件的内容,并且要满足下列的条件:

    由大写字母、小写字母、数字和一些特殊符号组成。

    不可以包含*?<>()[]{}/\|“`&;!等符号。

    +—可以出现在文件名中,但是不能作为文件名中的第一个字母。

    文件名中一般不应该包含空格。

    更重要的是,Linux的文件名是大小写敏感的,即ABC和abc是不同的两个文件,而在DOS/Windows中,两个文件名如果只有大小写上的差异,就被认为是同一个文件。另外,Linux中文件名没有扩展名的概念,例如Linux中的可执行文件不一定要叫做*.exe。还有Linux中文件没有“隐藏”属性,在Linux中,如果一个文件的文件名的第一个字母是“.”,那么这个文件就是隐藏文件,在一般命令中是不查看隐藏文件的。 4.2 使用和管理目录 Linux的目录结构是树状层次结构。其中有且仅有一个根目录,标为“/”。根目录下包含其他的目录或文件,而各目录中也可以包含子目录或文件。

    在Linux系统中,要指明一个目录或文件,有两种表示方法,如果一个目录以“/”起始,表示这个目录是从根目录开始一级一级的表示,这样的表示方式叫做绝对路径,如果一个目录不以“/”起始,表示这个目录是从当前目录开始表示。对用户的shell中,当前目录只有一个,就是用户当时所在的目录。显示当前目录可以使用pwd命令。

    img67 命令:pwd (Print Working Directory)

    功能:显示当前目录

    语法:pwd

    要更改当前目录,可以使用cd命令。如cd doc(相对路径)、cd/home/tux1/doc(绝对路径)。

    在Linux文件系统中,每个用户都有一个属于自己的目录,用来存放个人文件的,这个目录通常是在/home目录下以该用户名字命名的目录,如用户user1的主目录通常为/home/user1。在Linux中,“~”代表主目录(home directory),“.”代表当前目录,“..”代表当前目录的父目录,所以,使用cd..命令回到父目录,使用cd~或只用cd不含参数回到自己的主目录。使用cd~user1切换到user1的主目录。另外,使用cd-可以回到刚才的目录,比如你本来在目录A中,通过cd命令切换到目录B,这时候,输入cd-就从目录B回到了目录A,注意目录A与目录B并不一定有父子关系。

    img68 命令:cd (change directory)

    功能:切换目录

    语法:cd[target directory]

    在Linux中,创建一个目录的命令是mkdir,删除一个目录的命令是rmdir。

    img69 命令:mkdir(make directory)

    功能:新建目录

    语法:mkdir[directory]

    img70 命令:rmdir(remove directory)

    功能:删除目录

    语法:rmdir[directory]

    mkdir和rmdir的参数可以是相对路径,也可以是绝对路径。使用rmdir目录,要求目录是空目录,且不是当前目录或当前目录在这个目录下。如果目录非空,可以使用rm-rf dirname命令。另外,在mkdir和rmdir命令中可以使用“-p”参数,可以创建或删除多个目录。如mkdir-p dir1/dir2,可以在当前目录下创建dir1目录并在其中新建dir2目录。同理,rmdir-p dir1/dir2可以同时删除多级目录。

    显示目录中的内容,可以使用ls命令。

    img71 命令:ls(list)

    功能:显示目录包含的内容

    说明:ls包含许多选项。如果不指定参数的话,就显示当前目录中所有的文件和目录。常用选项

    ● 显示所有文件,包括隐藏文件:-a

    ● 显示所有文件,包括子目录下的文件:-R

    ● 显示文件的详细信息:-l

    ● 显示目录的信息而不是目录所含的内容:-d

    ● 使用—color,可以用不同颜色来标示不同的文件。普通文件:缺省色(灰色)。目录:蓝色。可执行文件:绿色。特殊文件:黄色。通过修改LS_COLORS或LS_COLOURS变量,可以设定缺省的颜色。

    例:

    [tux@localhost/]$ls

    bin dev home lib64 media mnt opt root seLinux sys tmp var

    boot etc lib lost+found misc net proc sbin srv tftpboot usr

    [tux@localhost/]$ls-l

    drwxr-xr-x  2 root root 4096 Jan 25 04:18 bin

    drwxr-xr-x  4 root root 4096 Jan 24 10:12 boot

    drwxr-xr-x 10 root root 5560 Jan 24 17:20 dev

    drwxr-xr-x 116 root root 12288 Jan 2504:18 etc

    drwxr-xr-x  4 root root 4096 Jan 24 10:47 home

    drwxr-xr-x 10 root root 4096 Jan 2504:14 lib

    drwxr-xr-x  7 root root 4096 Jan 2504:12 lib64

    drwx———   2 root root 16384 Jan 24 17:54 lost+found

    drwxr-xr-x  3 root root 4096 Jan 24 17:20 media

    drwxr-xr-x  2 root root  0 Jan 24 17:20 misc

    drwxr-xr-x  2 root root 4096 May 23 2005 mnt

    drwxr-xr-x  2 root root  0 Jan 24 17:20 net

    drwxr-xr-x  3 root root 4096 May 23 2005 opt

    dr-xr-xr-x 94 root root  0 Jan 2501:19 proc

    drwxr-x—- 13 root root 4096 Jan 25 10:06 root

    drwxr-xr-x  2 root root 12288 Jan 2504:18 sbin

    drwxr-xr-x  1 root root  0 Jan 2501:19 seLinux

    drwxr-xr-x  2 root root 4096 May 23 2005 srv

    drwxr-xr-x 10 root root  0 Jan 2501:19 sys

    drwxr-xr-x  3 root root 4096 Jan 24 10:32 tftpboot

    drwxrwxrwt 16 root root 4096 Jan 25 10:06 tmp

    drwxr-xr-x 16 root root 4096 Jan 24 10:01 usr

    drwxr-xr-x 28 root root 4096 Jan 24 10:29 var

    用ls–l显示的是文件的详细信息,一个文件一行,每行由7列组成,其中第一列为文件的类型和权限,第一个字母为文件的类型,常见的“d”为目录,“-”为普通文件,其余9位是文件的权限,下面有详细的叙述。第二列为文件的链接数,下面也会再叙述。第三列为文件的所有者,第四列为文件所在的组,第五列为文件的大小,第六列为文件最后修改时间,第七列为文件名。 4.3 使用和管理文件 在Linux中对文件的操作主要有:创建、复制、移动和删除一个文件或为一个文件改名,查看文本文件的内容以及打印一个文件等。

    在Linux中,用touch命令可以创建一个0字节的空文件或更新文件的时间戳。

    img72 命令:touch

    作用:更新文件的时间戳,如果这个文件不存在,则产生一个空文件

    格式:touch filename

    说明:touch命令可以用来将一批文件的最后访问时间和最后修改时间改为当前时间,一般在发布一批文件时使用。不过,touch命令更常用的地方是用来创建一个文件。因为在Linux中,有些场合只需要有一个特定名字的文件存在即可,这时候就可以用touch命令。

    在Linux中复制文件可以使用cp命令。

    img73 命令:cp(copy)

    格式:1)cp[options]source dest

       2)cp[options]source…directory

    cp命令有两个格式,第一种是将一个文件复制一份,这时第二个参数dest可以是一个文件,也可以是一个目录,如果是一个文件,就把源文件复制为目标文件,如果是一个目录,就将文件复制到这个目录中,并保持源文件名。

    例:

    cp myfile1 myfile2

    在当前目录中为myfile1创建一个复本myfile2

    cp myfile1~/doc/

    将当前目录下myfile1文件复制到主目录下的doc目录中,保持原文件名。

    第二种是将多个文件复制到一个目录中,这时候,最后一个参数必须是目录。

    例:

    cp myfile1 myfile2 doc/

    将当前目录下的myfile1和myfile2复制到doc目录中,保持原文件名不变。常用选项:

    -p:保持文件原来的属性

    -R:如果被复制的对象有目录,加上-R就可以将该目录下的子目录及子目录下的文件均复制到指定目录中。

    使用mv命令可以移动文件或为文件改名。

    img74 命令:mv(move)

    格式:mv[options]source dest

       mv[options]source…directory

    mv的第一种格式是将一个文件改名为另一个文件。如:

    mv myfile1 myfile2

    另一种格式是将一个或多个文件移动到一个目录中,这时候最后一个参数必须是目录。所有的文件将保持原文件名不变。如:

    mv myfile1 myfile2 dir1/

    Linux中可以使用rm命令删除文件。

    img75 命令:rm(remove)

    格式:rm[options]file…

    rm可以删除一个或多个文件。如果使用-r或-R的参数,还可以删除目录。常用选项:

    -R或-r:递归删除,可以用来删除一个目录,无论其中是否有东西

    -i:删除前先询问

    -f:强制删除。

    例如:

    rm–i file*

    删除当前目录下所有以file打头的文件,删除前先询问。

    rm–rf doc/

    删除目录doc,无论是否是空目录。

    查看文本文件的内容,可以使用很多命令,如cat,more,less,head,tail。

    img76 命令:cat(concatenate)

    作用:显示一个文件的内容

    img77 命令:more,less

    作用:

    分屏显示一个文件的内容

    img78 命令:head,tail

    作用:显示一个文件的前若干行或后若干行

    例:

    显示一个文件的前5行:head–5 file1显示一个文件的后15行:tail–15 file1

    显示一个文件从第20行开始之后的行:tail+20 file1

    显示一个文件的后10行,并且不退出,当文件被更新时立即显示:tail–f file1

    显示二进制文件,使用od命令。显示二进制文件中的字符串,使用string命令。使用lpr命令把文件送入打印队列,使用lpq命令查看打印队列的状态,取消一个打印任务,使用lprm job_id命令。

    Linux中有一条强大的按照制定规则查找文件的命令:find。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。

    img79 命令:find

    一、find命令格式

    1.find命令的一般形式为:

    find pathname-options[-print-exec-ok…]

    2.find命令的参数

    pathname:find命令所查找的目录路径。例如用“.”来表示当前目录,用“/”来表示系统根目录。

    -print:find命令将匹配的文件输出到标准输出。

    -exec:find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为command{}\;,注意{}和\之间的空格。

    -ok:和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

    3.find命令选项

    -name

    按照文件名查找文件。

    -perm

    按照文件权限来查找文件。

    -prune

    使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。

    -user

    按照文件属主来查找文件。

    -group

    按照文件所属的组来查找文件。

    -mtime-n+n

    按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime选项,但它们都和-m time选项。

    -nogroup

    查找无有效所属组的文件,即该文件所属的组在/etc/group中不存在。

    -nouser

    查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。

    -newer file1!file2

    查找更改时间比文件file1新但比文件file2旧的文件。

    -type

    查找某一类型的文件,诸如:

    b-块设备文件。

    d-目录。

    c-字符设备文件。

    p-管道文件。

    l-符号链接文件。

    f-普通文件。

    -size n:[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计。

    -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。

    -fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。

    -mount:在查找文件时不跨越文件系统mount点。

    -follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。

    -cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

    另外,下面三个的区别:

    -amin n

    查找系统中最后n分钟访问的文件

    -atime n

    查找系统中最后n*24小时访问的文件

    -cmin n

    查找系统中最后n分钟被改变文件状态的文件

    -ctime n

    查找系统中最后n*24小时被改变文件状态的文件

    -mmin n

    查找系统中最后n分钟被改变文件数据的文件

    -mtime n

    查找系统中最后n*24小时被改变文件数据的文件

    4.使用exec或ok来执行shell命令

    使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如ls或ls-l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。

    exec选项后面跟随着所要执行的命令或脚本,然后是一对儿“{}”,一个空格和一个“\”,最后是一个分号。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。

    例如:为了用ls-l命令列出所匹配到的文件,可以把ls-l命令放在find命令的-exec选项中:

    #find.-type f-exec ls-l{}\;

    -rw-r—r—1 root root 34928 2003-02-25./conf/httpd.conf

    -rw-r—r—1 root root 12959 2003-02-25./conf/magic

    -rw-r—r—1 root root 180 2003-02-25./conf.d/README

    上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls-l命令将它们列出。

    在logs目录中查找更改时间在5日以前的文件并删除它们:

    $find logs-type f-mtime+5-exec rm{}\;

    记住:在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。

    在下面的例子中,find命令在当前目录中查找所有文件名以.conf结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。

    $find.-name“*.conf”-mtime+5-ok rm{}\;

    <rm…./conf/httpd.conf>?n

    按y键删除文件,按n键不删除。

    任何形式的命令都可以在-exec选项中使用。

    在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个sam用户。

    #find/etc-name“passwd*”-exec grep“sam”{}\;

    sam:x:501:501::/usr/sam:/bin/bash

    二、find命令的例子

    1.查找当前用户主目录下的所有文件

    下面两种方法都可以使用:

    $find$HOME-print

    $find~-print

    2.让当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读文件的权限。

    $find.-type f-perm 644-exec ls-l{}\;

    3.查找系统中所有文件长度为0的普通文件,并列出它们的完整路径。

    $find/-type f-size0-exec ls-l{}\;

    4.查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们。

    $find/var/logs-type f-mtime+7-ok rm{}\;

    5.查找系统中所有属于root组的文件。

    $find.-group root-exec ls-l{}\;

    -rw-r—r—1 root root 595 10月3101:09./file

    6.find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。

    该命令只检查三位数字,所以相应文件的后缀不要超过999。先建几个admin.log*的文件,才能使用下面这个命令:

    $find.-name“admin.log[0-9][0-9][0-9]”-atime-7–ok rm{}\;

    <rm…./admin.log001>?n

    <rm…./admin.log002>?n

    <rm…./admin.log042>?n

    <rm…./admin.log942>?n

    7.查找当前文件系统中的所有目录并排序。

    $find.-type d|sort

    8.查找系统中所有的rmt磁带设备。

    $find/dev/rmt-print

    三、xargs

    xargs–从标准输入中创建并执行命令行

    在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

    find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

    在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行。这样在有些情况下就会出现进程过多、系统性能下降的问题,因而效率不高。

    而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

    来看看xargs命令是如何同find命令一起使用的,并给出一些例子。

    下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件。

    #find.-type f-print|xargs file

    ./.kde/Autostart/Autorun.desktop:UTF-8 Unicode English text

    ./.kde/Autostart/.directory:ISO-8859 text\

    ……

    在整个系统中查找内存信息转储文件(core dump),然后把结果保存到/tmp/ core.log文件中:

    $find/-name"core"-print|xargs echo"">/tmp/core.log

    上面这个执行太慢,改成在当前目录下查找

    #find.-name"file*"-print|xargs echo"">/temp/core.log

    #cat/temp/core.log

    ./file6

    在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应其他用户的写权限:

    #ls-l

    drwxrwxrwx 2 sam adm 4096 10月30 20:14 file6

    -rwxrwxrwx 2 sam adm0 10月3101:01 http3.conf

    -rwxrwxrwx 2 sam adm0 10月3101:01 httpd.conf

    #find.-perm-7-print|xargs chmod o-w

    #ls-l

    drwxrwxr-x 2 sam adm 4096 10月30 20:14 file6

    -rwxrwxr-x 2 sam adm0 10月3101:01 http3.conf

    -rwxrwxr-x 2 sam adm0 10月3101:01 httpd.conf

    用grep命令在所有的普通文件中搜索hostname这个词:

    #find.-type f-print|xargs grep“hostname”

    ./httpd1.conf:#different IP addresses or hostnames and have them handled by the./httpd1.conf:#VirtualHost:If you want to maintain multiple domains/hostnames on your

    用grep命令在当前目录下的所有普通文件中搜索hostnames这个词:

    #find.-name*-type f-print|xargs grep“hostnames”

    ./httpd1.conf:#different IP addresses or hostnames and have them handled by the./httpd1.conf:#VirtualHost:If you want to maintain multiple domains/hostnames on your

    注意,在上面的例子中,\用来取消find命令中的*在shell中的特殊含义。

    find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

    四、find命令的参数

    下面是find一些常用参数的例子,有用到的时候查查就行了。

    1.使用name选项

    文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。

    可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。

    不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*. txt的文件,使用~作为“pathname”参数,波浪号~代表了你的$HOME目录。

    $find~-name“*.txt”-print

    想要在当前目录及子目录中查找所有的‘*.txt’文件,可以用:

    $find.-name“*.txt”-print

    想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:

    $find.-name“[A-Z]*”-print

    想要在/etc目录中查找文件名以host开头的文件,可以用:

    $find/etc-name“host*”-print

    想要查找$HOME目录中的文件,可以用:

    $find~-name“*”-print或find.-print

    要想让系统高负荷运行,就从根目录开始查找所有的文件。

    $find/-name“*”-print

    如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是.txt的文件,下面的命令就能够返回名为ax37.txt的文件:

    $find.-name“[a-z][a-z][0-9][0-9].txt”-print

    2.使用perm选项

    按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。

    如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:

    $find.-perm 755-print

    还有一种表达方法:在八进制数字前面要加一个横杠“-”,表示都匹配,如-007就相当于777,-006相当于666

    #ls-l

    -rwxrwxr-x 2 sam adm0 10月3101:01 http3.conf

    -rw-rw-rw-1 sam adm 34890 10月3100:57 httpd1.conf

    -rwxrwxr-x 2 sam adm0 10月3101:01 httpd.conf

    drw-rw-rw-2 gem group 4096 10月26 19:48 sam

    -rw-rw-rw-1 root root 2792 10月31 20:19 temp

    #find.-perm006

    #find.-perm-006

    ./sam

    ./httpd1.conf

    ./temp

    -perm mode:文件权限位等于mode值

    -perm+mode:mode的值对应的其中一位权限在文件中被设置

    -perm–mode:mode的值对应的权限在文件中被设置

    3.忽略某个目录

    如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。

    如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:

    $find/apps-path“/apps/bin”-prune-o-print

    4.使用find查找文件的时候怎么避开某个文件目录

    比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件

    find/usr/sam-path“/usr/sam/dir1”-prune-o-print

    find[-path…][expression]在路径列表的后面的是表达式

    -path“/usr/sam”-prune-o-print是-path“/usr/sam”-a-prune-o

    -print的简写表达式按顺序求值,-a和-o都是短路求值,与shell的&&和||类似。如果-path“/usr/sam”为真,则求值-prune,-prune返回真,与逻辑表达式为真。否则不求值-prune,与逻辑表达式为假。如果-path“/usr/sam”-a-prune为假,则求值-print,-print返回真,或逻辑表达式为真。否则不求值-print,或逻辑表达式为真。

    这个表达式组合特例可以用伪码写为

    if-path“/usr/sam”then

       -prune

    else

       -print

    避开多个文件夹

    find/usr/sam\(-path/usr/sam/dir1-o-path/usr/sam/file1\)-prune-o-print圆括号表示表达式的结合。

    \表示引用,即指示shell不对后面的字符作特殊解释,而留给find命令去解释其意义。

    查找某一确定文件,-name等选项加在-o之后

    #find/usr/sam\(-path/usr/sam/dir1-o-path/usr/sam/file1\)-prune-o-name“temp”-print

    5.使用user和nouser选项

    按文件属主查找文件,如在$HOME目录中查找文件属主为sam的文件,可以用:

    $find~-user sam-print

    在/etc目录下查找文件属主为uucp的文件:

    $find/etc-user uucp-print

    为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名。find命令能够为你完成相应的工作。

    例如,希望在/home目录下查找所有的这类文件,可以用:

    $find/home-nouser-print

    6.使用group和nogroup选项

    就像user和nouser选项一样,针对文件所属于的组,find命令也具有同样的选项,为了在/apps目录下查找属于gem组的文件,可以用:

    $find/apps-group gem-print

    要查找没有有效所属组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件:

    $find/-nogroup-print

    7.按照更改时间或访问时间等查找文件

    如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。

    用减号(—)来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。

    希望在系统根目录下查找更改时间在5日以内的文件,可以用:

    $find/-mtime-5-print

    为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:

    $find/var/adm-mtime+3-print

    8.查找比某个文件新或旧的文件

    如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-ne-wer选项。它的一般形式为:

    newest_file_name!oldest_file_name

    其中,!是逻辑非符号。

    查找更改时间比文件sam新但比文件temp旧的文件:

    例:有两个文件

    -rw-r—r—1 sam adm0 10月3101:07 file

    -rw-rw-rw-1 sam adm 34890 10月3100:57 httpd1.conf

    -rwxrwxr-x 2 sam adm0 10月3101:01 httpd.conf

    drw-rw-rw-2 gem group 4096 10月26 19:48 sam

    -rw-rw-rw-1 root root 2792 10月31 20:19 temp

    #find-newer httpd1.conf!-newer temp-ls

    10776690-rwxrwxr-x 2 sam adm0 10月3101:01./httpd.conf

    1077671 4-rw-rw-rw-1 root root 2792 10月31 20:19./temp

    10776730-rw-r—r—1 sam adm0 10月3101:07./fiel

    查找更改时间比temp文件新的文件:

    $find.-newer temp-print

    9.使用type选项

    在/etc目录下查找所有的目录,可以用:

    $find/etc-type d-print

    在当前目录下查找除目录以外的所有类型的文件,可以用:

    $find.!-type d-print

    在/etc目录下查找所有的符号链接文件,可以用:

    $find/etc-type l-print

    10.使用size选项

    可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c。以块计量文件长度只用数字表示即可。

    在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,来查看文件系统的大小,因为这时使用块来计量更容易转换。

    在当前目录下查找文件长度大于1 M字节的文件:

    $find.-size+1000000c-print

    在/home/apache目录下查找文件长度恰好为100字节的文件:

    $find/home/apache-size100c-print

    在当前目录下查找长度超过10块的文件(一块等于512字节):

    $find.-size+10-print

    11.使用depth选项

    在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。

    在下面的例子中,find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。

    它将首先匹配所有的文件然后再进入子目录中查找。

    $find/-name“CON.FILE”-depth-print

    12.使用mount选项

    在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。

    从当前目录开始查找位于本文件系统中文件名以XC结尾的文件:

    $find.-name“*.XC”-mount-p rint 4.4 链接文件与inode Linux中用于共享文件时有个非常有特色的地方,叫做链接(link)。链接分为硬链接(hard link)和符号连接(symbolic link)两种,要学习链接,就必须先了解Linux中文件的inode与目录项之间的关系。

    Linux中常用的文件系统为ext2/3等。以ext2文件系统为例,每个文件都由三部分组成,即文件名、文件属性和数据。其中,一个文件都有一个叫做inode的数据结构,其中存放了文件的各种属性,如文件的主人、所在组、权限、大小、最后访问时间等,另外还有指针指向数据块。文件与inode是一一对应关系,每个inode有一个编号,可以称做i-number。

    与我们在Windows的经验不同的是,文件的inode中并不包含文件的名字。文件的名字存放在文件所在的目录中。Linux中的目录由若干目录项组成,每个目录项只包含两项信息,即这个目录中的文件的名字与对应的inode编号。

    img80

    图4.1 目录项与文件inode

    这样,有可能出现一种特殊的情况,就是多个目录项对应同一个inode,也就是一个文件可能有多个文件名。这些文件名可能属于同一个目录,也可能属于不同的目录。一个文件的多个名字叫做文件的硬链接,简称链接。

    img81 命令:ln(link)

    作用:为一个文件建立硬链接

    格式:ln原文件名新链接名

    在文件的inode中,有一个记录文件链接个数的数字,叫做link counter,一个文件有几个硬链接,这个link counter就是几。一个文件如果有多个链接(文件名),那么这些链接的地位是一样的,用户可以通过任何一个链接来访问这个文件。

    如果使用rm命令删除文件的话,删除的其实是文件的一个链接。如果一个文件的链接数大于1的话,系统仅仅是删除相应的目录项,并将inode中的link counter减1,并不真正删除文件,只有当这个文件的所有链接都被删除,即link counter变为0时,文件才会被真正的不可恢复的删除。

    除了硬链接以外,Linux还支持另外一种链接,叫符号链接或软链接。所谓符号链接,与原文件不是同一个文件,但是符号链接中文件的数据部分存放的是一个指向目标文件的指针,可以通过一个符号链接来访问原文件。

    建立符号链接的格式:ln–s原文件名符号链接名

    用ls–l查看时,一个符号链接文件的第一个属性字母为l,代表符号链接。

    为一个文件增加一个符号链接,并不会增大原文件的link counter,反之,删除符号链接也不会减少原文件的link counter。如果原文件被删除,那么符号链接仍然存在,但成为了一个无效的链接。与建立硬链接不同,为一个文件建立符号链接不需要对原文件有任何权限。事实上,完全可以为一个根本不存在的目标建立符号链接。在一定程度上,符号链接像Windows系统中的快捷方式。

    符号链接是对硬链接重要的补充,这是因为有两种场合下是不可以建立硬链接的。一是不能为目录建立硬链接,这是因为硬链接增加了文件系统的复杂性,如果目录也支持硬链接,就有可能建立出环状的目录结构。二是不能为一个文件在不同卷,即不同的文件系统上建立硬链接。

    链接是Linux管理文件的一个比较有特色的地方,有了链接,就可以更方便的共享文件。 4.5 文件的权限 ● 使用ls-l命令,可以查看文件的权限

    ● 普通文件有r w x三种权限

    ● 目录文件也有r w x三种权限

    ● 文件的权限对三类人设定不同的权限:文件所有者、同组人、其他人

    ● 可以使用符号或八进制数来设置文件权限

    ● 使用umask设定文件和目录的缺省权限

    使用ls-l命令查看文件的权限。在每一个文件的第一段为10位字母,第一个字母是文件的属性,“-”代表普通文件,“d”代表目录文件,“l”代表符号链接,“b”“c”代表设备。后面9位为文件的权限,分为三段,分别代表“所有者(u)”、“同组人(g)”、“其他人(o)”的读(r)、写(w)、执行(x)的权限。

    对普通文件而言,“r”代表可以阅读文件内容,“w”代表可以修改或删除文件内容,“x”代表可以将文件作为命令来执行(同时需要r权限)。

    对目录文件而言,“r”代表可以列出目录所包括的文件,“w”可以在目录内创建或删除文件(同时需要x权限),“x”表明目录可以做为活动目录。

    img82 命令:chmod(change mode)

    作用:修改文件的权限

    格式:chmod[options]符号权限或八进制权限files……

    例如:使用符号来改变文件的权限。例如:chmod go-x doc为删除doc文件的同组人和其他人的执行权。chmod u-x,go+w doc为删除doc文件所有者的执行权并添加同组人和其他人的写权。

    使用八进制数来设置文件权限。三位八进制数,分别代表“所有者(u)”、“同组人(g)”、“其他人(o)”,读(r)、写(w)、执行(x)的权限用4,2,1代表。例:744代表rwxr—r—,666代表rw-rw-rw。

    umask(掩码)是在创建文件时设置缺省权限用的。创建普通文件时,由666减umask。创建目录的缺省权限,是由777减umask。对普通用户而言,umask=002,即新创建文件和目录的缺省权限分别为664和775。对root用户而言,umask=022,即新创建文件和目录的缺省权限分别为644和755。可以在/etc/profile内设定umask值。 4.6 Linux目录结构 大部分Linux发布版都遵循标准Linux文件系统,这个标准规定了很多文件和目录的位置和名字。可以通过查看http://www.pathname.com/fhs来了解这个标准。这个标准大部分兼容了传统的UNIX文件系统,并做了小的改动。下面对这些目录的内容加以说明。

    img83

    图4.2 目录结构示意图

    /bin,/lib,/sbin

    ● /bin目录包含供每个人使用的可执行程序。

    ● /sbin目录包含仅供管理员使用的可执行程序。

    ● /lib目录包含库文件。

    /bin下的程序所有人都可以用,而/sbin下的程序一般只供管理员使用。所以,普通用户的$PATH变量中不包括/sbin目录,而管理员的$PATH里就有。

    这三个目录在系统启动后、在单用户模式下或是用急救盘启动等各种情况都应该可见,所以它们不应该在独立的文件系统中。

    /boot

    ● /boot目录包括了内核镜像和其他相关内容。

    ● 应该放在硬盘1023柱面以前。如果/分区在1024柱面以后,则应该为/boot单独划在一个分区上。

    由于BIOS设计的限制,在系统启动时,所有的内核文件要处在硬盘1023柱面以前,对于使用LBA(Linear Block Addressing)模式的硬盘而言,即8G以前。尽管在Linux启动以后,操作系统接管时,就可以绕过BIOS的这个限制,但是在启动时/ boot目录下的东西仍然需要放在硬盘1023柱面以前。所以,如果根目录所在的分区处在硬盘1024柱面以后,则应该为/boot单独划在一个分区上。当然,现在很多新的BI-OS已经可以存取1024以后的内容,但这并不是标准。

    /dev

    ● /dev目录包含着代表硬件设备的特殊文件,主要有:块设备,如硬盘。字符设备,如磁带机和串设备。命名管道和UNIX套接口(sockets)等。

    ● 每一个设备都有一个主编号和次编号,内核通过这些编号来识别设备。

    ● /dev目录不能单独划在一个分区上。

    在类UNIX的系统中,所有的设备和文件一样统一管理。用户可以对/dev目录的特殊文件访问来使用设备。由于这样比较危险,所以一般仅管理员可以这么做。在/ dev目录下有四类特殊文件:

    字符设备。这类设备的权限位以c打头。对这类设备的存取将是以一个串行方式进行。例如:tty(终端),鼠标,空设备null,零设备zero,随机设备random。

    块设备。这类设备的权限位以b打头。对这类设备可以随机存取。

    命名管道。这类设备的权限位以p打头。在输入输出重定向时可以使用到这类设备。

    UNIX套接口。这类设备的权限位以s打头。这些套接口可以在没有运行TCP/IP时像TCP/IP连接一样运行。只有在调用到套接口的程序中才可以使用这些套接口。

    块设备和字符设备都有一个主编号和次编号。内核通过这些编号来识别设备。

    块设备、字符设备和命名管道都可以使用mknod命令来创建,UNIX套接口则由程序创建。

    /etc

    ● /etc目录包含着整个系统的各种配置文件。

    ● /etc目录不能单独划在一个分区上。

    /etc目录是存放配置文件的目录,比如我们已经见过的/etc/inittab和/etc/ lilo.conf,但还有许多其他的配置文件。

    /etc/X11包含X-Window的配置文件。

    /etc/skel包含着用户缺省的配置文件。当新建一个用户时,将这个目录的内容复制到用户主目录下。

    /etc/rc.d包含系统启动脚本。这些脚本将由/etc/inittab调用。

    /etc/sysconfig包含系统配置文件。

    /home,/root

    ● /home目录包含各用户的主目录。

    ● /root目录是root的主目录。

    ● /home目录一般为独立的分区。/root目录不作为独立的分区。

    当新建一个用户时,如果没有专门指定目录的话,用户主目录是/home目录下同用户名的目录。root用户的主目录则设置为/root目录。这主要是为了保存用户数据,用户主目录/home一般为独立的分区,但为了防止系统在装载文件系统时发生问题,root用户的主目录不放在/home下。

    /mnt

    ● /mnt目录包含装载其他非标准文件系统的装载点。

    ● /mnt目录一般不是独立的分区。

    由于UNIX类的操作系统对文件系统的使用是通过装载(mount)到/目录树上,所以Linux专门指定在/mnt目录下设置一些空目录为其他非标准文件系统的装载点。如/mnt/floppy用来装载软盘,/mnt/cdrom用来装载光盘。当然,还可以将其他文件系统装载在其他位置上。

    /proc

    ● /proc是个虚拟目录,里面保存内核和进程的信息。

    /proc/interrupts包括所有中断(IRQs)的信息

    /proc/net/sockstat包含网络套接口的统计信息

    /proc/1/environ包含进程1的环境信息

    /proc/self/cwd包含要访问这个文件的进程的当前工作目录

    /proc/net/sockstat包含网络套接口的统计信息

    /proc/1/environ包含进程1的环境信息

    /proc/self/cwd包含要访问这个文件的进程的当前工作目录

    /tmp

    ● /tmp目录是为程序和用户提供放置临时空间的目录。

    ● /tmp目录可以单独划在一个分区上。

    ● /tmp目录会被一些系统进程定期清空。

    /tmp目录用来存放一些临时文件,一般在进程结束或用户注销里就会被自动删除。

    /usr

    ● /usr目录包含UNIX系统的众多资源。所以是占空间最大的一个目录。

    ● /usr目录包括很多应用程序和库文件等。

    ● /usr目录可以是独立的分区,也可以通过NFS装载一个网络目录。/usr目录可以是只读的。

    在一个新安装的Linux系统中,/usr目录是占空间最大的一个目录。除了在启动时和紧急情况下必要的程序放在/bin和/sbin下外,绝大部分的应用程序都放在/usr目录下。这个目录可以从网络上远程装载,如所有的工作站可以远程装载服务器上通过NFS共享出来的/usr目录,这样可以节约本地空间。而且,/usr设计为可以是只读的目录。

    /usr目录下一些重要的子目录有:

    /usr/bin,/usr/sbin,/usr/lib-含义类似根目录下对应目录

    /usr/dict-包含字典文件

    /usr/doc-包含一些重要文档

    /usr/etc-在网络远程安装/usr目录时,此目录包含网络范围的配置文件

    /usr/info,/usr/man-帮助信息和手册页

    /usr/src-应用程序源文件

    /usr/local-这个目录不是自动创建的,但是建议把自己的程序放在这个目录下,下面也对应一些目录,如bin,src等。

    /var

    ● /var目录包含了一些文件大小比较特殊的文件,如日志文件、锁文件等。

    ● /var目录还包括各种用途的文件,如:邮件、计划、打印文件等。

    ● /var目录也可以存放一些临时文件,它们一般比在/tmp目录下的文件使用时间长一些。

    ● /var目录通常是独立的分区。

    /var下经常存放一些比较大的文件,如日志文件放在/var/log,还有些应用程序产生的大文件放在/var下。

    /var/tmp里面也可以存放一些临时文件,就像/tmp目录,不过一般这些文件比在/tmp目录下的文件使用时间长一些,大约一周左右。

    /var/spool包含一些假脱机文件,即一些应用程序产生的但并不是马上处理的数据文件。典型的例子是邮件文件(放在/var/spool/mqueue)和打印文件(放在/var/spool/ lpd)。

    /var/run目录包含进程运行的信息,如进程ID等。

    /var/lock目录包含一些锁文件,这些文件起到一个信息的作用,说明某个资源正在被使用或某个进程正在运行。其他进程不可再使用这个资源或某个进程不能再运行一个复本等。

    /var/state目录用来保存一些关于DHCP服务器的信息,以便于重新启动机器时使用。

    /lost+found

    ● /lost+found存在于所有的文件系统中。

    ● 当系统不正常关机而重新启动后,fsck程序会运行来检查文件一致性。如果由于不正常关机造成文件碎片的话,fsck会把这些碎片回收并放在/lost+found下。

    /目录下的其他目录

    ● /opt目录是由一些外部应用程序使用的目录。

    ● 其他一些自己建的目录。 4.7 文件系统 什么是文件系统(Filesystem)?文件系统是存放文件的容器,在Linux中,一个文件系统是一个有层次结构的树型结构目录。一个文件系统是通过装载到另一个文件系统的装载点来使用的。一般来讲,装载点(即一个目录)是空的。根文件系统(/)是在系统引导时自动加载的。

    Linux中存放文件系统的存储介质常见的有:硬盘、光盘、软盘、Flash盘、磁带、网络存储设备等。

    Linux能够支持的常见的文件系统类型如下:

    ● Linux自身提供的缺省文件系统:ext2fs(一般根文件系统/使用此文件系统)。

    ● 新增的自身提供的文件系统:ext3fs,ReiserFS,IBM JFS等。

    ● 其他UNIX使用的文件系统:minix,ext,xiafs等。

    ● DOS/Windows使用的文件系统:FAT-12,FAT-16,FAT-32,VFAT,NTFS(只读)。

    ● HPFS(OS/2使用,只读),HFS(Macintosh使用,只读)。

    ● AFFS(Amiga),System V,Coherent,Xenix。

    ● CD-ROM(ISO 9660)。

    ● UMSDOS(UNIX-like FS on MS-DOS)。

    ● NFS(网络文件系统)。

    ● SMBFS(Windows共享文件系统)、NCPFS(Novell Netware共享文件系统)。

    ● /proc(用于内核和进程信息)。

    ● Linux操作系统安装过程中的文件系统的选择。

    1)ext2文件系统。

    ext2文件系统应该说是Linux正宗的文件系统,早期的Linux都是用ext2,但随着技术的发展,大多Linux的发行版本目前并不用这个文件系统了。比如Red Hat和Fedora大多都建议用ext3,ext3文件系统是由ext2发展而来的。ext2支持undelete(反删除),如果误删除文件,有时是可以恢复的,但操作上比较麻烦。ext2支持大文件。

    2)ext3文件系统。

    ext3是由ext2文件系统发展而来的一个用于Linux的日志文件系统。ext3支持大文件。但不支持反删除(undelete)操作。Red Hat和Fedora都力挺ext3。

    3)reiserfs文件系统。

    reiserfs文件系统是一款优秀的文件系统,支持大文件,支持反删除(undelete)。在测试ext2、reiserfs反删除文件功能的过程中,reiserfs文件系统表现的比较优秀,几乎能恢复90%以上的数据,有时能恢复到100%。操作反删除比较容易。

    文件系统的安全性。

    1)ext2、ext3和reiserfs文件系统自动修复能力对比。

    ext2、ext3及reiserfs都能自动修复损坏的文件系统,也都是在开机时进行。从表现来看reiserfs更胜一筹。ext2和ext3文件系统在默认的情况下是“This filesystem will be automatically checked every 21 mounts or 180 days,whichever comes first”,也就是每间隔21次或每180天加载文件系统就要自动检测一次。

    通过实践来看ext2和ext3在auto check上存在风险,有时文件系统开机后就进入单用户模式,并且把整个系统“扔”进lost+found目录,如果要恢复系统,就得用fsck来进行修复。当然fsck也同样存在风险。所以我们对ext2和ext3文件系统的使用,对新手来说的确需要心理准备。毕竟修复已经损坏的ext2和ext3文件系统是有困难的。

    另外ext2和ext3文件系统对于意外关机和断电,也可能导致文件系统损坏,所以我们在使用过程中,必须是合法关机。比如执行poweroff指令来关掉机器。

    reiserfs文件系统也能自动修复,它在自动检测和修复上具有很强的功能,几乎很少出现ext2和ext3的情况,另外从速度来说它也比ext2、ext3文件系统的速度要快。

    reiserfs对于意外断电表现最佳,reiserfs文件系统从未出现像ext2和ext3那样用手动方式来进行修复的情况。从这方面来说reiserfs还是极为安全的。不过,直接断电有时也会造成硬盘物理损伤。

    2)ext2、ext3和reiserfs反删除功能对比。

    从文件系统的反删除来看,ext2和reiserfs都支持反删除,对于一般使用者来说应该是安全的,但对于保密单位来说可能意味着不安全。从反删除角度来说明文件系统的安全性,也是有两方面。

    对于从事的工作比较机密的,用ext3比较好,因为ext3一旦删除文件,是不可恢复的,虽然网上也有几个关于反删除恢复操作在ext3中的例子,但实践来看,并不是那么容易。因为反删除能恢复相应的绝秘资料的泄密。

    但是对于一般使用者,建议用reiserfs文件系统,它支持反删除功能,反删除操作也比较容易。但也会存在一点问题。比如在Fedora或Red Hat中,有一个关于系统安全的seLinux,在默认情况下,可能在reiserfs中不支持seLinux。不过值得一说的是seLinux是一个绝对庞大、功能丰富、涉及面极广的安全工具,seLinux并不是一般使用者就能驾驭的了的。所以一般建议初学者在使用Linux系统时先关掉seLinux功能。慢慢尝试熟悉使用它。在Fedora和Red Hat最新的版本中,reiserfs文件系统的确是不支持seLinux,所以在Fedora或Red Hat中采用了reiserfs,并且还想用seLinux,还是自己找解决办法,可能要打内核补丁才行。至于其他Linux发行版本是否存在这个问题,还得需要尝试。

    传统ext2文件解析:

    ext2是传统的Linux支持的文件系统。其中的很多特性仍然保留在新的文件系统中,所以有必要对ext2文件系统进行一下解析。ext2文件系统的前身是minix文件系统,后来Linux在minix的基础上提出了扩展文件系统,即ext,ext2即扩展文件系统第二版。

    ext2fs和inode。

    当创建分区时,即格式化分区时,ext2fs分区将分成若干个大小为1024个字节(默认值)的块。

    Linux的块可以有不同的用途:超级块(Superblock)、Inode(索引节点)、间接索引块、数据块。不能将一个块用于不同的用途。

    1.Superblock(超级块):一个文件系统的第一块。一个文件系统中的第一块(block 1)是超级块。这是一个非常重要的块,它包含这个文件系统的一些基本信息,如最后一次使用的时间、块的大小、指向这个文件系统根的指针、指向空闲inode链的指针、指向空闲数据块链的指针等。由于其内容的重要性,为了在这个超级块损坏时有备份数据可用,在第8193、16385等块处有这个超级块的备份。

    2.inode(i节点块):一个inode有256字节,即,一个1024字节的块中包含4个inode。inode包含一个文件的所有者(user)、组(group)、权限(permission)、大小(size)、创建时间(ctime)、最后使用时间(atime)、最后修改时间(mtime)等。此外,inode还包含这个文件的数据块的位置,这个结构比较复杂,但十分高效。在一个文件中,头12个数据块是直接寻址,数据块的地址是记录在inode中的。如果文件的长度大于12个数据块的容量,一般的即12KB,那么就需要使用间接索引块。由inode引出一个指针指向一个间接索引块,由这个间接索引块包含数据块的编号和地址。由于一个指针是4个字节,一个1024字节的间接索引块就可以索引256个数据块,即256KB大小。如果文件的大小比256K字节还要大,就需要二级间接索引块,即间接索引块所指的又是间接索引块。通过二级间接索引块,就可以再索引65536个数据块。更进一步,通过使用三级间接索引块,就可以又多索引16777216个数据块,即16GB。但由于其他方面的限制,Linux的ext2fs中文件最大容量是2GB。

    3.数据块:包含的是文件的数据。因为目录也是文件的一种,所以目录也有数据块,其内容就是这个目录下的文件的文件名(由此可以看出,inode中并不存放文件名!),使用这种结构,就可以实现一个文件实例(inode)可以用多个文件名来访问。

    所以,一个文件系统中最重要是inode和数据块。如果一个文件系统满了,这可能是由两种原因造成的,一是inode用完了,二是数据块用完了。要根据实际情况来调节文件系统中的两个参数:一是块大小,缺省是1024,还可以设置为2048,4096等。另一个是多少个字节中包含一个inode,缺省的是4096。如果这个文件系统中有大量的小文件,这个值就应该设的小一点,以防止空间还有但inode用完了。

    在Linux中,使用文件系统前,需要创建和装载文件系统。

    文件系统的创建:

    这个过程是存储设备建立文件系统的过程,一般也被称为格式化或初始化,通过一些初始化工具来进行。一般的情况下每个类型的操作系统都有这方面的工具,也有多功能的第三方工具,比如PQ。如果不太懂操作系统自带的工具,可以用第三方工具来切割硬盘,把硬盘分割成若干分区,也可以使用Linux命令fdisk来创建一个分区。

    img84 命令:fdisk

    使用:显示分区表或管理分区

    语法是:fdisk[disk device]。

    使用fdisk可以创建Linux所需要的Linux native分区。

    然后再用操作系统自带的工具来初始化分区,也就是格式化分区。在Linux中有mkfs系列工具。以fedora 9.0为例,常用的工具有mkfs、mkfs.ext3、mkfs.reiserfs、mkfs.ext2、mkfs.msdos、mkfs.vfat、mkswap等。

    提示:如果不能创建reiserfs文件系统,也就是说没有mkfs.reiserfs或者mkreis-erfs命令,是因为没有安装reiserfs-utils工具包。

    1)mkfs的使用

    使用方法:

    #mkfs-t文件系统存储设备

    这里的文件系统是要指定的,比如ext3、reiserfs、ext2、fat32、msdos等设备,比如是一个硬盘的分区,软盘,光驱等。

    在格式化分区之前,应该先查看硬盘分区情况,并有针对性的格式化。比如用fdisk-l来查看。比如想格式化一个硬盘中的一个分区,用fdisk–l查看,可以看到有sda这个设备,所以可以用fdisk-l/dev/sda专门来显示分区情况。

    如果想把/dev/sda6格式化为ext3、ext2、reiserfs、fat32、msdos文件系统,命令格式如下。

    #mkfs-t ext3/dev/sda6

    #mkfs-t ext2/dev/sda6

    #mkfs-t reiserfs/dev/sda6

    #mkfs-t fat32/dev/sda6

    #mkfs-t msdos/dev/sda6

    2)mkfs.ext3、mkfs.reiserfs、mkfs.ext2、mkfs.msdos、mkfs.vfat、mke2fs

    mkfs在执行命令的时候,其实调用了上述一系列的工具。通过文件名,我们就知道这些工具是支持什么文件系统。

    #mkfs.ext3/dev/sda6注:把该设备格式化成ext3文件系统

    #mke2fs-j/dev/sda6注:把该设备格式化成ext3文件系统

    #mkfs.ext2/dev/sda6注:把该设备格式化成ext2文件系统

    #mke2fs/dev/sda6注:把该设备格式化成ext2文件系统

    #mkfs.reiserfs/dev/sda6注:把该设备格式化成reiserfs文件系统

    #mkfs.vfat/dev/sda6注:把该设备格式化成fat32文件系统

    #mkfs.msdos/dev/sda6注:把该设备格式化成fat16文件系统,msdos文件系统就是fat16

    #mkdosfs/dev/sda6注:把该设备格式化成fat16文件系统,同mkfs.msdos

    例:mke2fs,可以在这个分区上创建ext2fs文件系统(格式化分区)。

    #mke2fs-b 1024-i 4096-c/dev/hda6

    其中,-b指定块大小,-i指定多少个字节中包含一个inode,-c指定要格式化的分区。

    3)mkswap把一个分区格式化成为swap交换区

    #mkswap/dev/sda6注:创建此分区为swap交换分区

    #swapon/dev/sda6注:加载交换分区

    #swapoff/dev/sda6注:关闭交换分区

    我们查看系统已经加载的swap交换分区。

    #swapon/dev/sda6注:加载交换分区

    #swapon-s

    如果让swap开机就加载,应该改/etc/fstab文件,加类似如下一行。

    /dev/sda6 swap swap defaults00

    或者把命令行直接写入/etc/rc.d/rc.local中也行:swapon/dev/sda6

    如果硬盘不能再分区,你可以创建一个swap文件

    #dd if=/dev/zero of=/tmp/swap bs=1024 count=524288注:在/tmp目录下创建一个大小为512M的swap文件。

    #mkswap/tmp/swap注:把/tmp/swap文件,创建成swap交换区

    #swapon/tmp/swap注:加载swap

    #swapon-s

    注意:在安装系统的时候,一般已经划分了交换分区。查看/etc/fstab,应该有swap相关的行。如果在安装系统时没有添加swap,可以通过这种办法来添加。

    划分好的一个文件系统经过格式化后,并不能直接使用。文件系统只有加载才能使用,UNIX类的操作系统如此,Windows也是一样。在Windows更直观一些,具体内部机制我们不太了解。但Unix类的操作系统是通过mount进行的,加载文件系统时要有加载点,比如我们在安装Linux的过程中,有时会提示我们分区,然后建立文件系统,接着是问你的加载点是什么,我们大多选择的是/。我们在Linux系统的使用过程中,也会加载其他的硬盘分区,也要选中加载点,加载点通常是一个空置的目录,最好是我们自建的空置目录。

    加载文件系统,目前有两种方法,一是通过mount来加载;另一种方法是通过/ etc/fstab文件来开机自动加载。

    1.通过mount来加载磁盘分区(或存储设备)

    img85 命令:mount

    功能:加载文件系统

    语法:mount[-t文件系统类型][-o选项]设备名加载点。

    只使用mount命令而不带参数可以查看当前有哪些文件系统已经加载上来。如果希望在系统启动时自动加载一个文件系统,则需要在/etc/fstab这个配置文件中指定。使用mount/a命令则可以加载在/etc/fstab文件中定义了的文件系统。关于mount命令和fstab文件的格式,可以从man中获得更多信息。

    -t:通过这个参数,我们来指定文件系统的类型,一般的情况下不必指定有时也能识别,-t后面跟ext3、ext2、reiserfs、vfat、ntfs等,其中vfat是fat32和fat16分区文件系统所用的参数。如果您忘记了文件系统,也可以在-t后面加auto。

    -o:这个选项,主要选项有权限、用户、磁盘限额、语言编码等,但语言编码的选项,大多用于vfat和ntfs文件系统。由于选项太多,参见man mount。这里不多说。

    设备名:指存储设备,比如/dev/hda1,/dev/sda1,cdrom等。至于您的系统中有哪些存储设备,主要通过fdisk-l或者/etc/fstab或dmesg查看。一般的情况下光驱设备是/dev/cdrom。软驱设备是/dev/fd0。硬盘及移动硬盘以fdisk-l的输出为准。

    1)对光驱和软驱的加载。

    #mount/dev/cdrom

    #mount/dev/fd0

    第一行是mount光驱,至于mount到哪了,可以通过/etc/fstab来查看。同理软驱/dev/fd0设备也是如此。比如在/etc/fstab

    /dev/hdc/media/cdrecorder auto users,exec,noauto,managed00

    可以肯定的是光盘被mount到了/media/cdrecorder目录。

    但也可以自己来指定cdrom加载的位置。比如/mnt/cdrom,所以也可以这样来加载光驱:

    #mkdir/mnt/cdrom

    #mount/dev/cdrom/mnt/cdrom

    我们先建一个目录,然后执行mount命令,这样cdrom就挂在/mnt/cdrom中了。我们就可以在/mnt/cdrom中查看光盘中的资料和文件。这个目录您想怎么建就怎么建。用什么目录不是最重要的。重要的是您知道自己在做什么就行了。比如我们也可以把这个目录建成dvdrom。然后用mount/dev/cdrom/mnt/dvdrom来加载。

    有时我们的设备是COMBO的,有支持dvd cd还能支持刻录的。我们最好查一下光驱的设备,主要有两个方法,一是通过查看/etc/fstab,二是通过ls-l来查看。比如我们在/etc/fstab中查看到类似下面的一行。

    /dev/hdc/media/cdrecorder auto users,exec,noauto,managed 00

    通过这个,我们能知道hdc就是cdrom也是dvdrom的设备,更是cdrecorder的设备。为了验证我们的说法。请用ls-l来列文件。

    #ls-lh/dev/dvd*

    lrwxrwxrwx 1 root root 32005-09-13/dev/dvd->hdc

    #ls-lh/dev/cdrom

    lrwxrwxrwx 1 root root 32005-09-13/dev/cdrom->hdc

    #ls-lh/dev/cdwriter

    lrwxrwxrwx 1 root root 32005-09-13/dev/cdwriter->hdc

    这不一目了然了吗?dvd、cdrom、cdwriter的文件名都链接到了hdc这个设备,所以光驱设备根源就是/dev/hdc。所以我们也可以这样加载光驱。

    #mkdir/mnt/cdrom

    #mount/dev/hdc/mnt/cdrom

    2)加载硬盘和移动硬盘的文件系统。

    对于ext2、ext3、reiserfs不需要指定文件系统的编码,其实mount也没有这个功能。这些Linux文件系统,如果出现编码问题,一般是通过export LANG来指定。所以加载这些文件系统比较简单。

    首先我们得建一个文件系统加载的目录。我们前面已经提到了。一个有文件系统的分区要挂到系统中,必须要有一个加载点。这个加载点就是一个目录。比如我们通过fdisk-l得知hda5是Linux分区,并且创建了文件系统,比如是reiserfs文件系统吧。

    我们先用fdisk-l来查看一下分区情况:我们想要加载/dev/hda5分区,比如hda5分区创建的是reiserfs文件系统。

    #mkdir/mnt/hda5/

    注:先创建一个加载目录。

    #chmod 777/mnt/hda5/

    注:设置/mnt/hda5的权限为任何用户可写可读可执行。这样所有的用户都能够写入。

    #mount-t reiserfs/dev/hda5/mnt/hda5

    注:通过-t reiserfs来指定/dev/hda5是reiserfs文件系统,并且加载到/mnt/hda5目录。

    #mount-t auto/dev/hda5/mnt/hda5

    注:假如我们不知道hda5上reiserfs文件系统,我们可以用-t auto让系统定夺,然后加载到/mnt/hda5。

    #mount/dev/hda5/mnt/hda5

    注:不加任何参数,直接mount/dev/hda5到/mnt/hda5。系统自动判断分区文件系统是不是被加载了,我们通过df-lh来查看。

    要卸载一个文件系统,可以使用umount命令。

    img86 命令:umount(unmount)

    功能:卸载文件系统。

    语法:umount[设备名|加载点]

    要使用umount命令,首先要求没有用户和进程在使用这个文件系统上的东西,然使用umount设备名或umount装载点就可以卸载一个文件系统。

    如果卸载文件系统时报错,如:设备或资源忙。那么通常是这个文件系统中有某件正在被使用,或用户的当前目录在该文件系统中。可以使用fuser命令来检查当前哪个用户在使用该文件系统。

    其他与文件系统相关的一些命令主要有:

    df可以查看已装载的分区的使用信息。

    fsck可以对一个文件系统进行检查。

    du显示一个目录的使用情况。

    还有以m打头的一系列类dos的命令,如mdir,mcopy,mdel,mformat等。

    对于ext2fs,还有一些专门的命令,如tune2fs,debugfs,chattr命令等。

    2.通过/etc/fstab文件来开机自动加载文件系统

    (1)理解fstab

    上面是mount加载存储设备文件系统的办法。现在再来说一说在/etc/fstab中实现机自动加载文件系统的办法。首先要查看/etc/fstab。主要看写法。后文有开

    #This file is edited by fstab-sync-see man fstab-sync for details

    LABEL=/1/ext3 defaults 1 1

    /dev/devpts/dev/pts devpts gid=5,mode=620 0 0

    /dev/shm/dev/shm tmpfs defaults 0 0

    /dev/proc/proc proc defaults 0 0

    /dev/sys/sys sysfs defaults 0 0

    LABEL=SWAP-hda7 swap swap defaults 0 0

    /dev/hdc/media/cdrecorder auto users,exec,noauto,managed 0 0

    第一字段:设备名,在这里表示是文件系统。有时我们把加载文件系统也说成加载分区。在这个字段中也可以用分区标签。在例子中/LABEL=/1就是Fedora系统安装分区的标签,至于是在哪个分区,可以用df-lh来查看。

    [root@localhost tux1]#df-lh

    Filesystem容量已用可用已用%加载点

    /dev/hda811G 8.5G 1.9G 83%/

    /dev/shm236M 0 236M 0% /dev/shm

    /dev/hda1016G 6.9G 8.3G 46% /mnt/hda10

    LABEL=/1是/dev/hda8的标签。对于ext3和ext2文件系统,可以用e2label来设置硬盘分区的标签。

    e2label device[newlabel]

    比如我们想把文件系统为ext3的分区/dev/hda5的标签设备为/5,我们应该执行如下的命令:

    #e2label/dev/hda5/5

    #mkdir/mnt/hda5注:创建加载/dev/hda5分区的目录。

    #chmod 777/mnt/hda5注:打开权限,所有用户可读可写可执行。

    然后要改/etc/fstab中加一行

    /5/mnt/hda5 ext3 defaults 0 0

    如果是reiserfs文件系统,我们应该用

    #reiserfstune-l标签设备

    举例:比如为reiserfs文件系统/dev/hda10设置标签为/10。

    #reiserfstune-l/10/dev/hda10

    在/etc/fstab中加入一行:

    /10/mnt/hda10 reiserfs defaults 0 0

    警告:请不要在Linux的安装分区(也就是Linux系统/所在的分区)实践,会导致Linux系统崩溃。如果想实践,请在其他分区测试。

    第二字段:文件系统的加载点。

    第三字段:文件系统类型。

    第四字段:mount命令的选项,和mount中的-o同理。defaults包括这些选项:rw,suid,dev,exec,auto,nouser,async。通过实践,这个默认的还能满足我们的需要。至于这些选项的意思,请参看man mount。

    第五字段:表示文件系统是否需要dump备份,是真假关系。1是需要,0是不需要。

    第六字段:是否在系统启动时,通过fsck磁盘检测工具来检查文件系统,1是需要,0是不需要,2是跳过。

    基于这些认识,比如要开机自动加载/dev/hda5,可以如下:

    #mkdir/mnt/hda5/注:先创建一个加载目录。

    #chmod 777/mnt/hda5/注:设置/mnt/hda5的权限为任何用户可写可读可执行。这样所有的用户都能够写入。

    然后在/etc/fstab中加如下的一行:

    /dev/hda5/mnt/hda5 reiserfs defaults 0 0

    这样重启机器就能看到效果了。

    对文件系统进行扫描fsck。

    在Linux中有类似Windows中的scandisk的工具fsck,不过fsck可不仅仅是扫描,还能修正文件系统的一些问题。值得注意的是fsck扫描文件系统时一定要在单用户模式、修复模式或把设备umount后进行。

    警告:如果扫描正在运行中的系统,会造成系统文件损坏。如果您的系统是正常,请不要用扫描工具,它可能会把您的系统搞坏掉,fsck运行是有危险的。

    以Fedora为例,文件系统扫描工具有fsck、fsck.ext2、fsck.jfs、fsck.msdos、fsck.vfat、fsck.ext3、fsck.reiserfs(reiserfsck)。其中fsck默认支持文件系统ext2,如果想支持ext3文件系统的扫描,应该加-j参数,最好是应该根据不同的文件系统来调用不同的扫描工具,比如fsck.ext2,fsck.jfs,fsck.msdos,fsck.ext3,fsck.reiserfs(reiserfsck)等。我们也可以根据自己的文件系统选择不同的扫描工具。

    对于fsck.ext2和fsck.ext3常用的几个选项:

    -p自动修复文件系统存在的问题。

    -y如果文件系统有问题,会跳出提示是否修复,如果修复请按y。此选项的作用是对所有的问题回答“yes”。

    -c对文件系统进行坏块检查,并添加到坏块列表中。这是一个极为漫长的过程。

    -n不对文件系统做任何改变,只是扫描,以检测是否有问题。

    举例:比如/dev/hda6(文件系统是ext3的),如果要进行扫描并自动修复。

    #fsck.ext3-p/dev/hda6

    注意:虽然有时fsck在不加参数的情况下能识别不同的文件系统,但是针对不同文件系统,最好用相应的工具,对于不同工具的最为详细的参数,请参看—help或者man。

    (2)用户配额

    ● 配额限制(quota)是用来限制用户或组使用数据块或inode的数量的。配额限制是针对文件系统的。

    ● 使用mount命令来装载一个文件系统,使用umount命令来卸载一个文件系统。

    硬盘配额限制有两个限制,软限制(soft quota)和硬限制(hard quota)。当用户超过软限制时,系统会给出警告,而超过了硬限制,就会出错。此外,还有一个宽容期限(grace period),在用户对硬盘使用超过了软限制时,就会自动计算时间,如果超过软限制的时间并且超过宽容期限,则用户收到的就不再是警告而是错误了。

    在Linux上实现配额限制(quota),不需要daemon程序。对一个文件系统来说,都可以为每一个用户设置配额,这个配额存放在这个文件系统的根目录下,名字为quota.user和quota.groups。另外,在装载文件系统时要激活配额,可以在mount时指定usrquota和grpquota参数,自动加载的则要在/etc/fstab中指定。在装载上文件系统后,还需要使用quotaon命令加载配额检查。

    所以,要对一个文件系统使用硬盘配额,需要以下几步:

    1.修改/etc/fstab。在加载参数里指定usrquota和qrpquota

    2.创建两个配额文件。

    #touch/quota.user/quota.group

    #chomd 600/quota.user/quota.group

    3.重加载这个文件系统。

    #mount-o remount,usrquota,grpquota/

    4.计算当前配额使用情况。#quotacheck/

    5.激活配额。#quotaon/

    要配置配额,使用edquota命令。edquota命令会启动$EDITOR中指定的编辑器(通常为vi)来编程配置文件。对用户进行配额设置:edquota-u username。对组进行配额设置:edquota-g groupname。设置宽容期限:edquota-t。复制用户间的配额配置:edquota-p tux1-u tux2 tux3 tux4。

    使用quota命令可以查看用户配额的使用情况。普通用户使用这条命令可以查看自己配额的使用情况。repquota命令则是只有root用户可以使用的命令,作用是生成所有用户和组配额使用情况的报告。

    文件、目录、链接、权限、目录结构、文件系统

    1.Linux中文件都有哪些类型?

    2.Linux中目录项与inode有什么关系?解释一下硬链接和符号链接的异同。

    3.Linux中是如何限制文件的权限的?

    4.Linux中根目录下有哪些目录?它们主要是用来放什么东西的?

    5.Linux支持哪些文件系统?