当前位置: 首页 > article >正文

【Linux】Linux 文件系统——剖析文件权限概念,文件类型和inode号

ℹ️大家好,我是练小杰,周末愉快,今天加更一波,不知不觉,我们的【Linux零基础】专栏已经来到了40篇!!!
从没做一件事坚持那么久,各位都是好样的!!😆


本文是针对 Linux 文件权限这个知识点进行更加深入的讨论,后续将添加更多相关知识噢,谢谢各位的支持🙏

前情回顾: 【Linux文件、目录权限基本命令】
Linux专栏:🔝 【Linux零基础开始】【Shell 脚本编程】 【文件权限专栏】

主页:👉【练小杰的CSDN】

Alt

文件权限与类型

    • 主页:👉【[练小杰的CSDN](https://blog.csdn.net/weixin_55767624?spm=1011.2415.3001.5343)】
  • 文件权限的概念
    • 认识基本权限
    • 理解文件基本权限(r,w,x)
    • `r` : 可读权限
    • `w`: 读写可修改权限
    • “x”: 可执行的权限
      • 简单实例:
    • `-` :表示该项没有权限
  • 文件类型
    • 普通文件 `-` :
    • 目录文件`d`:
    • 设备文件`b`和`c` :
    • 链接文件`l` :
  • 文件的inode
    • 理解索引节点 inode 由来
    • 认识inode的内容
    • ⚠️注意
  • 文件的三种时间属性详解
    • atime:访问时间access time的缩写
      • 一个小测试
    • mtime:修改时间modify time的缩写
    • ctime: 状态改动时间change time的缩写
  • inode的大小
  • inode号
    • 命令 `ls -i`
    • 文件的删除或者移动
  • 目录文件
    • 举例

在这里插入图片描述

文件权限的概念

在Centos 或 Linux系统中,访问文件的的用户有三种:ower(文件所有者),group(所属组),others(其他用户)。
这三种用户对文件的操作方式有:可读(r),可写(w)和可执行(x)。文件的基本权限就是指三类用户对文件分别拥有三种文件操作方式中的哪些。

认识基本权限

为了更方便理解权限,我们先使用 ls -l 查看的文件的详细信息,并理解每一列输出数据所表示的含义。

[root@localhost etc]# ls -l
drwxr-xr-x.	3	root	root	101	Feb 15 20:51	test

在这里插入图片描述

  • 详细说明: 通过上表的输出结果可知

第一列“drwxr-xr-x.”:第一个字符表示文件类型,这里的“d”表示目录;
从第二个字符开始即“rwxr-xr-x.”,表示文件的基本权限;
第二列的数字“3”:表示这个文件被链接使用的次数;
第三列的字符“root”:表示文件的所有者或称文件属主为root用户;
第四列的字符“root”:表示文件的所属组或称文件属组;
第五列的数字“101”:表示文件的大小;
第六列的字符“Feb 15 20:51”:表示文件的最后修改日期;
第七列的字符“test”:表示文件名。

理解文件基本权限(r,w,x)

⚠️接下来我们针对第一列中的字段“rwx r-x r-x.”。这个字段包含九个字符,这九个字符按照三个字符一组分为三组。

  • 第一组表示文件所有者的权限,比如上面的第一组为“rwx ”,表示文件所有者具有可读(r),可写(w)和可执行(x)的权限;
  • 第二组表示文件属组用户的权限,比如上面的第二组为“r-x ”,表示文件属组用户具有可读(r),不可写(-)和可执行(x)的权限;
  • 第三组表示其他用户的权限,比如上面的第三组为“r-x ”,表示其他用户对文件具有可读(r),不可写(-)和可执行(x)的权限。

从上面我们可看到,文件的基本权限基本上每一组都由“r、w、x、-”四个字符中的三个字符组成,下面我们解释一下每种权限的实际意义。

r : 可读权限

表示对文件有读权限,具体来讲就是,目录的r权限指用户具有读取目录结构列表的权限,所以当你对目录具有读取 (r ) 权限时,表示你可以用“ls”命令查询该目录下的文件名, 也可以利用 ls这个指令显示目录的内容列表。文件的r权限表示用户可以查看文件的内容,如用cat等命令查看文件。

  • ls 举例:列出目录详细信息

    ls -l
    

输出结果:

drwxr-xr-x 2 user user 4096 Apr 27 10:00 Documents
drwxr-xr-x 5 user user 4096 Apr 27 09:50 Downloads
drwxr-xr-x 3 user user 4096 Apr 27 10:05 Pictures
drwxr-xr-x 4 user user 4096 Apr 27 10:10 Videos
  • cat 举例:查看文件内容

    cat filename.txt
    

输出结果:

Hello, lxj!
This is a sample text file.

w: 读写可修改权限

表示对文件有读写可修改权限;对目录的w权限,当用户拥有w权限时,他可以有执行以下操作的权限。

  1. 表示可以创建新的文件与目录;
  2. 删除已经存在的文件与目录(不管该文件的权限为何权限!)
  3. 修改已存在的文件或目录的名字;
  4. 移动该目录内的文件、目录的位置。

“x”: 可执行的权限

表示对文件有可执行的权限,但目录不可以被执行,所以目录的x权限表示用户能否进入该目录,如果没有x权限,那么你无法使用cd命令进入这个目录的;

简单实例:

  • 查看目录权限
ls -ld /home/user/testdir

输出结果:

dr-------- 2 user user 4096 Apr 27 10:00 /home/user/testdir

可以看到,该目录上没有可执行权限x的,所以应该是无法使用命令cd的。

  • 接下来尝试进入目录:

    cd /home/user/testdir
    

    输出结果:

    -bash: cd: /home/user/testdir: Permission denied
    

因为缺少执行权限 (x),用户是无法进入该目录。

  • 再尝试列出目录内容:

    ls /home/user/testdir
    

输出:

ls: cannot open directory '/home/user/testdir': Permission denied

就算有读权限 ( r ),如果没有执行权限 (x),也照样无法列出目录内容。

- :表示该项没有权限

假设有一个普通文件 lxj.txt,其权限设置为 -rw-r-----,详细理解如下:

ls -l example.txt

输出结果:

-rw-r----- 1 user group 0  Feb 15  21:51  lxj.txt

由上面的权限信息可以看到,所属组是没有写权限和 没有执行权限;其他用户是没有读、写和执行权限。

文件类型

Linux四种文件类型:普通文件、目录文件、设备文件和链接文件,用ls-l命令查看文件时,输出结果中的第一个字符表示文件类型。

普通文件 -

包括文本文件、数据文件、可执行的二进制程序文件等,使用“-”标识。如下命令所示:

[root@localhost /]# ls -l /etc
-rw-r--r--.  1 root root       16  Feb 15  21:55  adjtime

目录文件d

Linux系统把目录看成是一种特殊的文件,利用它构成文件系统的树型结构,使用“d”标识,相当于windows的文件夹。如下命令所示:

[root@localhost /]# ls -l /etc
drwxr-xr-x.	3	root	root	101	 Feb 15 20:51	test

设备文件bc

Linux系统把每一个设备都看成是一个文件,这类文件使用“b”和“c”标识。如下命令所示:

[root@localhost dev]# ls -l /dev
brw-rw----. 1 root disk  8,1 Feb 15 21:51  sda1	##表示块设备,比如硬盘
crw-r-----. 1 root kmem  1,4 Feb 15 21:51  port	##表示字符设度备文件,如鼠标,键盘

链接文件l

链接文件,使用“l”标识,相当于windows的快捷方式,如下命令所示:

[root@localhost dev]# ls -l /dev
lrwxrwxrwx. 1 root root  13 Feb 15 23:15 fd -> /proc/self/fd

文件的inode

理解索引节点 inode 由来

  • 一块硬盘会划分为多个扇区(Sector)作为文件的最小存储单位,每个扇区可储存512字节的数据。
  • 在操作系统读取硬盘时,不可能一个一个扇区地去读取,这样效率太低而影响性能,而是一次性读取多个扇区即一个"块"(block)的方式,这种由多个扇区组成的"块"称为文件的最小存取单位。最常见的一个"块"是4KB,由连续的八个 sector组成一个块(block)。
  • 文件数据都储存在""中,我们在读取文件时需要文件的创建者、文件的创建日期、文件的大小等之类的信息,这些信息称为储存文件的元信息。储存文件元信息的区域就叫做inode(索引节点)。

认识inode的内容

文件的元信息 包含在inode中,具体内容如下:

  • 文件的大小,
  • 文件拥有者(属主)的User ID,
    -文件属组的Group ID,
  • 文件的读( r )、写(w)以及执行(x)权限
  • 文件的时间戳信息:ctime(指inode上一次变动的时间)、mtime(指文件内容上一次变动的时间)、atime(指文件上一次打开的时间)。
  • 文件数据块(block)的位置
  • 文件的链接数,即指向这个inode的文件名的数量。
  • Linux的文件系统中,可以用stat命令查看某个文件的inode信息,例如我们查看一下anaconda-ks.cfg文件的inode信息如下命令所示:
[root@localhost ~]# stat anaconda-ks.cfg
File: 'anaconda-ks.cfg'
  Size: 2767      	Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d	Inode: 33574996    Links: 1
Access: (0600/-rw-------)  Uid: (  0/ root)   Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2025-02-15 23:45:32.049163900 -0700
Modify: 2025-02-15 23:45:32.050163962 -0700
Change: 2025-02-15 23:45:32.050163962 -0700
Birth: -         #这里指创建时间,空值
  • stat命令显示的信息详细说明:
  • File:文件名
  • Size:文件大小
  • Blocks:文件使用的数据块总数
  • IO Block:IO块大小
  • regular file:文件类型(常规文件)
  • Device:设备编号
  • Inode:Inode号
  • Links:链接数
  • Access:访问文件的权限
  • Gid、Uid:文件所有权的Gid和Uid
  • Context:selinux的上下文信息
Access: 2025-02-15 23:45:32.049163900 -0700
Modify: 2025-02-15 23:45:32.050163962 -0700
Change: 2025-02-15 23:45:32.050163962 -0700
#这里指linux文件的三种时间属性:atime(访问时间),mtime(修改时间),ctime(状态改动时间)
  • Atime: 表示文件的访问时间。当文件内容被访问时,会更新这个时间
  • Mtime: 表示文件内容的修改时间,当文件的数据内容被修改时,会更新这个时间。
  • Ctime:表示文件的状态被修改时间,当文件的状态被修改时,会更新这个时间。

⚠️注意

Linux是没有创建时间概念的,也就是不能查看到创建文件的时间。因为我们是无法判断文件是否被改过、读过、其状态是否变过,所以判断文件的建立时间基本上为不可能的。

  • 若文件创建后就没有修改过,那么修改时间=创建时间;
  • 若文件创建后,没有改动过状态,那么状态改动时间=创建时间;
  • 若文件创建后,没有被读取过,那么访问时间=创建时间。

文件的三种时间属性详解

atime:访问时间access time的缩写

显示的是文件中的数据最后被访问的时间,每读一次文件的内容,就会更新这个时间。

  • 如果文件被系统的进程直接使用或者通过一些命令和脚本间接使用,比如使用useradd命令增加一个新用户,就会修改/etc/passwd文件,当然/etc/passwd文件的atime就会改变。
  • 同时,当执行一些可执行文件、脚本或对这个文件运用 more、cat等命令时也会改变atime 的值,但ls、stat命令都不会修改文件的访问时间。

一个小测试

  • 第一步:使用ls命令和stat命令后看看atime是否改变。
[root@localhost ~]# ls anaconda-ks.cfg
[root@localhost ~]# stat anaconda-ks.cfg
Access: 2025-02-15 23:45:32.049163900 -0700   ##没有改变
  • 第二步:使用cat命令读一下这个文件,观察是否改变atime。我们用ls命令测试。
[root@localhost ~]# ls -lu anaconda-ks.cfg   #使用cat前
[root@localhost ~]# cat  anaconda-ks.cfg
[root@localhost ~]# ls -lu anaconda-ks.cfg   #使用cat后
-rw------- 1 root root 2767 Feb 15 23:46 anaconda-ks.cfg

由于我们已经执行了 cat anaconda-ks.cfg 命令,文件的最后访问时间将会更新为当前时间。

mtime:修改时间modify time的缩写

  • 例如,用vim编辑时就会改变。 ls -l列出的时间就是mtime时间,大家可以自行测试一下。

ctime: 状态改动时间change time的缩写

  • 当文件的权限、文件属主,文件属组,链接数发生改变时以及内容改变时。
  • 总而言之,当Inode内容发生改变和文件块内容(修改文件内容)发生改变时,会改变ctime
  • 因此,使用chmod、chown命令,一次文件属性,这个时间就会更新,如果使用vim命令修改了文件的内容也会改变ctime。大家可以使用命令“ls -lc filename”进行测试,也可以使用“stat filename”测试。

inode的大小

inode包含了文件那么多信息,自然也会占用硬盘空间。
硬盘格式化的时候,操作系统会将硬盘分成两部分:一个是数据区用于存放文件数据;另一个是inode区(inode table),用于存放inode信息。

  • 在格式化时就会给定inode节点的总数,一般每1KB或2KB设置一个inode,每个inode节点一般占用128字节或256字节。

  • 假定有一块1GB的硬盘,按每个inode节点的大小为128字节算,每1KB数据就要设置一个inode,那么这块硬盘的inode table就占用128MB,占整块硬盘的12.8%。 由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件了。

  • 可使用“df -i”命令查看硬盘分区的inode总数和已经使用的数量,如下所示。

[root@localhost ~]# df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda3      9283072 149233 9133839    2% /
devtmpfs        120526    377  120149    1% /dev
tmpfs           124487      1  124486    1% /dev/shm
tmpfs           124487    945  123542    1% /run
tmpfs           124487     16  124471    1% /sys/fs/cgroup
/dev/sda1       153600    340  153260    1% /boot
tmpfs           124487      7  124480    1% /run/user/42
tmpfs           124487     21  124466    1% /run/user/0

inode号

  • Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。
  • 每个inode都有一个号码,操作系统统一用inode号来识别不同的文件。
  • Unix/Linux系统内部不使用文件名,而是使用inode号来识别文件的。每个文件都有唯一的inode号与之对应,而对于同一个inode号,容许有多个文件名与之对应的。因此,磁盘上的同一个文件可以通过不同的路径去访问。
  • 由上面的输出信息可知,对于操作系统来说,文件名不过是inode号便于识别的别名而已。表面看起来用户好像在通过文件名打开文件的,其实在系统内部打开文件的过程是分三步进行的:
第一步:系统找到文件名所对应的inode号;
第二步:通过inode号,获取inode信息;
第三步:根据inode信息,找到文件数据所在的块(block),再读出数据。

命令 ls -i

使用“ls -i”命令,可以看到文件名对应的inode号。

[root@localhost ~]# ls -i anaconda-ks.cfg
33574996 anaconda-ks.cfg      #--文件anaconda-ks.cfg 的inode号

文件的删除或者移动

通过以上操作,我们已经了解了inode号的特点。那么,在Linux系统中对文件的删除或者移动,我们还可以采用另一种方式实现。

  • 直接删除inode节点可以删除文件,特别对于一些文件名包含特殊字符(如汉字命名的文件)而无法正常删除的文件,可以采用这种方式删除文件,其实文件的内容并没有被删除的,从这里我们就明白删除文件的实质了吧!
[root@localhost ~]# cd /
[root@localhost /]# mkdir inodetest
[root@localhost /]# cd inodetest
[root@localhost inodetest]# touch test
[root@localhost inodetest]# ls -i	
51005831 test
[root@localhost inodetest]# find ./*  -inum 51005831 -delete

⚠️接下来,我们可以继续创建一个文件,发现与刚才删除的文件是同一个inode号!

  • 移动文件或重命名文件,改变的只是文件名,并没有改变文件的inode号码
[root@localhost inodetest]# touch inodetestfile
[root@localhost inodetest]# ls -i	
51005831 inodetestfile
[root@localhost inodetest]# mv inodetestfile inodetestfile000
[root@localhost inodetest]# ls -i	
51005831 inodetestfile000

我们可以发现,在打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统是无法从inode号得知文件名的。

  • ⚠️注意
  • 我们可以在不关闭软件的情况下进行软件更新且不需要重启,就是基于inode的这一特点!
  • 系统通过inode号而不通过文件名去识别运行中的文件,当更新软件时,新版文件会以同一个文件名生成一个新的inode,这样不会影响正在运行中的文件,等到下一次再运行这个软件时,文件名就自动指向新版软件的inode,而旧版软件的inode则被回收。

目录文件

在Unix/Linux系统中,目录(directory)也是一种文件。我们常说的打开目录就是打开一个目录文件。
相对其它类型的文件来说,目录文件的结构简单多了,一个目录文件包含一系列目录项(dirent)的列表。

  • 每个目录项由两部分数据组成:
  1. 所包含文件的文件名。
  2. 该文件名对应的inode号。

举例

我们用命令“ls -i”查询一下”/”目录的目录项信息,下面的数字就是该目录的inode号。

[root@localhost ~]# ls -i /
232754 bin       81 home       17060739 media   2635724 project  82 srv        52618423 umaskdir      16792867 user1
64 boot            232757 lib      33927989 mnt    33574977 root         1 sys         2634251 umaskfile     16792866 user2  3 dev   83 lib64    50417441 opt        8813 run     2634660 testfile0   2634261 umaskuserdir   33783314 usr
16777281 etc   33575022 maskdir    1 proc    84 sbin   16777288 tmp         3251837 user          50331713 var

今天的Linux系统的文件权限内容到这里就结束了,明天再见啦👋
ℹ️了解更多,主页【练小杰的CSDN】
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!! 下周同一时间再见,各位伙伴们🚴🏻‍♀️~~

在这里插入图片描述


http://www.kler.cn/a/550904.html

相关文章:

  • VIM操作命令-全选复制删除
  • 【再读】2501.12948/DeepSeek-R1通过强化学习提升大型语言模型(LLMs)的推理能力
  • ceph部署-14版本(nautilus)-使用ceph-ansible部署实验记录
  • Linux中线程创建,线程退出,线程接合
  • 假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?
  • Office-Tab-for-Mac Office 窗口标签化,Office 多文件标签化管理
  • java练习(28)
  • 【C++初阶】类和对象①
  • Maven 中的 Artifact 与 GroupId:定义与使用
  • Java并发编程——AQS原理解析
  • 【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析⑩】
  • NetCDF数据处理
  • Linux高并发服务器开发 第十八天(信号及相关概念 信号捕捉)
  • 三、tsp学习笔记——屏幕移植
  • 嵌入式 Linux 设备树:为什么需要设备树?
  • Intel i7系列CPU替换为Xeon X79或X99架构的CPU替代方案和对比分析
  • jenkins 2.380配置从节点
  • DC-7靶机渗透测试全过程
  • BUU38 [RoarCTF 2019]Easy Java1
  • label-studio 导入既有的yolo格式标注