文件属性


[root@centos7 ~]$ ll -hi
total 8.0K
33579460 -rw-------. 1 root root 1.2K Jun 17 07:57 anaconda-ks.cfg
33579461 drwxr-xr-x. 2 root root    6 Jun 18 03:29 server
33588544 -rw-r--r--. 1 root root   15 Jun 18 02:14 test

    # 第一列:inode 索引节点编号;系统读取文件时,首先读取 inode 号,然后才能找到文件内容
    # 第二列:文件类型及权限。这一列共 11 个字符,其中第一个字符为文件类型,随后的 9 个字符为文件的对应权限,最后一个字符点号“.”是和 selinux 有关的一个标识:
    # 第三列:硬链接个数(详细参看命令的讲解)。相当于超市的多个入口,可以从不同的文件入口进入文件,还可以互为备份(消防通道)。
    # 第四列:文件或目录所属的用户(属主)。在 Liux 系统里,文件和程序的存在必须要有用户和组满足相应的存在需求。
    # 第五列:文件、目录对应的属组
    # 第六列:文件的大小
    # 第七列:文件的修改时间
    # 第八列:文件名

文件类型

第二列 第一个 字符串代表文件类型;

- 			# 代表普通文件;touch、echo、vim 都可以创建
d				# 代表文件夹;ls 显示蓝色;ls -p 以斜线结尾;ls -F 斜线结尾;
c				# 以c开头的就是字符设备;mknod 创建字符设备
b				# b开头的就是块设备;
s				# socket 文件;以s开头;进程之间的通讯,
p				# 管道文件

符号链接、软连接

file		# 显示文件类型
which 	# 显示文件位置
whereis	# 除了查找文件位置,还可以查找帮助文件位置;
    -b		# 查二进制命令

find		# 查找文件,遍历磁盘,查找速度慢;

用户讲解

1.root 用户
每个用户都对应一个 uid 和 gid
uid 相同,对应的权限相同;
多个用户可以使用同一个uid;前提是直接修改 /etc/passwd 文件;直接通过 useradd -u 创建相同uid用户报错;尽量不修改,容易出问题

另外进程运行必须对应用户;

# 用户

2.虚拟用户
实际存在,但是又不允许登陆;
满足进程需求;进程存在必须要有用户;
虚拟用户的 uid 1-499


3.普通用户
实际存在,允许登陆帮助管理系统;
uid c7 1000起步;c6 500 起步

对于用默认的配置,可以参考:/etc/login.defs

用户组

相当于一个用户的集合;
每个用户都必须要有一个 用户组;

用户组也有唯一标识:gid(group identify)
默认情况下,自动创建和用户名相同的用户组,gid 跟随 uid


文件修改时间

-rw-------. 1 root root 1154 Jun 17 07:57 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 Jun 18 03:29 server
-rw-r--r--. 1 root root   22 Jun 18 03:41 test
    														修改时间

文件有三种时间:
修改时间	# modify		文件内容被修改过
访问时间	# access		文件内容被访问过
变化时间	# change		文件属性发生改变 (文件内容属于属性的一部分)

ls -l		显示的时间为 修改时间;

state		可以查看文件的三个时间
    -c		# 可以查看文件、目录的指定属性

[root@centos7 ~]$ stat -c %a anaconda-ks.cfg
600

[root@centos7 ~]$ stat -c %A anaconda-ks.cfg
-rw-------

ls --time-style=iso -l		# 显示文件、目录 修改时间的格式
[root@centos7 ~]$ ls --time-style=iso -l
total 8
-rw-------. 1 root root 1154 06-17 07:57 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 06-18 03:29 server
-rw-r--r--. 1 root root   22 06-18 03:41 test

[root@centos7 ~]$ ls --time-style=long-iso -l
total 8
-rw-------. 1 root root 1154 2022-06-17 07:57 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 2022-06-18 03:29 server
-rw-r--r--. 1 root root   22 2022-06-18 03:41 test



文件索引 inode

[root@centos7 ~]$ ll -hi
total 8.0K
33579460 -rw-------. 1 root root 1.2K Jun 17 07:57 anaconda-ks.cfg
33579461 drwxr-xr-x. 2 root root    6 Jun 18 03:29 server
33954243 -rw-r--r--. 1 root root   22 Jun 18 03:41 test

第一列:文件的索引节点
索引节点是文件在系统中的唯一标识
找一个文件,最终都要通过索引节点才能找到
索引节点的概念出在 ext 文件系统中(ext2、3、4)

索引节点是磁盘上的一块存储空间。大小256字节或512字节
索引节点存放的是 文件的属性(大小、时间、用户和组、权限等)
在索引节点中 唯独不包含文件名;文件名在上级目录的block中

磁盘要想使用,先分区,格式化(创建文件系统)。
格式化创建文件系统时,就会生成大量的 inode 和 block。
inode 作用存储文件的属性信息,同时存放指向文件实体(block)的指针(类似软链接)
block 作用是存放文件内容的(大片)。

查看磁盘 inode 占用情况
[root@centos7 ~]$ df -i
Filesystem       Inodes IUsed    IFree IUse% Mounted on
devtmpfs          87742   361    87381    1% /dev
tmpfs             90911     1    90910    1% /dev/shm
tmpfs             90911   442    90469    1% /run
tmpfs             90911    17    90894    1% /sys/fs/cgroup
/dev/nvme0n1p3 12747776 37429 12710347    1% /
/dev/nvme0n1p2   256000   107   255893    1% /boot
/dev/nvme0n1p1        0     0        0     - /boot/efi
tmpfs             90911     1    90910    1% /run/user/0

stat  可以查看文件的inode值
  • inode 特点
Inode 的特点
总体来说,Inode 具有如下一些特点:

ext3/ext4文件系统(centos5.x/6.x默认的文件系统)下,一个非空文件至少要占用一个 Inode 和一个 Block。

Inode 节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口。Inode 在某一个文件系统(分区)内是唯一的。

文件块 Block

Block 叫做磁盘块,是用来存放实际数据的实体单元(ext 文件系统一般最大为 4KB),即用来真正存放数据,例如:照片、视频等普通文件数据,单个大的文件需要占用多个 Block 块来存储,特别小的单个文件如果不能占满整个 Block 块,剩余的空间也无法在利用。

Block 的特点
Block 的特点如下:

磁盘读取数据是按 Block 为单位读取的。
每读取一个Block就会消耗一次磁盘I/O(input/output磁盘读写)。
若文件比较大,一个文件可能占用多个 Block。
若文件比较小,一个 B1ock 剩余空间会被浪费,无论内容有多小。


磁盘在格式化的时候,可以指定block大小;

查看block占用
[root@centos7 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        343M     0  343M   0% /dev
tmpfs           356M     0  356M   0% /dev/shm
tmpfs           356M  5.0M  351M   2% /run
tmpfs           356M     0  356M   0% /sys/fs/cgroup
/dev/nvme0n1p3   25G  1.8G   23G   8% /
/dev/nvme0n1p2  495M  136M  360M  28% /boot
/dev/nvme0n1p1  200M  9.0M  191M   5% /boot/efi
tmpfs            72M     0   72M   0% /run/user/0


⚠️:磁盘满了,分为两种情况:

1. inode满了,df -i 查看
1. block 满了,df -h 查看

dumpe2fs /dev/sda1 可以产看分区的 inode 和 block 单位大小和各种信息;

linux 访问文件的流程

我们看到的 文件名(test.txt)其实它指向 该文件对应的 inode。inode 中记录了该文件的 block 块的位置和数量;然后再去找 block ,我们就访问到该文件中的数据了;

. 标识selinux的符号

selinux 是让系统更安全的一套规则

这个规则太严格了,一般我们关闭selinux

[root@centos7 ~]$ ll
total 8
-rw-------. 1 root root 1154 Jun 17 07:57 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 Jun 18 03:29 server
-rw-r--r--. 1 root root   22 Jun 18 03:41 test
第一列结尾的符号 . 是标识selinux的状态

都有 . 证明 selinux 开启状态;



[root@ip-10-254-25-232 ~]# getenforce
Disabled
[root@ip-10-254-25-232 ~]# ll
total 36360
drwxr-xr-x  2 root root       21 Jun 17 15:37 bin
drwxr-xr-x  2 root root       26 Jun 17 15:41 eks
-rwxr-xr-x  1 root root      301 Jun 16 03:55 glances
-rwxr-xr-x  1 root root 37224448 Jun 17 15:36 kubectl
drwxr-xr-x 10 root root      211 Jun 16 03:28 nginx
-rw-r--r--  1 root root       44 Jun 16 03:19 web.yml

当关闭 selinux 时,第一列的 . 不见了。证明 selinux 关闭了;

修改 selinux 需要重启机器;

硬链接

[root@centos7 ~]$ ls -lhi
total 8.0K
33579460 -rw-------. 1 					root root 1.2K Jun 17 07:57 anaconda-ks.cfg
33579461 drwxr-xr-x. 2 					root root    6 Jun 18 03:29 server
33954243 -rw-r--r--. 1 					root root   22 Jun 18 03:41 test
                     硬链接数

硬链接:具有相同inode节点号的文件;
默认文件有一个 硬链接
目录 除了自身,还有一个 .. 也是硬链接
目录	不支持人为创建硬链接文件;

# 创建硬链接
ln	源文件		硬链接


mv 只是修改 文件 的指向,inode没有改变,也不会修改block。所以mv非常快;


linux 删除文件的原理

1.静态文件:没有程序或进程访问的文件
    将文件所有的硬链接数变为 0 ;包括自身;
    
rm -f  只是删除文件的指向;其实文件没删
如果不小心删除了文件,直接停机;防止被占用inode
    1.系统会定时清理没有文件名的inode
    2.磁盘检查时会清理没有文件名的inode
    3.当增加文件的时候,会优先占用没有文件名的inode

恢复的工具:debugfs、ext3grep


2.动态文件
    有程序或进程访问的文件叫动态文件
删除:必须满足如下两个条件;
    1.必须 硬链接(i_link) 为 0;硬链接为零
    2.必须 i_count(进程调用文件的数量)为 0;引用计数为零

软链接

软链接:
本质是快捷方式,指向源文件实体,本身和源文件是不同的文件。
软连接支持 文件、目录

工作中经常使用软连接
    用于程序的版本更替
    	ln -s /usr/local/nginx-1.19.3 /usr/local/nginx		# 创建nginx 软链接

权限

# 权限放在文件的 inode 中,文件内容存放在 block 中;



# 权限位
-rw-------. 1 root root 1154 Jun 17 07:57 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 Jun 18 03:29 server
-rw-r--r--. 1 root root   22 Jun 18 03:41 test


一共九个字符:
r		# 读取权限 代表数字 4
w		# 可写权限 代表数字 2
x		# 可执行权限	代表数字 1
-		# 没有权限

# 字符分组
d    	rwx		 r-x					r-x			. 2 	root 	root    6 Jun 18 03:29 server
    		属主		属组				 other				  属主  属组

# 后边还有特殊权限位
t T  s S x X +


image-20220622202812446
# 一些简单的应用
chmod u-r,o=w,g=x test.txt

# 7 rwx ; 5 r-x; 5 r-w; r 4   w 2   x 1
chmod 755 test.txt

# 默认权限控制;可以使用 umask 444 来修改 umask 的默认值为 444
[root@centos7 ~]$ umask
0022
# 基于文件:默认权限规则
从666计算
umask 都为偶数,默认权限用减法
umask 有奇数,默认权限用减法,然后奇数位加1

# 基于目录:默认权限规则
默认权限


# 文件默认权限为 666-0022 即为创建文件的权限
[root@centos7 ~]$ stat a
  File: 'a'
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 10303h/66307d	Inode: 33579461    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

# 文件夹默认权限为 777 - 0022 如下图
[root@centos7 ~]$ stat b
  File: 'b'
  Size: 6         	Blocks: 0          IO Block: 4096   directory
Device: 10303h/66307d	Inode: 514138      Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)



linux 特殊权限位

基于9位基础权限

还有三位特殊权限位
suid 位:
    suid (setuid)位通过 s 字符标识,存在于基本权限的用户权限位的 x 权限对应的位置,
    如果用户权限位对应的 x 权限位上有 x 权限,则 suid 就用小写的 s 标识,
    如果用户权限位对应的 x 权限位上没有 x 权限,则 suid 就用大写的 S 标识,
    suid 的 s 对应的数字权限为 4,完整权限用八进制数 4000 表示


sgid 位:
    sgid (setgid)位同样是通过 s 字符来标识,
    但是,sgid 位存在于基本权限的用户组权限位的 x 权限对应的位置,
    如果用户组权限位对应的 x 权限位上有 x 权限,则 sgid 就用小写的 s 标识,
    如果用户组权限位对应的 x 权限位上没有 x 权限,则 sgid 就用大写的 S 标识,
    suid 的 s 对应的数字权限为 2,完整的权限用八进制数 2000 表示。


Sticky(粘滞位)知识简介:
    sticky(粘滞)位通过字符 T 标识,存在于基本权限的其他用户位对应的 x 权限位上,
    如果其他用户位的权限位上有 x 权限,则 sticky(粘滞)位通过小写的 t 标识,
    如果其他用户位的权限位上没有 x 权限,则 sticky(粘滞)位通过大写的 T 标识,
    对应的数字权限是 1,完整的权限用八进制数 1000 表示。
    被设置了 sticky,(粘滞)位权限的文件会显示黑字绿底,最典型的带 sticky(粘带)位权限的目录就是/tmp。

image-20220622222858530

特殊权限位 使用

# 4 2 1 加和放在基础权限数字的前面
# 修改方法:
chmod 7755 a

[root@centos7 ~]$ ll a
-rwsr-sr-t. 1 root root 0 Jun 22 07:04 a

特殊权限位 作用

Suid 作用
    首先suid是针对 二进制 命令的;
    让普通用户可以在执行某个设置了 suid 位的命令或程序时,拥有和 属主 一样的身份和权限(默认情况)。
    简单说,就是让普通用户 执行该命令时,拥有和 属主一样的权限;(只针对执行命令的文件本身,其他操作不行)


Sgid 作用
    首先suid是针对 二进制 命令的;也可以针对目录
    让普通用户可以在执行某个设置了 sgid 位的命令或程序时,拥有和 属组 一样的身份和权限(默认情况)。
    简单说,就是让普通用户 执行该命令时,拥有和 属组一样的权限;(只针对执行命令的文件本身,其他操作不行)
    
    当针对目录时,在设置了 sgid 的目录下创建文件,该文件的属组继承自父目录

    Sgid 基于目录的作用:
    	让不同的人创建文件属于相同的用户组,从而可以互相共享文件的权限。


粘滞位:
    代表目录;/tmp/ 目录
    作用:
    	粘滞位针对目录
    	配置了粘滞位的目录,所有用户都可以在该目录下创建删除文件、目录 。但是不能删除该目录