inode
Posted fpcbk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了inode相关的知识,希望对你有一定的参考价值。
linux下用df命令查看磁盘空间和inode占用情况,网上一大堆。我比较喜欢用的是df -h 查看容量,df -ihT 查看inode和文件系统类型。
那么什么是inode呢?
简单的就是存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。可以用stat +文件名来查看
linux下inode和文件名是分离的,所以cp或者mv文件,只改变了文件名,但是他的inode不会变。有时候,文件名包含特殊字符,没办法用rm删除(用转义符号也没用),这时候可以直接删除inode节点
比如:我们在windows上传了一个带有特殊符号的文件,比如
首先用ls -il命令查看其inode,
然后使用命令find ./ -inum 36175886 -exec rm -i {} ;(使用find命令在当前目录下查找inode是36175886 的文件,将其作为参数传给rm命令,参数位置在{}里,以;表示结束)。
当然,有时候还可以用双引号将要删除的文件名括起来。
好了,回到创建文件过多的情况。这时候,创建文件也出错No space left on device,用vim打开文件也出错E138: Can‘t write viminfo file,只能删除了。
警惕inode用光
- 我们的测试环境:Vmware上的一台CentOS5虚拟机,8G磁盘,除了512M的swap,只有一个的ext3分区sda1。
[root@localhost tmp]# fdisk -l Disk /dev/sda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 978 7855753+ 83 Linux /dev/sda2 979 1043 522112+ 82 Linux swap / Solaris
- 前一段时间在做一个目录创建文件数量限制的测试,测试的结论是:如果你的权限足够大,比如是root,那么某一个目录下创建文件的最大值,仅由当前分区上(而不是当前磁盘)剩余空间/块/inode数决定,这三个值任何一个用光都将导致分区内任何一个目录不能创建新文件。
- 一般人可能往往对磁盘空间(这个值和df中的block严格对应,这里是一个block占用1k byte的空间)非常敏感,却对inode使用情况关心甚少,其中一个重要原因是,大部分情况下文件没有多到用光inode或者更常见的,block先于inode用尽。然而,对于特殊的情况,特别是对于某种特别应用的特殊目录,可能inode的使用较block更甚,就有可能导致inode用尽的情况
Inode介绍
- Linux/Unix like OS 的文件系统中每个目录树中的节点并不是像 Windows 那样直接包含文件的具体信息,而只包含了文件名和 Inode number 。通过 Inode number 所找到对应于文件名的 Inode 节点中才真正记录了文件的大小/物理地址/所有者/访问权限/时间戳/被硬链接的次数等实际的 metadata 。因此你可以在 Linux 系统中通过硬链接( hard link ) 的方式给某个文件创建无数个位于不同目录下的文件名,而实际的文件数据只需要一份拷贝。
- 这里附一张流行的ext2-inode为基础的文件系统层次图
- 还有一些民间的描述,这里转载一下,以下内容来自Internet
來 源: freebsd.csie.nctu.edu.tw 檔 名: 0/System/inode(使用 70 埠) 標 題: 關 inode - About inode From: unixer.bbs@bbs.ee.ncku.edu.tw (優客李林) Newsgroups: tw.bbs.comp.386bsd Subject: 有關 inode... Date: 9 Dec 1996 08:27:00 GMT Hi... 由做過一些有關 filesystem 的 study, 在這邊對 inode 做一點說明... 1. inode 是作甚的? 一個 filesystem 可以粗略地分成 inode table 與 data area 兩部份. inode table 上有許多的 inode, 每個 inode 分別 記錄一個檔案的屬性, 與這個檔案分布在哪些 datablock 上 2. 一個 inode 有多大呢? 128 byte! 3. inode 和 data area 的關系 在 new filesystem 時, 通常會有一個參數, 用來描述要分配多少比例的空間給 inode table. 舉例來說, newfs -i 2048 是指 file system 中, 每分配 2048 byte 給 data area, 就分配一個 inode 但是一個 inode 就並不是一定就用掉 2048 byte, 也不是說 files allocation 的最小單位是 2048 byte, 它僅僅只是代表 filesystem 中 inode table/data area 分配空間的比例是 128/2048 也就是 1/16 (換個角度想, 我們可以想成是預估 filesystem 中 file 平均大小是 2048 byte) 如果 inode table 太小, 那在每個檔案都很小的時候, 就會發生 inode 用光 而 datablock 還剩一堆的情形. 4. file allocation 的最小單位 和 inode 多少有沒有關系呢? 沒有關系! FFS 中真正的最小單位是 fragment size 也就是我們在 new filesystem 時用的 newfs -b 8192 -f 1024 ^^^^^^^^ ps: -b 8192 代表 blocksize=8192, 這種"較大單位"是用來加速大檔案的存取用的 在 FreeBSD 中, 內定的是 -i 4096 -b 8192 -f 1024. 如果您要架 bbs/new 的話 可以考慮用 -i 1024 -b4096 -f1024 unixer ============================================================================ From: alexj@mail.tmc.edu.tw (Ji, Wen-Jie) Newsgroups: tw.bbs.comp.386bsd Subject: Re: HELP !! The parameter of newfs Date: Thu, 12 Dec 1996 01:39:31 GMT 沒關系,我自己找到答案了,寫在此讓大家分享一下. 所謂 block size & fragment size, 這是屬 file system 的一種解決方案. 自4.3 BSD, BSD 用這種方法來解決檔案 fragment 的問題 先假設 a block size= 4K, a fragment size = 256Bytes. 假如你現在要將一個 1K 的新檔案寫入 file system, FS 會把它存入 4 個fragment,而不會存入 block,一但這個檔案繼續被 append 增加到 4K 時, FS 會將它轉存到一個 block中, 而原來的 16 個fragments 就會被 clean ^^^^^^^^^^^^^^^^^^^^ 因為當你的檔案大到 4K 時,它佔用 了 16 (4K / 256 bytes) 個 fragments 再舉個例子, 如果現在又存了一個新的 4.1K 的檔案, FS 會分配 一個 block 及 4個 fragment 給 這個檔案, 因為 1 block + 4 fragments = 4 K + 256 bytes * 4 = 4.1K 所以,有此可知,對一台 news server, bbs, 或是會有大量的小檔案存取時, 為了降低 FS 的空間耗損率,應該採用 -b 4096 -f 256, 而不要採用預設值的 -b 8192 -f 1024,因為大部分的信件都不超過 512 bytes, 有些更不超過 256 bytes, 但是這樣可能會降低存取的速度.但我相信不嚴重 有興趣的人可以試試. ========================================================================= newfs 時的參數的影響:(以 100MB 的分割去作測試) >From jason@csie.NCTU.edu.tw Fri Mar 14 23:53:58 1997 From: Jason Chang size: 208845 (about 100MB) 參數 可用空間(1K-blocks) 可用 inode (ifree) -i 1024 91525 102397 -i 2048 96661 61437 -i 4096 100501 30717 -i 8192 102421 15357 -i 16384 103381 7677 -i 32768 103861 3837 -i 16384 -b 16384 -f 2048 103316 7677 -i 16384 -b 32768 -f 4096 103104 8189 -i 16384 -b 65536 -f 8192 102808 8189
Inode使用情况查看
- df -i
- 即时的反应inode使用情况,你可以相信他
- tune2fs -l /dev/sda1|grep -i inode
- 这个命令中的/dev/sda1要看你的真是设备,通常是sdxn或者hdxn这样的格式
- 这个命令中查看到的Free inodes情况不一定是最新的,所以不要太相信他
- 还有一个不是查看inode使用情况而是反映inode的重要内核参数的,值得一提
# 以下内容来自于 proc 的manpage /proc/sys/fs/inode-max This file contains the maximum number of in-memory inodes. On some (2.4) systems, it may not be present. This value should be 3-4 times larger than the value in file-max, since stdin, stdout and network sockets also need an inode to handle them. When you regularly run out of inodes, you need to increase this value. /proc/sys/fs/inode-nr This file contains the first two values from inode-state. /proc/sys/fs/inode-state This file contains seven numbers: nr_inodes, nr_free_inodes, preshrink and four dummy values. nr_inodes is the number of inodes the system has allocated. This can be slightly more than inode- max because Linux allocates them one page full at a time. nr_free_inodes represents the number of free inodes. preshrink is non-zero when the nr_inodes > inode-max and the system needs to prune the inode list instead of allocating more.
Inode用尽的症状
# 新文件不能建立 # touch yfang (假设原来没有这个文件) touch: cannot touch `yfang‘: No space left on device ‘ # 临时文件自然也不能创建,可能导致很多连锁问题 # man bash 需要创建临时文件,所以这个命令你不能在正常使用 # 还有很多其他类似的命令,需要创建临时文件的你都没有机会再用了
以下是关键的df数据对比
# 测试开始前 [root@localhost ~]# df -k Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 7609680 2206848 5010048 31% / tmpfs 127852 0 127852 0% /dev/shm [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 7.3G 2.2G 4.8G 31% / tmpfs 125M 0 125M 0% /dev/shm [root@localhost ~]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 1964160 354166 1609994 19% / tmpfs 31963 1 31962 1% /dev/shm # 实施inode侵占 for((i=1;i<1609990;i++));do touch file$i;done # 强行侵占所有inode后,注意最后df -i的输出 [root@localhost ~]# df -k Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 7609680 2258580 4958316 32% / tmpfs 127852 0 127852 0% /dev/shm [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 7.3G 2.2G 4.8G 32% / tmpfs 125M 0 125M 0% /dev/shm [root@localhost ~]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 1964160 1964160 0 100% / tmpfs 31963 1 31962 1% /dev/shm
Inode用尽的紧急解决方案
- 我们现在知道了inode会用光,即时见效的解决方案其实也很简单,无非是或者开源,或者截流(通常是截流)
- 开源:重新对分区进行分配,使得空间紧张的分区拥有更多的inode,或者添加一块硬盘,原理不用解释了
- 截流:找到问题的症结,删除或移出不需要(或者临时不需要)的文件可以使得你的系统暂时摆脱inode不够带来的诸多系统不正常,然后寻找解决方案,重新部署磁盘
- 没有什么是永远正确的,我们需要的是适合的,所以如果有特殊的需求(比如大量的小碎片文件)时,最好了解一下VFS(Virtual File-system)的结构
分析一下Inode什么情况下会用尽,以及我们应该注意的地方
- 首先,我们知道,Linux下所有的东西都被看做文件,而每一个文件都会占用一个Inode
- 来看我们的系统,在为分区创建文件系统时,默认的参数使得磁盘按照每个inode占用4k的情况分配inode,这一点从block总数7609680和inode总数1964160的比例关系可以近似得知,所以如果你的这个分区刚好要用来存放大量的小碎片文件,又没有很好的文件管理策略时,就可能面临inode先于磁盘空间用尽的问题。一旦文件系统创建结束,这个分区上可用的最大inode值就是不可变的了。改变的方法是创建分区时更改文件系统的参数,在FreeBSD中你可以使用newfs -i 2048 或者在Linux环境下mke2fs -i 2048 (意味着每分配2K数据空间,就分配一个inode)。
# 信息来自 mke2fs manpage -i bytes-per-inode Specify the bytes/inode ratio. mke2fs creates an inode for every bytes-per-inode bytes of space on the disk. The larger the bytes-per-inode ratio, the fewer inodes will be created. This value gen- erally shouldn’t be smaller than the blocksize of the filesystem, since then too many inodes will be made. Be warned that is not possible to expand the number of inodes on a filesystem after it is created, so be careful deciding the correct value for this parameter.
以上是关于inode的主要内容,如果未能解决你的问题,请参考以下文章
Linux深入理解重定向inode详解与软硬链接的概念及区别