Linux运维实战之文件系统、链接文件(2)

6、ext文件系统中的目录:

从上面的Inode-table中可以看到,该表中存储的数据是文件的元数据(即描述文件属性的数据,例如文件类型、文件的时间戳、与文件权限相关的描述信息等),但并没有文件名,那文件名存储在什么地方呢?

文件名是保存在目录中的哈!下面重点说说目录。

文件系统要管理众多的文件,首要的问题是要把文件有条不紊地组织起来。每个文件都有目录项,目录是文件路径的映射(注意:目录并不是文件的容器),全部目录项组成目录文件,如下图所示:

image

可以看出,Linux系统的文件管理机构将文件属性从目录项分离出来了哈!分离出来的好处有两点:

(1)为文件的共享提供了方便:

若文件名不与文件属性信息分离,则指向同一个文件的多个目录项均应包含同一个文件的属性信息,也就是说,多个目录项中存有同一个文件属性信息的多个副本。这样显然造成存储空间的浪费哈!若文件属性分离,则指向同一个文件的多个目录项中只保存相同的Inode号,而文件属性信息只有一份,因此节省了存储空间。共享文件越多节省空间就越明显。增加共享链接或撤销共享链接也相当便利(后面我们会说到Linux系统中文件链接的知识哈)。

(2)减少文件“按名查找”引起的I/O传输:

假设外设为磁盘,每个磁盘块512字节。对Linux来说,若目录项含有文件属性,目录项占78个字节。若目录项不含有文件属性,目录项占16个字节。设某目录文件共有128个目录项,则前者共有约20个盘块,后者仅需4个盘块。由于每次启动I/O只传输一个盘块,所以后者查找一个目录项启动该盘的次数大大减少。

7、Linux系统树型目录组织结构:

再来考虑一个问题:Linux系统为什么要把目录组织成树状结构呢?

层次化结构能够大大减小查找的复杂度-->如果系统内文件很多,则目录文件会变得很长,要查找某个文件将耗费太多的时间(例如:我们要查找一个文件,但不知道它存储在什么地方,此时我们就需要从“/”下开始查找,那肯定是非常耗时间哈。若此时我们知道这个文件保存在"/var/log/” 下,那查找起来肯定快的多哈!)。树是一种层次化的数据结构,它由根结点,子结点以及子子结点组成。Linux借用树状结构来组织它的文件目录,形成树型目录组织。树型目录组织是多级目录组织的一种形式。Linux文件系统的目录组织结构如下图所示:

image

8、目录树上的搜索与操作:

(1)从目录的树根开始,经过各级子目录,最终到达数据文件名,才能对数据文件进行访问

(2)由根、各级目录名、数据文件名连接起来的字符串成为“绝对路径名”

(3)若用户当前正在某目录上进行操作,那么称其为“当前目录”

(4)给定路径名,从目录树上找到文件的Inode号的过程称为“文件名搜索”

Tips:为了加速文件查找,Linux通常采用缓存的机制(第一次查找文件时需要按顺序查找,之后就把结果缓存到buffer中)。 

二、Linux系统文件管理相关操作:

1、删除文件:

(1)将要删除的文件的Inode归类为空闲Inode

(2)将对应的磁盘块归为空闲块(不会对磁盘块做任何操作)

(3)完全删除文件(360文件粉碎机的原理):将要删除的文件所对应的磁盘块用0填充

结论:从上面可知:删除文件的速度会非常快。

2、复制文件:文件复制的过程是创建一个与原文件一模一样(Inode、磁盘块均相同)的文件

3、移动文件:

不同分区之间的文件移动:创建新文件(创建全新的Inode和磁盘块),删除老文件(把文件的Inode清空归类为空闲Inode,把对应的磁盘块归类为空闲块)

同一个分区里的文件移动: 创建一个新的Inode指向源文件的磁盘块;将源文件的Inode清空归类为空闲Inode。

三、ext文件系统的扩展属性:

lsattr:列出文件的扩展属性

image

chattr:(+/-/=)赋予相关扩展属性

-i:真正只读

-a:仅允许追加内容

-c:自动压缩(类似于NTFS的压缩功能)

image

 

四、链接文件:

1、硬链接:指向同一个Inode的两个路径

【语法】

如何创建硬链接文件: ln SRC_FILE LINK_FILE

ls –l 命令的第二段显示出的数字指文件被硬链接的次数,举例如下:

image

【特性】

不能跨分区使用;

不能对目录创建硬链接(否则会产生循环引用);

例如目录A-->B,B-->C,C-->A,因此出现死循环。

删除原文件路径,不影响链接文件的使用;

所有文件指向同一个inode,因此,为它们是同一个文件;

【举例】

#----举例说明硬链接的特性----# [root@CentOS ~]# mkdir -pv LinkFileTest #创建一个实验用目录 mkdir: created directory `LinkFileTest' [root@Centos ~]# cd LinkFileTest/ [root@Centos LinkFileTest]# cp /etc/fstab . #复制fstab文件到实验目录 [root@Centos LinkFileTest]# ln fstab fstab_bak #为fstab文件创建硬链接 [root@Centos LinkFileTest]# ls -l total 8 -rw-r--r--. 2 root root 924 Oct 8 20:45 fstab -rw-r--r--. 2 root root 924 Oct 8 20:45 fstab_bak #可以看到两个文件的大小及其它相关属性都是一样的 [root@Centos LinkFileTest]# ls -i #该命令可以查看文件的Inode号 396473 fstab 396473 fstab_bak #可以看出原文件与其硬链接文件的Inode号完全一样 #尝试为目录创建硬链接: [root@Centos LinkFileTest]# ln /tmp/ /hello ln: `/tmp/': hard link not allowed for directory #出错了哈:不允许为目录创建硬链接

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/17277.html