Linux下文件属性介绍

一、文件属性概况

 Linu系统中的文件和目录的属性主要包括:

  • 索引节点(inode)
  • 文件类型
  • 权限属性
  • 连接数
  • 所归属的用户和用户组
  • 最近的修改时间

...

可以通过 ls -lhi(ls -li与其区别是文件大小表示不同) 命令查看:

[root@localhost project]# ls -lhi
total 0
25537624 -rw-r--r--  1 root root  0 Oct 26 23:05 1.txt
25542507 drwxr-xr-x. 2 root root  6 Oct 13 22:58 test1
    2890 drwxr-xr-x. 3 root root 47 Oct 10 22:03 test3
17290833 drwxr-xr-x. 2 root root  6 Oct 13 21:20 test4
25542468 drwxr-xr-x. 2 root root  6 Oct 13 21:43 test5

其上每一列说明如下:

 其中:

  • 第一列为inode索引号
  • 第二列为文件类型和权限(第1个字符为文件类型,2-10为权限)
  • 第三列为硬连接个数(通过ln命令创建)
  • 第四列为文件或目录的属主和属组
  • 第五列为文件或目录的大小
  • 第六列为文件或目录最近的修改时间
  • 第七列为文件或目录的名称

举例说明:

[root@localhost etc]# ls -lhi sysconfig/kdump 
25399276 -rw-r--r--. 1 root root 1.5K Nov  7  2016 sysconfig/kdump
  • inode索引号为25399276 
  • 文件类型为普通文件,因为第二列第一个字符为“-”
  • 文件权限是第二列(2-10个字符查看),属主可读、可写、可执行(rw-),文件归属用户组可读(r--),其它用户可读(r--)
  • 硬连接个数为1(就是它本身)
  • 属主为root,属组为root
  • 文件大小为1.5k
  • 最近修改时间为Nov 7 2016
  • 文件名为kdump

二、inode与block

 Linux的存储设备被格式化为文件系统后会被分为两部分:

  • inode(索引节点)
  • block

  其中inode是用来存储数据属性(文件类型、属主、文件大小等)信息的,但是不包含文件名;block是用来存储数据的。inode除了存储属性外,还会进行文件的索引,所以就产生了inode值,这也就是通过inode快速查找文件实体内容。

 举个例子就是inode相当于书的目录,block相当于每一页的内容,通过目录可以快速的翻到那一页的内容。通过 ls -li 既可以查看到inode信息:

[root@localhost project]# ls -li
total 0
25537624 -rw-r--r--  1 root root  0 Oct 26 23:05 1.txt
25542507 drwxr-xr-x. 2 root root  6 Oct 13 22:58 test1
    2890 drwxr-xr-x. 3 root root 47 Oct 10 22:03 test3
17290833 drwxr-xr-x. 2 root root  6 Oct 13 21:20 test4
25542468 drwxr-xr-x. 2 root root  6 Oct 13 21:43 test5

  其中第一列就是inode的值。inode存放的是文件的属性信息,所以它是有大小的。inode的大小是在文件系统被格式化就无法更改的,系统会根据磁盘大小自动给一个合适的大小(128或者256字节)。可以通过以下命令查看各分区inode的大小以及占用情况:

[root@localhost project]# df -i
Filesystem      Inodes IUsed   IFree IUse% Mounted on
/dev/sda3      6712832 32055 6680777    1% /
devtmpfs        230957   377  230580    1% /dev
tmpfs           233408     1  233407    1% /dev/shm
tmpfs           233408   447  232961    1% /run
tmpfs           233408    16  233392    1% /sys/fs/cgroup
/dev/sda1       102400   330  102070    1% /boot
tmpfs           233408     1  233407    1% /run/user/0

对于block系统也会给一个默认值(1k~4k),最大为4k,也就是说超过4k大小的文件,最少都需要两个以上的block来盛放它。

一个block只能存放一个文件的内容,尽管这个block没有放满,新的文件也需要重新打开block来存放,block的大小需要根据具体的业务需求来适当的给定:

  • 对于业务中小文件比较多的需求,block小一些比较好,这样比较省空间,否则容易造成空间浪费;当然不利的就是读取效率低(磁盘I/O高)
  • 对于业务中大文件比较多的需求,block大一些比较好,这样效率比较高,因为减少了磁盘的I/O读写

  总之,block分大了容易造成空间浪费,分小了影响磁盘性能,在实际业务中应该根据当前需求来应对。Inode和block在磁盘格式化文件系统时可以指定其大小,一般也不太需要这样做。

  有时候,通过命令 df -h 查看磁盘空间没满,但是已经存不进数据了,这种情况是Inode已经耗尽了。所以确定一个磁盘分区究竟能放入多少个文件,需要分情况:

  • Inode先耗尽,以Inode来计算文件的个数
  • block先耗尽,以block来计算文件的个数(根据文件大小与block大小比较),如果文件大小小于block大小,文件个数就是block个数

三、文件类型

(一)文件类型介绍

在Windows系统中,文件的扩展名就可以代表文件的类型,比如:

  • jpeg、png等扩展名就是图片类型
  • doc、docx等扩展名就是文档类型
  • mp4、avi等扩展名就是视频类型

...

但是在Linux中文件类型与扩展名没有任何关系,之所以Linux中的文件有扩展名也是为了兼容Windows中用户的习惯。那么Linux中是如何查看文件类型呢?

(二)文件类型的种类

 通过执行 ls -l 或者 ls -al 查看:

[root@localhost /]# ls -l
total 20
lrwxrwxrwx.   1 root root    7 Oct  1 14:26 bin -> usr/bin
dr-xr-xr-x.   4 root root 4096 Oct  1 14:46 boot
drwxr-xr-x   19 root root 3180 Oct 26 22:43 dev
drwxr-xr-x.  78 root root 8192 Oct 26 22:43 etc
drwxr-xr-x.   4 root root   32 Oct 11 22:27 home
lrwxrwxrwx.   1 root root    7 Oct  1 14:26 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Oct  1 14:26 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Nov  5  2016 media
...

可以看到结果中的第一列一共有10个字符,其中2-10个字符是和权限相关的,第一个字符就是文件类型可以看到目前有l(符号链接类型)和d(目录类型)。当然Linux中还有其它一些类型,总的来说分文以下几类:

  • 普通文件(-)
  • 目录文件(d)
  • 字符设备或块设备文件(c/b)
  • 套接口文件(s)
  • 符号链接文件(l)
  • 管道文件(p)

(三)文件类型详解

1、普通文件

 通过ls -l查看文件属性:

[root@localhost project]# ls -l
total 0
-rw-r--r--  1 root root  0 Oct 26 23:05 1.txt

可以看到第一列第一个字符是“-”,这就是表示该文件类型是普通文件,一般通过touch、echo、tar等命令创建的文件。

 2、目录文件

[root@localhost project]# ls -l
total 0
-rw-r--r--  1 root root  0 Oct 26 23:05 1.txt
drwxr-xr-x. 2 root root  6 Oct 13 22:58 test1
drwxr-xr-x. 3 root root 47 Oct 10 22:03 test2

第一列第一个字符是“d”,表示该文件类型是目录文件,创建目录通过mkdir或者cp(-r或者-a参数)命令创建或者复制目录。那么如何通过名称来区分是文件还是目录呢?

[root@localhost project]# ls -F
1.txt  test1/  test3/  test4/  test5/

通过 ls -F命令可以查看,如果名称后面跟着的是“/”那么就是目录,以此可以进行文件或者目录的过滤。

# 方法一
[root@localhost project]# ls -F | grep "/$"
test1/
test3/
test4/
test5/

# 方法二
[root@localhost project]# ls -l | grep "^d"
drwxr-xr-x. 2 root root  6 Oct 13 22:58 test1
drwxr-xr-x. 3 root root 47 Oct 10 22:03 test3
drwxr-xr-x. 2 root root  6 Oct 13 21:20 test4
drwxr-xr-x. 2 root root  6 Oct 13 21:43 test5

3、字符设备及块设备

[root@localhost ~]# ll -l  /dev/tty*
crw-rw-rw- 1 root tty     5,  0 Oct 27 21:06 /dev/tty
crw--w---- 1 root tty     4,  0 Oct 27 21:06 /dev/tty0
crw--w---- 1 root tty     4,  1 Oct 27 21:06 /dev/tty1
crw--w---- 1 root tty     4, 10 Oct 27 21:06 /dev/tty10
...

在/dev下的上面的文件是第一个字符是以“c”开头,这种类型就是字符设备文件,是串行端口的接口设备。

[root@localhost ~]# ll -l  /dev/sda*
brw-rw---- 1 root disk 8, 0 Oct 27 21:06 /dev/sda
brw-rw---- 1 root disk 8, 1 Oct 27 21:06 /dev/sda1
brw-rw---- 1 root disk 8, 2 Oct 27 21:06 /dev/sda2
brw-rw---- 1 root disk 8, 3 Oct 27 21:06 /dev/sda3

上面的第一列的第一个字符是以“b”开头,这种文件类型是块设备文件,存储数据使用的接口设备,比如硬盘、光驱等。

 4、套接口文件

   假如安装了MySQL服务,它是有这个mysql.sock文件的,该文件属性的第一个字符是“s”,这类文件通常用于数据连接,比如MySQL服务启动后监听3306端口的请求连接,MySQL客户端通过mysql.sock套接字文件连接MySQL服务端。

 5、符号链接文件

[root@localhost ~]# ll /
total 20
lrwxrwxrwx.   1 root root    7 Oct  1 14:26 bin -> usr/bin
dr-xr-xr-x.   4 root root 4096 Oct  1 14:46 boot
drwxr-xr-x   19 root root 3180 Oct 27 21:06 dev
drwxr-xr-x.  78 root root 8192 Oct 27 21:06 etc
drwxr-xr-x.   4 root root   32 Oct 11 22:27 home
lrwxrwxrwx.   1 root root    7 Oct  1 14:26 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Oct  1 14:26 lib64 -> usr/lib64
...

符号链接文件通过“l”来表示,可通过ln命令创建软连接进行实现。

6、管道文件

[root@localhost ~]# find / -type p|xargs ls -l
prw------- 1 root root 0 Oct 27 21:06 /run/systemd/inhibit/1.ref
prw------- 1 root root 0 Oct 27 21:06 /run/systemd/initctl/fifo
prw------- 1 root root 0 Oct 27 21:19 /run/systemd/sessions/2.ref

管道文件属性的第一个字符是“p”,也就是说管道文件的类型是使用p来表示的。它是用来解决多个程序访问同一个文件所造成的错误问题。

(四)文件扩展名

Linux下文件扩展名没什么太大的实际意义,但是为了兼顾Windows下用户习惯,不同的文件类型还是会用不同的扩展名来表示。比如:

  • .conf 配置文件
  • .rpm rpm安装包文件
  • .tar、.tgz、.zip、.gz、.bz2等均是压缩文件
  • .py、.pl、.php、.html/htm等是脚本或者程序文件

...

四、文件权限

第二列共10个字符,其中第1个字符已经说明为文件类型,第2-9个字符文件权限,这里详细说明一下文件权限:

 权限位共9个字符被分成3组,每3个字符一组,分别对应的是属主的权限位、属组的权限位以及其它用户的权限位,其中:

  • r表示对该文件持有可读权限
  • w表示对该文件持有可写权限
  • x表示如果该文件为可执行文件,就是拥有该文件的可执行权限
  • -表示对该文件无任何权限

五、用户和用户组

  Linux系统可以进行多用户同时登陆,多个用户可以通过ssh工具同时登录Linux处理不同的任务,所以Linux中有很多用户,但是为了进行用户管理以及用户权限的管理,就涉及到用户角色与用户组。

(一)用户、角色管理

在Linux中不同角色的用户,其拥有的权限是不同,通过uid与gid来进行识别:

uid 角色 用户特性
0 超级用户 如果设置一个用户为超级用户,可以修改uid为0,但尽量不要这样做,可以使用sudo代替
1-499 虚拟用户 这个返回的uid是给系统使用的uid,避免人为创建的uid与系统的uid冲突
500-65535 普通用户 当使用useradd命令创建用户时,其uid就从500开始的

  系统中为什么会有虚拟用户呢?因为系统运行服务时是需要用户角色的,比如运行httpd等服务都是在一个用户角色下运行的,所以系统会默认创建这样一个角色。再比如运行MySQL服务时,也会创建一个用户角色用于专门运行MySQL服务,当然这个角色可以没有登录系统的权限:

# 添加用户组
[root@localhost etc]# groupadd mysql -g 51

# 添加用户mysql,并且指定属于mysql用户组
[root@localhost etc]# useradd mysql  -u 51 -s /sbin/nologin -g mysql

(二)用户组管理

用户组就是具有相同特性用户的集合,它的作用就是方便用户权限的管控,只需要将权限分配给用户组,然后再将用户分配到某一组即可。用户和组的关系:

  • 一对一      一个用户可以属于一个用户组
  • 一对多      一个用户可以属于多个用户组
  • 多对一      多个用户可以属于一个用户组
  • 多对对      多个用户可以属于多个用户组

用户和用户组是有配置文件,相关文件有:/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow

1、/etc/passwd(用户基本配置文件)

[root@localhost ~]# vim /etc/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...

该配置文件中每一行表示一个账户信息,其中每一行有7列,中间以“:”分割:

列(字段) 说明 举例
账号名称 用户的账号名称,唯一的 root
账号密码 出于安全考虑,该地方使用x代替,实际密码放置于/etc/shadow文件中 x
uid 用户账号uid,范围为0-65535 0
gid 用户组,创建用户时默认创建一个同名的用户组,gid的范围为0-65535 0
用户说明 该字段是对该用户的描述说明 root
用户家目录 用户登录后首先进入的目录,一般与用户名相同的目录 /root
shell解释器 当前用户登录后使用的shell解释器,默认的shell为bash              /bin/bash

 2、/etcshadow

   该文件是用户存放系统账户密码的文件,那么为什么要分开放呢?因为每个用户登录都需要取得uid和gid用户判断权限,这样/etc/passwd文件的权限为644,所有的用户都是可读的,这样带来安全隐患。所以系统就把加密后的密码存放于/etc/shadow文件中。

[root@localhost ~]# vim /etc/shadow

root:$6$4njBFoI9/wZMbi35$Je3wm9auNKcYCfbjFkyWdhkC65NTrTMXtDFQxy
   NLW3vJd9LIu
/rkkQzBzRp86CKqY94.nnQZMaKlMU0n3NDfV.::0:99999:7::: bin:*:17110:0:99999:7::: daemon:*:17110:0:99999:7::: adm:*:17110:0:99999:7::: lp:*:17110:0:99999:7::: ...

该文件中每一行表示一个账户的密码信息,每一行中间以“:”隔离,共有9列:

列(字段) 说明 举例
账号名称 用户的账号名称,唯一的 root
账号密码 加密后的账号密码 $6$4njBF...
最近更改密码的天数 从1970年1月1日到最近用户更改密码的天数  
禁止修改密码的天数 从1979年1月1日到用户可以更改密码的天数  
用户必须更改密码的天数 从1979年1月1日到用户必须更改密码的天数  
警告用户更改密码的天数 在密码即将过期的前多少天提醒用户更改密码的天数  
禁用天数 密码过期后禁用账户的天数             
标志 保留  

 3、/etc/group

 该文件是用户组的配置文件:

[root@localhost ~]# vim /etc/group

root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
...

每一行表示一个用户组的信息,每一行通过“:”被分成4个字段:

列(字段) 说明 举例
用户组名 用户组名称 root
用户组密码 出于安全考虑,该地方使用x代替,实际密码放置于/etc/gshadow文件中 x
gid 用户组id 0
用户组成员 属于该用户组的所有用户账号  

该文件中包括用户组和用户的信息,以及用户和用户组的关系,比如那些用户属于哪些组。

 4、/etc/gshadow

[root@localhost ~]# vim /etc/gshadow

root:::
bin:::
daemon:::
sys:::
adm:::
tty:::
...

该文件是用户组密码加密文件,每一行有4个字段:

 列(字段)  说明  举例
 用户组名  用户组名称  root
 用户组密码  用户组密码,可以为空  
 用户组管理员账号  用户组管理员,该字段可以为空。如果有多个管理员,中间以逗号隔开  
 用户组成员  加入这个组的所有用户账号。如果有多个用户,中间以逗号隔开  

六、文件修改时间 

 在文件的属性中,第五列和第七列分别为文件或者目录的大小、文件或者目录的名称,第六列为文件修改时间。

[root@localhost project]# stat test.txt 
  File: ‘test.txt’
  Size: 0             Blocks: 0          IO Block: 4096   regular empty file
Device: 803h/2051d    Inode: 25537617    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-10-31 13:22:46.743306208 +0800
Modify: 2020-10-31 13:22:46.743306208 +0800
Change: 2020-10-31 15:03:27.279981276 +0800
 Birth: -

上面红色有三个时间分别是:

  • Access 最后访问时间
  • Modify 最后修改时间
  • Change 状态改变时间

当做下面的操作后三个时间的变化如下:

  • 创建(比如:touch命令)一个文件后A、C、M三个时间一样
  • 读取(比如:cat命令等)文件,A变;C、M不变
  • 修改(比如:vim命令等)文件内容,C、M变;A不变

 文件属性中的时间就是上面三个时间中的Modify(最后修改时间)。

原文地址:https://www.cnblogs.com/shenjianping/p/13855277.html