【Linux】Linux文件系统——剖析文件权限概念,文件类型和inode号
- 人工智能
- 2025-08-26 10:21:02

ℹ️大家好,我是练小杰,周末愉快,今天加更一波,不知不觉,我们的【Linux零基础】专栏已经来到了40篇!!!从没做一件事坚持那么久,各位都是好样的!!😆
本文是针对 Linux 文件权限这个知识点进行更加深入的讨论,后续将添加更多相关知识噢,谢谢各位的支持🙏
前情回顾: 【Linux文件、目录权限基本命令】 Linux专栏:🔝 【Linux零基础开始】【Shell 脚本编程】 【文件权限专栏】
主页:👉【练小杰的CSDN】 文件权限与类型 主页:👉【[练小杰的CSDN]( 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 Videoscat 举例:查看文件内容
cat filename.txt输出结果:
Hello, lxj! This is a sample text file. w: 读写可修改权限表示对文件有读写可修改权限;对目录的w权限,当用户拥有w权限时,他可以有执行以下操作的权限。
表示可以创建新的文件与目录;删除已经存在的文件与目录(不管该文件的权限为何权限!)修改已存在的文件或目录的名字;移动该目录内的文件、目录的位置。 “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 设备文件b和c :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和UidContext: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)的列表。
每个目录项由两部分数据组成: 所包含文件的文件名。该文件名对应的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】 ⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!! 下周同一时间再见,各位伙伴们🚴🏻♀️~~
【Linux】Linux文件系统——剖析文件权限概念,文件类型和inode号由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【Linux】Linux文件系统——剖析文件权限概念,文件类型和inode号”