※部分内容得先看前一篇:扇区与块(sectors,block)
文件的实际数据是写入block的,但文件的元数据呢(如创建者,大小,日期等,但除了文件名),这些都是写入一个叫inode的东西。简单点就是一个文件一个inode。
硬盘格式化时文件系统会将硬盘分成数据区和inode区(inode table),并且可以指定每多少KB分配一个inode之类的。
# tune2fs -l /dev/cciss/c0d0p5
Inode count: 29097984
Block count: 29095715
Inode size: 128
可以看到一个inode大小为128byte,及inode和block的数量。
所以这里有一点要注意,如果你无法创建文件,可能是空间满了(block用光了),也可能是inode用光了。
特别是如果你有大堆小文件,再小的文件也要消耗inode。但如果你都是大文件,那inode太多其实也浪费了硬盘空间,毕竟一个inode也要128bye呢。
所以格式化时要先清楚自己主要存储的是什么样的文件,来权衡inode的数量。
# touch 1.txt
当建一个空文件,通过df -i可以发现可用inode数的确-1了。
# mkdir 1
当建一个文件夹时,通过df -i可以发现可用inode数也会-1。
# stat 1.txt
File: `1.txt'
Size: 0 Blocks: 0 IO Block: 4096
Device: 6805h/26629d Inode: 27591990 Links: 1
可以发现,1个空文件不会占用block,但会占用inode。所以一个空文件的实际占用空间是128byte(一个inode的大小)。
再看一个非空文件(大小正好是一个block)
# stat 2.txt
File: `2.txt'
Size: 4096 Blocks: 8 IO Block: 4096
Device: 6805h/26629d Inode: 27591991 Links: 1
注意这里的Blocks: 8不是指8个block,而是8个扇区(1个block)的意思!
再看一个非空文件(大小正好是一个block大小+1)
# stat 3.txt
File: `3.txt'
Size: 4097 Blocks: 16 IO Block: 4096
Device: 6805h/26629d Inode: 27591995 Links: 1
可以发现,这个文件得占16个扇区(2个block)。
再来看一个硬链接
# touch 1.txt
# ln 1.txt 2.txt
# ls -i
2982861 1.txt 2982861 2.txt
可以发现inode号是一样的。
# ls -l
-rw-r--r-- 2 root dba 0 5月 22 11:26 1.txt
-rw-r--r-- 2 root dba 0 5月 22 11:26 2.txt
# stat 1.txt
File: `1.txt'
Size: 0 Blocks: 0 IO Block: 4096
Device: 6805h/26629d Inode: 2982861 Links: 2
# stat 2.txt
File: `2.txt'
Size: 0 Blocks: 0 IO Block: 4096
Device: 6805h/26629d Inode: 2982861 Links: 2
inode号一样,本质就是同一个文件,不过可以发现links数是2。
然后删掉任何一个文件,links数变为1。
再来看看软链接
# touch 1.txt
# ln -s 1.txt 2.txt
# ls -i
2982861 1.txt 2982862 2.txt
可以发现inode号是不一样的。
# ls -l
-rw-r--r-- 1 root dba 0 5月 22 11:28 1.txt
lrwxrwxrwx 1 root dba 5 5月 22 11:28 2.txt -> 1.txt
发现连文件大小都不一样,根本就是两个文件。links数也是各自为1。
最后,如果要读取一个文件比如/tmp/1.txt,简单来说流程是这样的:
打开/找到tmp对应的inode号,然后去inode table中根据这个inode号得到相关的块信息,然后读取,再打开tmp,查找1.txt得到相应的inode号……
PS:/的inode号是2
inode
最新推荐文章于 2023-03-11 00:21:34 发布