| 查看: 128 | 回复: 0 | ||
| 当前主题已经存档。 | ||
[资源]
对话 UNIX: 关于 inode
|
||
|
您是否曾经对一些 UNIX® 命令(如 df)中的 Iused 和 %Iused 的含义感到困惑,或者当人们讨论 inode 的时候不知所云?UNIX 和 Linux® 系统都使用了 inode ,当然 IBM® AIX® 也不例外。本文将向您介绍什么是 inode 、为什么对于 UNIX 来说 inode 非常重要、 inode 的结构,以及操作 inode 的命令。 inode 是 UNIX 操作系统中的一种数据结构,它包含了与文件系统中各个文件相关的一些重要信息。在 UNIX 中创建文件系统时,同时将会创建大量的 inode 。通常,文件系统磁盘空间中大约百分之一空间分配给了 inode 表。 有时,人们使用了一些不同的术语,如 inode 和索引编号 (inumber)。这两个术语非常相似,并且相互关联,但它们所指的并不是同样的概念。 inode 指的是数据结构;而索引编号实际上是 inode 的标识编号,因此也称其为 inode 编号 或者索引编号。索引编号只是文件相关信息中一项重要的内容。下一个部分将介绍 inode 中的其他一些属性。 inode 表包含一份清单,其中列出了对应文件系统的所有 inode 编号。当用户搜索或者访问一个文件时,UNIX 系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该 inode ,并对其进行适当的更改。 例如,使用 vi 来编辑一个文件。当您键入 vi 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/in ... ixfiles/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 -6 Filesystem 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 访问该文件系统。 图 1. smitty chfs 命令的结果 smitty chfs istat 和 stat 在 AIX 中检查 inode 的一种快捷的方式是使用 istat 命令。使用这个命令,您可以找到特定文件的索引编号,以及其他的 inode 项目,如权限、文件类型、UID、GID、链接的数目(非符号链接)、文件大小和最近一次更新、最近一次修改以及最近一次访问的时间戳。 清单 2 显示了 AIX 中文件 /usr/bin/ksh 的 inode 信息。 清单 2. /usr/bin/ksh 的 inode 信息 # istat /usr/bin/ksh Inode 18150 on device 10/8 File Protection: 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: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/hd2 Inode 18150 on device 10/8 File Protection: 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 命令。 |
» 猜你喜欢
【复旦大学】二维材料方向招收2026年博士研究生1名
已经有0人回复
北京纳米能源与系统研究所 王中林院士/曹南颖研究员课题组2026级硕/博/博后招生
已经有10人回复
物理学I论文润色/翻译怎么收费?
已经有88人回复
荷兰Utrecht University超快太赫兹光谱王海教授课题招收2026 CSC博士生
已经有23人回复
反铁磁体中的磁性切换:两种不同的机制已成功可视化
已经有0人回复
求标准粉末衍射卡号 ICDD 01-076-1802
已经有0人回复
新西兰Robinson研究所招收全奖PhD
已经有0人回复
石墨烯转移--二氧化硅衬底石墨烯
已经有0人回复













回复此楼