Linux文件属性详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux文件属性详解相关的知识,希望对你有一定的参考价值。

文件属性(ls -lhi查看到的信息)

技术分享图片

1.1 第一列:inode号

1.1.1 什么是inode

文件存储在硬盘上,硬盘的最小存储单位叫做"扇区"(sector)。每个"扇区"的大小为512字节(byte),
,操作系统读取硬盘的时候,不会一个个扇区的读取,这样效率太慢。他是一次性读取多个扇区,即一次性读取一个"Block块"。一个Block有8个连续的扇区(sector)组成。
数据都存在Block块里面,但是我们怎么知道一个数据存放在哪些Block块里面呢?这个时候就必须需要一个索引,引导我们去找到哪些存放在BLOCK块里面的额数据。这存放索引的地方我们称为索引节点(Inode),索引节点里面包括了:文件的类型,属主,属组,权限,和时间戳一些信息,但是不包括文件名,
1.1.2 inode包含的内容
技术分享图片

1:文件的类型
2:文件的权限,属主、属组、其他人的权限(r:读;w:写;o:其他人)
3:文件的硬连接数
4:属主
5:属组
6:文件的大小,对于目录而言:只是目录本身的大小,而不是里面内容的大小
7:默认是文件的修改时间
[[email protected]_50 ~]# stat /
  File: `/‘                 #除了这个其他的都存放在inode里面
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 803h/2051d  Inode: 2           Links: 29
Access: (0555/dr-xr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-12-13 08:11:33.331896121 -0500
Modify: 2018-07-27 00:10:10.415506122 -0400
Change: 2018-07-27 00:10:10.415506122 -0400

1.1.3 inode的大小

想一下,既然他要存放内容,所以他肯定也是需要占用磁盘空间大小的。所硬盘分区在创建文件系统(格式化)的时候自动把硬盘分区分成两个区域:

    1)Block块,数据区:存放实际的数据
    2)Inode块,索引区:存放inode所包含的信息(文件属性信息)
inode节点的大小和总数,是创建文件系统的时候就给定的,后期没办法更改,一般是128字节(byte)或者256字节(byte)。

1.1.4 如何查看inode的数量和大小:

1.1.4.1 查看数量

    df -i   
    [[email protected]_50 ~]# dumpe2fs   /dev/sda3 | grep -i "inode count"
dumpe2fs 1.41.12 (17-May-2010)
Inode count:              1250928

1.1.4.2 查看inode的大小:

[[email protected]_50 ~]# dumpe2fs /dev/sda3 | grep -i "inode size"
dumpe2fs 1.41.12 (17-May-2010)
Inode size:           256

如果inode被占用完全,那么对这个文件里面写入数据的时候会提示磁盘已满,no space left on device

1.1.5 inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux不考文件名来区分文件,就像Linux不靠用户名来区分用户。文件名只是inode号码便于识别的绰号。
打开或编辑文件的过程:
技术分享图片

1.1.6 目录文件

Linux下面一切皆文件,所以列出目录下的内容也相当于列出目录文件里面的内容,进入目录,就相当于进入目录文件里面。
目录文件的结构非常简单,就是一系列目录项(dirent)的列表,每个目录项都有两部分组成:
1)所包含的文件名
2)所包含的文件名和inode(索引节点号)的对应关系
修改目录下面的文件名,实际上就是在修改目录文件本身的block块里面的对应信息。所以能不能改目录下面的文件的名称是根据目录的权限来的。而是不根据文件本省的的权限来的。

1.1.7 inode总结

磁盘被分区格式化为ext4文件系统后会生成一定数量的inode和block
1)inode被称为索引点,存放文件的属性信息及作为文件的索引(类似于C语言指针)
2)ext3/ext4文件系统的block存放的是文件的实际内容
3)inode是磁盘上的一块存储空间,CentOS5是128字节,CentOS6是256字节
4)inode的表现形式是一串数字,不同文件对应inode不相同
5)inode号相同的互为硬链接
6)ext3和ext4文件系统下,一个文件至少占用一个inode和block
7)ext3和ext4文件系统下,一个文件只能占用一个inode
改变inode大小,mkfs.ext4 –b 2048 –i 256#-b指定block大小,-i指定inode大小

1.1.8 block总结

1)用来实际存放数据的地方,如果是目录,里面存放下级文件的文件名称
2)磁盘读取数据是按照block为单位读取的
3)一个文件至少占用一个block,未用完的浪费,可以占用多个block
4)要提升磁盘I/O性能,那就要一次性读取数据尽量的多
5)block并非越大越好。block太大会对小文件存放浪费太多磁盘空间,太小对于大文件来说,会更大的消耗I/O。一般默认为4K(4096字节)

1.2 文件类型

-:代表普通文件
d:代表目录
l:代表软连接(ln –s 源文件 链接文件)
b:块设备和其他外围设备,是特殊类型的文件
普通文件“—”又分为:(用file来查看)
1) 纯文本文件(ascll):文件内容可以直接督导数据
2) 二进制文件(binary):Linux中的命令程序就是这种格式
3) 数据格式文件(data):有些程序在运行的过程中会读取某些特定格式的文件,那些特定格式的文件被称为数据文件。
虽然Linux不按照后缀名区分文件,但是我们还是最好写上,以方便管理。
一般这样设置后缀名:

*.txt    文本文件
*.tar    打包文件
*.tar.bz  bzip2格式压缩打包文件(j)
*.tar.gz  gzip格式压缩打包文件(z)
*.py    表示python语言文件
*.sh    shell编程脚本
*.pl    表示perl文件
*.html,*.php,*.htm,*.php,*.jsp,*.do   网页语言文件
*.conf  配置文件
*.rpm  rpm安装包

1.3 权限:

1.3.1 普通权限

1.3.1.1 对文件的权限:

读:r(read):可读权限,表示具有读取,和阅读文件的内容
写:w(write):写权限,表示具有增加,删除,修改文件内容的权限(是对于文件内容来操作的)
    1)如果没有r权限,用vim编辑的时候会提示无法编辑,但是可以使用cat,或echo重定向追加
执行:x(execute):文件可以被系统执行
    2)如果没有r权限,就是由执行权限,它也会提示权限不足,(想一下,你连里面的内容都不知道是啥,怎么去执行他呢。)
    3)删除文件,或修改文件名是跟他的父目录有关的,因为文件名是存放在上级目录的block块里面的。

1.3.1.2 对目录的权限

读:r:表示是否具有浏览目录下面及子目录的权限(ls或者tree)
写:w:具有增加、删除和修改目录下的文件名或目录名的权限,但需要x权限的配合(如果没有x权限,更改完成之后却不能执行(保存)那修改还有什么意义呢?)
x:表示具有进入的权限,没有r权限能进去,没有w选线不能修改和创建和删除。
    1)如果没有x权限,就不能进去到目录里面
    2)如果有r权限,没有x权限,ls是可以看到目录下面的内容的,但是不能cd进入到这个目录内。ls -l查看这个目录里面内容的属性的时候全都是???
[[email protected]_50 ~]$ ll -d /tmp/123
drwxr-xrw- 2 root root 4096 Jul 27 03:05 /tmp/123
[[email protected]_50 ~]$ ls -l /tmp/123/
ls: cannot access /tmp/123/1.txt: Permission denied
total 0
-????????? ? ? ? ?            ? 1.txt

1.3.1.3 文件或目录的权限有umask决定的

···
临时设置umask值:umask 0022
目录默认的总权限为0777,然后实际权限为0777-umask==实际权限
文件默认的总权限为0666,然后实际权限为0666-umask(当碰到奇数的时候在奇数位加上1)==实际权限
技术分享图片
···

1.3.3 特殊权限

1.3.3.1 SUID

set uid数字代号“4”在一个程序或命令上添加SetUid以后(u+s),这样属主就有了s权限,意味着任何用户在执行此程序时,都是使用属主的身份来执行的,passwd这个命令是最具有代表的。
1)当这个文件或目录本身就有x权限的时候,加上s权限,在x权限位就是s
2)当这个文件或目录本身没有x权限的时候,加上s权限,在x权限位就是S
[[email protected]_50 ~]# which passwd
/usr/bin/passwd
[[email protected]_50 ~]# ll -d /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 Nov 23 2015 /usr/bin/passwd
[[email protected]_50 ~]# ll -d /etc/shadow
---------- 1 root root 945 Jul 26 23:44 /etc/shadow 普通用户并不对这个文件有修改权限,但是他能更改密码,他更改密码的时候是以root用户的身份进行的,所以他才能修改密码

1.3.3.2 GUID

set gid数字代号“2”,在一个程序或命令上添加set gid以后(g+s),这样属组就有了s权限,意味着任何用户在执行此程序时,使用的是文件的属组。给目录设置set Gid权限,任何用户在该目录下创建的文件,文件的属组都和目录的属组一致。
1)当这个文件或目录本身就有x权限的时候,加上s权限,在x权限位就是s
2)当这个文件或目录本身没有x权限的时候,加上s权限,在x权限位就是S

1.3.3.3 t权限

sticky数字代表1,附加在other的权限上,当设置此权限之后,每个人的文件或目录只能有用户自己本身来删除。

1.3.4 文件的访问控制列表

1.3.4.1 setfacl指令来

设置文件的访问控制列表,我们如果想一个文件对哪一个用户有什么特殊权限,我们就可以使用这个命令来实现。相当于路由的acl,优先级高于其他人权限的那个优先级

1.3.4.2 -m 新增一个acl列表

setfacl -m u:user_name:perms file_name 给文件设置一个关于单个用户的权限列表
setfacl -m d:u:user_name:perms file_name 给目录设置一个关于单个用户的权限列表
setfacl -m g:group_name:perms file_name 给文件设置一个关于用户组的权限列表
setfacl -m d:g:group_name:perms file_name 给目录设置一个关于用户组的权限列表

1.3.5 粘滞位权限(待补充)

1.4 链接

1.4.1 硬链接

一般情况下,文件名和inode号码是“一一对应”的关系,在同一个分区内不可能同时出现两个inode号相同的文件,但是Linux系统中存在一个inode 号对应多个文件名。这些文件互为硬链接。虽然他们的文件名不一样,但他们实际上操作的还是一个文件。
ln 源文件 链接后的文件
ln test.txt test.txt_ln
[[email protected]_50 tmp]# ll -i
total 0
130937 -rw-r--r-- 2 root root 0 Jul 27 05:34 test.txt
130937 -rw-r--r-- 2 root root 0 Jul 27 05:34 test.txt_ln

1.4.1.1 总结

1)  inode号相同的,可以认为互为硬链接
2)  硬链接的创建不能跨越文件系统(跨越分区),目录不能创建硬链接
3)  删除源文件或链接文件,文件实例未被改变,只有删除所有的硬链接文件和源文件,文件的实体才会被改变。
4)  当所有的硬链接和源文件被删除,没有进程调用后,在存放新的数据会占用这个文件的空间或者磁盘fsck检查的时候,删除的数据才会被回收,
5)  可以通过文件设置硬链接文件,来防止重要文件被误删除
6)  每在目录下创建一个子目录,他的上级目录的硬连接数加1 
7)  目录硬链接的个数减去2代表他下面有多少个目录(减去他本身的1,和“.”)

1.4.2 软链接

1.4.2.1 作用

当一个软件的编译路径变了,我们还希望使用以前的路径,这时候就需要用到软连接,软连接相当于一个传送门,删除软连接对源文件没影响,但删除源文件,软连接就失效了。

1.4.2.2 总结

1)  软链接类似于windows的快捷方式(可以用readlink查看指向)
2)  软连接类似于一个文本文件,里面存放的是源文件的路径,指向源文件实体
3)  删除源文件,软链接失效,一般显示白字红底闪烁提示
4)  软链接具备不同的inode号
5)  软链接和源文件属于不同类型的文件

1.4.3 软连接和硬链接的图解

技术分享图片
1.5 属主,属组,和修改时间
.```
属主:这个文件的属于那一个人
属组,这个文件属于哪一个用户组
可通过chown修改”chown 属主:属组” 文件名
最后修改时间:
[[email protected] tmp]# stat 1| grep ^Modify #可查看
Modify: 2018-04-08 09:55:03.976989445 -0400
可以通过touch -m来修改
[[email protected] tmp]# touch -m 1 -d "2011-11-11"
[[email protected] tmp]# stat 1| grep ^Modify
Modify: 2011-11-11 00:00:00.000000000 -0500

## 1.6 系统创建文件提示:no space left on device磁盘空间不足
Linux系统中提示这个可能三种原因:
1)block块被占满
2)inode块被占满
3)文件全部都删除了,还是提示空间不足,因为这些文件在被进程占用
### 1.6.1 block被占满:
#### 1.6.1.1    模拟环境:

#虚拟出来一个100M的磁盘。
[[email protected]_50 ~]# dd if=/dev/zero of=/tmp/test_block bs=100M count=1
1+0 records in
1+0 records out
104857600 bytes (105 MB) copied, 8.69812 s, 12.1 MB/s
[[email protected]_50 ~]# du -h /tmp/test_block
100M /tmp/test_block
#给这个分区创建文件系统
[[email protected]_50 ~]# mkfs.ext4 /tmp/test_block
mke2fs 1.41.12 (17-May-2010)
/tmp/test_block is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
#指定挂载分区格式,挂载这个虚拟磁盘
[[email protected]_50 ~]# mount -o loop /tmp/test_block /mnt/
[[email protected]_50 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 19G 2.0G 16G 12% /
tmpfs tmpfs 2.5G 0 2.5G 0% /dev/shm
/dev/sda1 ext4 190M 66M 115M 37% /boot
/dev/test ext4 93M 2.1M 86M 3% /app/logs
/tmp/test_block ext4 93M 1.6M 87M 2% /mnt
[[email protected]_50 ~]# cd /mnt
#生成一个大文件,来充满这个100M的磁盘
[[email protected]_50 mnt]# seq 100000000 >>1.txt
[[email protected]_50 mnt]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 19G 2.0G 16G 12% /
tmpfs tmpfs 2.5G 0 2.5G 0% /dev/shm
/dev/sda1 ext4 190M 66M 115M 37% /boot
/dev/test ext4 93M 2.1M 86M 3% /app/logs
/tmp/test_block ext4 93M 91M 0 100% /mnt

[[email protected]_50 mnt]# seq 1000 >>1.txt
seq: write error: No space left on device
错误已经出现

#### 1.6.1.2    解决办法:

通过du -sh指令查找出大文件,然后删除它。
[[email protected]_50 mnt]# du -sh /
#找到了一个比较大目录“/mnt”,在统计查看这个目录下的大目录,按照这样逐级查找,找到这个大文件,并分析是什么内容,能不能删除,能删除直接删除即可
[[email protected]_50 mnt]# du -sh /mnt/

90M /mnt/1.txt
[[email protected]_50 mnt]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 19G 2.0G 16G 12% /
tmpfs tmpfs 2.5G 0 2.5G 0% /dev/shm
/dev/sda1 ext4 190M 66M 115M 37% /boot
/dev/test ext4 93M 2.1M 86M 3% /app/logs
/tmp/test_block ext4 93M 1.6M 87M 2% /mnt
磁盘占用率下降,得以解决这个问题

### 1.6.2 inode被占满
inode被沾满的原因,小文件过多,一个文件就要占用一个inode,inode的数量是有限的,所以小文件过多,很少消耗block,所以inode就被占满了。
#### 1.6.2.1    模拟环境

[[email protected]_50 mnt]# touch file_inode{1..100000}.txt
touch: cannot touch file_inode27266.txt‘: No space left on device<br/>touch: cannot touchfile_inode27267.txt‘: No space left on device


#### 1.6.2.2    解决办法:
小文件多,说明他的所在的目录大小肯定大,因为文件名是存放在上级目录的block里面的,小文件多,就说明文件名多,文件名多,就说明占用上级目录的block多。解决思路就是用find查找目录大小大大的文件。
[[email protected]_50 /]# find / -type d -size +1M
/mnt
[[email protected]_50 /]# ls /mnt/ |xargs rm -rf
### 1.6.3 被进程占用,找到调用这个文件的进程,删除然后重启一下服务就行。
## 1.7 Linux下删除文件的原理
![](http://i2.51cto.com/images/blog/201807/29/c746b84255b1496443901d37f83eba52.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
## 1.8 Linux删除文件的详解
![](http://i2.51cto.com/images/blog/201807/29/0fb60c5f02b746225aba4bd38b02c0e9.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

以上是关于Linux文件属性详解的主要内容,如果未能解决你的问题,请参考以下文章

12.22- linux文件属性详解

12.22- linux文件属性详解

12.22- linux文件属性详解

12.22- linux文件属性详解

12.22- linux文件属性详解

Linux文件属性之Linux文件删除重要原理详解