NO20文件属性--inode--block-企业场景题
壹 Linux文件属性描述:
在Linux里一切皆文件
Linux系统中的文件或目录的属性主要包括:索引节点(inode)、文件类型、权限属性、链接数、所归属的用户和用户组、最近修改时间等内容。
例子:
[root@localhost etc]# ls -lhi
total 1.4M
50752632 drwxr-xr-x. 3 root root 101 Apr 23 14:59 abrt
17631870 -rw-r--r--. 1 root root 16 Apr 23 15:16 adjtime
16778352 -rw-r--r--. 1 root root 1.5K Jun 7 2013 aliases
18018101 -rw-r--r--. 1 root root 12K Apr 23 15:20 aliases.db
17779594 drwxr-xr-x. 2 root root 51 Apr 23 15:00 alsa
50456080 drwxr-xr-x. 2 root root 4.0K Apr 23 15:13 alternatives
17631850 -rw-------. 1 root root 541 Aug 3 2017 anacrontab
17037763 -rw-r--r--. 1 root root 55 Mar 1 2017 asound.conf
18040415 -rw-r--r--. 1 root root 1 Nov 6 2016 at.deny
1216969 drwxr-x---. 3 root root 43 Apr 23 15:00 audisp
34216454 drwxr-x---. 3 root root 83 Apr 23 15:20 audit
18150015 drwxr-xr-x. 4 root root 71 Apr 23 15:05 avahi
如上10列所代表的Linux文件属性:
第①列:#inode索引节点编号
(相当于身份证,在Linux系统里是唯一的)
(系统读取文件时首先通过文件名找到inode,然后才能读取到文件内容)
第②列:#文件类型及权限
(共10个字符,第一个字符为类型,后9个字符为文件权限,最后一个字符.和selinux相关的标识)
第③列:#硬链接个数 (门的作用:1访问入口。2备份作用)
第④列:#文件或目录所属的用户(属主,拥有者)
(Linux里面文件和程序的存在必须要有用户组和组,满足相应的存在需求)
(组和拥有者可以不是一个)
第⑤列:#文件或目录所属的组
第⑥列:#文件大小 (在Linux里一切皆文件)
第⑦⑧⑨列:#最近修改时间 (月 日 时 分)
(find -mtime -ctime -atime:modify change access)
第⑩列:#实际的文件或目录名(严格的说文件名不算文件的属性)文件名不在inode里,而是在上级目录的block里。
贰 查看文件系统inode总量以及剩余量:
叁 查看磁盘的使用量:
PS:对于运维人员来说“磁盘满了”,一个是block满了,一个是inode满了。
磁盘空间是否满了,是由两项参数决定的:
1、inode是否满了。
2、block是否满了。
任何一项满了,你都无法放你最喜欢的片了。
磁盘满了的一个特征:
(no space on device left)
肆 有关inode的小结:(学会给阶段性的知识作小结是学好Linux的好习惯)
1)磁盘被分区并格式化为ext4文件系统后会生成一定数量的inode和block。
2)inode成为索引节点,它的作用是存放文件的属性信息以及作为文件的索引(指向文件的实体)。
3)ext4/ext4文件系统的block存放的是文件的实际内容。
4)inode是磁盘上的一块存储空间,C6非启动分区inode默认大小256字节,C5是128字节。
5)inode的表现形式是一串数字,不同的为了见对应的inode(一串数字)在文件系统里是唯一的。
6)inode节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口。
7)ext3/ext4文件系统下,一个文件被创建后至少要占用一个inode和一个block。
8)ext3/ext4文件系统下,正常情况下一个文件占用且只能占用一个inode(像人和身份证),硬链接文件不算。
9)block是用来存储实际数据的,它的大小一般有1K,2K,4K几种。其中引导分区等为1K,其他普通分区多为4K(C6)。
10)如果一个文件很大(高清大片4G),需要占多个block,如果文件很小(0.01K),至少占一个block,并且这个block的剩余空间就浪费了,即无法在存储其他数据了。
11)inode大小和总量查看:(下面的i是不区分大小写)
[root@localhost etc]# dumpe2fs /dev/sda3|egrep -i "block size|lnode size"
[root@localhost etc]# dumpe2fs /dev/sda3|egrep -i "block count|lnode count"
默认block count一般会大于lnode count的数量。
12)查看inode的总量和使用量:
[root@localhost etc]# df -i
13)查看文件的inode信息方法:
[root@localhost etc]# ls -li
[root@localhost /]# stat /etc/hosts
14)如何生成及指定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并非越大越好。太大对于存放小文件就会浪费磁盘空间(比如1000K的文件,block大小为4K和1K,则分别占用250和1000个block,消耗IO分别为250次和1000次)。
6)根据业务需求,确定默认的block大小:1K>文件>16K==block小一点、大一点。
7)block太大例如4K,文件都是0.1K的,大量浪费磁盘空间,但是访问性能高。
8)block太小例如1K,文件都是1000K的,消耗大量IO。
9)block大小设置也是格式化分区时候确定的,命令:mkfs.ext4-b 2048-l 256 /dev/sdb。
10)企业里文件都会比较大一般>4K,block大一点会提升磁盘访问效率。
11)ext3/ext4文件系统(centos5/centos6),一般都设置为4K。
总的小结:
1)磁盘被分区格式化文件系统后,会分为inode和block俩部分内容。
2)inode存放文件的属性以及指向文件实体的指针,文件名不再inode里,一般上级目录的block里。
3)访问文件原理:通过文件名==inode==blocks。
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。
9)可以在格式化的时候改变inode及block的大小。命令:mkfs.ext4-b 2048-l 256 /dev/sdb。
文件删除恢复:ext3grep,应该养成好习惯,先备份再操作,要能快速还原,不容易还原的,先通过多套测试环境测试,然后再操作。
企业面试题:一个100M(100000K)的磁盘分区,分别写入1K的文件或写入1M的文件,分别可以写多少。
错误解答:很容易计算1K的个数:100*1000=10000个,1M文件的个数:100、1=100个。
以上题考察的知识点:不要直接给答案。
1 上面的题目考察文件系统inode和block的知识。
2 inode是存放文件属性信息的(也包含指向文件实体的指针),默认大小128byte(C58),256byte(C64).
3 block是存放文件实际内容的,默认大小1K(boot)或4K(非系统分区默认给4K)一般企业用4K的。
4 一个文件至少要占用一个inode及一个block。
5 默认较大分区常规企业真实场景情况下,inode数量是足够的,而block数量消耗的会更快。
假设B 4K 写入1K文件的数量,基本上就是block的数量。
假设B 4K 写入1M文件的数量:总block数量/250block=存放1M的数量。
企业面试题:如果向磁盘写入数据提示No space left on device,通过df -h查看磁盘空间,发现没满,原因。企业场景什么情况下会导致这个问题呢?
解答:
1 可能是inode数量被耗尽了。
2 企业工作中邮件临时队列/var/spool/clientmquene这里很容易被大量小文件占满导致No space left on device的错误。clientmquene目录只有安装了sendmail服务,才会有,是sendmail邮件的临时队列。centos5.8默认就会装sendmail,centos6.6默认没有sendmail,但是有postfix。
Linux服务器 /var/spool/clientmqueue 目录下产生大量文件的解决办法
今天收到nagios报警邮件,其中一台server中的磁盘分区空间超过95%,登录到服务器查看
[root@hadoop-node-29 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 19G 16G 2.8G 95% /var
到目录/var查看哪个目录中的文件最大
[root@hadoop-node-29 var]# du -sh *
找到是/var/spool目录占了很大空间,进入spool目录继续查看 找到是clientmqueue目录中的文件很多占了大部分空间。
删除所有文件
[root@hadoop-node-29 clientmqueue]# rm -rf *
结果返回-bash: /bin/rm: Argument list too long
换用命令find . -print|xargs rm 过了一段时间终于删除了所有文件
不过这种方法只是治标不治本的方法。
为什么var/spool/clientmqueue会产生大量的文件呢,查资料是因为cron执行时会将相关结果以mail方式发送到执行用户的帐号,可是当sendmail 沒有启动 那么所有信件就会暂存在这个目录中,此时就会出现这种情况。
治本的方法是在cron 任务中的后面加上 > /dev/null 2>&1
例如
* * * * * /etc/init.d/snmp_cron.sh > /dev/null 2>&1
有关inode的小结:(学会给阶段性的知识作小结是学好Linux的好习惯)
1)磁盘被分区并格式化为ext4文件系统后会生成一定数量的inode和block。
2)inode成为索引节点,它的作用是存放文件的属性信息以及作为文件的索引(指向文件的实体)。
3)ext4/ext4文件系统的block存放的是文件的实际内容。
4)inode是磁盘上的一块存储空间,C6非启动分区inode默认大小256字节,C5是128字节。
5)inode的表现形式是一串数字,不同的为了见对应的inode(一串数字)在文件系统里是唯一的。
6)inode节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口。
7)ext3/ext4文件系统下,一个文件被创建后至少要占用一个inode和一个block。
8)ext3/ext4文件系统下,正常情况下一个文件占用且只能占用一个inode(像人和身份证),硬链接文件不算。
9)block是用来存储实际数据的,它的大小一般有1K,2K,4K几种。其中引导分区等为1K,其他普通分区多为4K(C6)。
10)如果一个文件很大(高清大片4G),需要占多个block,如果文件很小(0.01K),至少占一个block,并且这个block的剩余空间就浪费了,即无法在存储其他数据了。
11)inode大小和总量查看:(下面的i是不区分大小写)
[root@localhost etc]# dumpe2fs /dev/sda3|egrep -i "block size|lnode size"
[root@localhost etc]# dumpe2fs /dev/sda3|egrep -i "block count|lnode count"
默认block count一般会大于lnode count的数量。
12)查看inode的总量和使用量:
[root@localhost etc]# df -i
13)查看文件的inode信息方法:
[root@localhost etc]# ls -li
[root@localhost /]# stat /etc/hosts
14)如何生成及指定inode大小:
格式化命令:mkfs.ext4-b 2048-l 256 /dev/sdb
inode总结
什么是inode?
理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫扇区(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块(block)。这种由多个扇区组成的块是文件存取的最小单位,块的大小,最常见的是4KB,即连续八个sector组成一个block,文件数据都储存在块中,那么很明显,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创年日期、文件的大小等等。这种储存元信息的区域叫做inode,中文译名为”索引节点”。inode (index node) 表中包含文件系统的所有文件列表。
inode包含文件的信息(元数据)
Inode编号
用来识别文件类型,以及用于stat C函数的模式信息
文件权限
文件的拥有者的UID
文件所属组的GID
链接数(指向这个文件名路径名称个数)
文件的大小
文件的间戳(ctime指inode上一次变动的时间,mtime是指文件内容上一次变动的时间,atime指文件上一次打开的时间)
指向磁盘文件的数据块指针
有关文件的其它数据
注意:要想查看文件的inode信息可以使用stat命令查看
inode表结构
直接块指针:
前12个直接指针,直接指向存储数据的区域。如Blocks大小为4*1024KB,前12个直接指针就可以保存48KB的文件
间接块指针:
设每个指针占用4个字节,则以及指针指向的Blocks可以保存(4*1024)/4KB,可指向1024个Blocks,一级指针可存储文件数据大小为1024*(4*1024)KB=4MB
双重间接块指针:
同样Blocks大小为4*1024,则二级指针可保存Blocks指针数量为((4*1024)/4)*((4*1024)/4),则二级指针保存文件数据大小为(1024*1024)*(4*1024)=4GB
三重间接块指针:
以次类推三级指针可以储存文件数据大小为(1024*4*1024*1024)*(4*1024)=4TB
inode的大小:
每个inode都有一个编号,操作系统用inode号来识别不同文件。Unix/Linux系统不使用文件名,而使用inode号来识别文件,对于系统来说,文件名只是inode号码便于识别的别称或绰号。表面上,通过文件名打开文件;实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号;其次,通过inode号,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
注意:inode号并不是无限的,如果一个分区的节点数被使用完了,那么即使磁盘空间还有剩余也不能再存放任何数据。可以使用df -i命令查看节点使用情况
注:1节点总数、2使用过节点数、3剩余节点数、4节点使用率
目录文件:
Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件目录文件的结果非常简单,就是一系列目录项(direct)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号。
ls命令只列出目录文件中的所有文件名:
ls -i命令列出整个目录文件,即文件名和inode号(箭头标的即为inode号):
如果要查看文件的详细信息,就必须根据inode号,访问inode节点,读取信息。ls -i -l 目录文件 列出整个目录文件,即文件名和inode号(箭头标注的列即为inode号)
理解了上面的知识,就能理解目录的权限,文件的读权限(r)和写权限(w),都是针对目录文件本身。由于目录文件内只有文件名和inode号,所以只有读权,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而读取inode节点内的信息需要目录文件的执行权限(x)。
Linux中cp、rm、mv 、ln对inode的影响:
cp命令
-
分配一个未被使用的inode号,在inode表中添加一个新项目,(注意:如果是cp到讴歌已经存在的文件,则inode号采用被覆盖之前的目标文件的inode号,如果对运行中的apache共享模块so文件进行cp操作,就会出现Segmentation fault<段错误>)
-
在目录中新建一个目录项,并指向步骤1中的inode
-
把数据复制到block中
rm命令
-
减少链接数量,如果链接数为0,释放inode(inode号也已被重新使用);
-
如果inode被释放,则数据块放到可用空间列表中;
-
删除目录中的目录项
mv命令
1.如果mv命令的目标文件和源文件所在额文件系统相同:
使用新文件名建立目录项;
删除带有原来文件名的目录项;
注意:该操作对inode表没有影响(除时间戳),对数据的位置也没有影响,不移动任何数据。(即使是mv到一个已经存在的目标文件,新目录项指源文件inode,会先删除目标文件的目录项,所以如果对运行中的apache的共享模块so文件进行这种操作的话不会有问题,新的so文件inode号变了)
2.如果目标和源文件所在的问价系统不相同,就是cp和rm;
ln命令
符号(软)链接:
符号链接的内容是它引用文件的名称,可以是任意文件或目录,也可以链接不同问价系统的文件,甚至可以链接不存在的文件,这就产生一般称为断裂的问题,还可以不断的循环链接源文,但是其大小为指向的路径字符串的长度;不增加或减少目标文件inode 的引用计数。
使用ln -s source_file softlink_file (注意:源文件(source_file)的路径是相对路径(也可以是绝对路径,通常使用的是相对路径),一定是相对于软链接文件的路径,而非相对于当前工作目录的路径)创建符号链接,在对符号链接进行读写操作的时候,系统会自动把该操作转换为对源文件的操作,但是删除连接文件时,系统仅仅删除符号链接文件,而不是删除源文件本身。
硬链接:
不允许给目录创建硬链接,创建硬链接会正价额外的记录项以引用文(不能跨驱动或分区创建硬链接),硬链接件对应于同一文件系统上的一个物理文件,硬链接节点编号是相同的,创建硬链接链接数递增,删除文件时:rm命令递减计数的链接,文件如果存在,至少有一个链接数,当链接数为0时,该文件被删除。
使用ln existfile newfile 命令创建硬链接
硬链接于软连接的区别:
1、本质不同:硬链接是指向同一个文件,软链接指向的不是同一个文件
2、删除时:硬链接不受影响,软链接失效
3、创建链接时:创建硬链接链接数加1,创建软链接连接数不变
4、是否可以跨分区:硬链接不可以跨分区,软链接可以跨分区
5、目录是否可以创建链接:硬链接不可以对目录创建,软链接可以对目录创建
6、硬链接的inode号相同,软链接inode号不同