Linux inode && Fast Directory Travel Method(undone)

时间:2023-03-09 09:08:56
Linux inode && Fast Directory Travel Method(undone)

目录

. Linux inode简介
. Fast Directory Travel Method

1. Linux inode简介

0x1: 磁盘分割原理

字节 -> 扇区(sector)(每个扇区存储512字节) -> 块(block)(最常见的是4KB,即8个连续的sector组成一个block)

. 磁盘的最小存储单位是"扇区"
. 文件存储的最小单位是"块"

0x2: Linux EX2 filesystem

当一个partition(分区)被格式化为ext2文件系统时,就会有inode table和block area这两个区域

. inode table
保存inode,即储存文件元信息的区域
类似于windows中的MBR的概念(主要开机扇区,master boot recoder),即一块硬盘的第0轨上。计算机一开机就会去读取这个区域。由MBR的含义知,若一个硬盘的MBR挂了,这块硬盘就等于挂了
inode 则是记录"该档案的相关属性,以及档案内容放置在哪一个 Block 之内"的信息。简单的说,inode 除了记录档案的属性外,同时还必须要具有指向( pointer )的功能,亦即指向档案内容放置的区块之中,好让操作系统可以正确的去取得档案的内容
我们知道,Linux下所有的设备都被抽象为了文件的统一概念,每一个文件都有对应的inode,里面包含了与该文件有关的一些信息
/*
保存inode元数据的结构体为: struct stat,可以用stat命令,查看某个文件的inode信息:stat example.txt
struct stat
{
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */ /* Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES. */ struct timespec st_atim; /* time of last access */
struct timespec st_mtim; /* time of last modification */
struct timespec st_ctim; /* time of last status change */ #define st_atime st_atim.tv_sec /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
*/ . block area
block是文件系统保存实际数据的最小单位,数据本身的信息就保存在这个区域

Linux inode && Fast Directory Travel Method(undone)

0x3: inode的大小

inode也会消耗硬盘空间,我们知道,inode信息保存在"inode table"中 ,每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令

df -i

aaarticlea/png;base64,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" alt="" />

0x4: inode number

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。实际上,系统内部这个过程分成三步

. 系统找到这个文件名对应的inode号码
. 通过inode号码,获取inode信息
. 根据inode信息,找到文件数据所在的block,读出数据

使用ls -i命令,可以看到文件名对应的inode号码:

ls -i ip.txt.win03

aaarticlea/png;base64,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" alt="" />

0x5: 读取目录文件

Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件
目录文件的结构非常简单,就是一系列目录项(dirent)的列表,即目录遍历本质上是在做目录项(dirent)的遍历。每个目录项,由两部分组成

. 所包含文件的文件名
. 该文件名对应的inode号码

ls -i命令列出整个目录文件,即文件名和inode号码:

ls -i /etc

aaarticlea/png;base64,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" alt="" />

目录文件的读权限(r)和写权限(w),都是针对目录文件本身。由于目录文件内只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而读取inode节点内的信息需要目录文件的执行权限(x)
0x6: 硬链接

一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。在Linux的这种架构设计下,可以实现以下事情

. 用不同的文件名访问同样的内容
. 对文件内容进行修改,会影响到所有文件名
. 删除一个文件名,不影响另一个文件名的访问

这种情况就被称为"硬链接"(hard link)

inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1

反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域

值得注意的是:

创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)

0x7: 软链接
除了硬链接以外,还有一种特殊情况
文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)
这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化
0x8: inode的特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象

. 文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用
. 移动文件或重命名文件,只是改变文件名,不影响inode号码
. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名

Relevant Link:

http://man7.org/linux/man-pages/man2/stat.2.html
http://www.cnblogs.com/kkgreen/archive/2012/03/02/2377794.html
http://www.ruanyifeng.com/blog/2011/12/inode.html

2. Fast Directory Travel Method

Relevant Link:

http://guojing.me/linux-kernel-architecture/posts/dentry-cache/
http://oss.org.cn/kernel-book/ch08/8.3.3.htm
http://blog.csdn.net/cywosp/article/details/21126161

Copyright (c) 2014 LittleHann All rights reserved