您的位置:首页 > 运维架构 > Linux

Linux inode相关知识

2011-05-06 17:50 246 查看
这篇文章主要讲一下Linux底下inode相关的一些知识,同时介绍一下,文件系统上的inode数目是如何计算,如何管理的。

一、什么是inode?

inode是文件系统(FileSystem)上的一个概念,是文件系统上用来保存文件信息的一种结构。

从根本上讲,inode中包含有关文件的所有信息(除了文件的实际名称以及实际数据内容之外),inode包含了如下基本信息(只列出了常用的):

inode编号

用来识别文件类型,

以及用于statC函数的模式信息

文件的链接数目

属主的UID

属主的组ID(GID)

文件的大小

文件所使用的磁盘块的实际数目

最近一次修改的时间

最近一次访问的时间

最近一次更改的时间

下图为inode的结构图:

二、Linux下对inode进行查看的方式

1、df命令查看剩余inode数量



1
root@frank-laptop:~$df-i-h
2
文件系统Inode(I)已用(I)可用(I)已用%挂载点
3
/dev/sda63.6M346K3.3M10%/
4
none212K914211K1%/dev
5
none214K10214K1%/dev/shm
6
none214K78214K1%/var/run
7
none214K4214K1%/var/lock
8
none214K1214K1%/lib/init/rw
9
/dev/sda74.8M301K4.5M7%/home
这个命令-i的意思是列出inode数目,-h是以一种人们易于理解的方式呈现结果,我们通过这个命令可以看到各个分区inode数目的使用情况。有一个你必须要清楚的是,一旦inode用完,你的文件系统将无法创建任何内容,就算有剩余的空间。这点我相信应该道理很清楚

2、stat命令查看指定文件信息



1
root@frank-laptop:~$stat/bin/bash
2
File:"/bin/bash"
3
Size:818232Blocks:1600IOBlock:4096普通文件
4
Device:806h/2054dInode:131084Links:1
5
Access:(0755/-rwxr-xr-x)Uid:(0/root)Gid:(0/root)
6
Access:2010-10-2010:22:38.041508828+0800
7
Modify:2010-04-1909:51:35.000000000+0800
8
Change:2010-05-1520:06:53.468309411+0800
使用这个命令,我们可以找到特定文件的索引编号,以及其他的inode项目,如权限、文件类型、UID、GID、链接的数目(非符号链接)、文件大小和最近一次更新、最近一次修改以及最近一次访问的时间戳。

3、ls命令

在我们的日常工作中总会碰到这样的情况,难以删除或者管理某些文件,因为这些文件的文件名中使用了短横线或者其他特殊字符、或者其文件名完全不正确。这很可能是有人对该文件进行了错误命名。

因为UNIX中的大多数命令,包括开关或者选项在内,都是以连字符(-)或者双连字符(–)开头的,很难使用诸如rm、mv和cp之类常用的命令来操作这些文件。幸运的是,某些命令提供了一些选项,以用来显示相关文件所关联的inode的索引编号。ls命令就提供了一个这样的选项:



1
root@frank-laptop:~$ls-i
2
4456450examples.desktop4589605workspace4456466图片4456460桌面
3
267055lyrics4456463公共的4456464文档
4
4721446TencentFiles4456462模板4456461下载
5
132716UbuntuOne4456467视频4456465音乐
4、find命令
使用UNIXfind命令,我们可以完成使用ls命令所开始的工作。对于要进行操作的文件,您已经知道了它们的索引编号,那么就可以开始进行相应的操作了!
要删除看似无名的文件,我们只需要使用find和-inum开关对索引编号和文件进行定位。然后,在找到该文件之后,使用find和-exec开关删除该文件:



1
root@frank-laptop:~$find.-inum38988-execrm{}/;
要对该文件进行重命名,可以再次进行相同的操作,但这一次使用mv而不是rm:

1
root@frank-laptop:~$find.-inum38989-execmv{}fileM/;
5、fsck命令

不幸的是,硬件设备不可能一直使用下去,系统可能会在使用多年后出现故障。当发生这种情况,以及由于电源故障或者某些其他问题而导致操作系统异常关闭的时候,您可能会在还原系统备份时碰到一些在崩溃期间处于打开状态的文件,并且现在需要对其加以处理。此时,您可能会碰到一些需要修复inode或者存在错误的消息。如果发生这种状况,那么fsck命令可以用来救急!您可以使用fsck来修复文件系统或者修正受损的inode,而不是还原系统、或者甚至重新构建操作系统。

1
root@frank-laptop:~$fsck-text4/dev/sda6-a
fsck时候需要用-t来指定分区文件系统的类型,-a是自动修复,没有这个选项,你可以手动更改inode信息

二、如何计算inode

当我们在格式化一个文件系统的时候,格式化程序mkfs会根据blocks数目和每个inode所占的字节数来计算inode数目,具体如何计算的,现在让我们来做一个实验,我们用dd命令创建一个1G大小的磁盘img

1
root@frank-laptop:/tmp$ddif=/dev/zeroof=/test.imgbs=1Mcount=1024
2
记录了1024+0的读入
3
记录了1024+0的写出
4
1073741824字节(1.1GB)已复制,17.0225秒,63.1MB/秒
上面这个命令中bs的意思是指blocksize,为1MB,block数目为1024块,总共加起来是1GB
好我们现在用mkfs来创建一个ext3的文件系统,我们可以用-N来指定inode数目,我们可以指定一个很大的值

1
root@frank-laptop:/tmp$mkfs.ext3-N21420000test.img
2
mke2fs1.41.11(14-Mar-2010)
3
test.imgisnotablockspecialdevice.
4
无论如何也要继续?(y,n)y
5
mkfs.ext3:inode_size(256)*inodes_count(21420000)toobigfora
6
filesystemwith262144blocks,specifyhigherinode_ratio(-i)
7
orlowerinodecount(-N).
我们可以看到提示我们指定的inode数目过于大,使得无法创建文件系统。其中有一个重要信息是inode_size是256,也就是说inode数目最大值应该为:硬盘大小/inode_size。这个inode_size我们可以用-i这个选项来指定,ext3文件系统默认使用256,最小值为128,那么我们来计算一下我们的inode值最大为多少:
1024x1024x1024/256=4194304
理论上来说我们可以指定这么多inode,但是用于文件系统同时需要superblock所以我们不可能create这么多inode,不过可以不指定superblock试试:

1
root@frank-laptop:/tmp$mkfs.ext3-m0-n-N4194303test.img
2
mke2fs1.41.11(14-Mar-2010)
3
test.imgisnotablockspecialdevice.
4
无论如何也要继续?(y,n)y
5
test.img:Cannotcreatefilesystemwithrequestednumberofinodeswhilesettingupsuperblock
失败,那么我们把inode值改为最大的一半,再试试

01
root@frank-laptop:/tmp$mkfs.ext3-N2097152test.img
02
mke2fs1.41.11(14-Mar-2010)
03
test.imgisnotablockspecialdevice.
04
无论如何也要继续?(y,n)y
05
文件系统标签=
06
操作系统:Linux
07
块大小=4096(log=2)
08
分块大小=4096(log=2)
09
Stride=0blocks,Stripewidth=0blocks
10
2097152inodes,262144blocks
11
13107blocks(5.00%)reservedforthesuperuser
12
第一个数据块=0
13
Maximumfilesystemblocks=268953600
14
64blockgroups
15
4120blockspergroup,4120fragmentspergroup
16
32768inodespergroup
17
Superblockbackupsstoredonblocks:
18
4120,12360,20600,28840,37080,103000,111240,201880
19
20
正在写入inode表:完成
21
Creatingjournal(8192blocks):完成
22
Writingsuperblocksandfilesystemaccountinginformation:完成
23
Thisfilesystemwillbeautomaticallycheckedevery22mountsor
24
180days,whichevercomesfirst.Usetune2fs-cor-itooverride.
从上面的输出信息我们可以看出ext3文件系统的块大小为4096,总共262144个块,其中13107为超级块,64个块组,每个块组有4120个块,然后我们可以看到superblock是位于哪些块上。

我们挂载这个img之后可以看到还剩下410.3MB的剩余空间,这个我们可以知道inode有一个部分需要存储文件信息,所以剩下够用的空间就只有一部分,所以在inode数目上我们应该有一个权衡,毕竟inode数目太多,可能能够利用的空间就小了

四、参考文献
1、http://www.ibm.com/developerworks/cn/aix/library/au-speakingunix14/
2、http://hi.baidu.com/meizhe/blog/item/f1d67aecea47b4d72e2e211b.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: