深入理解linux文件权限
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等机制,有效地防止漏洞程序或恶意程序对系统关键部分的破坏。
下一节我们通过实际操作示例如何使用它们。
- 点赞
- 收藏
- 关注作者
评论(0)