linux的inode 详细

node是UNIX操作系统中的一种数据结构,它包含了与文件系统中各个文件相关的一些重要信息。在UNIX中创建文件系统时,同时将会创建大量的inode。通常,文件系统磁盘空间中大约百分之一空间分配给了inode表。
有时,人们使用了一些不同的术语,如inode和索引编号(inumber)。这两个术语非常相似,并且相互关联,但它们所指的并不是同样的概念。inode指的是数据结构;而索引编号实际上是inode的标识编号,因此也称其为inode 编号或者索引编号。索引编号只是文件相关信息中一项重要的内容。下一个部分将介绍 inode中的其他一些属性。
inode表包含一份清单,其中列出了对应文件系统的所有inode编号。当用户搜索或者访问一个文件时,UNIX系统通过inode表查找正确的inode编号。在找到inode编号之后,相关的命令才可以访问该inode,并对其进行适当的更改。
例如,使用vi来编辑一个文件。当您键入vi [filename]时,在inode表中找到inode编号之后,才允许您打开该inode。在vi的编辑会话期间,更改了该 inode中的某些属性,当您完成操作并键入:wq时,将关闭并释放该inode。通过这种方式,如果两个用户试图对同一个文件进行编辑,inode已经在第一个编辑会话期间分配给了另一个用户 ID (UID),因此第二个编辑任务就必须等待,直到该inode释放为止。
inode 的结构
对于经验丰富的UNIX开发人员或者管理员来说,inode的结构相对比较简单,但是可能还有一些您尚不了解的、令人惊讶的有关inode的内幕。下面的定义仅给出了inode中所包含的、UNIX用户经常使用的一些重要信息:
inode 编号 
用来识别文件类型,以及用于stat C函数的模式信息 
文件的链接数目 
属主的 UID 
属主的组ID (GID) 
文件的大小 
文件所使用的磁盘块的实际数目 
最近一次修改的时间 
最近一次访问的时间 
最近一次更改的时间
从根本上讲,inode中包含有关文件的所有信息(除了文件的实际名称以及实际数据内容之外)。可以在AIX 的 Header文件/usr/include/jf/ino.h中、或者Web页面 http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.files/doc/aixfiles/inode.h.htm 中可以找到完整的 inode 结构。
以上所列举的信息对于文件来说非常重要,并且在UNIX中频繁使用。如果没有这些信息,那么文件将被认为遭到破坏和不可用。
与其他的操作系统相比,UNIX系统中的目录和文件可能看起来有所不同,但事实并非如此。在UNIX中,目录本身就是文件,只是在它们的inode中使用了一些附加的设置。目录本质上就是一个包含了其他文件的文件。另外,其模式信息中设置了一些相应的标志,以告知系统该文件实际上是一个目录。
使用inode
了解如何在UNIX中使用inode可以节约大量的时间,并提高工作效率。在尚未了解inode之前,您可以使用下面的命令,以减少可能碰到的问题。
df命令
如前所述,当您在 UNIX 中创建一个文件系统时,将为inode表分配大约百分之一的总磁盘空间。每次在文件系统中创建一个文件时,都会为该文件分配一个 inode。通常,与一个文件系统相关联的inode的数目足够多,但耗尽inode的可能性始终存在。要监视是否发生了这种情况,您可以观察df的输出。
使用df命令,您可以查看所有已挂载的文件系统或者特定的文件系统。在该命令的输出中,您可以查看各个文件系统中已使用的inode的数目,以及文件系统中总体使用情况百分比,如清单 1中所示。
清单 1. 使用 df 来监视 inode 的使用
# df -k|head -6Filesystem
1024-blocks Free %Used Iused %Iused Mounted on/dev/hd4 
229376 138436 40% 4730 13% /dev/hd2 
8028160 962692 89% 110034 33% /usr/dev/hd9var 
1835008 366400 81% 25829 24% /var/dev/hd3 
524288 523564 1% 98 1% /tmp/dev/hd1 
32768 32416 2% 5 1% /home
如果由于某种原因,某个文件系统inode的使用率达到百分之百,那么您将无法在该文件系统中创建更多的文件、设备、目录等等。对于这种情况,一种解决方案是通过smitty chfs命令为该文件系统添加更多的空间,如图 1所示。另一种解决方案是创建较小的inode区段。现在,在增强的日志文件系统(Enhanced Journal File System)中,IBM AIX 5L允许inode区段小于16KB的缺省大小。请记住,如果您在AIX 5L中使用这个选项,那么将无法从较早版本的AIX访问该文件系统。

在AIX中检查inode的一种快捷的方式是使用istat命令。使用这个命令,您可以找到特定文件的索引编号,以及其他的inode项目,如权限、文件类型、UID、GID、链接的数目(非符号链接)、文件大小和最近一次更新、最近一次修改以及最近一次访问的时间戳。
清单 2显示了AIX中文件/usr/bin/ksh的inode信息。
清单 2. /usr/bin/ksh 的 inode 信息
# istat /usr/bin/kshInode 
18150 on device 10/8 
FileProtection: r-xr-xr-xOwner: 2(bin) 
Group: 2(bin)Link count: 5 
Length 237804 bytes
Last updated: Wed Oct 24 17:37:10 EDT 2007
Last modified: Wed Apr 18 23:58:06 EDT 2007
Last accessed: Mon Apr 28 11:25:35 EDT 2008
除了显示来自istat的标准信息之外,现在您还知道了/usr/bin/ksh对应的索引编号。如果您同时还找到了该文件所处的逻辑卷,那么甚至可以显示更多的信息。要查找该信息,一种方式是通过使用df命令来查看该文件位于哪个已挂载的文件系统中:
# df /usr/bin Filesystem
512-blocks Free %Used Iused %Iused Mounted on/dev/hd2 
16056320 1925384 89% 110034 33% /usr

文件/usr/bin/ksh位于目录/usr/bin中。查看df命令的输出,您可以发现,目录/usr/bin包含于/usr文件系统中,并且/usr文件系统位于逻辑卷/dev/hd2之中。现在,您已经知道了索引编号和逻辑卷的名称,那么就可以将这两个信息项作为参数来使用istat,这样一来,您可以确定组成该文件的磁盘块的十六进制地址,如清单 3中所示。
清单 3. 确定文件磁盘块的十六进制地址
# istat 18150 /dev/hd2Inode 
18150 on device 10/8 
FileProtection: r-xr-xr-x
Owner: 2(bin) Group: 2(bin)Link count: 5 
Length 237804 bytes
Last updated: Wed Oct 24 17:37:10 EDT 2007
Last modified: Wed Apr 18 23:58:06 EDT 2007
Last accessed: Mon Apr 28 11:44:20 EDT 
2008 Block pointers (hexadecimal):11620 ef8c0
Linux 提供了其特有的istat版本:stat。Linux stat命令可以显示类似的信息,并且还包括一些在 AIX istat命令中没有提供的命令开关:
# stat /bin/bash
File: /bin/bash 
Size: 722684 
Blocks: 1432 
IO Block: 4096 
regular file
Device: fd00h/64768d 
Inode: 12799859 
Links: 1
Access: (0755/-rwxr-xr-x) 
Uid: ( 0/ root) 
Gid: ( 0/ root)
Access: 2008-04-06 19:13:50.000000000 -0400
Modify: 2006-07-12 03:11:53.000000000 -0400
Change: 2007-11-22 04:05:30.000000000 -0500
ls命令
在您的日常工作中总会碰到这样的情况,难以删除或者管理某些文件,因为这些文件的文件名中使用了短横线或者其他特殊字符、或者其文件名完全不正确。这很可能是有人对该文件进行了错误命名。
因为UNIX中的大多数命令,包括开关或者选项在内,都是以连字符(-)或者双连字符(--)开头的,很难使用诸如rm、mv和cp之类常用的命令来操作这些文件。幸运的是,某些命令提供了一些选项,以用来显示相关文件所关联的inode的索引编号。ls命令就提供了一个这样的选项:
# ls 
- -- -p 
fileA fileB fileC 
fileD fileE fileF 
fileG fileH fileI 
fileJ fileK fileL
使用ls -i命令,您可以看到文件名称旁边的索引编号,如清单 4中所示。现在,您已经知道了文件的索引编号,那么就可以很容易地操作该文件了。
清单 4. 查看文件的索引编号
# ls ?i
38988 38991 -p 
38984 fileC 
38982 fileF 
38977 fileI 
38978 fileL
38989 - 
38980 fileA 
38986 fileD 
38983 fileG 
38987 fileJ
38990 -- 
38979 fileB 
38976 fileE 
38985 fileH 
38981 fileK
find 命令
使用UNIX find命令,您可以完成使用ls命令所开始的工作。对于要进行操作的文件,您已经知道了它们的索引编号,那么就可以开始进行相应的操作了!
要删除看似无名的文件,您只需要使用find和-inum开关对索引编号和文件进行定位。然后,在找到该文件之后,使用find和-exec开关删除该文件:
# find . -inum 38988 -exec rm {} \
要对该文件进行重命名,可以再次进行相同的操作,但这一次使用mv而不是rm:
# find . -inum 38989 -exec mv {} fileM \
为了验证取得了预期的结果,只需要再次使用ls -i命令:
#ls -i
38990 --
38979 fileB
38976 fileE
38985 fileH
38981 fileK
38991 -p
38984 fileC
38982 fileF
38977 fileI
38978 fileL
38980 fileA
38986 fileD
38983 fileG
38987 fileJ
38989 fileM

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

通过使用fsck命令,您还可以缩小受损inode的搜索范围。如果您正在搜索一个特定的inode,那么可以使用带-ii-NodeNumber开关的fsck命令。
结束语
如果没有inode,那么UNIX中的文件和目录将根本无法使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值