Linux 文件属性

Linux 文件属性

Linux 文件或目录的属性主要包括:文件或目录的节点、种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容。

[root@backup ~]# ls -lhi
total 176K
1700621 drwxr-xr-x  17 root root 4.0K Apr 15 21:49 1
1700619 -rw-r--r--   1 root root 123K May 20 22:48 1.zip
1701005 -rw-r--r--   1 root root   66 May 20 23:56 a
1700617 -rw-------.  1 root root 1016 Apr 15 19:29 anaconda-ks.cfg
1700610 -rw-r--r--.  1 root root  22K Apr 15 19:29 install.log
1700611 -rw-r--r--.  1 root root 5.8K Apr 15 19:28 install.log.syslog
1701020 -rw-r--r--   1 root root  223 May 25 20:44 ssh.exp

解释:

第一字段:inode索引节点编号,系统读取文件时首先通过文件名找到inode,然后才能读取到文件内容;

第二字段:文件种类和权限(-表示文件,d表示目录,r表示文件属主可读、w可写、x可执行,rwx中的-代表无);

第三字段:硬链接个数,同一个文件的不同访问入口;

第四字段:属主,文件或目录所属的用户;

第五字段:文件或目录所归属的组;

第六字段:文件或目录的大小;

第七字段-第九字段:最后访问或修改时间,默认是修改时间;

最后字段:文件名或目录名,严格说不算文件的属性;

 

inode

inode索引节点。每个存储设备或存储设备的分区(存储设备是硬盘、软盘、U盘 ... ... )被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限,但是inode唯独不包含文件名。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令, 能通过inode值最快的找到相对应的文件。

用ls 查看某个目录或文件时,如果加上-i 参数,就可以看到inode节点。也可以用stat查看详细信息。

[root@backup ~]# stat ssh.exp 
  File: `ssh.exp'
  Size: 223           Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d    inode: 1701020     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-05-25 20:44:45.185391039 +0800
Modify: 2017-05-25 20:44:43.627393671 +0800
Change: 2017-05-25 20:44:43.628393535 +0800

inode是有大小的centos5默认大小是128字节,centos6默认大小是256字节,是在分区被格式化创建文件系统后定下来的。

dumpe2fs命令可以查看硬盘inode size和Block size

[root@backup ~]# dumpe2fs  /dev/sda1 |grep -i "inode size"
dumpe2fs 1.41.12 (17-May-2010)
inode size:              128
[root@backup ~]# dumpe2fs  /dev/sda2 |grep -i "inode size"
dumpe2fs 1.41.12 (17-May-2010)
inode size:              256

查看文件系统inode总量以及剩余量

[root@backup ~]# df -i
Filesystem      inodes IUsed   IFree IUse% Mounted on
/dev/sda2      2240224 56777 2183447    3% /
tmpfs            28522     1   28521    1% /dev/shm
/dev/sda1        51200    38   51162    1% /boot

查看磁盘使用量

[root@backup ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        34G  1.5G   31G   5% /
tmpfs           112M     0  112M   0% /dev/shm
/dev/sda1       190M   27M  153M  15% /boot

磁盘空间是否满了,由两项参数决定的,任何一项满了都无法存储数据。

第一个是inode是否满了。

第二个是block是否满了。

inode小结:

1)磁盘分区格式化为ext4文件系统后会生成一定数量的inode和block。

2)inode是索引节点,作用是存放文件的属性信息以及文件的索引(指向文件的实体block)。

3)ext3/ext4文件系统的block存放的是文件的实际内容。

4)Block的大小一般有1k,2k,4k,其中引导分区为1k,其他分区为4k。

5)inode是一块磁盘存储空间,centos6非启动分区inode默认大小256字节,centos5是128字节。

6)inode是一串数字,不同的文件对应的inode在文件系统里是唯一的。

7)inode号相同的文件,互为硬链接文件(硬链接就是文件的又一个入口)。

8)一个文件被创建后至少要占用一个inode和一个block。

9)如果一个文件很大,可能占多个block。

10)如果文件很小,也要至少占一个block,并且剩余空间不可以使用,浪费了。

11)inode大小和总量查看:

dumpe2fs  /dev/sda3|egrep -i “block size|inode size”

dumpe2fs  /dev/sda3|egrep -i “block count |inode count”

12)查看inode的总量和使用量命令df -i。

13)生成和指定inode大小,mkfs.ext4 -b 2048 -I 256 /dev/sdb。

14)查看文件的inode信息,ls -li或stat。

 

Block 小结:

1)磁盘读取数据是按block为单位读取的。

2)一个文件可能占多个block,每读取一个block就会消耗一次磁盘I/O

3)如果要提升磁盘I/O性能,那么就要尽可能一次读取数据多。

4)一个block只能存放一个文件的内容,无论内容有多小,如果block默认为4K,那么存放1k的文件,剩余的就浪费了。

5)Block并非越大越好,block太大对于小文件存放就会浪费磁盘空间,

6)大文件(大于16K)一般设置block大一点,小文件(小于1k)一般设置小一点。

7)Block太大例如4K,文件都是0.1k,太浪费磁盘空间。

8)Block太大例如1k,文件都是1000K,消耗磁盘IO

9)文件较大时,block设置大点会提升磁盘访问效率

10)ext3/ext4文件一般设置成4k。

一个100Mblock的总大小,个数和单个block大小有关)的磁盘分区,分别写入1K的文件和写入1M的文件,分别可以写多少个?为什么?

解题思想:先说明要考察的知识

1、inode是存放文件属性信息的,默认大小是128字节(c5),256字节(c6)

2、Block是存放文件实际内容的,默认大小1K(boot)或4K(非系统分区默认为4k)

3、一个文件至少要占用一个inode以及一个block

4、默认分区常规情况下,inode数量是足够的,而block数量消耗的会更快。

答题:

1、默认分区常规情况下,对文件来说inode是足够的,而block数量消耗的会更快,block为4k的情况,1M的文件不会有磁盘浪费请况,所以文件数量数量大概为100/1=100个。

2、对于小文件0.1k,inode会消耗的更快,默认分区的时候block数量是大于inode数量的。每个小文件都会占用一个inode和一个block,所以最终文件的数量为:inode会先消耗完,文件总量是inode的数量。

如果向磁盘写入数据提示如下错误:NO space left on device,通过df -h查看磁盘空间,发现没满,请分析原因是什么(小文件多)?

用df –i看inode使用情况。

 文件权限

第一列:权限位,共九位,其中每三位为一组。r代表可读,用数字4表示,w代表可写,用数字2表示,x代表可执行,用数字1表示。-代表没有权限,用数字0表示。其中第一个三位代表属主(拥有者),第二个三位代表属组(群组),最后一个三位代表其他用户。

第二列:代表属主

第三列:代表属组

第四列:文件名字

硬链接

一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域

目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)。

ln 创建文件硬链接的语法:

ln   源文件   目标文件(目标文件不能事先存在)
[root@backup test]# ls -l
total 4
-rw-r--r-- 1 root root 1 May 30 22:43 a

创建硬链接

[root@backup test]# ls -li
total 8
1569796 -rw-r--r-- 2 root root 1 May 30 22:43 a
1569796 -rw-r--r-- 2 root root 1 May 30 22:43 b

修改任意一个文件,硬链接都会被修改(同一个文件,不同入口)

[root@backup test]# echo "hello">b
[root@backup test]# cat a
hello
[root@backup test]# cat b
hello

删除一个硬链接查看,删除源文件硬链接文件正常,硬链接数-1

[root@backup test]# ls -li b
1569796 -rw-r--r-- 1 root root 1 May 30 22:43 b
[root@backup test]# cat b
1

目录创建硬链接

[root@backup test]# ln /test/ /tmp/
ln: `/test/': hard link not allowed for directory

为什么创建的目录硬链接至少为2?

[root@backup test]# ls -ali
total 12
1569794 drwxr-xr-x   3 root root 4096 May 30 23:30 .
      2 dr-xr-xr-x. 25 root root 4096 May 29 12:14 ..
1569796 drwxr-xr-x   2 root root 4096 May 30 23:30 aa
[root@backup test]# cd aa
[root@backup aa]# ls -ali
total 8
1569796 drwxr-xr-x 2 root root 4096 May 30 23:30 .
1569794 drwxr-xr-x 3 root root 4096 May 30 23:30 ..
[root@backup aa]# ls -ldi /test/aa/ /test/aa/.
1569796 drwxr-xr-x 2 root root 4096 May 30 23:30 /test/aa/
1569796 drwxr-xr-x 2 root root 4096 May 30 23:30 /test/aa/.

目录本身为1,进入自身目录会有一个.表示当前目录,当进入子目录后会有一个..表示上一层目录

硬链接知识小结:

1、   具有相同inode节点号的多个文件互为硬链接文件。

2、   删除硬链接文件或者删除源文件任意之一,文件实体并未被删除。

3、   只有删除了源文件及所有对应的硬链接文件,文件实体才会被删除。

4、   当所有的硬链接文件及源文件被删除后,再存放新的数据会占用这个文件的空间,或者磁盘fsck检查的时候,删除的数据也会被系统回收。

5、   硬链接文件就是文件的另一个入口。

6、   可以通过给文件设置硬链接文件,来防止重要文件被误删。

7、   通过执行命令 ln 源文件 硬链接文件 来创建硬链接。

8、   硬链接文件可以用rm命令删除。

9、   对于静态文件,当对应硬链接数为0,文件就被删除。

软链接

除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。(相当于快捷方式)

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

创建软链接(也被称为符号链接)的语法

ln   -s     源文文件或目录     目标文件或目录
[root@backup test]# echo "hello world" >a
[root@backup test]# ls -li
total 4
1569796 -rw-r--r-- 1 root root 12 May 30 23:01 a
[root@backup test]# ln -s a b
[root@backup test]# ls -li
total 4
1569796 -rw-r--r-- 1 root root 12 May 30 23:01 a
1569798 lrwxrwxrwx 1 root root  1 May 30 23:01 b -> a

查看软连接的原文件

[root@backup test]# readlink b
a

修改文件

[root@backup test]# cat a
hello world
[root@backup test]# cat b
hello world
[root@backup test]# echo "----">>b
[root@backup test]# cat a
hello world
----
[root@backup test]# cat b
hello world
----

删除原文件,软连接和源文件具有不同的inode,软链接文件只是其源文件的一个标记。当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但我们却不能查看软链接文件的内容了。

[root@backup test]# rm -f a
[root@backup test]# ls
b
[root@backup test]# cat b
cat: b: No such file or directory

目录可以创建软连接。

[root@backup test]# ln -s /etc/sysconfig/network-scripts/ /test/net
[root@backup test]# ls -l
total 4
-rw-r--r-- 1 root root 12 May 30 23:04 a
lrwxrwxrwx 1 root root  1 May 30 23:01 b -> a
lrwxrwxrwx 1 root root 31 May 30 23:07 net -> /etc/sysconfig/network-scripts/
[root@backup test]# ls net/
ifcfg-eth1  ifdown-bnep  ifdown-ipv6  ifdown-ppp     ifdown-tunnel  ifup-bnep  ifup-ipv6  ifup-plusb  ifup-routes  ifup-wireless     network-functions
ifcfg-lo    ifdown-eth   ifdown-isdn  ifdown-routes  ifup           ifup-eth   ifup-isdn  ifup-post   ifup-sit     init.ipv6-global  network-functions-ipv6
ifdown      ifdown-ippp  ifdown-post  ifdown-sit     ifup-aliases   ifup-ippp  ifup-plip  ifup-ppp    ifup-tunnel  net.hotplug

软链接知识小结:

1、   软链接类似Windows的快捷方式,可以通过readlink查看指向。

2、   软链接类似一个文本文件,里面存放的是原文件的路径,指向源文件实体。

3、   删除源文件,软链接文件依然存在,但是无法访问指向的源文件路径内容了。

4、   失效是时候一般是白字红底闪烁提示。

5、   执行命令ln -s 源文件 软链接文件。

6、   软链接和源文件是不同类型的文件,也是不同的文件,inode号也不相同。

7、   删除软连接文件可以用rm命令。

软连接和硬链接的区别:

1、   默认情况下,ln命令创建的是硬链接,ln -s 命令创建的是软连接。

2、   硬链接文件与源文件的inode节点号相同,而软链接文件的inode节点号与源文件不同。

3、   ln命令不能对目录创建硬链接,但可以创建软链接。

4、   删除软链接文件,对源文件无任何影响。

5、   删除硬链接文件,对源文件无任何影响。

6、   删除软链接的源文件,会导致软链接失效。

7、   同时删除硬链接及源文件,整个文件才会被删除

文件删除原理及案例

Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和 i_nlink。

    i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 的意义是介质连接的数量(硬链接的数量);可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。

当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。

    对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?

这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。

以上讲的i_nlink及i_count是文件删除的真实条件,但是当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删的文件呢?

前面说了,rm操作只是将文件的i_nlink减少了,或者说置0了,实际就是将文件名到inode的链接删除了,此时,并没有删除文件的实体即(block数据块),此时,如果及时停止机器工作,数据是可以找回的,如果此时继续写入数据,那么当新数据就可能会被分配到被删除的数据的block数据块,此时,文件就会被真正的回收了,那时就是神仙也没有办法了。

 

文件删除的条件:i_link=0并且i_count=0

 硬链接数和进程引用数都为0,那么这个文件就删除了

 企业案例:web服务器磁盘满故障深入解析

生产线服务器硬盘满了。该删的日志都删掉了。可空间还是满的,但是用du -sh /*查看时占用硬盘空间之和还远小于硬盘大小,即找不到硬盘分区是怎么被写满的。

案例实战模拟:

1、安装httpd服务

[root@backup ~]# yum install httpd -y

2、开启服务

[root@backup ~]# /etc/init.d/httpd start

3、编辑httpd的配置文件,打开日志记录功能

[root@backup ~]# cd /etc/httpd/conf
[root@backup conf]# vim httpd.conf 
513  CustomLog /app/logs/access_log common

4、创建一个小的文件系统,用于存放上述access_log日志。

[root@backup conf]# dd if=/dev/zero of=/dev/sdc bs=8K count=10
10+0 records in
10+0 records out
81920 bytes (82 kB) copied, 0.000778298 s, 105 MB/s
[root@backup conf]# mkfs -t ext4 /dev/sdc

5、创建目录

[root@backup conf]#  mkdir /app/logs -p

6、挂载

root@backup conf]# mount -o loop /dev/sdc /app/logs
[root@backup conf]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        34G  1.5G   31G   5% /
tmpfs           112M     0  112M   0% /dev/shm
/dev/sda1       190M   27M  153M  15% /boot
/dev/sdc         73K   14K   55K  21% /app/logs

7、重启httpd服务,确保日志记录到了上述文件系统挂载的/app/log下面

[root@backup conf]# ls /app/logs/
lost+found
[root@backup conf]# /etc/init.d/httpd restart
[root@backup conf]# ls /app/logs/
access_log  lost+found

8、访问网站192.168.88.10并查看日志

[root@backup conf]# cat /app/logs/access_log 
192.168.88.1 - - [31/May/2017:18:59:13 +0800] "GET / HTTP/1.1" 403 4961
192.168.88.1 - - [31/May/2017:18:59:13 +0800] "GET /icons/apache_pb.gif HTTP/1.1" 200 2326
192.168.88.1 - - [31/May/2017:18:59:13 +0800] "GET /icons/poweredby.png HTTP/1.1" 200 3956
192.168.88.1 - - [31/May/2017:18:59:13 +0800] "GET /favicon.ico HTTP/1.1" 404 288

10、写个循环脚本访问httpd,使得httpd日志充满/app/logs整个空间

[root@backup conf]# for i in `seq 10000`;do curl -s 127.0.0.1>/dev/null;done
[root@backup ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        34G  1.5G   31G   5% /
tmpfs           112M     0  112M   0% /dev/shm
/dev/sda1       190M   27M  153M  15% /boot
/dev/sdc         73K   68K  1.0K  99% /app/logs

11、错误的删除方案。

[root@backup ~]# rm -f /app/logs/access_log 
[root@backup ~]# ls /app/logs/
lost+found
[root@backup ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        34G  1.5G   31G   5% /
tmpfs           112M     0  112M   0% /dev/shm
/dev/sda1       190M   27M  153M  15% /boot
/dev/sdc         73K   68K  1.0K  99% /app/logs

12、查看被删除的但仍由进程占用的文件名。

[root@backup ~]# lsof |grep del
httpd      5103    root    7w      REG                7,0    55260         12 /app/logs/access_log (deleted)
httpd      5105  apache    7w      REG                7,0    55260         12 /app/logs/access_log (deleted)
httpd      5106  apache    7w      REG                7,0    55260         12 /app/logs/access_log (deleted)
httpd      5107  apache    7w      REG                7,0    55260         12 /app/logs/access_log (deleted)
httpd      5108  apache    7w      REG                7,0    55260         12 /app/logs/access_log (deleted)
httpd      5109  apache    7w      REG                7,0    55260         12 /app/logs/access_log (deleted)
httpd      5110  apache    7w      REG                7,0    55260         12 /app/logs/access_log (deleted)
httpd      5111  apache    7w      REG                7,0    55260         12 /app/logs/access_log (deleted)
httpd      5112  apache    7w      REG                7,0    55260         12 /app/logs/access_log (deleted)

13、解决方法,重启服务(释放占用文件)

[root@backup ~]# /etc/init.d/httpd restart
[root@backup ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        34G  1.5G   31G   5% /
tmpfs           112M     0  112M   0% /dev/shm
/dev/sda1       190M   27M  153M  15% /boot
/dev/sdc         73K   14K   55K  21% /app/logs

14、较好方案,清空日志而不删除日志。

[root@backup ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        34G  1.5G   31G   5% /
tmpfs           112M     0  112M   0% /dev/shm
/dev/sda1       190M   27M  153M  15% /boot
/dev/sdc         73K   68K  1.0K  99% /app/logs
[root@backup ~]# >/app/logs/access_log 
[root@backup ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        34G  1.5G   31G   5% /
tmpfs           112M     0  112M   0% /dev/shm
/dev/sda1       190M   27M  153M  15% /boot
/dev/sdc         73K   14K   55K  21% /app/logs

这个也可以模拟空间满和inode满

[root@backup logs]# touch {a..z}
touch: cannot touch `e': No space left on device
touch: cannot touch `f': No space left on device

 

posted @ 2017-05-31 19:16  wxianj  阅读(257)  评论(0)    收藏  举报