文件系统与目录

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
性能测试 PTS,5000VUM额度
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: 本文介绍了Linux文件系统的基本概念及其组成部分。文件系统是磁盘上的特定格式区域,用于保存和管理文件。常见的Linux文件系统有Ext3、Ext4和XFS,其中XFS是RHEL 7的默认文件系统,支持高达18EB的存储容量。文件系统通过inode记录文件的属性,如权限、所有者、大小和时间戳等。此外,文章还介绍了虚拟文件系统(VFS)的概念,以及Linux文件系统的目录结构和权限管理机制。通过`chmod`命令,可以使用数字表示法或文字表示法修改文件权限。

 一、文件系统

文件系统(File System)是磁盘上有特定格式的一片区域,操作系统利用文件系统保存和管理文件。

用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。

Linux系统支持数十种的文件系统,而最常见的文件系统如下所示。

(1)Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。

(2)Ext4:Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1 073 741 824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。

(3)XFS:是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统。它的优势在发生意外宕机后显得尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。它最大可支持的存储容量为18EB,这几乎满足了所有需求。

[root@rhel7-lzq-01 ~]# df -T
                              1K-         % 
/dev/sda2                      xfs      9754624  101720 9652904    2% /
devtmpfs                       devtmpfs  918820       0  918820    0% /dev
tmpfs                          tmpfs     933524       0  933524    0% /dev/shm
tmpfs                          tmpfs     933524   25648  907876    3% /run
tmpfs                          tmpfs     933524       0  933524    0% /sys/fs/cgroup
/dev/sda5                      xfs      7801856 3104784 4697072   40% /usr
/dev/sda3                      xfs      7801856   37976 7763880    1% /home
/dev/sda6                      xfs      7801856  172984 7628872    3% /var
/dev/sda1                      xfs       289444  159608  129836   56% /boot
/dev/mapper/rhel_rhel7--01-tmp xfs       975524   33068  942456    4% /tmp
tmpfs                          tmpfs     186708      36  186672    1% /run/user/0
/dev/sr0                       iso9660  3963760 3963760       0  100% /run/media/root/RHEL-7.4 Server.x86_64

image.gif

RHEL 7系统中一个比较大的变化就是使用了XFS作为文件系统,XFS文件系统可支持高达18EB的存储容量。

日常在硬盘需要保存的数据实在太多了,因此Linux系统中有一个名为super block的“硬盘地图”。Linux只是把每个文件的权限与属性记录在inode中,而且每个文件占用一个独立的inode表格。该表格的大小默认为128字节,里面记录着如下信息。

  • 该文件的访问权限(read、write、execute)。
  • 该文件的所有者与所属组(owner、group)。
  • 该文件的大小(size)。
  • 该文件的创建或内容修改时间(ctime)。
  • 该文件的最后一次访问时间(atime)。
  • 该文件的修改时间(mtime)。
  • 文件的特殊权限(SUID、SGID、SBIT)。
  • 该文件的真实数据地址(point)。

拓展知识:文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区的读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续八个sector组成一个block。

文件数据都储存在“块”中,那么很显然,我们还必须找到一个地方储存文件的“元信息”,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点“。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

[root@rhel7-lzq-01 ~]# xfs_info /dev/sda5
meta-data=/dev/sda5              isize=512    agcount=4, agsize=488256 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1953024, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

image.gif

dumpe2fs  /dev/sda1   # tune2fs和dumpe2fs只能打开ext3/ext4等文件类型

image.gif

文件的实际内容则保存在block块中(大小可以是1KB、2KB或4KB),一个inode的默认大小仅为128B(Ext3),记录一个block则消耗4B。当文件的inode被写满后,Linux系统会自动分配出一个block块,专门用于像inode那样记录其他block块的信息,这样把各个block块的内容串到一起,就能够让用户读到完整的文件内容了。

对于存储文件内容的block块,有下面两种常见情况(以4KB的block大小为例进行说明)。

  • 情况1:文件很小(1KB),但依然会占用一个block,因此会潜在地浪费3KB。
  • 情况2:文件很大(5KB),那么会占用两个block(5KB-4KB后剩下的1KB也要占用一个block)。
[root@rhel7-lzq-01 ~]# stat anaconda-ks.cfg
  "anaconda-ks.cfg"
  1704            8          IO 4096   
802h/2050d        Inode16816723    1
(0600/-rw-------)  Uid(    0/    root)   Gid(    0/    root)
system_u:object_r:admin_home_t:s0
访2024-09-09 19:16:17.438645964 +0800
2024-09-09 19:13:04.498062870 +0800
2024-09-09 19:13:04.498062870 +0800
-
[root@rhel7-lzq-01 ~]#

image.gif

[root@rhel7-lzq-01 ~]# ls -i
16816723 anaconda-ks.cfg        8405783    8405786   16816731   25167608 
16816729 initial-setup-ks.cfg       138        139   25167607   16816730 

image.gif

二、虚拟文件系统

计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。VFS的架构示意图如下。

image.gif 编辑

三、Linux文件系统目录结构

在Linux系统中,目录、字符设备、块设备、套接字、打印机等都被抽象成了文件:Linux系统中一切都是文件。想要找到一个文件,我们要依次进入该文件所在的磁盘分区(假设这里是D盘),然后在进入该分区下的具体目录,最终找到这个文件。

在Linux系统中并不存在C/D/E/F等盘符,Linux系统中的一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(Filesystem Aierarchy Standard,FHS)采用树形结构来存放文件,以及定义了常见目录的用途。

Linux系统中的文件和目录名称是严格区分大小写的。例如,root、rOOt、Root、rooT均代表不同的目录,并且文件名称中不得包含斜杠(/)。Linux系统中的文件存储结构如下图所示。

image.gif 编辑

在Linux系统中,最常见的目录以及所对应的存放内容如下表所示。

目录名称 应放置文件的内容
/ Linux文件的最上层根目录
/boot 开机所需文件—内核、开机菜单以及所需配置文件等
/dev 以文件形式存放任何设备与接口
/etc 配置文件
/home 用户家目录
/bin Binary的缩写,存放用户的可运行程序,如ls、cp等,也包含其他shell,如bash和cs等
目录名称 应放置文件的内容
/lib 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数
/sbin 开机过程中需要的命令
/media 用于挂载设备文件的目录
/opt 放置第三方的软件
/root 系统管理员的家目录
/srv 一些网络服务的数据文件目录
/tmp 任何人均可使用的“共享”临时目录
/proc 虚拟文件系统,如系统内核、进程、外部设备及网络状态等
/usr/local 用户自行安装的软件
/usr/sbin Linux系统开机时不会使用到的软件/命令/脚本
/usr/share 帮助与说明文件,也可放置共享文件
/var 主要存放经常变化的文件,如日志
/lost+found 当文件系统发生错误时,将一些丢失的文件片段存放在这里

四、Linux文件权限

文件是操作系统用来存储信息的基本结构,是一组信息的集合。文件通过文件名来唯一地标识。Linux中的文件名称最长可允许255个字符,这些字符可用A~Z、0~9、.、_、-等符号来表示。

与其他操作系统相比,Linux没有“扩展名”的概念,也就是说文件的名称和该文件的种类并没有直接的关联。它的另一个特性是Linux文件名区分大小写。

在Linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。通过设定权限可以从以下3种访问方式限制访问权限。

  • 只允许用户自己访问。
  • 允许一个预先指定的用户组中的用户访问。
  • 允许系统中的任何用户访问。

根据赋予权限的不同,3种不同的用户(所有者、用户组或其他用户)能够访问不同的目录或者文件。所有者是创建文件的用户,文件的所有者能够授予所在用户组的其他成员以及系统中除所属组之外的其他用户的文件访问权限。每一个用户针对系统中的所有文件都有它自身的读、写和执行权限。

  • 第一套权限控制访问自己的文件权限,即所有者权限。
  • 第二套权限控制用户组访问其中一个用户的文件的权限。
  • 第三套权限控制其他所有用户访问一个用户的文件的权限。

这三套权限赋予用户不同类型(即所有者、用户组和其他用户)的读、写及执行权限,就构成了一个有9种类型的权限组。

我们可以用“ls -l”或者ll命令显示文件的详细信息,其中包括权限。如下所示:

image.gif 编辑

文件属性示意图:

image.gif 编辑

文件各种属性信息:

每一行的第一个字符一般用来区分文件的类型,一般取值为d、-、l、b、c、s、p。具体含义如下。

d:表示是一个目录,在ext文件系统中目录也是一种特殊的文件。

-:表示该文件是一个普通的文件。

l: 表示该文件是一个符号链接文件,实际上它指向另一个文件。

b、c:分别表示该文件为区块设备或其他的外围设备,是特殊类型的文件。

s、p:这些文件关系到系统的数据结构和管道,通常很少见到。

五、使用数字表示法修改权限

通常在权限修改时可以用两种方式来表示权限类型:数字表示法和文字表示法。

chmod命令的格式是:

chmod 选项 文件

所谓数字表示法是指将读取(r)、写入(w)和执行(x)分别以数字4、2、1来表示,没有授予的部分就表示为0,然后再把所授予的权限相加而成。

以数字表示法修改权限的例子:

原 始 权 限 转换为数字 数字表示法
rwxrwxr-x (421) (421) (401) 775
rwxr-xr-x (421) (401) (401) 755
rw-rw-r-- (420) (420) (400) 664
rw-r--r-- (420) (400) (400) 644

1.文字表示法

使用权限的文字表示法时,系统用4种字母来表示不同的用户。

u:user,表示所有者。

g:group,表示属组。

o:others,表示其他用户。

a:all,表示以上3种用户。

使用下面3种字符的组合表示法设置操作权限。

r:read,可读。

w:write,写入。

x:execute,执行。

操作符号包括以下几种。

+:添加某种权限。

-:减去某种权限。

=:赋予给定权限并取消原来的权限。

例子:

[root@RHEL7-1 ~]# chmod u=rw,g=rw,o=r /etc/file

image.gif

小小案例,带你飞一下~!

假如我们要“设定”一个文件filesystem.text(没有的话可以自己创建文件)的权限为-rwxr-xr-x时,所表述的含义如下。

user (u):具有可读、可写、可执行的权限。

group与others (g/o):具有可读与执行的权限。

执行结果如下:

[root@rhel7-lzq-01 opt]# touch filesystem.text
[root@rhel7-lzq-01 opt]# ll
 8
-rw-r--r--. 1 root root    0 10 28 10:46 filesystem.text
drwxr-xr-x. 2 root root   19 9  20 14:28 linux01
drwxr-xr-x. 2 root root    6 3   9 2015 rh
-rw-r--r--. 1 root root   15 10  8 13:26 shuqing.log
-rw-r--r--. 1 root root 2053 10  8 13:28 tmp.log
[root@rhel7-lzq-01 opt]# chmod u=rwx,go=rx filesystem.text
[root@rhel7-lzq-01 opt]# ls -al filesystem.text
-rwxr-xr-x. 1 root root 0 10 28 10:46 filesystem.text

image.gif

假如设置-rwxr-xr--这样的权限又该如何操作呢?可以使用“chmod u=rwx, g=rx,o=r filename”来设定。此外,如果不知道原先的文件属性,而想增加filesystem.text文件的所有人均有写入的权限,那么可以使用如下命令:

[root@rhel7-lzq-01 opt]# ls -al filesystem.text
-rwxr-xr-x. 1 root root 0 10 28 10:46 filesystem.text
[root@rhel7-lzq-01 opt]# chmod a+w filesystem.text
[root@rhel7-lzq-01 opt]# ls -al filesystem.text
-rwxrwxrwx. 1 root root 0 10 28 10:46 filesystem.text
[root@rhel7-lzq-01 opt]#

image.gif

如果要将权限去掉而不改动其他已存在的权限呢?例如,要去掉所有人的可执行权限,则可以使用如下命令:

[root@rhel7-lzq-01 opt]# ls -al filesystem.text
-rwxrwxrwx. 1 root root 0 10 28 10:46 filesystem.text
[root@rhel7-lzq-01 opt]# chmod a-x filesystem.text
[root@rhel7-lzq-01 opt]# ls -al filesystem.text
-rw-rw-rw-. 1 root root 0 10 28 10:46 filesystem.text
[root@rhel7-lzq-01 opt]#

image.gif


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
存储 负载均衡 算法
p2p的文件系统
p2p的文件系统
138 4
|
6天前
|
存储 Unix PHP
31 文件系统
路老师分享PHP文件处理技术,涵盖文件的打开、关闭、读取及写入操作,帮助初学者深入了解PHP语言。
17 2
|
存储 缓存 算法
文件系统(上)
文件系统(上)
183 0
|
存储 Linux Windows
【文件系统】
【文件系统】
99 0
Linux文件系统(四)文件系统管理命令
Linux文件系统(四)文件系统管理命令
|
IDE Unix Linux
linux中的tar打包、压缩多个文件、磁盘查看和分区类、du查看文件和目录占用的磁盘空间、df查看磁盘空间使用情况、lsblk查看设备挂载情况、fdisk分区、mount/umount挂载/卸载、设置开机自动挂载
tar [选项] XXX.tar.gz 将要打包进去的内容 (功能描述:打包目录,压缩后的 文件格式.tar.gz)du 目录/文件 (功能描述:显示目录下每个子目录的磁盘使用情况)du: disk usage 磁盘占用情况。详细的请看我之前发的博客。linux常用命令下。linux常用命令中。linux常用命令上。...............对于Linux用户来讲,不论有几个分区,分别分给哪一个目录使用,它总归就是一个根 目录、一个独立且唯一的文件结构。Linux中每个分区都是用来组成整个文件系统的一部分,它在用一种叫做“挂载”的处理 方法,它整个文件系统中包含了一整套的文件和目录,并将一
417 1
linux中的tar打包、压缩多个文件、磁盘查看和分区类、du查看文件和目录占用的磁盘空间、df查看磁盘空间使用情况、lsblk查看设备挂载情况、fdisk分区、mount/umount挂载/卸载、设置开机自动挂载
|
程序员 Linux 芯片
fat文件系统查找、删除、创建目录
fat文件系统查找、删除、创建目录
404 0
|
Linux 网络安全 数据安全/隐私保护
使用SSHFS文件系统远程挂载目录
使用SSHFS文件系统远程挂载目录
使用SSHFS文件系统远程挂载目录