Linux文件和目录的属性及权限

一笑奈何 提交于 2019-12-05 09:43:00

1.Linux中的文件

1.1 文件属性概述

Linux系统中的文件或目录的属性主要包括:

  • 索引节点inode
  • 文件类型
  • 权限属性
  • 链接数
  • 所归属的用户和用户组
  • 最近修改时间 等内容:

下面我们看执行 ls -lih 命令的结果(共10列):

  • -l 长格式
  • -i 显示 索引节点 inode
  • -h 以人类熟悉的方式显示文件大小
[root@oldboy oldboy]# ls -lhi
total 32K
275427 -rw-r--r-- 1 root root    8 Sep  4 14:56 123.log
275423 -rw-r--r-- 1 root root    0 Sep  4 14:46 dd.tx
275576 drwxr-xr-x 3 root root 4.0K Oct  1  2019 ext
275695 -rw-r--r-- 1 root root   71 Sep  4 19:45 file.txt
275582 -rw-r--r-- 1 root root    0 Oct  1  2019 jeacen
275694 -rw-r--r-- 1 root root  101 Sep  4 18:30 nginx.conf
275583 -rw-r--r-- 1 root root    0 Oct  1  2019 oldboy
275424 -rw-r--r-- 1 root root    0 Sep  4 14:47 second
275578 drwxr-xr-x 2 root root 4.0K Oct  1  2019 test
275584 -rw-r--r-- 1 root root    0 Oct  1  2019 wodi.gz
275579 drwxr-xr-x 2 root root 4.0K Oct  1  2019 xiaodong
275580 drwxr-xr-x 2 root root 4.0K Oct  1  2019 xiaofan
275581 drwxr-xr-x 2 root root 4.0K Oct  1  2019 xingfujie
275585 -rw-r--r-- 1 root root    0 Oct  1  2019 yingsui.gz

 

索引节点inode文件类型文件权限硬链接个数文件属主文件所属用户组文件大小文件修改时间文件名
275581 d rwxr-xr-x 2 root root 4.0K Oct 1 2019 xingfujie

 

 

 

文字解释

  • 第 1 列:inode 索引节点 编号(相当于身份证,唯一);
    • 系统读取文件时,首先通过文件名找到inode,然后才能读取到文件内容
  • 第 2 列:文件类型及权限(共10个字符)
    • 第一个字符为 文件类型
    • 后9个字符为 文件权限
  • 第 3 列:硬连接个数(详细看ln命令) 
  • 第 4 列:文件或目录所属的用户(属主)
    • 在Linux里面,文件和程序的存在必须要有用户和组,满足相应的存在需求。
  • 第 5 列:文件或目录所属的组
  • 第 6 列:文件或目录的大小
  • 第 7,8,9 列:文件或目录的修改时间
  • 第 10 列:实际的文件名或目录名
    • 严格来讲,文件名不算文件的属性

2. 索引节点

2.1 inode概述

硬盘要存储数据(房子要主人),首先要分区(隔断),然后格式化创建文件系统(装修),最后存数据。

 

Inode,中文意思是 索引节点(index node)。 

在每个Linux存储设备或存储设备的分区(存储设备可以是硬盘、软盘、U盘...)被格式化为ext4文件系统 (CentOS6.7)后,一般都有两部分:

  • 第一部分是Inode(很多个)
  • 第二部分是Block(很多个)

 

Block 是用来存储实际数据用的,例如:照片,视频等普通文件数据。

而 inode 就是用来存储这些数据属性信息的(也就是 ls -l的结果),inode包含的属性信息包括

  • 文件大小、
  • 属主、
  • 归属的用户组、
  • 读写权限、
  • 文件类型、
  • 修改时间,
  • 还包含指向文件实体的指针的功能( inode节点--block的对应关系)等,

但是,inode 里面唯独不包含文件名

 

Inode 除了记录文件属性的信息外,还会为每个文件进行信息索引,所以就有了inode 的数值。
操作系统根据指令,即可通过 inode 的值最快的找到相对应的文件实体。 

 

文件,inode,block之间的关系如下:

 

这就相当于,教室们门口贴一张纸(inode),有大家的位置信息,以及学生姓名,性别,座位就相当于block。 

 

打个比方,比如一本书,存储设备或分区就相当于这本书,Block相当于书中的每一页内容,而inode就相当于这本书前面的目录。
一本书有很多内容,一个知识点可能有很多页,如果想查找某部分或某知识点的内容,我们一般先查书的目录,通过目录能更快的找到我们想看的知识点的内容。
虽然不太恰当,但还是比较形象的。

 

当我们用 ls 查看某个目录或文件时,如果加上 -i 参数,就可以看到 inode 节点了。

 

ls -li 查看目录下所有文件和目录的属性和inode节点

[root@oldboy oldboy]# ll -i /oldboy
total 32
275427 -rw-r--r-- 1 root root    8 Sep  4 14:56 123.log
275423 -rw-r--r-- 1 root root    0 Sep  4 14:46 dd.tx
275576 drwxr-xr-x 3 root root 4096 Oct  1  2019 ext
275695 -rw-r--r-- 1 root root   71 Sep  4 19:45 file.txt
275582 -rw-r--r-- 1 root root    0 Oct  1  2019 jeacen
275694 -rw-r--r-- 1 root root  101 Sep  4 18:30 nginx.conf
275583 -rw-r--r-- 1 root root    0 Oct  1  2019 oldboy
275424 -rw-r--r-- 1 root root    0 Sep  4 14:47 second
275578 drwxr-xr-x 2 root root 4096 Oct  1  2019 test
275584 -rw-r--r-- 1 root root    0 Oct  1  2019 wodi.gz
275579 drwxr-xr-x 2 root root 4096 Oct  1  2019 xiaodong
275580 drwxr-xr-x 2 root root 4096 Oct  1  2019 xiaofan
275581 drwxr-xr-x 2 root root 4096 Oct  1  2019 xingfujie
275585 -rw-r--r-- 1 root root    0 Oct  1  2019 yingsui.gz

 

查看指定某个文件的包括inode在内的所有属性的命令为:stat filename

  • 文件大小,
  • Block块数,
  • Inode索引节点, 
  • 链接数, 
  • 权限 
  • 访问时间atime,修改时间mtime,改变时间ctime
[root@oldboy oldboy]# stat nginx.conf
  File: `nginx.conf'
  Size: 101             Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 275694      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-09-04 18:30:51.437111190 +0800
Modify: 2019-09-04 18:30:51.422111642 +0800
Change: 2019-09-04 18:30:51.434111276 +0800

 

第1列inode值是 275694:查看一个文件或目录的inode,通过 ls命令的 -i 参数即可。 

因为 inode 要存放文件的属性信息,所以 inode 是有大小的。 

CentOS5 inode 的默认大小是128字节,而CentOS 6 inode 的默认大小是256 字节,inode的大小在分区被格式化创建文件系统之后就定下来了,格式化以后就无法更改inode大小了。格式化前可以通过参数指定 inode大小,但是一般工作环境没这个需求。

 

不同CentOS版本 inode 大小不同:

[root@oldboy oldboy]# dumpe2fs /dev/sda3|grep -i "Inode size"
dumpe2fs 1.41.12 (17-May-2010)
Inode size:               256

boot分区,inode大小默认128字节:

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

 

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

[root@oldboy oldboy]# df -i
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda3      462384 56099 406285   13% /
tmpfs          127522     1 127521    1% /dev/shm
/dev/sda1       51200    38  51162    1% /boot

查看的对应信息为:文件系统名,Inode总数量,使用的Inode数量,剩余的Inode剩余量,使用的百分比占比,挂载所在分区。

 

查看磁盘的使用量:(其中,inode也算磁盘的空间)

[root@oldboy oldboy]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       6.9G  1.5G  5.1G  22% /
tmpfs           499M     0  499M   0% /dev/shm
/dev/sda1       190M   36M  145M  20% /boot

 

 

磁盘空间是否满了,由两项参数决定的:

  • 第一个是 inode 满了
  • 第二是是 block 满了

任何一项满了,都无法进行存储。

 

磁盘满的一个特征( no space left on device).

 

有关 inode 的小结:

  1. 磁盘被分区并格式化为 ext4 文件系统后,会生成一定数量的 inode 和 block
  2. inode 称为 索引节点,它的作用是存放文件的属性信息以及作为文件的索引(指向文件的实体)
  3. ext3/ext4 文件系统的 block存放的是文件的实际内容
  4. inode 是磁盘上的一块存储空间,CentOS 6 非启动分区 inode 默认大小 256 字节,CentOs5是128字节。
  5. inode 的表现是形式一串数字,不同的文件对应的inode(一串数字)在文件系统里是唯一的。
  6. inode 节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口。
  7. ext3/ext4文件系统下,一个文件被创建后至少要占用一个 inode 和一个 block
  8. ext3/ext4文件系统下,正常情况,一个文件占用且只能占用一个 inode (人和身份证)
  9. block是用来存储实际数据的,每个block的大小一般有 1k,2k,4k几种。 其中引导分区等为 1k,其他普通分区为 4k(CentOS 6)
  10. 如果一个文件很大(几个G),可能占多个block;如果文件很小(0.01k),至少占一个,并且这个block的剩余空间就浪费了,即无法再存储其他数据了。
  11. inode大小和总量查看:
    • dumpe2fs /dev/sda3|egrep -i 'inode count|block count'
    • dumpe2fs /dev/sda3|egrep -i 'inode size|block size' 默认 block count 一般会大于inode count的数量。
  12. 查看inode的总量和使用量:
    • df -i
  13. 查看文件的inode信息方法
    • ls -li
    • stat filename
  14. 如何生成及指定 inode 大小
    • mkfs.ext4 -b 2048 -l 256 /dev/sdb
[root@oldboy oldboy]# dumpe2fs /dev/sda3|egrep -i 'block count|inode count'
dumpe2fs 1.41.12 (17-May-2010)
Inode count:              462384
Block count:              1849088
Reserved block count:     92454

[root@oldboy oldboy]# dumpe2fs /dev/sda3|egrep -i 'block size|inode size'     
dumpe2fs 1.41.12 (17-May-2010)
Block size:               4096
Inode size:               256

有关block的知识小结:

  1. 磁盘读取数据是按 block为单位读取的
  2. 一个文件可能占用多个block。每读取一个block就会消耗一次 磁盘I/O.
  3. 如果要提升磁盘IO性能,那么就要尽可能一次性读取数据尽量的多
  4. 一个block只能存放一个文件的内容,无论内容有多小。如果block 4K,那存放1K的文件,剩余3K就不能存放被的文件,只能浪费了
  5. Block并非越大越好。Block太大对于小文件存放就会浪费磁盘空间,例如:1000k的文件,Block的大小为4k,占用250个block;如果block默认大小为1k,占用1000个block。访问效果谁更高?消耗IO分别为250次和1000次。
  6. 根据业务需求,确定默认的block大小。如果是大文件(大于16K)一般设置block大一点,小文件(小于1k)一般设置block小一点。
  7. block太大,例如4k,文件都是0.1k的,大量浪费磁盘空间,但是访问性能高
  8. block太小,例如1k,文件都是1000k,消耗大量磁盘IO
  9. block的设置也是格式化分区时候
    • mkfs.ext4 -b 2048 -I 256 /dev/sdb
  10. 企业里文件都会比较大(一般大于4k),block设置大一些会提升磁盘访问效率
  11. ext3/ext4 文件系统(CentOS 5和6),一般都设置为 4K
 

当前的生产环境一般设置为4k。特殊的业务,如视频可以加大block大小。


总体小结:

  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 -I 2048 /dev/sdb

通过inode 删除文件

  1. 查看文件
    • ls -li
  2. 通过inode删除文件
    rm `find . -inum 159004`
    
    find . -inum 159004 -exec rm {} \;

     


文件删除恢复 ext3grep

数据恢复需要重启,恢复数据会影响生产环境。

所以,应该养成好习惯,先备份再操作,要能快速还原,不容易还原的,先通过多套测试环境测试,然后再操作。

 

企业面试题:一个100M(100000K)的磁盘分区,分别写入 1K 的文件或写入 1M 的文件,分别可以写多少个?

错误解答:1k的个数:100 x 1000=100000个,1M的文件个数:100/1=100个

 

正确答案 

假设 Block的默认大小为 4K,写入1k的文件的数量基本上就是block的数量: 

  • 假设 inode数量够多的情况下,就是Block的数量,浪费3/4的容量; 
  • 假设 inode 数量小于block的数量,就是inode的数量,浪费3/4的容量。
 

假设 Block的默认大小为 4K,写入1M的文件的数量:
总的block数量/ 250 block = 存放1M的数量

磁盘空间多大,基本就可以写入100/1M数量,一般情况下inode和block都是足够的。

 

知识点: 

  • 上面的考试题考察的是文件系统inode 和block的知识
  • inode是存放文件属性信息的(也包含指向文件实体的指针),默认大小128byte(CentOS58),256byte(CentOS64)
  • block是存放文件实际内容的,默认大小1k(boot)或4k(非系统分区默认给4k),一般企业多用4k的block
  • 一个文件至少要占用一个inode及一个block
  • 默认较大分区常规企业真实场景下,inode数量是足够的。而block数量消耗会更快。

企业面试题:一个100M(Block的总大小,个数和单个block大小有关)的磁盘分区,分别写入 0.5K 的文件,及写入 1M 的文件,分别可以写多少个?为什么?

 

答案相关知识点

  1. Inode 是存放文件属性信息的,默认大小为128byte(CentOS58), 256byte(CentOS64)
  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查看磁盘空间,发现没满,请问可能原因是什么?企业场景,什么情况下会导致这个问题发生呢?

 

答案

可能是inode数量被消耗尽了。

 

企业工作中邮件临时队列/var/spool/clientmqueue这里很容易被大量小文件占满导致No space left on device的错误。
Clientmqueue目录只有安装了sendmail服务,才会有,是sendmail邮件的临时队列。 

CentOS5.8默认就会安装sendmail服务,CentOS6.6 默认没有sendmail。


3.文件类型及文件扩展名

 

3.1 文件类型介绍 

Linux系统不同于Windows系统,两者的文件类型和文件扩展名也有很大的差异。 

Linux系统中的文件类型和文件扩展名所代表的意义和Windows系统中是不同的。

在Linux系统中,我们一般通过应用程序或命令创建的文件,如file.txt, file.tar.gz,这些文件的扩展名不同,且要用不同的程序或命令来打开,但都是常规文件(也被称为普通文件)。

后面附带的后缀文件扩展名(.txt,.tar.gz),除了让曾经习惯windows的用户易读外,大多数对于Linux系统来说没有特别实际的意义,在Linux系统中也是为了易读,而Windows系统中的扩展名就是实实在在表示文件的类型格式

 

例如: 

  • windows图片文件扩展名:jpg, jpeg, png, gif 等
  • 文本文件扩展名: doc, docx, txt, pdf等

3.2 Linux中的文件类型

在Linux系统中,可以说一切设备(包括目录、普通文件)皆为文件 

 

文件类型包含有:

  • 普通文件
  • 目录
  • 字符设备文件
  • 块设备文件
  • 符号链接文件
  • 管道文件等等
 

当执行 ls -l 或 ls -al 命令后显示的结果中:

[root@oldboy oldboy]# ls -al
total 40
drwxr-xr-x   7 root root 4096 Sep  4 19:45 .
dr-xr-xr-x. 28 root root 4096 Sep  5 04:54 ..
-rw-r--r--   1 root root    8 Sep  4 14:56 123.log
-rw-r--r--   1 root root    0 Sep  4 14:46 dd.tx
drwxr-xr-x   3 root root 4096 Oct  1  2019 ext
-rw-r--r--   1 root root   71 Sep  4 19:45 file.txt
-rw-r--r--   1 root root    0 Oct  1  2019 jeacen
-rw-r--r--   1 root root  101 Sep  4 18:30 nginx.conf
-rw-r--r--   1 root root    0 Oct  1  2019 oldboy
-rw-r--r--   1 root root    0 Sep  4 14:47 second
drwxr-xr-x   2 root root 4096 Oct  1  2019 test
-rw-r--r--   1 root root    0 Oct  1  2019 wodi.gz
drwxr-xr-x   2 root root 4096 Oct  1  2019 xiaodong
drwxr-xr-x   2 root root 4096 Oct  1  2019 xiaofan
drwxr-xr-x   2 root root 4096 Oct  1  2019 xingfujie
-rw-r--r--   1 root root    0 Oct  1  2019 yingsui.gz

第一列第2-10个字符(比如rw-r--r--)是用来描述文件权限的。
而一列的第一个字符就是描述文件类型的,比如上面结果中就有-, d两种类型。

文件类型标识符英文名称文件类型说明
     
     
d directory 表示这是一个目录,如上文ext,在ext2fs中,目录是一个特殊的文件
- regular file 表示这是一个普通的文件,如上文的oldboy
l link 表示这是一个符号链接文件,实际上它指向另一个文件
b block 表示块设备和其他的外围设备,是特殊类型的文件
c character 表示字符设备文件
s socket 表示socket文件
p named pipe 表示管道文件

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!