对话 UNIX: 关于 inode
转自:http://www.ibm.com/developerworks/cn/aix/library/au-speakingunix14/
inode 是 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 释放为止。
对于经验丰富的 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 中使用了一些附加的设置。目录 本质上就是一个包含了其他文件的文件。另外,其模式信息中设置了一些相应的标志,以告知系统该文件实际上是一个目录。
了解如何在 UNIX 中使用 inode 可以节约大量的时间,并提高工作效率。在尚未了解 inode 之前,您可以使用下面的命令,以减少可能碰到的问题。
如前所述,当您在 UNIX 中创建一个文件系统时,将为 inode 表分配大约百分之一的总磁盘空间。每次在文件系统中创建一个文件时,都会为该文件分配一个 inode 。通常,与一个文件系统相关联的 inode 的数目足够多,但耗尽 inode 的可能性始终存在。要监视是否发生了这种情况,您可以观察 df
的输出。
使用 df
命令,您可以查看所有已挂载的文件系统或者特定的文件系统。在该命令的输出中,您可以查看各个文件系统中已使用的 inode 的数目,以及文件系统中总体使用情况百分比,如清单 1 中所示。
# 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
命令为该文件系统添加更多的空间,如图 1 所示。另一种解决方案是创建较小的 inode 区段。现在,在增强的日志文件系统 (Enhanced Journal File System) 中,IBM AIX 5L 允许 inode 区段小于 16KB 的缺省大小。请记住,如果您在 AIX 5L 中使用这个选项,那么将无法从较早版本的 AIX 访问该文件系统。
chfs
在 AIX 中检查 inode 的一种快捷的方式是使用 istat
命令。使用这个命令,您可以找到特定文件的索引编号,以及其他的 inode 项目,如权限、文件类型、UID、GID、链接的数目(非符号链接)、文件大小和最近一次更新、最近一次修改以及最近一次访问的时间戳。
清单 2 显示了 AIX 中文件 /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 中所示。
# 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 |
在您的日常工作中总会碰到这样的情况,难以删除或者管理某些文件,因为这些文件的文件名中使用了短横线或者其他特殊字符、或者其文件名完全不正确。这很可能是有人对该文件进行了错误命名。
因为 UNIX 中的大多数命令,包括开关或者选项在内,都是以连字符 (-
) 或者双连字符 (--
) 开头的,很难使用诸如 rm
、mv
和 cp
之类常用的命令来操作这些文件。幸运的是,某些命令提供了一些选项,以用来显示相关文件所关联的 inode 的索引编号。ls
命令就提供了一个这样的选项:
# ls - -- -p fileA fileB fileC fileD fileE fileF fileG fileH fileI fileJ fileK fileL |
使用 ls -i
命令,您可以看到文件名称旁边的索引编号,如清单 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 |
使用 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 |
不幸的是,硬件设备不可能一直使用下去,系统可能会在使用多年后出现故障。当发生这种情况,以及由于电源故障或者某些其他问题而导致操作系统异常关闭的时候,您可能会在还原系统备份时碰到一些在崩溃期间处于打开状态的文件,并且现在需要对其加以处理。此时,您可能会碰到一些需要修复 inode 或者存在错误的消息。如果发生这种状况,那么 fsck
命令可以用来救急!您可以使用 fsck
来修复文件系统或者修正受损的 inode ,而不是还原系统、或者甚至重新构建操作系统。
下面的命令可以尝试修复逻辑卷 /dev/hd1:
# fsck –p /dev/hd1 –y |
通过使用 fsck
命令,您还可以缩小受损 inode 的搜索范围。如果您正在搜索一个特定的 inode ,那么可以使用带 -ii-NodeNumber
开关的 fsck
命令。
如果没有 inode ,那么 UNIX 中的文件和目录将根本无法使用。希望在阅读完本文之后,您可以更好地了解 inode 、它们对于 AIX 系统的重要性,以及如何管理它们。您可能会对 df
命令的看法大为改观。
<!-- CMA ID: 329960 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
-
对话 UNIX:查看本系列中的其他部分。
-
Wikipedia 中的 inode :在 Wikipedia 的条目中,阅读有关 inode 的更多信息。
-
Wikipedia 中的 AIX 条目:阅读 Wikipedia 中有关 AIX 操作系统的极好的条目,以获取有关其背景和开发的更多信息。
-
istat
命令:从 Combined IBM Systems 信息中心了解有关istat
命令的更多信息。
-
fsck
命令:从 Combined IBM Systems 信息中心了解有关fsck
命令的更多信息。
-
df
命令:从 Combined IBM Systems 信息中心了解有关df
命令的更多信息。
-
chfs
命令:从 Combined IBM Systems 信息中心了解有关chfs
命令的更多信息。
-
ls
命令:从 Combined IBM Systems 信息中心了解有关ls
命令的更多信息。
-
find
命令:从 Combined IBM Systems 信息中心了解有关find
命令的更多信息。
-
smitty
命令:从 Combined IBM Systems 信息中心了解有关smitty
命令的更多信息。
-
inode.h 文件:从 Combined IBM Systems 信息中心了解有关 inode.h 文件的更多信息。
-
AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
-
AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
-
AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
-
developerWorks 技术事件和网络广播:了解最新的 developerWorks 技术事件和网络广播。
-
AIX Wiki:访问此 AIX 相关技术信息的协作环境。
-
Podcast:收听 Podcast 并与 IBM 技术专家保持同步。
相关推荐
这几天训网络最困扰我的问题就是服务器...EXT4-fs error (device sda1): ext4_lookup:1593: inode #6004222: comm trash-expunge: deleted inode referenced: 6004301 类似这样的错误,看样子是sda1磁盘文件系统的问题
### Inode多网卡限制破解方法详解 #### 一、Inode校园网限制多网卡破解步骤 **背景介绍:** 对于很多在校学生而言,使用学校的Inode认证系统时经常会遇到多网卡限制的问题,这使得无法通过笔记本电脑创建无线热点...
一、iNode:Linux文件系统的核心 1.1 iNode定义:iNode是Linux文件系统中的一种数据结构,存储了文件的各种元数据,包括文件的所有者、权限、大小、创建时间、修改时间等,但不包含文件的实际内容。每个文件或目录...
在Unix和类Unix操作系统(如Linux和Mac OS)中,inode是文件系统中的一个重要组成部分,它存储了文件的元数据,包括文件的所有者、权限、大小、创建和修改时间等信息,但不包含文件的实际内容。 inode客户端是针对...
### iNode客户端安装指导(Mac OS)知识点解析 #### 一、概述 iNode客户端是专为Mac OS设计的一款多功能接入软件,它主要用于宽带接入的身份认证与安全检查。该客户端能够与以太网交换机、路由器等网络设备协同工作...
`inode`(即“索引节点”)是一个数据结构,存储了关于文件和目录的所有元数据,但不包含文件的实际内容。在MacOS中,文件系统如HFS+或APFS(Apple File System)都会使用`inode`来管理和查找文件。 1. **什么是...
1. **iNode基础概念**:在Unix和类Unix系统(如macOS)中,iNode是文件系统用来存储文件元数据的结构,包括文件大小、创建时间、修改时间、权限、所有者等信息。iNodeClient可能利用这些元数据快速定位和管理文件。 ...
iNodeClient是一款由H3C公司为Linux操作系统开发的联网工具,主要面向网络管理人员和IT专业人士,用于管理和监控网络设备。这款工具集成了多种功能,包括远程管理、配置、故障排查以及性能监控,旨在提高网络运维...
Inode(索引节点)是另一个核心概念,它存储了关于文件的元数据,而不是文件的实际数据。每个文件或目录都有一个对应的Inode,包含如下信息: 1. **文件权限**:读、写、执行权限。 2. **文件所有者和组**:拥有...
《Mac iNode 7.3 H3C_iNode_PC_7.3_E0517:为Mac用户解决网络接入难题》 Mac iNode 7.3是一款专为苹果Mac OS系统设计的网络接入工具,由H3C公司提供,主要用于帮助用户在特定环境下(如企业或学校)实现网络连接。...
### 关于inode和block #### inode与block的基本概念 在深入理解inode与block之前,我们需要先了解它们在操作系统中的基本作用及其重要性。 - **inode(节点)**:inode是Inode Node的缩写,是文件系统中用来存储...
《深入理解Linux中的iNode HC》 在Linux操作系统中,文件系统是管理和组织磁盘存储空间的核心机制。其中,iNode(索引节点)是文件系统的重要组成部分,它记录了文件的各种元数据,如文件的所有者、权限、大小、...
本文将深入探讨"基于inode和位示图的文件系统"这一主题,该主题通常与Linux操作系统紧密相关。我们将通过C语言的角度来理解和实现这种文件系统的模拟。 首先,理解inode至关重要。在Linux系统中,inode(或称索引...
首先,inode(全称是“index node”,即索引节点)是Linux和类Unix系统中存储文件元信息的数据结构。它包含了文件的创建时间、修改时间、大小、权限、拥有者等基本信息,并且记录了文件的数据在哪里存储在磁盘上。一...
在Unix和类Unix系统(包括MacOS)中,iNode是文件系统的一个核心概念,用于存储关于文件和目录的元数据,如文件大小、创建时间、修改时间等。iNodeClient可能是一个用于查看、管理或操作这些元数据的工具,同时也...
每个文件或目录在Linux系统中都有一个对应的iNode,存储着关于文件的基本信息,如文件大小、创建时间、权限等。然而,在这里,"iNode"可能是指一个服务或者平台的名称,而"iNodeClient"是这个平台的Linux客户端。 ...
在UNIX操作系统中,管理进程的数据结构主要是`proc`,它包含了关于进程状态、内存映射、打开文件等信息。`sysent`结构用于系统调用表,定义了每个系统调用的参数和处理函数。`buf`结构则用于缓冲磁盘I/O,提高文件...
【标题】"inodeclient for Mac" 是一款专为Mac用户设计的校园网客户端软件,它使得在校学生能够方便地接入并使用校园网络。这款客户端在Mac操作系统上提供了简单易用的界面,帮助用户轻松建立网络连接。 【描述】在...
iNode是Linux文件系统的核心组成部分,它存储了关于文件的各种元数据,如文件的所有者、权限、创建时间、修改时间、访问时间以及文件的大小等。每个文件和目录在Linux文件系统中都有一个唯一的iNode号,通过这个号码...