inode
inode知识点总结
一次在生产环境中添加软链接,并将软链接删除,导致真实数据删除。还好测试环境有一份同样的数据。这样事告诉我:第一,在做删除操作前,一定先备份。第二:把软链接相关知识重新梳理
linux内核用数字管理文件系统,内存,进程等等,是为了方便,简洁,因为文件名称,进程名是很长很多很占字节。
就我知道的:
- 进程通过pid来管理,进程名称是pid别名
- 文件通过inode来管理,文件名称是inode的别名
Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
一、inode简介
文件存储在硬盘上,硬盘的最小存储单位叫做"扇区"(sector)。每个扇区存储512字节(0.5KB)。<br />
操作系统读取硬盘的时候,不会一个一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。<br />
文件数据都存储在"块"中,那很显然,我们还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做inode,中文译名为"索引节点"。
二、inode包含哪些信息
* 文件大小
* 文件的拥有者
* 文件的所属组
* 文件的读、写、执行权限
* 链接数,即有多少个文件名指向这个inode
* 文件的时间戳
* ctime:指inode上一次变动的时间
* mtime:指文件内容上一次变动的时间
* atime:指文件上一次打开时间
三、inode的大小
inode也会消耗硬盘空间,所以硬盘格式的时候,操作系统会自动将硬盘分成两个区域。一个数据存储,另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数的总数,在格式化时就给定,一般是block size一个inode。假设这里有一块150G的硬盘,每个inode节点的大小为256字节(可通过inode size查看),每4096字节就设置一个inode,那么inode table的大小就会达到150/(4096/256)=9.375mb
四、硬链接
区别: 硬链接, 各个文件的内容都相同! 都是真正的file data! 彼此之间的地位是相同的, 没有依赖性, 删除一个, 不影响另一个!
硬链接的主要目的是: 为了防止对重要文件的"误删". 有些 : "类似" 复制备份, 但是不是复制 备份!
硬链接的特性:
* 不能对目录进行创建,只可对文件创建
* 文件有相同的inode及date block
* 只能对文件进行创建
* 不能交叉文件系统进行硬链接的创建,(区分方式:df -i --print type)
* 删除一个硬链接文件并不影响其他有相同inode号的文件
~]# ln A B
B依赖于A,创建过后,在次查看A的link次数时,增加一个
五、软链接
除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。
软链接的特性:
* 软链接有自己的文件属性及权限等
* 可对不存在的文件或目录创建软链接
* 软链接可对文件或目录创建
* 创建软链接时,链接计数link不会增加
* 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软链接被称为死链接 ,若被指向路径文件被重新创建,死链接可恢复为正常的软链接
~]# ln -s A B
B依赖于A
六、inode的特殊作用
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象:
- 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
- 移动文件或重命名文件,只是改变文件名,不影响inode号码。
- 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。这使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。
七、当出现硬盘inode用满时处理办法
首先定位哪个目录出现大量文件占用inode
~]# for i in /; do echo $i; find $i |wc -l|sort -nr; done
解决方案:
1 根据业务需要,判断产生大量inode的文件是否重要,如果重要,备份,不重要则删除。
2 挂载一个新盘,并在格式化时,多分配些inode,也就是将inode size值设置小些,就会多些inode,并将盘挂载至生产大量inode的目录下。也直接将别的分区中的目录软链接至产生大量inode的目录下,来缓解inode不足的问题。
~]# df -hi
新增一块硬盘
~]# fdisk -l /dev/sdx
~]# mke2fs -N 1000000 -t ext4 /dev/sdx1
~]# mke2fs --help
Usage: mke2fs [-c|-l filename] [-b block-size] [-C cluster-size]
[-i bytes-per-inode] [-I inode-size] [-J journal-options]
[-G flex-group-size] [-N number-of-inodes]
[-m reserved-blocks-percentage] [-o creator-os]
[-g blocks-per-group] [-L volume-label] [-M last-mounted-directory]
[-O feature[,...]] [-r fs-revision] [-E extended-option[,...]]
[-t fs-type] [-T usage-type ] [-U UUID] [-jnqvDFKSV] device [blocks-count]
‘-i’ 设定inode的大小
‘-N’ 设定inode数量,有时使用默认的inode数不够用,所以要自定设定inode数量。
‘I’ 设定inode size 大小
~]# vim /etc/fstab //填写开机挂载
~]# mount //挂载至指定目录
相关命令
dumpe2fs
用于打印“ext2/ext3/ext4”文件系统的超级块和快组信息。 以及相关的inode size,block size等相关信息
查看分区、文件或目录的inode:
~]# df -i --print-type
Filesystem Type Inodes IUsed IFree IUse% Mounted on
/dev/vda1 ext4 3276800 245250 3031550 8% /
tmpfs tmpfs 1007669 1 1007668 1% /dev/shm
/dev/vdb1 ext3 9830400 294893 9535507 3% /clientdb
~]# ls -i 1.txt
67165374 1.txt
~]# stat 1.txt // display file or file system status
File: ‘1.txt’
Size: 8 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67165374 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-05-18 09:52:07.111983793 +0800
Modify: 2018-05-18 09:51:21.556984412 +0800
Change: 2018-05-18 09:51:21.556984412 +0800
Birth: -
删除inode:
~]# find ./ -inum 83856174 | xargs rm //删除inode为83856174的文件,如果不执行rm操作,就是将inode为83856174的文件或目录找出来
~]# find / -samefile filename //查找相同inode的文件
~]# find ./ -inum 83856174 | xargs rm -rf //删除目录及目录下的文件
~]# find ./ -inum xxxxx -delete //删除空目录
-inum n
File has inode number n. It is normally easier to use the -samefile test instead.