linux文件系统inode与软链接硬链接

http://blog.csdn.net/lmh12506/article/details/7274943

http://blog.csdn.net/yangcs2009/article/details/39639749#t8

http://www.cnblogs.com/younes/archive/2009/12/03/1616306.html

inode 

  Linux的文件系统(硬盘)分为2部分:inode table 与 data area。inode table上有许多的inode, 每个inode分别记录一个档案的属性与这个档案分布在哪些datablock上(也就是我们说的指针)。inode有两个功能:记录档案属性和指针。data area由很多datablock构成,data area记录文件的真实内容。 
 

硬链接

Hard Link 只是在某个目录下新增一个该档案的关连数据而已!
 
1.举个例子来说,我的 /home/vbird/crontab 为一个 hard link 的档案,他连结到 /etc/crontab 这个档案,也就是说,其实 /home/vbird/crontab 与 /etc/crontab是同一个档案,只是有两个目录( /etc 与 /home/vbird )记录了 crontab 这个档案的关连数据罢了!也就是说,我由 /etc 的 Block 所记录的关连数据可知道 crontab 的 inode 放置在 A 处,而由 /home/vbird 这个目录下的关连数据,contab 同样也指到 A处的 inode! 所以,crontab 这个档案的 inode 与 block 都没有改变,有的只是有两个目录记录了关连数据.
 
2.使用 hard link 设定连结文件时,磁盘的空间与 inode 的数目都不会改变!由上面的说明来看,我们可以知道, hard link 只是在某个目录下的 block 多写入一个关连数据,所以当然不会用掉 inode 与磁盘空间。
 
3.当我们修改其中一个文件的内容时,互为硬链接的文件的内容也会跟着变化。如果我们删除互为硬链接关系的某个文件时,其它的文件并不受影响.
 
4.由于 hard link 是在同一个 partition 上面进行数据关连的建立,所以 hard link 是有限制的:
  a. 不能跨 Filesystem.
  b. 不能 link 目录。

5.假设已经建立若干me.txt的硬链接:ln me.txt hard_me.txt ……。
                 之后运行 ls -l: -rw-r--r-- 3 younes younes   40 2009-12-03 16:36 hard_me.txt ,其中橙色底纹的数字代表指向该文件硬链接的数目。
 

软链接

 
1. 软链接也叫符号链接,他和硬链接有所不同,软链接文件只是其源文件的一个标记。当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但我们却不能查看软链接文件的内容了.
 
2. Symbolic Link 与 Windows 的快捷方式可以给他划上等号,由 Symbolic link 所建立的档案为一个独立的新的档案,所以会占用调inode与block。
 

软硬链接的区别

 
(1)软连接可以 跨文件系统 ,硬连接不可以 。实践的方法就是用共享文件把windows下的 aa.txt文本文档连接到linux下/root目录 下 bb,cc . ln -s aa.txt /root/bb 连接成功 。ln             aa.txt /root/bb 失败 。
(2)关于 I节点的问题 。硬连接不管有多少个,都指向的是同一个I节点,会把 结点连接数增加,只要结点的连接数不是 0,文件就一直存在 ,不管你删除的是源文件还是连接的文件。只         要有一个存在,文件就 存在(其实也不分什么 源文件连接文件的 ,因为他们指向都是同一个 I节点)。 当你修改源文件或者连接文件任何一个的时候,其他的 文件都会做同步的修           改 。软链接不直接使用i节点号作为文件指针, 而是使用文件路径名作为指针。所以删除连接文件对源文件无影响,但是删除源文件,连接文件就会找不到要指向的文件。软链接有自           己的inode, 并在磁盘上有一小片空间存放路径名。
(3)软连接可以对一个不存在的文件名进行连接 。
(4)软连接可以对目录进行连接。
 
备注:I节点 :它是UNIX内部用于描述文件特性的数据结构。我们通常称I节点为文件索引结点(信息结点)。i节点含有关于文件的大部分的重要信 息,包括文件数据块在磁盘上的地址。每一         个I节点有它自己的标志号,我们称为文件顺序号。I节点包含的信息 :1.文件类型  2.文件属主关系  3.文件的访问权限  4.文件的时间截 。
 
     硬连接指通过索引节点来进行的连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index )。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要的文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件才会被真正删除。
软链接文件有点类似于Windows的快捷方式。它实际上是特殊文件的一种。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
软链接是另一个文件,作用可以理解为一个指针,作用在这个文件上的操作除了删除都直接转向实际指向文件,由于是一个真实的文件所以占用磁盘空间 。硬链接可以认为不是一个文件,它只是实际文件的一个别名,它的作用是防止真实文件被误操作,给一个文件建立硬链接后,他们互为别名,删除其中任一个,只会删除该别名,实际文件并不会被删除。由于只是别名没有任何其他信息,所以并不占用原始文件大小的磁盘空间。

目前,UNIX的文件系统有很多种实现,例如UFS(基于BSD的UNIX文件系统)、ext3、ext4、ZFS和Reiserfs等等。

不论哪一种文件系统,总是需要存储数据。硬盘的最小存储单位是扇区,数据所存储的最小单位则不是扇区,因为用扇区来存储效率就太低了。一个扇区只有512字节,而磁头是一个扇区一个扇区地读取,也就是说,如果文件是10MB,那么为了读这个文件,磁头必须要进行读取20480次。这样效率是极其低下的。



逻辑块

为了提高效率,就有了逻辑块(Block)的概念,也可以叫做数据块。逻辑块是在分区进行文件系统的格式化时所指定的“最小存储单位”,这个最小存储单位是以扇区为基础的,所以逻辑块的大小总是扇区的2的n次方倍。此时,磁头可以一次读取一个块,这样效率可就高了!

逻辑块的规划是很有学问的,并不是越大越好,因为一个逻辑块最多也只能容纳一个文件(在Linux的ext2中),所以如果逻辑块被规划的太大,那么会很浪费磁盘空间。举个例子,如果一个逻辑块为4KB,而有一个文件只有0.1KB大小,而这个小文件仍然要占用一个逻辑块,因此就会浪费3.9KB的空间。

所以,在规划磁盘时,需要考虑到主机的用途。比如BBS主机,由于文章短小,文件较小,那么逻辑块分配的小一点好。如果主机主要用在存储大容量的文件,那么考虑到使用效率,还是逻辑块大一点好!


磁盘的组成


我们可以把一个磁盘分成一个或多个分区。每个分区可以包含一个文件系统。

我们下面要描述一个分层细化的过程,请您集中精力来随我思考:

1 磁盘是由一个一个分区组成的,即磁盘=分区+分区+分区…

2 每一个分区内都有一个文件系统,且一个分区内有且仅有一个文件系统。

3 每个分区内都依次包含这些内容:自举块(也叫引导块),超级块,柱面组0,柱面组1,…柱面组n。即分区=自举块+超级块+柱面组(若干)

4 每个柱面组又包括了这些内容:超级块副本,配置信息,i节点图(记录哪些i节点可用),块位图(记录哪些块是否可用),i节点(许多),数据块(也叫逻辑块)

好了,你应该可以根据1,2,3,4在脑海里构造出一张分层图了,如果你把它画出来,对你记忆i节点的概念会更有好处。

超级块

超级块(superblock)的作用是存储文件系统的大小、空的和填满的块,以及它们各自的总数和其他诸如此类的信息。要使用一个分区来进行数据访问,那么第一个要访问的就是超级块。所以,如果超级块坏了,那磁盘也就基本没救了。

i节点

下面要讲到i节点,就不能不提提Linux的安全性。由于Linux操作系统是一个多用户、多任务的环境,为了保护每个用户所拥有数据的隐密性,就将每个文件分成了两个部分来存储:一个是文件的属性,另一个则是文件的内容。

i节点(iinode)就是用来存储文件的属性的;而数据块(逻辑块)是用来存储文件的内容的!

如果要格式化一个分区,就要指定inode的大小和块的大小才行!更通俗的说,一个ext2文件系统是一定要包括inode表与块区域这两个部分的!

至于块,我在前面提到过,它也叫逻辑块,还叫数据块,它是数据存储的最小单位。

而inode“记录文件属性以及文件内容放置在哪一个块内”的信息,更通俗的说,inode除了包含文件的属性之外,还包括一个指针,这个指针就指向文件内容放置的数据块的位置,好让操作系统可以方便的去读取文件内容。

在inode中一般包括了这样一些文件属性信息:

  • 文件的拥有者和所属用户组;
  • 文件的访问权限设定;
  • 文件的类型;
  • 文件的访问、修改等时间
  • 文件的大小;
  • 文件的各种标志,如SUID和SGID等;
  • 指向文件内容数据块的指针。

一个inode的大小通常为128字节。(在ext4中这个知识将被颠覆,ext4中的inode大小将扩展到256字节)

好,下面就来看看到底我们怎么利用inode来管理文件呢?


Linux VFS  文件系统分类

Linux 有着极其丰富的文件系统,大体上可分如下几类:

  1. 网络文件系统,如 nfs、cifs 等;
  2. 磁盘文件系统,如 ext4、ext3 等;
  3. 特殊文件系统,如 proc、sysfs、ramfs、tmpfs 等。

实现以上这些文件系统并在 Linux 下共存的基础就是 Linux VFS(Virtual File System 又称 Virtual Filesystem Switch),即虚拟文件系统。VFS 作为一个通用的文件系统,抽象了文件系统的四个基本概念:文件、目录项 (dentry)、索引节点 (inode) 及挂载点,其在内核中为用户空间层的文件系统提供了相关的接口(见图 3.所示 VFS 在 Linux 系统的架构)。VFS 实现了 open()、read() 等系统调并使得 cp 等用户空间程序可跨文件系统。VFS 真正实现了上述内容中:在Linux中除进程之外一切皆是文件。

图 3. VFS 在系统中的架构
图 3. VFS 在系统中的架构

Linux VFS 存在四个基本对象:超级块对象 (superblock object)、索引节点对象 (inode object)、目录项对象 (dentry object) 及文件对象 (file object)。超级块对象代表一个已安装的文件系统;索引节点对象代表一个文件;目录项对象代表一个目录项,如设备文件 event5 在路径 /dev/input/event5 中,其存在四个目录项对象:/ 、dev/ 、input/ 及 event5。文件对象代表由进程打开的文件。这四个对象与进程及磁盘文件间的关系如图 4. 所示,其中 d_inode 即为硬链接。为文件路径的快速解析,Linux VFS 设计了目录项缓存(Directory Entry Cache,即 dcache)。

图 4. VFS 的对象之间的处理
图 4. VFS 的对象之间的处理

Linux 文件系统中的 inode

在 Linux 中,索引节点结构存在于系统内存及磁盘,其可区分成 VFS inode 与实际文件系统的 inode。VFS inode 作为实际文件系统中 inode 的抽象,定义了结构体 inode 与其相关的操作 inode_operations(见内核源码 include/linux/fs.h)。

清单 10. VFS 中的 inode 与 inode_operations 结构体
[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. struct inode {   
  2.    ...   
  3.    const struct inode_operations   *i_op; // 索引节点操作  
  4.    unsigned long           i_ino;      // 索引节点号  
  5.    atomic_t                i_count;    // 引用计数器  
  6.    unsigned int            i_nlink;    // 硬链接数目  
  7.    ...   
  8. }   
  9.   
  10. struct inode_operations {   
  11.    ...   
  12.    int (*create) (struct inode *,struct dentry *,int, struct nameidata *);   
  13.    int (*link) (struct dentry *,struct inode *,struct dentry *);   
  14.    int (*unlink) (struct inode *,struct dentry *);   
  15.    int (*symlink) (struct inode *,struct dentry *,const char *);   
  16.    int (*mkdir) (struct inode *,struct dentry *,int);   
  17.    int (*rmdir) (struct inode *,struct dentry *);   
  18.    ...   
  19. }  

如清单 10. 所见,每个文件存在两个计数器:i_count 与 i_nlink,即引用计数与硬链接计数。结构体 inode 中的 i_count 用于跟踪文件被访问的数量,而 i_nlink 则是上述使用 ls -l 等命令查看到的文件硬链接数。或者说 i_count 跟踪文件在内存中的情况,而 i_nlink 则是磁盘计数器。当文件被删除时,则 i_nlink 先被设置成 0。文件的这两个计数器使得 Linux 系统升级或程序更新变的容易。系统或程序可在不关闭的情况下(即文件 i_count 不为 0),将新文件以同样的文件名进行替换,新文件有自己的 inode 及 data block,旧文件会在相关进程关闭后被完整的删除。

清单 11. 文件系统 ext4 中的 inode
[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. struct ext4_inode {   
  2.    ...   
  3.    __le32  i_atime;        // 文件内容最后一次访问时间  
  4.    __le32  i_ctime;        // inode 修改时间  
  5.    __le32  i_mtime;        // 文件内容最后一次修改时间  
  6.    __le16  i_links_count;  // 硬链接计数  
  7.    __le32  i_blocks_lo;    // Block 计数  
  8.    __le32  i_block[EXT4_N_BLOCKS];  // 指向具体的 block   
  9.    ...   
  10. };  

清单 11. 展示的是文件系统 ext4 中对 inode 的定义(见内核源码 fs/ext4/ext4.h)。其中三个时间的定义可对应与命令 stat 中查看到三个时间。i_links_count 不仅用于文件的硬链接计数,也用于目录的子目录数跟踪(目录并不显示硬链接数,命令 ls -ld 查看到的是子目录数)。由于文件系统 ext3 对 i_links_count 有限制,其最大数为:32000(该限制在 ext4 中被取消)。尝试在 ext3 文件系统上验证目录子目录及普通文件硬链接最大数可见清单 12. 的错误信息。因此实际文件系统的 inode 之间及与 VFS inode 相较是有差异的。


1.什么是索引节点?
索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。

2. 索引节点与文件的关系
Linux 为每个文件分配一个称为索引节点的号码inode,可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。系统是通过索引节点(而不是文件名)来定位每一个文件。文件系统处理文件所需要的所有信息都放在称为索引节点的数据结构中。文件名可以随时更改,但是索引节点对文件是唯一的,并且随文件的存在而存在。 
一个文件系统允许的inode节点数是有限的,如果文件数量太多,即使每个文件都是0字节的空文件,系统最终也会因为节点空间耗尽而不能再创建文件。所以当发现不能建立文件时首先要考虑硬盘数据区是否还有空间(可通过du命令),其次还得检查节点空间。 Linux之所以能支持多种文件系统,其实是由于Linux提供了一个虚拟文件系统VFS,VFS作为实际文件系统的上层软件,掩盖了实际文件系统底层的具体结构差异,为系统访问位于不同文件系统的文件提供了一个统一的接口。实际上许多文件系统并不具备inode结构,其目录结构也和以上的讨论不同,但通过VFS,系统均为其提供了虚拟一致的inode和目录项结构。所以,'ls -il'命令实际显示的inode应该是VFS inode,也就是说,inode是存在于内存中的数据结构,而不一定是实际的硬盘结构。但为Linux量身定做的ext2文件系统具备实际的inode 和连接型目录项结构.有一个inode, 就可以有一个文件, fs中有多少inode,就可以有多少file. inode又有单字节和多字节之分(由文件系统的类型和单个文件的大小决定). inode在建fs时同时开出, 开多少? 这由nbpi(平均每节点管理多大文件)和fs的大小决定. fs建好后,想增加inode,只能扩fs, 而且nbpi无法改变. 反之, 每当扩fs, inode也相应增加.因此, 由于jfs能管理的inode数为16M(2的24次方), 当nbpi确定时, fs的最大值也定了.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值