深入理解linux文件权限

举报
码乐 发表于 2024/05/13 12:08:03 2024/05/13
【摘要】 1 文件从何处来我们继续旅程,文件从何而来?实际上Linux 引导启动时,默认使用的文件系统是根文件系统。其中一般都包括以下6类文件类型的一些子目录和文件:etc/ 目录主要含有一些系统配置文件:dev/ 含有设备特殊文件,用于使用文件操作语句操作设备;bin/ 存放系统执行程序。例如 sh、mkfs、fdisk 等;usr/ 存放库函数、手册和其他一些文件;usr/bin 存放用户常用...

1 文件从何处来

我们继续旅程,文件从何而来?

实际上Linux 引导启动时,默认使用的文件系统是根文件系统。其中一般都包括以下6类文件类型的一些子目录和文件:

etc/ 目录主要含有一些系统配置文件:

dev/  含有设备特殊文件,用于使用文件操作语句操作设备;
bin/ 存放系统执行程序。例如 sh、mkfs、fdisk 等;

usr/ 存放库函数、手册和其他一些文件;
usr/bin 存放用户常用的普通命令:

var/ 用于存放系统运行时可变的数据或者是日志等信息。

权限维护主要的指令 chmod,chown 就在 usr/bin中。

  • 挂载windows文件

现有 Linux 系统(例如 RedHat) 能够访问多种文件系统,包括利用 loop 设备访问存储在文件中的文件系统。

对应windows系统的文件,如果想把 Linux 系统中的某个文件取出来,那么现在可以双击配置文件图标开始运行 Linux 系统。
在进入 Linux 系统后,使用 DOS 软盘读写工具 mtools 把 hello.c 文件写到软盘 Imag中。并使用 WinImage打开 diskb.img 文件,在 Winmage 的主窗口中会有一个hello.c如果需要把某个文件文件存在。用鼠标选中该文件并拖到桌面上即完成了取文件的整个操作过程。

  • 挂载linux的外部文件

对于linux软盘外接文件,我们可以直接使用 mount 命令来加载其中的文件系统进行读写访问。
例如我们需要访问 rootimage 中的文件,那么只要执行以下命令。

[root@ard images]# mount -t minix rootimage /mnt -o loop
root@ard mnt]# ls
bin dev etc root tmp usr
[root@ard mnt]#

其中 mount命令的-t linux选项指明所读文件系统类型是 MINIX(linux支持的文件系统之一),-0 loop 选项说明通过 loop 设备来加载文件系统。

若需要访问 DOS 格式软盘Image 文件,只需把 mount 命令中的文件类型选项 minix 换成 msdos 即可。

如果想访问硬盘 Image 文件,那么操作过程与上述不同。由于软盘 Image 文件一般包含一个完整文件系统的映像,因此可以直接使用 mount 命令加载软盘 mage 中的文件系统,但是硬盘 mage 文件中通常含有分区信息,并且文件系统是在各个分区中建立的。

也即我们可以把硬盘中的每个分区看成是一个完整的“大”的外接硬盘。

关于外接文件的操作以后再立文说明,这里主要说明在linux系统内的文件和文件夹的权限维护。

2 从六大linux文件系统查找文件

系统从硬盘加载,硬盘的第一个扇区是主引导扇区,其中存放着硬盘引导程序和分区表信息。
分区表中的信息指明了硬盘上每个分区的类型、在硬盘中的起始位置参数和结束位置参数以及占用的扇区总数,参考硬盘分区表结构。

如果把内核映像文件放在文件系统中,那么就可以在文件系统所在设备的第 1 个块(即引导块空间)存放实际的引导程序,并由它来取得和加载文件系统中的内核映像文件。

linux标准文件系统一般由6个部分组成,包括:引导块,超级块,i节点位图,逻辑块位图,i节点,数据区。

  • 引导块和超级块

引导块是计算机加电启动时可由 ROM BIOS 自动读入的执行代码和数据。

引导设备可以不含代码。但是任何系统必须含有引导块空间,以保持linux文件系统格式的统一。文件系统只是在块设备上空出一个存放引导块的空间。

超级块用于存放盘设备上文件系统结构的信息,并说明各部分的大小。被加载的文件系统超级块保存在 超级块表(数组) super_block中。该表共有8项,因此linux系统中同时最多加载 8个文件系统。

逻辑块位图用于描述盘上每个数据盘块的使用情况。除第 1 个比特位(位 0)以外,逻辑块位图中每个比特位依次代表盘上数据区中的一个逻辑块。

  • i 节点

i节点位图用于说明i节点是否被使用,同样是每个比特位代表一个i节点。
对于 1K 大小的盘块来讲,一个盘块就可表示8192 i节点的使用状况。

与逻辑块位图的情况类似,由于当所有i节点都被使用时查找空闲i节点的函数会返回 0 值,因此i节点位图第1个字节的最低比特位(位0) 和对应的i节点0 都闲置不用,并且在创建文件系统时会预先将 i 节点 0 对应比特位图中的比特位置为 1。

每个文件或目录名都有一个i节点每个i节点结构中存放着对应文件的相关信息,如文件宿主的 id(uid)、文件所属组 d (gid)、文件长度访问修改时间以及文件数据块在盘上的位置等。整个结构共使用 32 个字节。

i_mode 字段用来保存文件的类型和访问权限属性。其比特位 15-12 用于保存文件类型,位 11-9 保存执行文件时设置的信息,位 8-0 表示文件的访问权限.

文件中的数据是放在磁盘块的数据区中的,而一个文件名则通过对应的i 节点与这些数据磁盘块相联系,这些盘块的号码就存放在 i节点的逻辑块数组i zonel中。其中,i zonel数组用于存放i节点对应文件的盘块号。

i_zone_0到i_zone_6用于存放文件开始的 7 个磁盘块号,称为直接块。如果文件足够大将会使用间接块,二次间接块等结构,这在文件存储和系统分页中非常常见。

对于/dev/目录下的设备文件来说,它们并不占用磁盘数据区中的数据盘块,即它们文件的长度是0。设备文件名的i节点仅用于保存其所定义设备的属性和设备号。设备号被存放在设备文件i节点的 zone[0]中。

当所有i节点都被使用时,查找空闲i节点的函数会返回值 0,因此i节点位图最低比特位和i节点0 都不使用。i节点0 的结构被初始化成全零,并在创建文件系统时将i节点0 的比特位置位。

在linux中,逻辑块的长度等于盘块长度。因此在linux代码中这两个术语含义相同。
但是术语数据逻辑块(或数据盘块)则是指盘设备上数据部分中,从第一个数据盘块开始编号的盘块。

  • 从文件名找到文件的磁盘位置

在打开一个文件时,文件系统会根据给定的文件名找到其 i 节点号,从而通过其对应i 节点信息找到文件所在的磁盘块位置,见图所示。

对于要查找文件名/usr/bin/vi 的i节点号,文件系统首先会从具有固定i节点号(1)的根目录开始操作,即从i节点号 1 的数据块中查找到名称为 usr 的目录项.从而得到文件/usr 的i节点号。

根据该i节点号文件系统可以顺利地取得目录/usr,并在其中可以查找到文件名 bin 的目录项。
这样也就知道了/usr/bin 的i节点号,因而我们可以知道目录/usr/bin 的目录所在位置,并在该目录中查找到vi 文件的目录项。

最终我们获得了文件路径名/usr/bin/i的i节点号,从而可以从磁盘上得到该i节点号的i 节点结构信息。

小结

本文通过原理了解linux文件权限是维护系统安全和稳定性的重要工具。

这些设计是为了确保系统的安全性和稳定性,通过配合最小权限原则、权限掩码、可扩展性和ACL等机制,有效地防止漏洞程序或恶意程序对系统关键部分的破坏。

下一节我们通过实际操作示例如何使用它们。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。