【Linux】Linux 文件系统——剖析文件权限概念,文件类型和inode号
ℹ️大家好,我是练小杰,周末愉快,今天加更一波,不知不觉,我们的【Linux零基础】专栏已经来到了40篇!!!
从没做一件事坚持那么久,各位都是好样的!!😆
本文是针对 Linux 文件权限这个知识点进行更加深入的讨论,后续将添加更多相关知识噢,谢谢各位的支持🙏前情回顾: 【Linux文件、目录权限基本命令】
Linux专栏:🔝 【Linux零基础开始】【Shell 脚本编程】 【文件权限专栏】主页:👉【练小杰的CSDN】
文件权限与类型
- 主页:👉【[练小杰的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权限时,他可以有执行以下操作的权限。
- 表示可以创建新的文件与目录;
- 删除已经存在的文件与目录(不管该文件的权限为何权限!)
- 修改已存在的文件或目录的名字;
- 移动该目录内的文件、目录的位置。
“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和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)的列表。
- 每个目录项由两部分数据组成:
- 所包含文件的文件名。
- 该文件名对应的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】
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!! 下周同一时间再见,各位伙伴们🚴🏻♀️~~