inode 是什么?

Last updated on 8 months ago

inode 是什么?

文件数据是存放在磁盘上;磁盘最小的单位是 512byte,我们称之为扇区;在与操作系统交互的过程中,操作系统读取磁盘最小粒度并不是一个扇区,而是8个扇区,也就是4k,称之为块;

  • 扇区是设备的最小寻址单元
  • 块是文件系统最小寻址单元

从操作系统的角度来看,磁盘分为了很多个块,文件数据也是存放在块里面; 和其他主流的存储系统一样,也需要元数据,也就是描述这个块的数据,存放块元数据的区域我们称之为 inode!

从那里可以看到?

1
2
3
4
5
6
7
8
9
10
11
12
hrp@ubuntu:~$ stat start.sh 
File: start.sh
Size: 229 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1099124 Links: 1
Access: (0775/-rwxrwxr-x) Uid: ( 1000/ hrp) Gid: ( 1000/ hrp)
Access: 2024-02-06 06:31:40.948950397 -0800
Modify: 2024-01-29 06:21:19.270881895 -0800
Change: 2024-02-02 08:36:20.954486953 -0800
Birth: -
hrp@ubuntu:~$ ls -lh start.sh
-rwxrwxr-x 1 hrp hrp 229 Jan 29 06:21 start.sh
hrp@ubuntu:~$

从ls命令可以看到 start.sh 大小为229个字节,stat 命令可以看到文件的元数据信息,看到Block 为8, 按照上面所说一个block 为512字节,8个为1k,可实际文件才229字节,不到一个扇区,为什么要占用8个呢?那么现在有个问题,文件大小和block数量有什么联系?

刚才前面说了,文件系统中,块是文件系统最小寻址单元,如果是一个扇区一个扇区的来读数据,太慢了,有了block概念,它是按块大小的粒度来读取的,block才是文件存取的最小单位,所以说无论你差距多小的文件,Blocks 数量始终为8;用 dumpe2fs 命令即可看到磁盘上文件系统的Block size,为4k ,刚好就是 8个block;

TODO: 在小文件场景下,岂不是有很多文件碎片?

1
2
3
4
5
6
7
hrp@ubuntu:~$ sudo dumpe2fs /dev/sda1 |more
dumpe2fs 1.44.1 (24-Mar-2018)
...
Inode count: 1310720
Block count: 5242368
...
Block size: 4096

stat 里面的 IO Block又是什么?

顾名思义是 IO 块大小,其实就是文件系统的 块大小

每个inode 大小是?

对于一个裸盘,要是想使用,必须先格式硬盘,然后操作系统根据文件系统的类型(ext3,ext4等)开始进行分区,这个时候会划分 indoe的区域;

分区如下
|— super block —|———–inode block————————|——————data block——————–|

  • 超级块:当文件系统挂载时进入内存
  • 索引节点区:当文件被访问时进入内存

可以用 df -i 看到 磁盘上有多少inode,以及inode 使用情况

1
2
3
4
hrp@ubuntu:~$ df -i /dev/sda1
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 1310720 284361 1026359 22% /
hrp@ubuntu:~$

至于inode的大小,可以使用 dumpe2fs 看到 inode size

1
2
3
4
5
hrp@ubuntu:~$ sudo dumpe2fs -h /dev/sda1 | grep "Inode size"
[sudo] password for hrp:
dumpe2fs 1.44.1 (24-Mar-2018)
Inode size: 256
hrp@ubuntu:~$

每个文件至少有一个node,如果inode 都是使用完了, 是无法创建文件的;

TODO: 那小文件的场景下,就以sda1为例, 创建了1310720个1k的文件,才用了1.28g空间,inode就没了,这个怎么办?

inode 号码

每个inode 都有个序号, ls -i 可以到,第一列为inode 号

1
2
3
hrp@ubuntu:~$ ll -i hello.py 
1099968 -rw-rw-r-- 1 hrp hrp 303 Feb 4 08:12 hello.py
hrp@ubuntu:~$

在Linux中,读一个文件并不直接通过 文件名,而是通过inode 号来索引;

TODO:创建文件时候文件分配哪一个inode号呢?