inode table
是
data area
的索引表
.
Inode
分内存中的
inode
和文件系统中的
inode
,我们这说的是文件系统中的
inode
。
1.linux FS
可以简单分成
inode table
与
data area
两部份。
inode table
上有许多的
inode,
每个
inode
分别记录一个档案的属性与这个档案分布在哪些
datablock
上
(
也就是我们说的指针
)
。
inode
两个功能:记录档案属性和指针
2.inode table
中红色区域即
inode size
,是
128Byte
,在
liunx
系统上通过命令我们可以看到,系统就是这么定义的。
Inode size
是指分配给一个
inode
来记录文档属性的磁盘块的大小。
dumpe2fs -h /dev/hda6 | grep node
Inode size: 128
3.data ares
中紫色的区域
block size
:这就是我们一般概念上的磁盘块。这块区域是我们用来存放我们的数据的地方。
4.
还有一个逻辑上的概念:是指
FS
中每分配
2048 byte
给
data area,
就分配一个
inode
。但是一个
inode
就并不是一定就用掉
2048 byte,
也不是说
files allocation
的最小单位是
2048 byte,
它仅仅只是代表
filesystem
中
inode table/data area
分配空间的比例是
128/2048
也就是
1/16
。
mkfs.ext3 -i 2048
这个
-i
参数就是我们所说的逻辑概念,它的大小决定
inode count
的大小,
redhat5
默认
-i
最小为可设置为
1024.
5.
网上很多介绍关于
inode
的文章,把
inode size
的定义搞错了,他们把
-i
参数这个值或
block size
解读为
inode size
所以很多文章令人费解。
6.inode
参数是可以通过
mkfs.ext3
命令改变的:
mkfs.ext3 -i 2048 -b 8192 -f 1024 /dev/sdb2
-i 2048
更改
inode
每
2KB
创建一个
-b 8192
设置
block size
的大小为
8kB
-f 1024
设置
fragments
的大小为
1KB
mkfs.ext3 �CN 2939495 /dev/sdb2
�CN 2939495
更改
inode count
。
二.更改一个分区
inode
参数的完整操作过程:
1.
卸载硬盘分区:
[root@localhost ~]# umount /dev/hda7
2.
调整
inode
参数
[root@localhost ~]# mkfs.ext3 -i 1024 -b 8192 /dev/hda7
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2048256 inodes, 512064 blocks
25603 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=525250560
63 block groups
8240 blocks per group, 8240 fragments per group
32512 inodes per group
Superblock backups stored on blocks:
8240, 24720, 41200, 57680, 74160, 206000, 222480, 403760
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
3.
修改
/etc/fstab
修改前
[root@localhost ~]# vi /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
LABEL=/opt /opt ext3 defaults 1 2
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
LABEL=/usr /usr ext3 defaults 1 2
LABEL=/var /var ext3 defaults 1 2
LABEL=SWAP-hda8 swap swap defaults 0 0
~
修改后:
[root@localhost ~]# vi /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
/dev/hda7 /opt ext3 defaults 1 2
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
LABEL=/usr /usr ext3 defaults 1 2
LABEL=/var /var ext3 defaults 1 2
LABEL=SWAP-hda8 swap swap defaults 0 0
4.
挂载分区
mount -a
5.
完成后
参数
-i
最小值是
1024
,这个值的大小决定
inode count
的大小,对应关系:
i=2048 Inode count:1025024
i=1024 Inode count:2048256
inode size
的值在这是没有变化的,这也可以证明我上面定义的
inode size
。
让我们更加清晰的这几个定义之间的关系。
Inode size
Block size
Inode conut
[root@localhost ~]# dumpe2fs -h /dev/hda7
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 440696ad-80e7-4810-8648-a9efda177ea9
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal resize_inode dir_index filetype needs_recovery sparse_super
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 2048256
Block count: 1024128
Reserved block count: 51206
Free blocks: 873767
Free inodes: 2048245
First block: 0
Block size: 2048
Fragment size: 2048
Reserved GDT blocks: 512
Blocks per group: 8176
Fragments per group: 8176
Inodes per group: 16256
Inode blocks per group: 1016
Filesystem created: Fri Jul 11 18:10:33 2008
Last mount time: Fri Jul 11 18:11:02 2008
Last write time: Fri Jul 11 18:11:02 2008
Mount count: 1
Maximum mount count: 34
Last checked: Fri Jul 11 18:10:33 2008
Check interval: 15552000 (6 months)
Next check after: Wed Jan 7 18:10:33 2009
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Journal inode: 8
Default directory hash: tea
Directory Hash Seed: ad1b7c40-6978-49e9-82f6-2331c5cac122
Journal backup: inode blocks
Journal size: 32M
注释:由于时间关系:
关于
mkfs.ext3 -i 2048 -b 8192 -f 1024 /dev/sdb2
中这个
-i
参数的定义,我是根据对应关系推断,给了它只是个逻辑概念的定义。
欢迎大虾们有更有力的论据来解释一下,或推翻我的观点。
三.读取一个树状目录下的文件
/etc/crontab
的流程
<!--[if !supportLists]-->
1.
操作系统根据根目录
( / )
的相关资料可取得
/etc
这个目录所在的
inode
,并前往读取
/etc
这个目录的所有相关属性;
<!--[endif]-->
<!--[if !supportLists]-->
2.
根据
/etc
的
inode
的资料,可以取得
/etc
这个目录底下所有文件的关连数据是放置在哪一个
Block
当中,并前往该
block
读取文件的关连性容;
<!--[endif]-->
<!--[if !supportLists]-->
3.
由上个步骤的
Block
当中,可以知道
crontab
这个文件的
inode
所在地,并前往该
inode
;
<!--[endif]-->
<!--[if !supportLists]-->
4.
由上个步骤的
inode
当中,可以取得
crontab
这个文件的所有属性,并且可前往由
inode
所指向的
Block
区域,顺利的取得
crontab
的文件内容
<!--[endif]-->
<!--[if !vml]-->
<!--[endif]-->
四
.
硬链接
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
目录。
五.软链接
1.
软链接也叫符号链接,他和硬链接有所不同,软链接文件只是其源文件的一个标记。当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,
但我们却不能查看软链接文件的内容了
.
2.Symbolic Link
与
Windows
的快捷方式可以给他划上等号,由
Symbolic link
所建立的档案为一个独立的新的档案,所以会占用掉
inode
与
block
3.
所以可用使用软链接解决某个分区
inode conut
不足的问题
(
软链接到另一个
inode count
足够多的分区
)
本文出自 “ 足球痞子” 博客,请务必保留此出处 http://dianping.blog.51cto.com/427241/95041
本文出自 51CTO.COM技术博客