前言:
在linux系统中,每个设备都会被当成一个文件来对应。没有文件系统,电脑就不知道读取写入数据到硬盘。所以,学好文件系统很重要。
目录
一、认识文件系统
用户在一件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以满足用户正常的使用需求。
1)文件系统类型
linux系统常见的文件系统有:
- Ext4(第四代扩展文件系统):是linux系统中最常用的文件系统,是对ext3文件系统和的改进和扩展。它支持更大的分区和分区大小,以及更快的文件系统检查和操作速度。
- XFS(扩展文件系统):是一种高性能的文件系统,适用于大型文件和大容量存储。它支持高并发访问和快速的文件系统检查,适用于高负载的服务器环境。 它的优势在发生意外宕机后尤其明显,可以快速恢复可能被破坏的文件而且强大的日志功能只需花费极低的文件权限和属性的信息。
- JFS(日志文件系统):JFS是IBM开发的一种日志文件系统,具有快速的文件系统恢复能力和高性能。它支持大容量存储和快速数据访问,适用于大型服务器和高性能计算环境。
2)文件权限和属性的记录
日常在硬盘中需要保存的数据很多,因此在linux操作系统中有一个名为“super block”的“硬盘地图”。linux将每个文件的权限和属性记录在索引节点(inode)中,并且每个文件占用一个独立的inode表格,默认大小为128B。
super block可用于恢复文件系统的元数据信息。其中保存了关键的元数据,还在数据恢复和文件系统一致性检查等方面发挥着重要的作用。
存储着以下信息:
- 该文件的访问权限(read、write、execute);
- 该文件的所有者与所属组(owner、group);
- 该文件的大小(size);
- 该文件的创建或内容修改时间(ctime);
- 该文件的最后一次访问时间(atime);
- 该文件的修改时间(mtime);
- 文件的特殊权限(SUID、SGID、SBIT);
- 该文件的真实数据地址(point)。
3)文件实际内容的记录:
文件实际内容存储在block中(block的大小可以是1KB、2KB、4KB),一个inode的默认大小仅为128B(Ext3),记录一个block则消耗4KB。
当文件的inode被写满后,linux操作系统会自动分配出一个block,专门用于向inode那样记录其他block的信息,这样把各个block的内容串到一起(指针连接),就能够让用户读到完整的文件内容。对于存储文件内容的block,有下面两种常见的情况(以大小为4KB大小的block为例进行讲解):
- 情况一:文件很小(如1KB),但依然会占用一个block,因此会潜在地浪费3KB。
- 情况二:文件较大(如5KB),那么会占用两个block(剩下的1KB也要占用一个block)。
【通过这种方式,linux文件系统可以有效地管理和存储大文件的内容,同时保持inode表格的大小相对较小。这种分层的数据结构允许文件系统存储大量的文件内容,同时保持快速访问和管理的能力。】
当我们操作linux操作系统时,实际上我们是通过内核提供的虚拟文件系统(VFS)与系统进行操作。
- 一个系统可以同时挂载多个和不同类型的文件系统,再通过VFS提供一个统一的视图给用户或应用程序访问。
- 虚拟文件系统的设计允许linux系统支持多种文件系统并存的情况。
- VFS提供了统一接口,但仍可能在不同操作系统中有所差异。
二、Linux文件系统结构
Linux操作系统中的一切都是文件,而一切文件都是从根目录开始的,并按照文件系统层次化标准采用树形结构来存放文件。
【Linux操作系统中的文件和目录名都是严格区分大小写的】
Linux操作系统中常见的目录名称以及相应的存放内容:
三、管理linux文件权限
1. 理解文件和文件权限
文件是操作系统用来存储信息的基本结构,是一组信息的集合。Linux中的文件名称最长可允许255个字符,这些字符可用A~Z、0~9、“.”、“_“、”-”等符号表示。
与其他操作系统相比,linux系统最大的不同就是没有“扩展名“的概念,也就是说:文件的名称与该文件的种类没有直接的关联。
如果文件名以“.“开头,说明该文件是隐藏文件。(需要使用ls -a命令才能显示)。
Linux中的每一个文件或者目录都包含访问权限,访问权限决定了谁可以访问以及如何访问文件和目录。可用通过以下3种方式限制访问权限:
- 只允许用户自己访问。
- 允许一个预先指定的用户组中的用户访问。
- 允许系统中的任何用户访问。
三套权限赋予用户不同权限类型(所有者、用户组和其他用户)的读、写以及执行权限,就构成了一个有9个字符的权限组。如下图:
【文件权限后的“+“,表示当前用户拥有访问该文件的ACL(访问控制列表)的权限】
2. 详解文件的各种属性信息
1)第一组为文件类型权限
i. 文件类型
第一个字符用来区分文件的类型,一般取值为d、-、l、b、c、s、p。具体含义为:
- d:目录。在ext文件系统中,目录也是一种特殊的文件。
- -:普通文件。
- l:符号链接文件,实际上它指向另一个文件。
- b、c:分别表示该文件为区块设备和其他外围设备,是特殊类型的文件。
- s、p:表示这些文件关系到系统的数据结构和管道,通常很少见到。
ii. 文件的访问权限
每一行的第2~10个字符用来表示文件的访问权限。这9个字符每3个一组:
- 第一组:文件所有者权限
- 第二组:文件所有者所属组的组成员的权限
- 第三组:文件所有者所属组群以外的权限
根据权限种类的不同,9个字符分为3种类型。
- r:对文件——读取文件内容;对目录——浏览目录。
- w:对文件——新增、修改文件内容;对目录——删除、移动目录内文件。
- x:对文件——执行文件;对目录——进入目录
- -:无该项权限。
2) 第二组为多少文件名连接到此节点
每个文件都会将其权限与属性记录到文件系统的节点中。
【有多少连接数=有多少种找到该文件的方式=有多少个链接指向该文件】
3) 第三组表示这个文件(或目录)的拥有者账号
4) 第四组表示这个文件的所属组
在Linux系统中,你的账号会附属于一个或多个组中。如果一个文件的权限是A,那么文件所属组的组成员都对该文件有A权限。
5) 第五组表示该文件的容量大小,默认单位是B
6) 第六组表示该文件的创建日期或最近的修改日期
如果时间部分仅显示年份,代表该文件被修改的时间距离现在太远了,使用ls -l—full-time 即可查看完整时间。
7) 第七组表示文件名
如果有“.“前缀,表示该文件是隐藏文件
3. 使用数字表示法修改权限
将读取(r),写入(w),执行(x)分别以数字4、2、1来表示,没有授予的部分表示为0,然后把授予的权限相加。
如:
举例:
【启用.bashrc这个文件的所有权限】
4. 文字表示法
1) 4种字符表示不同的用户
- u:user,表示所有者
- g:group,表示所属组
- o:others,表示其他用户
- a:all,表示以上3种用户
2) 操作符
- +:添加某种权限
- -:减去某种权限
- =:赋予给定权限并取消原来的权限
举例:
1.【所有者和所属组有读写权限,其他有读权限】
注意设置权限时,中间没有空格符号
2. 【给其他用户添加读权限】
四、修改文件和目录的默认权限和隐藏权限
超级用户具有特权级别的权限,可以绕过默认权限设置。而隐藏权限可能对超级用户施加一些限制。设置系统隐藏属性使用chattr命令,使用lsattr命令可以查看隐藏属性。
基于安全机制方面的考虑,设定文件不可修改的特性,即使是文件的所有者也不能修改,非常重要。
1. 理解文件预设权限
默认权限和umask有密切关系,umask指定的就是用户在建立文件或目录时的默认权限值。
如何得知umask值:
umask值有4组数字,第一组是特殊权限(比如:SUI、SCID、SBIT)用的。
目录与文件的默认权限不同。x权限对目录来说很重要,但一般文件不应该有执行的权限。因此,预设的情况应该分为两种:
- 若用户建立文件,则预设无x权限,最大为666,预设为-rw-rw-rw-。
- 若用户建立目录,由于x与能否进入此目录有关,因此默认所有权限均开放。预设为drwxrwxrwx。
umask值指的是该默认值需要减掉的权限,具体如下:
- 去掉写入权限时,umask值输入2
- 去掉读取权限时,umask值输入4
- 去掉读写和写入权限时,umask值输入6
- (其他以此类推)
【注意:计算umask值时,建议使用符号相减的计算方式,避免出现错误(如633情况)】
2. 设置文件隐藏属性
1)chattr命令
改变文件属性。
这个命令可以改变存放在ext4文件系统上的文件或目录属性,这些属性共有以下8种:
- a:系统只允许这个文件后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,则系统将只允许这个目录下建立和修改文件,而不允许删除任何文件。
- b:不更新文件或目录的最后存取时间。
- c:将文件或目录压缩后存放。
- d:将文件或目录排除在操作之外。
- i:不得任意改动文件或目录。(即使加!也不能实现改变)
- s:保密性地删除文件或目录,即硬盘文件空间将全部被收回。【删除后无法恢复或访问】
- S:即时更新文件或目录。
- u:预防意外删除。
chattr的相关参数如下。由于以上8种属性是隐藏的,所以需要使用lsattr命令。
- -R:递归处理,将指定目录下的所有文件以及子目录一并处理。
- -v<版本编号>:设置文件或目录的版本。
- -V:显示命令执行过程。
- +<属性>:开启文件或目录的该项属性。
- -<属性>:关闭文件或目录的该项属性。
- =<属性>:指定文件或目录的该项属性。
举例:
在/xiaoming目录下建立文件,加入i属性,并尝试删除。
可以看出,即使是超级管理员也无法删除这个文件。
取消i属性:
此外,如果是日志文件,就需要+a属性,可增加但不能修改与删除旧有数据。
2)lsattr命令
显示文件隐藏属性。
常用参数如下:
- -a:将隐藏文件的属性也显示出来。
- -d:如果是目录,则仅列出目录本身的属性而非目录内的文件名。
- -R:连同子目录的数据也一并列出。
使用chattr命令你个后,可以使用lsattr命令来查阅隐藏的属性。
3. 文件特殊权限:SUID、SGID、SBIT
1)SUID(Set User ID):
当 SUID 标记被设置在一个可执行文件上时,运行该文件的用户将临时具有该文件的所有者的权限。这意味着用户在执行该文件时将具有文件所有者的权限级别,而不是自己的权限级别。SUID 通常用于需要具有特定权限才能完成某些操作的程序,例如 passwd 命令,允许非管理员用户更改自己的密码。
2)SGID(Set Group ID):
当 SGID 标记被设置在一个可执行文件或目录上时,运行该文件或目录的用户将具有与文件或目录所属组相同的组权限。这意味着用户在执行该文件或访问该目录时将具有该组的权限级别,而不是自己所属组的权限级别。SGID 通常用于需要在特定组上执行操作的程序或目录。
3)SBIT(Sticky Bit):
当 SBIT 标记被设置在一个目录上时,只有目录的所有者、文件的所有者或 root 用户可以删除或重命名该目录中的文件。该特殊权限通常用于公共目录,以确保目录中的文件只能被其所有者修改或删除,而不会被其他用户干扰。
4. 使用文件访问控制列表
如果希望对某一个指定的用户进行单独的权限控制,就需要使用到文件的访问控制列表(ACL)了。通俗来说,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不会再继承其所在目录的ACL。
以下举一个很经典的例子:
切换成普通用户后,尝试加入root管理员的家目录。在没有针对普通用户对root管理员的家目录设置ACL之前,显示无权限:
下面使用文件ACL来解决这个问题:
1.使用setfacl命令
setfacl命令用于管理文件的ACL规则。
文件的ACL提供的是在所有者、所属组、其他用户的读/写/执行权限之外的特殊权限的控制。使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。
常用参数:
- 针对目录文件:-R
- 针对普通文件:-m
- 删除某个文件的ACL:-b
当使用ls命令查看文件权限时,最后的“.”变成了“+”,索命该文件已经设置了ACL。
2. 使用getfacl命令
用于显示文件上设置的ACL信息。