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:默认是文件的修改时间
[root@oldboy_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   
    [root@oldboy_50 ~]# dumpe2fs   /dev/sda3 | grep -i "inode count"
dumpe2fs 1.41.12 (17-May-2010)
Inode count:              1250928

1.1.4.2 查看inode的大小:

[root@oldboy_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查看这个目录里面内容的属性的时候全都是???
[zsf@oldboy_50 ~]$ ll -d /tmp/123
drwxr-xrw- 2 root root 4096 Jul 27 03:05 /tmp/123
[zsf@oldboy_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)==实际权限
![](http://i2.51cto.com/images/blog/201807/29/5606be2fbd2b1a311c07df86922399e4.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.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
[root@oldboy_50 ~]# which passwd 
/usr/bin/passwd
[root@oldboy_50 ~]# ll -d /usr/bin/passwd 
-rwsr-xr-x. 1 root root 30768 Nov 23  2015 /usr/bin/passwd
[root@oldboy_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 [root@oldboy_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 属主:属组” 文件名
最后修改时间:
[root@zsf tmp]# stat 1| grep ^Modify   #可查看
Modify: 2018-04-08 09:55:03.976989445 -0400
可以通过touch -m来修改
[root@zsf tmp]# touch -m 1 -d "2011-11-11"
[root@zsf 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的磁盘。
[root@oldboy_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
[root@oldboy_50 ~]# du -h /tmp/test_block 
100M    /tmp/test_block
#给这个分区创建文件系统
[root@oldboy_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.
#指定挂载分区格式,挂载这个虚拟磁盘
[root@oldboy_50 ~]# mount -o loop  /tmp/test_block /mnt/
[root@oldboy_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
[root@oldboy_50 ~]# cd /mnt
#生成一个大文件,来充满这个100M的磁盘
[root@oldboy_50 mnt]# seq 100000000 >>1.txt
[root@oldboy_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

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

1.6.1.2 解决办法:

通过du -sh指令查找出大文件,然后删除它。
[root@oldboy_50 mnt]# du -sh /*
#找到了一个比较大目录“/mnt”,在统计查看这个目录下的大目录,按照这样逐级查找,找到这个大文件,并分析是什么内容,能不能删除,能删除直接删除即可
[root@oldboy_50 mnt]# du -sh /mnt/*
90M /mnt/1.txt
[root@oldboy_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 模拟环境

[root@oldboy_50 mnt]# touch file_inode{1..100000}.txt
touch: cannot touch `file_inode27266.txt': No space left on device
touch: cannot touch `file_inode27267.txt': No space left on device

1.6.2.2 解决办法:

小文件多,说明他的所在的目录大小肯定大,因为文件名是存放在上级目录的block里面的,小文件多,就说明文件名多,文件名多,就说明占用上级目录的block多。解决思路就是用find查找目录大小大大的文件。
[root@oldboy_50 /]# find / -type d -size +1M
/mnt
[root@oldboy_50 /]# ls /mnt/ |xargs rm -rf

1.6.3 被进程占用,找到调用这个文件的进程,删除然后重启一下服务就行。

1.7 Linux下删除文件的原理

1.8 Linux删除文件的详解

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏九彩拼盘的叨叨叨

前端模拟ajax接口

在平常开发中,了解完需求后,前端和后端会确定页面的需要的ajax接口,及接口的细节(请求与响应的格式)。然后,前后端就可以各自开工~ (注:在本文的接口均指aj...

13620
来自专栏我的博客

Python上传文件到FTP服务器

代码在python2.7下测试通过!写在最前面! # -*- coding: UTF-8 -*- from ftplib import FTP import o...

91360
来自专栏北京马哥教育

243张图片为你解析Linux轻量级自动运维化工具Ansible

Ansible 是什么 ansible架构图 ansible特性 模块化:调用特定的模块,完成特定的任务; 基于Python语言研发,由Paramiko...

40760
来自专栏九彩拼盘的叨叨叨

nodejs概要

nodejs是由Ryan Dahl写的。他做nodejs的初衷是为了做一个高性能是web服务器。 为了实现高性能服务器,实现要点是:

22430
来自专栏云计算教程系列

在Ubuntu 16.04如何使用Percona将MySQL类别的数据库备份到指定的对象存储上呢?

数据库通常会在您的基础架构中存储一些最有价值的信息。因此,在发生事故或硬件故障时,必须具有可靠的备份以防止数据丢失。

15830
来自专栏androidBlog

Git 命令行教程及实例教程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

14610
来自专栏Python研发

django-celery定时任务以及异步任务and服务器部署并且运行全部过程

应用Celery之前,我想大家都已经了解了,什么是Celery,Celery可以做什么,等等一些关于Celery的问题,在这里我就不一一解释了。

1K20
来自专栏北京马哥教育

243张图片为你解析Linux轻量级自动运维化工具Ansible

基于Python语言研发,由Paramiko, PyYAML和Jinja2三个核心库实现;

20520
来自专栏SpringBoot 核心技术

第八章:使用拦截器记录你的SpringBoot的请求日志本章目标构建项目配置拦截器初尝试运行项目总结

33820
来自专栏小樱的经验随笔

mount命令详解及常见问题汇总

一 、mount命令(用来挂载硬盘或镜像等) 用法:mount [-t vfstype] [-o options] device dir 1、-t vfstyp...

1K50

扫码关注云+社区

领取腾讯云代金券