文件属性
2022-06-22
[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 +

# 一些简单的应用
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。

特殊权限位 使用
# 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/ 目录
作用:
粘滞位针对目录
配置了粘滞位的目录,所有用户都可以在该目录下创建删除文件、目录 。但是不能删除该目录