Unix/Linux系统中的inode总结

iNode结构

文件系统创建(格式化)时,就把存储区域分为两大连续的存储区域。一个用来保存文件系统对象的元信息数据,这是由inode组成的表,每个inode默认是256字节或者128字节。另一个用来保存“文件系统对象”的内容数据,划分为512字节的扇区,以及由8个扇区组成的4K字节的块。块是读写时的基本单位。一个文件系统的inode的总数是固定的。这限制了该文件系统所能存储的文件系统对象的总数目。典型的实现下,所有inode占用了文件系统1%左右的存储容量。

      iNode的元信息大概包括上述几项。

文件系统中每个“文件系统对象”对应一个“inode”数据,并用一个整数值来辨识。这个整数常被称为inode号码(“i-number”或“inode number”)。由于文件系统的inode表的存储位置、总条目数量都是固定的,因此可以用inode号码去索引查找inode表。

        Inode存储了文件系统对象的一些元信息,如所有者、访问权限(读、写、执行)、类型(是文件还是目录)、内容修改时间、inode修改时间、上次访问时间、对应的文件系统存储块的地址,等等。知道了1个文件的inode号码,就可以在inode元数据中查出文件内容数据的存储地址。

在 Linux 中文件的 inode 中是不记录文件名的,文件名是记录在目录的 block 中。因此在新增/删除/重命名文件的时候,与目录的w权限有关。另一个直观的感受就是,你可以对正在使用的文件改名,换目录,甚至放到废纸篓,都不会影响当前文件的使用,这在 Windows 里是无法想象的。比如你打开个 Word 文件,然后对其进行重命名操作,Windows 会告诉你先给我关闭文件!

        这里我用一个命令查看一个目录的inode具体信息

NAME
       stat - display file or file system status
SYNOPSIS
       stat [OPTION]... FILE...

# stat /data
  File: `/data'
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: 805h/2053d      Inode: 2           Links: 3
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-01-19 05:10:33.652318432 +0800
Modify: 2017-01-19 05:10:32.487325693 +0800
Change: 2017-01-19 05:10:32.487325693 +0800



# stat /data/a
  File: `/data/a'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d      Inode: 13          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-01-19 03:29:26.353328360 +0800
Modify: 2017-01-19 03:29:26.353328360 +0800
Change: 2017-01-19 03:29:26.353328360 +0800

除了上述的命令,还可以使用ls -li来列出一个目录的属性:

$ls -li  /home/wuchong
141494  drwxr-xr-x 18 wuchong wuchong    4096 12月  2  2013 hadoop-1.1.1
1715845 drwxrwxr-x  2 wuchong wuchong    4096  7月 12 09:07 input
1718481 -rw-rw-r--  1 wuchong wuchong       0  7月 12 16:11 test.txt
1718478 -rw-r--r--  1 root    root    1780292  6月 16 19:04 etc.jar.bz2
……

文件名与目录名是“文件系统对象”便于使用的别名。一个文件系统对象可以有多个别名,但只能有一个inode,并用这个inode来索引文件系统对象的存储位置。

  • inode不包含文件名或目录名的字符串,只包含文件或目录的“元信息”。

  • Unix的文件系统的目录也是一种文件。打开目录,实际上就是读取“目录文件”。目录文件的结构(在block中存放的)是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件或目录的名字,以及该文件或目录名对应的inode号码。

  • 文件系统中的一个文件是指存放在其所属目录的“目录文件”中的一个目录项,其所对应的inode的类别为“文件”;文件系统中的一个目录是指存放在其“父目录文件”中的一个目录项,其所对应的inode的类别为“目录”。可见,多个“文件”可以对应同一个inode;多个“目录”可以对应同一个inode。

  • 文件系统中如果两个文件或者两个目录具有相同的inode号码,那么就称它们是“硬链接”关系。实际上都是这个inode的别名。换句话说,一个inode对应的所有文件(或目录)中的每一个,都对应着文件系统某个“目录文件”中唯一的一个目录项。

  • 创建一个目录时,实际做了3件事:在其“父目录文件”中增加一个条目(从父目录可以找到该目录及inode号);分配一个inode(用于找到目录文件存放位置);再分配一个存储块,用来保存当前被创建目录包含的文件与子目录。被创建的“目录文件”中自动生成两个子目录的条目,名称分别是:“.”和“..”。前者与该目录具有相同的inode号码,因此是该目录的一个“硬链接”。后者的inode号码就是该目录的父目录的inode号码。所以,任何一个目录的"硬链接"总数,总是等于它的子目录总数(含隐藏目录)加2。即每个“子目录文件”中的“..”条目,加上它自身的“目录文件”中的“.”条目,再加上“父目录文件”中的对应该目录的条目。

  • 通过文件名打开文件,实际上是分成三步实现:首先,操作系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

    当我们读取一个文件时,实际上是在目录中找到了这个文件的 inode 编号,然后根据 inode 中的 block 指针,把各个 block 数据块组合起来,放入内存供进一步的处理。当我们写入一个文件时,是分配一个空白inode给该文件,将其inode编号记入该文件所属的目录,然后选取空白的数据块,让inode的指针指像这些数据块,并放入内存中的数据。

还有一个问题: 为什么删除比复制快?

删除的过程是我开始的时候以为是删除inode。其实应该是释放占据的inode的信息。而复制。是生成新的inode。block也发生变化。

为什么说删除是释放了inode值呢。因为,在系统创建文件系统的时候,inode表和block就已经存在了。就好比:你去洗澡。你有个柜子的钥匙,你有几号柜子的钥匙(inode值)。你就可以使用那个柜子(block)。当你洗完了,你交出钥匙(释放inode值)。管理人员不关心:你曾使用过的柜子(block)。但是,还会有另一位顾客使用你曾使用过度这个柜子钥匙(占用你释放的inode值)。占用你曾使用过的柜子(block)。

之所以说是释放不说删除:因为那个inode本身就存在,不是我们创建的。我们只是使用带有inode数值对应位置的磁盘空间(block块)。所以用释放更加准确。

这样会产生一个问题:文件系统可能会用尽inode。这导致文件系统还有空闲的存储空间,但已经没有空闲的inode可供使用了。例如,一个电子邮件服务器可能会被大量的小文件用尽所有inode,但是却没有填满文件存储空间。这是可以释放inode(rm ) 也可以利用其余目录 的剩余空间。

硬链接与软链接

当文件出现在一个目录文件中时,我们就把文件接入到文件系统中(在目录中写入该文件的文件名和 inode 号),我们称建立一个到文件的硬链接(hard link)。一个文件允许出现在多个目录中,这样,它就有多个硬链接。当硬链接的数目(link count)降为0时,文件会被 Linux 删除。所以很多时候,unlink 与 remove 在 Linux 操作系统中是一个意思。引入硬链接的目的是为了“安全”,如果你将任何一个“文件名”删除,其实 inode 与 block 都还是存在的。此时可以通过另一个“文件名”来读取到正确的文件数据。此外,不论你使用哪个“文件名”来编辑,最终的结果都会写入到相同的 inode 与 block 中,因此均能进行数据的修改。

至于软链接(soft link),其实就是 Windows 上的快捷方式。基本上,软链接就是在创建一个新的独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。由于只是利用文件来作为指向的操作,所以,当源文件被删除后,软链接的文件会打不开。由于软链接(soft link)的广泛使用不会影响 link count,而且可以跨越文件系统,现在较少手动建立硬连接。

创建硬链接与软链接使用 ln 命令即可。

$ln [-s] 源文件 目标文件
-s : 如果不加任何参数就是硬链接,加上 -s 就是软链接

~$ln -s /etc/crontab .    
~$ln /etc/crontab crontab2
~$ ll -i /etc/crontab ~/crontab ~/crontab2
1310870 -rw-r--r-- 2 root    root    722  6月 15  2012 /etc/crontab

1310870 -rw-r--r-- 2 root    root    722  6月 15  2012 /home/wuchong/crontab2
1718696 lrwxrwxrwx 1 wuchong wuchong  12  7月 12 16:42 /home/wuchong/crontab -> /etc/crontab

可以看到硬链接文件的 inode 是同一个,并且连接数变成了 2。而软链接是一个新的文件,拥有自己的 inode 号。

参考:

http://wuchong.me/blog/2014/07/21/linux-file-manage/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值