Linux系统一切皆文件,我们使用命令ls -li 查看文件时,可以显示文件的具体信息,总共有九列,每一列都代表着不同含义。

linux 文件属性信息解析(inode/权限/硬连接等)

文件属性

文件inode

文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区sector,每个扇区存储512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块block。这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个sector组成一个block。

文件数据存储在块中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做inode,中文译名为索引节点,也叫i节点。因此,一个文件必须占用一个inode,但至少占用一个block。

  • 元信息 → inode
  • 数据 → block
# stat命令可以查看inode信息
[[email protected] ~]# stat /etc/passwd

 

linux 文件属性信息解析(inode/权限/硬连接等)

inode 信息

文件类型

常见的文件类型符合主要有以下几种:

  • d:代表目录
  • -:代表普通文件
  • l:代表链接文件(相当于windows系统的快捷方式)
  • c/b:代表块文件/字符文件
  • s:代表socket文件(套接字文件)
[[email protected] ~]# ls -l /etc/hosts
[[email protected] ~]# ls -ld /etc/
[[email protected] ~]# ls -l /etc/system-release
[[email protected] ~]# ls -l /dev/zero 
[[email protected] ~]# ls -l /dev/sda

linux 文件属性信息解析(inode/权限/硬连接等)

不同文件类型

文件权限

linux文件基本权限位为9位权限,每三位一组,分别是文件属主(Owner)的读、写、执行,文件属于组(Group)的读、写、执行,其他用户(Other)的读、写、执行;此外还有额外3位权限位,共12位权限。

基本权限:

  • r :读(read)权限,可以用数字4表示
  • w:写(write)权限,可以用数字2表示
  • x :执行(e'x'cute)权限,可以用数字1表示
  • -:没有权限,可以用数字0表示
# 创建一个新文件,一般默认都是644权限
[[email protected] ~]# touch testfile.txt
[[email protected] ~]# stat testfile.txt
# 创建一个目录,一般默认都是755权限
[[email protected] ~]# mkdir testdir
[[email protected] ~]# stat testdir
# 其实创建的文件和目录的默认权限,是根据我们系统设置umask的取值决定的。
# 目录的默认权限是:777  文件的默认权限是:666
# 根据目录默认权限与umask的权值相减得到创建新目录的权限
# 根据文件默认权限与umask的权值相减得到创建新文件的权限
# 比如root用户的umask是0022,那么目录权限:777-022 = 755  文件权限:666-022 = 644
[[email protected] ~]$ umask 
0002

linux 文件属性信息解析(inode/权限/硬连接等)

默认权限

特殊权限:

suid意味着如果某个用户对属于自己的shell脚本设置了这种权限,那么其他用户在执行这一脚本时也会具有其属主的相应权限。guid则表示执行相应脚本的用户将具有该文件所属用户组中用户的权限。

  • suid:用户对应的权限位,可以用数字4表示
  • sgid:用户组对应的权限位,可以用数字2表示
  • sticky:其他用户对应的权限位,可以用数字1表示
# chmod 命令可以用来设置文件权限
# 设置suid
[[email protected] ~]# chmod u+s testfile.txt
[[email protected] ~]# chmod 4644 testfile.txt
#设置sgid
[[email protected] ~]# chmod g+s testdir/
[[email protected] ~]# chmod 2755 testdir/
#设置sticky
[[email protected] ~]# chmod o+t /tmp/tmp.txt
[[email protected] ~]# chmod 1644 /tmp/tmp.txt

linux 文件属性信息解析(inode/权限/硬连接等)

特殊权限

文件硬连接数

硬连接就是一个inode值对应了多个文件名,相当于使用了多个别名,硬链接只能在同一文件系统中的文件之间进行链接,不能对目录进行创建。删除一个硬链接文件并不影响其他有相同 inode 号的文件。

# 创建一个文件,内容hello world
[[email protected] ~]# cat > myfile.txt 
hellp world!
^C
# 查看inode,硬连接数为1
[[email protected] ~]# ls -li myfile.txt 
67153474 -rw-r--r--. 1 root root 13 Jan 31 10:43 myfile.txt
# ln 创建硬连接
# ln 源文件 目标文件
[[email protected] ~]# ln myfile.txt myfile.txt_1
# 查看两个文件,inode相同,硬连接数为2
[[email protected] ~]# ls -li myfile.txt*
67153474 -rw-r--r--. 2 root root 13 Jan 31 10:43 myfile.txt
67153474 -rw-r--r--. 2 root root 13 Jan 31 10:43 myfile.txt_1
# 删除源文件,并不影响目录文件
[[email protected] ~]# rm myfile.txt -f
[[email protected] ~]# cat myfile.txt_1 
hellp world!
[[email protected] ~]# ls -li myfile.txt_1 
67153474 -rw-r--r--. 1 root root 13 Jan 31 10:43 myfile.txt_1

linux 文件属性信息解析(inode/权限/硬连接等)

 

文件所属主

文件的所属用户,也就是uid。

# 通过 id 命令,查看用户的信息
[[email protected] ~]# id root
uid=0(root) gid=0(root) groups=0(root)
# 创建文件,该文件属于root用户,对应有读写权限
[[email protected] ~]# touch tmp.txt
[[email protected] ~]# ls -l tmp.txt 
-rw-r--r--. 1 root root 0 Jan 31 10:57 tmp.txt

linux 文件属性信息解析(inode/权限/硬连接等)

属主

文件所属组

文件所属的用户组,也就是gid。

# 通过 id 命令,查看用户的信息
[[email protected] ~]# id root
uid=0(root) gid=0(root) groups=0(root)
# 创建文件,该文件属于root用户组,该组成员对文件有读权限
[[email protected] ~]# touch tmp.txt
[[email protected] ~]# ls -l tmp.txt 
-rw-r--r--. 1 root root 0 Jan 31 10:57 tmp.txt

linux 文件属性信息解析(inode/权限/硬连接等)

属组

文件大写

# 创建一个文件,大小25M
[[email protected] ~]# dd if=/dev/zero of=./test.txt bs=1M count=25
25+0 records in
25+0 records out
26214400 bytes (26 MB) copied, 0.176295 s, 149 MB/s
# ls 可以看到文件大小,单位字节(bytes)
[[email protected] ~]# ls -l test.txt 
-rw-r--r--. 1 root root 26214400 Jan 31 11:10 test.txt
# du 命令可以查看文件大小
[[email protected] ~]# du -sm test.txt

linux 文件属性信息解析(inode/权限/硬连接等)

文件大小

文件修改时间

Linux系统文件有三个时间,Access Time(访问时间)、Modify Time(修改时间)、Change Time(改变时间)。

  • Access Time,它在Linux的文件系统中被称为访问时间,当文件的内容被访问时,就会更新这个时间。
# 创建一个时间
[[email protected] ~]# echo 123 > tmp.txt
[[email protected] ~]# ls -l tmp.txt 
-rw-r--r--. 1 root root 4 Jan 31 11:23 tmp.txt
[[email protected] ~]# date 
Sun Jan 31 11:31:57 CST 2021
# 查看这个文件之后,可以看到文件访问时间被修改了
[[email protected] ~]# cat tmp.txt 
[[email protected] ~]# stat tmp.txt

linux 文件属性信息解析(inode/权限/硬连接等)

Access Time

  • Modification Time,当“内容数据”被修改时,Linux系统会去更新这个时间
[[email protected] ~]# ls -l tmp.txt 
-rw-r--r--. 1 root root 4 Jan 31 11:23 tmp.txt
[[email protected] ~]# date 
Sun Jan 31 11:34:43 CST 2021
# 修改文件内容,文件修改时间被更改了
[[email protected] ~]# echo 456 > tmp.txt 
[[email protected] ~]# ls -l tmp.txt 
-rw-r--r--. 1 root root 4 Jan 31 11:34 tmp.txt
[[email protected] ~]# stat tmp.txt

linux 文件属性信息解析(inode/权限/硬连接等)

Modification Time

  • Change Time,即状态时间,当文件的状态即文件的属性被改变时就会更改这个时间,例如文件系统中的links(链接数)、size(文件的大小)、文件的权限。
[[email protected] ~]# ls -l tmp.txt 
-rw-r--r--. 1 root root 4 Jan 31 11:34 tmp.txt
[[email protected] ~]# date
Sun Jan 31 11:37:13 CST 2021
# 为该文件创建硬连接
[[email protected] ~]# ln tmp.txt tmp.txt_1
# 这时候没有修改文件内容,文件修改时间不变
[[email protected] ~]# ls -l tmp.txt
-rw-r--r--. 2 root root 4 Jan 31 11:34 tmp.txt
# 使用stat可以看到状态时间发生了变化
[[email protected] ~]# stat tmp.txt

linux 文件属性信息解析(inode/权限/硬连接等)

Change Time