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。

一个100M(block的总大小,个数和单个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
浙公网安备 33010602011771号