0%

Linux 存储术语和概念的介绍

前言

Linux 拥有强大的系统和工具来管理硬件设备,存储器管理自然不在话下。本文将从较高的层面上介绍,Linux 如何表示这些设备,以及如何将原始存储转换为服务器上的可用空间。

什么是块存储?

块存储是 Linux 内核调用块设备的一个别称。块设备是一种可用于存储数据的硬件,如传统的盘片旋转的硬盘驱动器(hard disk drive,HDD)、固态硬盘(solid state drive,SSD)、闪存记忆棒(flash memory stick)等。之所以叫块设备,是因为内核接口通过引用固定大小的块或空间块来使用硬件。

简单地说,块存储就是你所认为的计算机常规磁盘存储。设置完成后,它就扩展了当前的文件系统树,你可以无缝地写入或读取驱动器中的信息。

什么是磁盘分区?

磁盘分区是一种方法,这种方法将存储驱动器拆分成多个更小的可用单元。分区是存储驱动器的一部分,对其处理的方式与驱动器本身大致相同。

分区操作允许你分割驱动器的可用空间,并将每个分区用于不同目的。这为用户提供了很大的灵活性,让他们可以分别进行以下安装,轻松升级、多操作系统、交换空间或者专用文件系统。

虽然可以在不分区的情况下格式化和使用磁盘,但一些操作系统希望找到分区表,即使是磁盘只有一个分区。通常建议对新驱动器进行分区,以便在未来获得更大的灵活性。

MBR vs GPT

磁盘分区时,了解分区格式(format)非常重要。这通常归结为 MBR(Master Boot Record)和 GPT(GUID Partition Table)之间的选择。

MBR 是传统的分区系统,它已经被使用了 30 多年。使用至今,它有一些严重的局限性。例如,它不能被用于超过 2TB 的磁盘,并且最多只能有四个主分区。因此,第四分区通常被设置为“扩展分区”,在其中可再创建多个“逻辑分区”。这允许你细分“扩展分区”,以添加更多分区。

GPT 是一种更现代的分区方案,它试图解决 MBR 固有的一些问题。运行 GPT 的系统中,每个磁盘可以有更多的分区。分区的数量通常仅受操作系统本身的限制。此外,GPT 不存在磁盘大小限制,并且分区表信息存放在多个位置以防止损坏。GPT 还可为磁盘中仅能识别 MBR 的工具,编写一个“protective MBR”。

在大多数情况下,GPT 是更好的选择,除非操作系统或工具无法使用 GPT。

格式化和文件系统

虽然 Linux 内核可以识别原始磁盘,但不能直接使用它。要使用它,必须将其格式化。格式化是一个过程,这个过程将文件系统写入磁盘并为文件操作做好准备。文件系统是一个系统,这个系统构造数据并控制如何向底层磁盘写入和检索信息。如果没有文件系统,你无法将存储设备用于任何与文件相关的操作。

有许多不同的文件系统格式,每种格式都有许多不同维度的权衡,包括操作系统支持。基本上,它们都向用户显示磁盘的类似表示,但是,每种文件系统所支持的特性,以及用于启用用户和维护操作的机制,这些可能风格迥异。

一些比较流行的 Linux 文件系统是:

  • Ext4:最流行的默认文件系统是 Ext4,全称 the fourth version of the extended filesystem。Ext4 文件系统有以下特性,记录日志,向后兼容旧系统,非常稳定,并具有成熟的支持和工具。如果你没有特殊需求,它是一个很好的选择。
  • XFS:XFS 专注于性能和大数据文件。在处理大型文件和处理大型磁盘时,它可以快速格式化并具有良好吞吐量的特性。它还具有实时快照功能。XFS 使用元数据日志,而不是兼有元数据和数据的日志。这样可以实现快速性能,但在突然断电时,可能会导致数据损坏。
  • Btrfs:Btrfs 是一种现代的、功能丰富的写时复制(copy-on-write)文件系统。 该体系结构允许将一些卷管理功能集成到文件系统层中,包括快照、克隆、卷等。在处理完整磁盘时,Btrfs 仍会遇到一些问题。 关于它对生产工作负载的准备情况,存在争议,许多系统管理员正在等待文件系统更加成熟。
  • ZFS:ZFS是一个写时复制(copy-on-write)文件系统和卷管理器,它具有强大而成熟的功能集。它具有出色的数据完整性功能,可以处理大型文件系统,具有快照和克隆等典型卷功能,并且可以将卷组织成 RAID 和类似 RAID 的阵列,以实现冗余和性能目的。在 Linux 上的使用方面,由于许可问题,ZFS 有一段争议的历史。然而,Ubuntu 现在正在为它提供二进制内核模块,Debian 在其库中包含了它的源代码。其它发行版的支持尚未确定。

Linux如何管理存储设备

/dev 中的设备文件

在Linux中,几乎所有东西都用文件表示。这包括存储驱动器之类的硬件,它们在系统上表示为 /dev 目录中的文件。通常,表示存储设备的文件以 sdhd 开头,后跟一个字母。例如,服务器上的第一个驱动器通常类似于 /dev/sda

/dev 中,这些驱动器上的分区也有文件,通过将分区号附加到驱动器名称的末尾来表示。例如,前一个示例中驱动器上的第一个分区是 /dev/sda1

虽然 /dev/sd*/dev/hd* 设备文件代表了引用驱动器和分区的传统方式,但是在使用时存在明显的缺点。Linux 内核决定哪个设备在每次启动时获取哪个名称,因此当设备变动设备节点时,这可能会导致混乱。

要解决此问题,/dev/disk 目录中包含了子目录,这些子目录对应各种不同的、更持久的方法,来标识系统上的磁盘和分区。这些子目录中包含一些符号链接,这些符号链接是在引导时被创建的,以获得正确的 /dev/[sh]da* 文件。这些链接是根据其目录的标识特征命名的(例如,/dev/disk/by-partlabel 目录中用分区标签来命名)。这些链接始终指向正确的设备,因此它们可以用作存储空间的静态标识符。

/dev/disk 下可能有以下的部分或全部子目录:

  • by-label:大多数文件系统都有一个标记机制,该机制允许为磁盘或分区分配任意的、由用户指定的名称。此目录包含了一些链接,这些链接是以这些用户提供的标签来命名的。
  • by-uuid:UUID 或 universally unique identifier(通用唯一标识符)是一串冗长而唯一的、由字母和数字组成的字符串,它可用作存储资源的 ID。这些标识符通常不是人类可读的,但几乎保证是独特的,甚至可以跨系统。因此,在系统之间迁移,使用 UUID 引用存储可能是个好主意,因为命名冲突的可能性较小。
  • by-partlabelby-partuuid:GPT 表提供了它们自己的一组标签和 UUID,它们也可用于识别。其功能与前两个目录的功能大致相同,但仅限于使用 GPT 的标识符。
  • by-id:此目录包含了一些链接,这些链接是由硬件自己的序列号和它们所连接的其它硬件生成的。这并非完全持久,因为设备连接到系统的方式可能会更改其 by-id 名称。
  • by-path:与 by-id 类似,此目录依赖于存储设备与系统本身的连接。此处的链接是被构建的,构建中使用了系统的解释,这些解释是对用于访问设备的硬件。这与 by-id 具有相同的缺点,因为将设备连接到不同的端口可以改变该值。

通常,by-labelby-uuid 是持久识别特定设备的最佳选择。

注意

DigitalOcean 块存储卷负责报告给操作系统的设备序列号。这就允许 by-id 分类在该平台上可靠地持久化。这是引用 DigitalOcean 卷的首选方法,因为它既具有持久性,又可在首次引导时预测。

挂载块设备

/dev 中的设备文件用于与相关设备的内核驱动程序通信。但是,为了将设备视为可用空间的一部分,这就需要更有用的抽象。

在 Linux 和其它类 Unix 操作系统中,整个系统(无论涉及多少物理设备)都由单个统一的文件树来表示。因此,当要使用驱动器或分区上的文件系统时,必须将其挂接到现有树中。挂载就是这个过程,它将格式化的分区或驱动器附加到 Linux 文件系统中,并形成一个目录。然后就可以从该目录访问驱动器的内容。

驱动器几乎总是安装在专用的空目录上(安装在非空目录上意味着在卸载驱动器之前,目录的常用内容将无法访问)。可以设置许多不同的安装选项,来改变已安装设备的行为。例如,驱动器可以以只读模式安装,以确保其内容不会被更改。

Filesystem Hierarchy Standard(文件系统层次结构标准)建议使用 /mnt 或其下的子目录来临时挂载文件系统。如果这正合你意,这可能是安装它的最佳位置。标准中没有建议在何处挂载永久存储器,因此你可以选择你想要的任何方案。在许多情况下,/mnt/mnt 的子目录也用于永久存储器。

使用 /etc/fstab 永久安装

Linux 系统查看名为 /etc/fstab(filesystem table,文件系统表)的文件,以确定在引导过程中要挂载哪些文件系统。不会自动挂载此文件中没有条目的文件系统(例外情况是 systemd .mount 单元文件定义的那些,但目前这些文件并不常见)。

/etc/fstab 文件非常简单。每行代表一个应挂载的、各不相同的文件系统。行中指定块设备、将其附加到的挂载点、驱动器格式和挂载选项,以及一些其它信息。

更复杂的存储管理

虽然大多数简单的情况下不需要额外的管理结构,但更复杂的管理范例可以获得更高的性能、冗余或灵活性。

什么是 RAID?

RAID 代表 redundant array of independent disks(独立磁盘冗余阵列)。RAID 是一种存储管理和虚拟化技术,允许你将驱动器组合在一起,并将它们作为一个单元进行管理,并具有其它功能。

RAID 阵列的特性取决于其 RAID 级别,RAID 级别基本上定义了阵列中的磁盘如何相互关联。选择的级别会影响驱动器集合的性能和冗余。一些更常见的级别是:

  • RAID 0:此级别表示驱动器条带化。这意味着,当数据写入阵列时,数据将被拆分并分布在集合中的磁盘内。这可以提高性能,因为可以同时写入或读取多个磁盘。缺点是,单个驱动器故障可能会丢失整个阵列中的所有数据,因为没有一个磁盘包含足够信息,来重建内容。
  • RAID 1:RAID 1 基本上是驱动器镜像化。写入 RAID 1 阵列的任何内容都将写入多个磁盘。主要优点是数据冗余,假如在存储镜像的任何一侧丢失硬盘驱动器,它允许数据幸免于难。由于多个驱动器包含相同的数据,因此可用容量减半。
  • RAID 5:RAID 5 在多个驱动器上条带化数据,类似于 RAID 0。但是,此级别还实现了驱动器之间的分布式奇偶校验。这基本上意味着如果驱动器发生故障,其余驱动器可以使用它们之间共享的奇偶校验信息重建阵列。奇偶校验信息足以重建任何一个磁盘,这意味着阵列可以承受任何一个磁盘丢失。奇偶校验信息减少了阵列的可用空间,减少量为一个磁盘。
  • RAID 6:RAID 6 具有与 RAID 5 相同的属性,但提供双奇偶校验。这意味着 RAID 6 阵列可以承受任何两个驱动器的丢失。阵列的容量再次受奇偶校验量的影响,这意味着可用容量减少了两个磁盘空间。
  • RAID 10:RAID 10 是级别 1 和 0 的组合。首先,制作两组镜像阵列。然后,数据在它们之间进行条带化。这将创建一个具有一些冗余特性的阵列,同时提供良好的性能。然而,这需要相当多的驱动器,并且总容量是组合磁盘空间的一半。

什么是 LVM?

LVMLogical Volume Management(逻辑卷管理)是一个系统,它抽象底层存储设备的物理特性,以提供更高的灵活性和能力。LVM 允许你创建物理设备组,并将其作为一个单独的空间块进行管理。然后,你可以根据需要,将空间分段为逻辑卷,逻辑卷用作分区。

LVM 在常规分区之上实现,并且解决了传统分区固有的许多限制。例如,使用 LVM 卷,你可以轻松扩展分区、创建跨多个驱动器的分区、获取分区的实时快照以及将卷移动到不同的物理磁盘。LVM 可与 RAID 结合使用,以提供灵活的管理和传统的 RAID 性能特征。

接下来呢?

如果你希望在 Linux 系统中使用新的存储设备,这篇文章将指导你完成分区、格式化和挂载新文件系统的基本过程。对于大多数主要关注增加额外容量的情况,这应该足够了。要了解如何执行基本存储管理任务,请查看这篇文章

(END)

本文转译自互联网,原文链接在这里
我是 zZhiw,更多内容请关注