Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300744
  • 博文数量: 33
  • 博客积分: 132
  • 博客等级: 入伍新兵
  • 技术积分: 1002
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-16 22:24
个人简介

学习计算机科学与技术专业,喜欢计算机,喜欢linux,喜欢编程

文章存档

2014年(7)

2013年(12)

2012年(14)

分类: LINUX

2013-06-20 13:16:05

4、怎样根据文件名查找文件

大家都知道,linux系统内部不使用文件名,而使用 inode来识别文件。但是呢,我们平常的确是用文件进行操作的。那么,既然系统不支持,我们是怎么用的呢?

其实在文件系统中有一个结构体专门是将用户态的文件名转化为内核态的 inode。这样的话我们在用户态就可以方便的用文件名进行操作了,而在内核态也没有影响用 inode进行操作的本质。这个结构体是:

  1. #define EXT2_NAME_LEN 255
  2.                                                                                                                                                                                                     
  3. struct ext2_dir_entry_2 {
  4.    __u32 inode; /* Inode number */
  5.    __u16 rec_len; /* Directory entry length */
  6.    __u8 name_len; /* Name length */
  7.    __u8 file_type;
  8.    char name[EXT2_NAME_LEN]; /* File name */
  9. };


它实现查找的过程可以归纳为三步: 

  1. 找到根目录的 inode,因为规定它是固定放在第二个 inode中,因此还是很容易找到的。

  2. 根据上一步的 inode提示,可以找到其数据块,从数据块中读出该目录下的文件列表,然后找到下一个目录项的 inode。

  3. 循环执行第二步,直到找到最后一个目录项,再根据其 inode的记录就可以找到其数据块的内容了。     

顺便提一下,上面结构体的 name[EXT2_NAME_LEN] 就是记录文件名的,它的长度已经宏定义为 255个字节,也就是说我们的文件名的长度限制是不能超过 255个字节。 

5、有关挂载  

首先,挂载点一定是一个目录,该目录是进入你所挂载那个设备的入口。挂载的命令式mount,卸载的命令式 umount。

                                    mount  挂载的设备  挂载的目录

                                                    eg:mount  /dev/sda10 /mnt

                                    umount  卸载的设备   

                                                    eg:umount  /dev/sda10

文件系统要能够只有链接到系统的目录树上才能被访问到。linux文件系统是一个目录树的结构,我们对文件进行的查找都是通过根目录进行的,所以我们必须将所要访问的设备链接到我们的文件系统目录树上,也就是我们文件系统的某个目录上。通过这个目录建立一个入口,访问这个设备,这就是挂载的意义。

6、软链接和硬链接 

                    ln  A  B (创建文件 B,将 B与 A进行硬链接);

                    ln  -s  A  B (创建文件 B,将 B与 A进行软链接);

说明一点,符号链接就是软链接。

硬链接文件有两个限制

  1. 不允许给目录创建硬链接;(因为创建目录的链接的同时会对该目录下的所有文件都创建链接,这会增加文件系统的复杂度,所以为了简单,不允许给目录创建硬链接

  2. 只有在同一个文件系统中的文件之间才能创建链接。(文件格式都不一样        

下面是我创建了一个硬链接和一个软链接,我们可以看到硬链接文件的 inode 是一样的,都是1442003,但是软链接文件的 inode 是 1442004,和源文件的 inode 不一样,这是为什么呢?         

         

现在看看下面的两个图,这两个图是硬链接和软链接的原理图。       

   

第一个图是硬链接的图,我们的源文件是 2 号文件,它在 /etc/crontab目录下放置着,现在给它创建一个硬链接文件 1。它在 /root/crontab 目录下放置着。真正数据的指向是在 real 中放置着。文件 1 和文件 2 都通过指向 real 来进行访问真正的数据内容。文件 1 和文件 2 具有同样的 inode, 文件 1 是文件 2的别名(类似 C++ 中引用的概念)。因此,当我们删除任意一个文件(1 号文件或者 2 号文件)都不影响另外文件对数据的访问,只是链接数减少而已,所以这两个文件是一样的,就像我们既有小名,又有大名一样,无论叫那个名字都是叫我这个人。                            


           

第二个图是软链接的图,和上面一样,我们的源文件是 2 号文件,软链接文件是 1 号文件。我们想通过 1 号文件来进行访问数据的话,要先访问到 2 号文件,那么 1 号文件存储的是 2 号文件的路径,而不是 real。所以可以看出单独的 1 号文件是无法访问到 real 的实际内容的。它是一个单独的文件,所以它有自己的 inode。(类似 windows 中的快捷方式)如果你删除了 2 号文件,那么我们就不能通过 1 号文件访问到数据了。因为 1 号文件是存的 2 号文件的路径,2 号文件都不存在了,就无法访问到数据了。                           

阅读(1959) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~