1. 文件属性概述和目录的属性及权限

Linux系统中的文件或目录的属性主要包括:索引节点(inode)、文件类型、权限属性、连接数、所归属的用户和用户组、最近修改时间等内容。
实例1: ls -lhi
[root@kali data]# ll -ih
total 20K
267065 drwxr-xr-x 3 root root 4.0K Jul 28 2016 3306
271249 drwxr-xr-x 3 root root 4.0K Jul 28 2016 3307
263641 -rw-r—r— 1 root root 0 Aug 15 2016 admin.txt
263726 -rw-r—r— 1 root root 2.2K Jul 17 00:53 oldboy.txt
linux文件属性体系知识 - 图1

文件解释:
第一列:inode索引节点编号(人的身份证,全国唯一)。
系统读取文件时,首先通过文件名找到inode,然后才能读取到文件内容。
第二列:文件类型及权限(共10个字符,第一个字符为类型,后9个字符为文件权限)
第三列:硬链接个数(详情man ls命令)(硬链接:一个文件两个不同的访问入口)
第四列:文件或目录所属的用户(属主)
第五列:文件所属群组
第六列:文件的大小
第七八九列:文件的修改时间
第十列:文件名(严格来讲,文件名不算文件属性)

1.1 索引节点inode

inode概述
硬盘要存储数据,首先要分区,然后格式化创建文件系统,最后存数据。
inode,中文意思是索引节点(index node)。在每个linux存储设备或存储设备的分区(存储设备可以是硬盘、软盘、U盘……)被格式化为ext4(CentOS6.8)文件系统后,一般都有两部分:第一部分是Inode(很多个),第二部分是Block(很多个)。

Block是用来存储实际数据用的,例如:照片,视频等普通文件数据。
而inode就是用来存储这些数据属性信息(也就是ls -l的结果), inode属性信息包括不限于文件大小、属主(用户)、归属的用户组、文件权限、文件类型、修改时间,还包含指向文件实体的指针的功能(inode节点—block的对应关系)等,但是,inode唯独不包含文件名

linux文件属性体系知识 - 图2

查看文件详细属性:
[root@kali data]# stat /etc/passwd
File: `/etc/passwd’
Size: 1323 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 13955 Links: 1
Access: (0644/-rw-r—r—) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-07-16 23:27:35.739565104 +0800
Modify: 2016-07-16 23:26:25.743438920 +0800
Change: 2016-07-16 23:26:25.745439167 +0800

因为inode要存放文件的属性信息,所以每个inode本身是有大小的,Centos5 inode默认大小是128字节,而Centos6 inode的默认大小是256字节,inode的大小在分区被格式化创建文件系统后定下来的,格式化以后就无法更改inode大小,格式化之前可以通过参数指定inode的大小,但是一般企业工作环境没这个需求。

查看文件系统Inode总量以及剩余量
[root@kali data]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 546720 90509 456211 17% /
tmpfs 125517 1 125516 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot

查看磁盘的使用量
[root@kali data]#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.1G 3.1G 4.7G 40% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 33M 147M 19% /boot
磁盘空间是否满了,是由两项参数决定的:
第一个是inode是否满了,第二个block是否满了,任何一项满了,都无法存放数据了。
磁盘满的一个特征(no spance left on device)。

有关inode的小结:学会给阶段性的知识做小结是学好Linux运维的好习惯。

  1. 磁盘被分区并格式化为ext4文件系统后会生成一定数量的inode和block。
  2. inode称为索引节点,它的作用是存放文件的属性信息及作为文件的索引(指向文件的实体)
  3. ext3/ext4文件系统的block存放的是文件的实际内容。
  4. inode是磁盘上的一块存储空间,Centos6非启动分区inode默认大小256字节,centos5是128字节。
  5. inode的表现是形式一串数字,不同的文件对应的inode(一串数字)在文件系统里是唯一的
  6. inode节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口
  7. ext3/ext4文件系统下,一个文件被创建后至少要占用一个Inode和一个block
  8. ext3/ext4文件系统下,正常情况下一个文件占用且只能占用一个inode(人和身份证)
  9. block是用来存储实际数据的,每个block的大小一般有1k,2k,4k几种。其中引导分区等为1k,其他普通分区多为4k
  10. 如果一个文件很大(高清的大片4G),需要占多个block,如果文件很小(0.01k),至少占用一个block,并且这个block的剩余空间就浪费了,既无法在存储其它数据了。
  11. inode大小和总量查看

[root@kali data]# dumpe2fs /dev/sda1|egrep -i "block count|Inode count"
dumpe2fs 1.41.12 (17-May-2010)
Inode count: 51200
Block count: 204800
Reserved block count: 10240
12)查看inode总量
[root@kali data]#df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 546720 90509 456211 17% /
tmpfs 125517 1 125516 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot

  1. 查看文件的inode信息方法

    ls -li 或 stat /etc/passwd
    13) 如何生成及指定inode大小
    格式化命令:mkfs.ext4 -b 2048 -l 256 /dev/sdb

有关Block的知识小结:

  1. 磁盘读取数据是按Block为单位读取的。
  2. 一个文件可能占用多个block。每读取一次block就会消耗一次磁盘I/O。
  3. 如果要提升磁盘IO性能,那么就要尽可能一次性读取数据量的多。
  4. 一个block只能存放一个文件的内容,无论内容有多小。如果block默认是4k大小,那么存放一个1k的文件,剩余的3k就不能存放别的文件,只能浪费了。
  5. block并非越大越好。block太大对于存放小文件就会浪费磁盘空间,例如:1000k的文件block大小为4k,占用250个block,如果block默认为1k,则需要占用1000个block。访问效率谁更高?消耗IO分别为250次和1000次。
  6. 根据业务需求,确定默认的block大小,如果是大文件(大于16k)一般设置block大一点,小文件(小于1k)一般设置block小一点。
  7. block太大例如4k,文件都是0.1k的,大量浪费磁盘空间,但是访问性能高。
  8. block太小,例如1k,文件都是1000K,消耗大量磁盘IO。
  9. block大小设置也是格式化分区的时候确定的,命令mkfs.ext4 -b 2048 -I 256 /devxxx
  10. 企业里文件都会比较大(一般会大于4K),block设置大一些会提升磁盘访问效率。
  11. ext3/ext4文件系统(centos5和5)一般都设置为4K。

1.2 总的小结:

  1. 磁盘被分区格式化文件系统后,会分为inode和block两部分内容。
  2. inode存放文件的属性以及指向文件实体的指针,文件名不在inode里,一般在上级目录的block里。
  3. 访问文件原理:通过文件名—->inode—>block
  4. inode一般情况下默认大小256B,block大小1,2,4K,默认4k,注意,引导分区等特殊分区除外。
  5. 通过df -i查看inode的数量及使用情况,dumpe2fs /dev/sda3查看inode及block的大小/数量
  6. 一个文件至少要占用一个inode及一个block,多个文件可以占用一个inode(硬链接),相同文件。
  7. 一个block只能被一个文件使用,如果文件很小block很大,剩余空间浪费,无法继续被其他文件使用。
  8. block不是越大越好,要根据业务的文件大小进行选择,一般centos6就是默认4K

1.3 企业案例:

如果向磁盘写入数据提示如下错误:No space left on device,通过df -h查看磁盘空间,
发现没满,请问可能是什么原因?企业场景什么情况下会导致这个问题发生呢?

解答:可能是inode数量被消耗尽了。

企业工作中邮件临时队列/var/spool/clientmquene这里很容易被大量小文件占满导致No space left on device的错误。clientquene目录只有安装了sendmail服务才会有,是sendmail邮件的临时队列。