壹 Linux文件属性描述:
在Linux里一切皆文件
Linux系统中的文件或目录的属性主要包括:索引节点(inode)、文件类型、权限属性、连接数、所归属的用户和用户组、最近修改时间等内容。node
例子:
[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 avahilinux
如上10列所表明的Linux文件属性:
第①列:#inode索引节点编号
(至关于身份证,在Linux系统里是惟一的)
(系统读取文件时首先经过文件名找到inode,而后才能读取到文件内容)
第②列:#文件类型及权限
(共10个字符,第一个字符为类型,后9个字符为文件权限,最后一个字符.和selinux相关的标识)
第③列:#硬连接个数 (门的做用:1访问入口。2备份做用)
第④列:#文件或目录所属的用户(属主,拥有者)
(Linux里面文件和程序的存在必需要有用户组和组,知足相应的存在需求)
(组和拥有者能够不是一个)
第⑤列:#文件或目录所属的组
第⑥列:#文件大小 (在Linux里一切皆文件)
第⑦⑧⑨列:#最近修改时间 (月 日 时 分)
(find -mtime -ctime -atime:modify change access)
第⑩列:#实际的文件或目录名(严格的说文件名不算文件的属性)文件名不在inode里,而是在上级目录的block里。ios





贰 查看文件系统inode总量以及剩余量:面试

叁 查看磁盘的使用量:apache

PS:对于运维人员来讲“磁盘满了”,一个是block满了,一个是inode满了。centos
磁盘空间是否满了,是由两项参数决定的:
一、inode是否满了。
二、block是否满了。
任何一项满了,你都没法放你最喜欢的片了。bash
磁盘满了的一个特征:
(no space on device left)服务器
肆 有关inode的小结:(学会给阶段性的知识做小结是学好Linux的好习惯)
1)磁盘被分区并格式化为ext4文件系统后会生成必定数量的inode和block。运维
2)inode成为索引节点,它的做用是存放文件的属性信息以及做为文件的索引(指向文件的实体)。ide
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命令
rm命令
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,建立软连接链接数不变
四、是否能够跨分区:硬连接不能够跨分区,软连接能够跨分区
五、目录是否能够建立连接:硬连接不能够对目录建立,软连接能够对目录建立
六、硬连接的inode号相同,软连接inode号不一样
