前言
何为文件系统?
文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
1. Linux下文件系统的层次结构
在Linux系统下我们首先执行以下命令并查看输出:
ls -l /
对于Linux软件开发人员肯定已经非常熟悉Linux系统的目录结构。文件系统可以根据它们的结构而变化,但在大多数情况下,它们应该符合文件系统层次标准。执行ls -l /
命令查看根目录下列出的目录,你的目录可能与我的目录有些许的不同,但目录应该大致如下所示:
我们来看一下各个目录都是做什么用的:
/ -根目录,整个文件系统层次结构的根目录,所有内容都位于此目录下。 /bin -存放基本的可执行的程序(二进制文件),包括基本的命令,如ls和cp。 /boot -包含内核引导加载程序文件。 /cdrom -光盘安装点 /dev -存放设备文件。 /etc -核心系统配置目录,应该只保存配置文件。 /home -用户的主目录,保存你的文档,文件,设置等。 /lib、/lib32、/lib64、/libx32 -主要目的是存放特定的库,这些库是在/bin和/sbin目录里的工具所需要的库,/lib中的库可以是32位或64位 /lost+found -这个目录一般情况下是空的,当系统非法关机后,如果你丢失了一些文件,在这里能找回来,通常很少用到此目录 /media -用作可移动媒体的连接点,如USB驱动器。 /mnt -临时挂载的文件系统。 /opt -可选应用软件包。 /proc -当前运行进程的信息。 /root -root用户的主目录。 /run -自上次引导以来运行系统的信息。 /sbin -包含基本的系统二进制文件,通常只能由root用户运行。 /srv -系统提供的特定于站点的数据。 /tmp -临时文件的存储 /usr -通常它不包含主文件夹意义上的用户文件。这意味着用户安装的软件和实用程序,但这并不是说你不能在那里添加个人目录。在这个目录中有/usr/bin、/usr/local等子目录。 /var -变量目录,用于系统日志记录、用户跟踪、缓存等。
2. 文件系统类型
文件系统分很多种类,有许多不同的文件系统实现可用。有些比其他的更快,有些支持更大容量的存储,而另一些只能在更小容量的存储上工作。不同的文件系统有不同的组织数据的方式。由于有很多不同的实现,应用程序需要一种方法来处理不同的操作。因此,有一种东西叫做虚拟文件系统抽象层。它是应用程序和不同文件系统类型之间的一层,因此无论拥有什么文件系统,你的应用程序都能够使用它。
你的磁盘上可以有许多文件系统,这取决于它们是如何分区的。
Linux系统中日志记录
在大多数文件系统类型上,日志记录是默认的,但是为了以防万一,你应该知道它是做什么的。假设你正在复制一个大文件,突然断电。如果你使用的是一个没有日志记录的文件系统,那么文件终会损坏,你的文件系统也会不一致,然后当你重新启动时,系统将执行文件系统检查以确保一切正常。但是,修复可能需要一段时间,这取决于你的文件系统有多大。
现在,如果你使用的是带日志记录的系统,在你的机器开始复制文件之前,它会将你将要做的事情写入日志文件。当你实际复制文件时,一旦它完成,日志将该任务标记为完成。因此,文件系统总是处于一致的状态,因此,如果你的机器突然关闭,它将确切地知道你停止的位置。这也减少了引导时间,因为它不检查整个文件系统,只查看日志。
常见桌面文件系统类型
ext4:这是本地Linux文件系统的新版本。它与旧的ext2和ext3版本兼容。它支持高达10亿字节的磁盘卷和高达16TB甚至更多的文件大小。它是Linux文件系统的标准选择。 Btrfs:“Better or Butter FS”,它是一种新的Linux文件系统,提供快照、增量备份、性能提升等功能。它是广泛可用的,但还不太稳定和兼容。 XFS:高性能日志文件系统,非常适合具有大文件的系统,例如媒体服务器。 NTFS和FAT:Windows文件系统 HFS+:苹果系统的文件系统
查看以下Ubuntu系统上的文件系统:
3. Linux下磁盘的分区
硬盘可以细分为多个分区,本质上就是多个块设备。回想一下这样的例子,/dev/sda1和/dev/sda2, /dev/sda是整个磁盘,但是/dev/sda1是磁盘上的个分区。分区对于分离数据非常有用,如果你需要某个文件系统,可以轻松地创建一个分区,而不是将整个磁盘设置为一种文件系统类型。
分区表每个磁盘都有一个分区表,这个表告诉系统磁盘是如何分区的。该表告诉你分区的开始和结束位置,哪些分区是可引导的,磁盘的哪些扇区分配给哪些分区等等。有两种主要的分区表方案,主引导记录(MBR)和GUID分区表(GPT)。
分区磁盘由帮助我们组织数据的分区组成。你可以在一个磁盘上有多个分区,它们不能相互重叠。如果有未分配给分区的空间,则称为空闲空间。分区的类型取决于你的分区表。在一个分区中,你可以拥有一个文件系统,也可以将一个分区专用于其他功能,如交换分区。
MBR
传统的分区表,被用作标准 可以有主分区、扩展分区和逻辑分区 MBR有四个主分区的限制 通过将一个主分区划分为一个扩展分区(一个磁盘上只能有一个扩展分区),可以创建额外的分区。然后在扩展分区中添加逻辑分区。逻辑分区的使用就像任何其他分区一样。 支持大2TB的磁盘
GPT
GUID分区表(GPT)正在成为磁盘分区的新标准 只有一种类型的隔断,你可以做很多 每个分区都有一个全局ID (GUID) 主要用于基于UEFI的引导
文件系统结构
文件系统是文件和目录的有组织的集合。在其简单的形式中,它由一个管理文件的数据库和实际文件本身组成。
引导块:它位于文件系统的前几个扇区中,文件系统并没有真正使用它。相反,它包含用于引导操作系统的信息。操作系统只需要一个引导块。如果你有多个分区,它们将有引导块,但其中许多是未使用的。 超级块:这是在引导块之后的单个块,它包含关于文件系统的信息,例如inode表的大小、逻辑块的大小和文件系统的大小。 索引表:把它看作是管理文件的数据库。每个文件或目录在索引表中都有一个的条目,并且包含关于该文件的各种信息。 数据块:这是文件和目录的实际数据。
让我们看一下不同的分区表。下面是一个使用MBR分区表(msdos)的分区示例。你可以看到系统上的主分区、扩展分区和逻辑分区。
磁盘分区
如果我们需要对磁盘进行分区。有很多工具可以做到这一点:
fdisk 基本的命令行分区工具,不支持GPT parted 这是一个命令行工具,支持MBR和GPT分区 gparted 这是parted的GUI版本 gdisk fdisk但不支持MBR,只支持GPT 我们用parted来划分。假设我连接了USB设备,我们看到设备名称是/dev/sdb2.
4. 创建文件系统
你可以创建一个文件系统:
sudo mkfs -t ext4 /dev/sdb2
就这么简单!mkfs(制作文件系统)工具允许我们指定我们想要的文件系统类型和位置。你只希望在新分区的磁盘上创建文件系统,或者在对旧磁盘重新分区时创建文件系统。如果你试图在现有文件系统之上创建一个文件系统,那么很可能会使你的文件系统处于损坏状态。
5. mount and umount
在你可以查看文件系统的内容之前,你必须挂载它。要做到这一点,我需要设备位置、文件系统类型和挂载点,挂载点是系统上文件系统将要附加的目录。我们要把设备挂载到一个挂载点。
首先创建挂载点,然后进行挂载:
mkdir /myTest
sudo mount -t ext4 /dev/sdb2 /myTest
就这么简单!现在当我们转到/myTest目录时,我们可以看到文件系统的内容,-t指定文件系统的类型,然后是设备位置,然后是挂载点。
从挂载点卸载设备:
sudo umount /myTest
或者
sudo umount /dev/sdb2
请记住,内核按照找到设备的顺序命名设备。如果我们的设备名称在我们挂载它之后因为某种原因改变了怎么办? 你可以使用设备的通用ID (UUID)而不是名称。
查询系统中块设备的uuid:
我们可以看到我们的设备名称、它们对应的文件系统类型和它们的uuid。现在,当我们想要挂载某个设备时,我们可以使用:
sudo mount UUID=59c03b23-fd61-4bfc-b9fa-570edf47a0b9 /myTest
大多数情况下,你不需要通过设备的uuid来挂载设备,使用设备名称要容易得多,而且通常情况下,操作系统知道挂载常见的设备,如USB驱动器。如果你需要在启动时自动挂载文件系统,就像你添加了一个辅助硬盘驱动器一样,可能会使用UUID。
6. /etc/fstab
当我们想在系统启动时自动挂载文件系统,我们可以将它们添加到文件系统表的缩写文件/etc/fstab
中。该文件包含已挂载的文件系统的列表。
每一行代表一个文件系统,字段是:
UUID -设备标识 挂载点 -文件系统挂载到的目录 文件系统类型 选项 -其他挂载选项 转储 -由转储实用程序用来决定何时进行备份,默认为0 Pass -用来决定应该检查文件系统的顺序,如果值为0,则不检查
要添加一个条目,只需使用上面的条目语法直接修改/etc/fstab文件。修改这个文件时要小心,如果搞砸了,可能会给带来一些麻烦
其中swap
属于交换分区,这个交换分区是什么?交换是我们用来给系统分配虚拟内存的。如果内存不足,系统会使用这个分区将空闲进程的内存“交换”到磁盘,这样就不会陷入内存困境。
使用分区作为交换空间假设我们希望将/dev/sdb2分区设置为交换空间。
首先确保我们没有任何东西在分区上 执行命令 mkswap /dev/sdb2
初始化交换区运行 swapon /dev/sdb2
将启用交换设备如果你希望交换分区在启动时保持不变,你需要在/etc/fstab文件中添加一个条目。w是使用的文件系统类型。 删除交换模块: swapoff /dev/sdb2
通常应该分配大约两倍于内存的交换空间。但是现在系统通常已经足够强大并且有足够的内存。
7. 磁盘使用情况
你可以使用一些工具来查看磁盘的利用率:
df
命令显示当前挂载的文件系统的利用率。-h
标志提供了一种可读的格式。你可以看到设备是什么,以及有多少容量被使用和可用。
假设你的磁盘快要满了,你想知道哪些文件或目录占用了这些空间,你可以使用du
命令。
du -h
8. 文件系统修复
有时我们的文件系统并不总是处于佳状态,如果我们突然关闭系统,我们的数据可能会损坏。这取决于系统是否试图让我们回到工作状态。
fsck
(文件系统检查)命令用于检查文件系统的一致性,甚至可以尝试为我们修复它。通常,当你启动磁盘时,fsck将在磁盘挂载之前运行,以确保一切正常。但有时磁盘非常糟糕,需要手动执行此操作。但是,一定要在你处于修复磁盘或可以在不挂载的情况下访问文件系统的地方执行此操作。
sudo fsck /dev/sdb1
9. 索引节点
还记得我们的文件系统是如何由实际文件和管理这些文件的数据库组成的吗?该数据库称为索引节点表。
什么是索引节点?索引节点(inode)是该表中的一个条目,每个文件都有一个索引节点。它描述了关于文件的所有内容,例如:
文件类型-常规文件,目录,字符设备等 拥有者 拥有组 访问权限 时间戳- mtime(后一次修改文件的时间),ctime(后一次修改属性的时间),atime(后一次访问的时间) 文件的硬链接数 文件大小 分配给文件的块数 指向文件数据块的指针 基本上索引节点存储了关于文件的所有内容,除了文件名和文件本身
什么时候创建索引节点?创建文件系统时,也会为索引分配空间。有一些算法可以根据磁盘容量等确定需要多少索引节点空间。你可能在某些时候看到过磁盘空间不足的错误问题。同样的情况也会发生在索引节点上,你可能会耗尽索引节点,因此无法创建更多的文件
索引节点信息索引节点是由数字标识的,当一个文件被创建时,它被分配一个索引号,这个编号是按顺序分配的。然而,有时你可能会注意到,当你创建一个新文件时,它得到的索引号比其他文件低,这是因为一旦索引被删除,它们就可以被其他文件重用。查看索引编号执行ls -li
命令:
你还可以使用stat
查看有关文件的详细信息,它还会告诉你有关索引节点的信息。
10. 符号链接
在Windows操作系统中,有一种叫做快捷键的东西,快捷键只是其他文件的别名。如果对原始文件做了一些操作,可能会破坏快捷方式。在Linux中,等同于快捷方式的是符号链接
(或软链接或符号链接)。symlinks允许我们通过文件名链接到另一个文件。Linux中的另一种类型的链接是硬链接
,它们实际上是另一个指向索引节点的链接文件。
可以看到,我创建了一个名为myFile1Link的符号链接,指向myFile1。符号链接用->
表示。注意我是如何获得一个新的节点号的,符号链接只是指向文件名的文件。当你修改符号链接时,文件也会被修改。节点号对于文件系统是的,你不能在一个文件系统中有两个相同的节点号,这意味着你不能通过节点号在不同的文件系统中引用文件。但是,如果你使用符号链接,它们不使用节点号,而是使用文件名,因此可以跨不同的文件系统引用它们。
硬链接
硬链接只是创建另一个文件,该文件具有到同一节点的链接。因此,如果我修改了myFile2或myFile2link的内容,两者都将看到更改,但如果我删除了myFile2,则仍然可以通过myFile2link访问该文件。这就是ls命令中的链接计数发挥作用的地方。链接数是一个节点拥有的硬链接的数量,当你删除一个文件时,它会减少链接数。只有当节点的所有硬链接都被删除时,节点才会被删除。当你创建一个文件时,它的链接计数是1,因为它是指向该节点的文件。与符号链接不同,硬链接不跨文件系统,因为索引节点对于文件系统是的。
小结
好了,这次就总结到这里吧。本文我们总结了Linux系统下文件系统相关的常用且重要的知识点,希望对小伙伴们有所帮助!喜欢的小伙伴记得
点赞👍、分享📃、再看☕
,你的每一个动作都是对作者的大支持!