Linux中的存储术语和概念介绍
介绍
Linux 拥有强大的系统和工具来管理硬件设备,包括存储驱动器。 在本文中,我们将概括介绍 Linux 如何表示这些设备以及如何将原始存储转换为服务器上的可用空间。
什么是块存储?
块存储是 Linux 内核称为块设备的另一个名称。 块设备 是一种可用于存储数据的硬件,如传统的旋转硬盘驱动器 (HDD)、固态驱动器 (SSD)、闪存棒等。 它被称为块设备,因为内核通过引用固定大小的块或空间块与硬件接口。
所以基本上,块存储就是您认为的计算机上的常规磁盘存储。 设置完成后,它基本上充当当前文件系统树的扩展,您可以无缝地写入驱动器或从驱动器读取信息。
什么是磁盘分区?
磁盘分区是一种将存储驱动器分成更小的可用单元的方法。 分区是存储驱动器的一部分,其处理方式与驱动器本身的处理方式大致相同。
分区允许您对可用空间进行分段并将每个分区用于不同的目的。 这为用户提供了很大的灵活性,允许他们对安装进行分段,以便于升级、多个操作系统、交换空间或专用文件系统。
虽然磁盘可以在没有分区的情况下格式化和使用,但一些操作系统希望找到一个分区表,即使只有一个分区写入磁盘。 通常建议对新驱动器进行分区以获得更大的灵活性。
MBR 与 GPT
对磁盘进行分区时,重要的是要知道将使用什么分区 格式 。 这通常归结为 MBR(主引导记录)和 GPT(GUID 分区表)之间的选择。
MBR是传统的分区系统,已经使用了30多年。 由于它的年龄,它有一些严重的局限性。 例如,它不能用于大小超过 2TB 的磁盘,并且最多只能有四个主分区。 因此,第四个分区通常被设置为“扩展分区”,其中可以创建“逻辑分区”。 这允许您细分最后一个分区以有效地允许额外的分区。
GPT 是一种更现代的分区方案,它试图解决 MBR 固有的一些问题。 运行 GPT 的系统每个磁盘可以有更多的分区。 这通常仅受操作系统本身施加的限制的限制。 此外,GPT 不存在磁盘大小限制,分区表信息可用于多个位置以防止损坏。 GPT 还可以编写一个“保护性 MBR”,告诉 MBR-only 工具该磁盘正在被使用。
在大多数情况下,GPT 是更好的选择,除非您的操作系统或工具阻止您使用它。
格式化和文件系统
虽然 Linux 内核可以识别原始磁盘,但驱动器不能按原样使用。 要使用它,必须对其进行格式化。 格式化是将文件系统写入磁盘并为文件操作做准备的过程。 文件系统 是结构化数据并控制信息如何写入和从底层磁盘检索的系统。 如果没有文件系统,您将无法使用存储设备进行任何与文件相关的操作。
有许多不同的文件系统格式,每种格式都有许多不同维度的权衡,包括操作系统支持。 在基本层面上,它们都向用户提供了类似的磁盘表示,但每个支持的功能以及用于启用用户和维护操作的机制可能非常不同。
一些比较流行的 Linux 文件系统是:
- Ext4:最流行的默认文件系统是 Ext4,或扩展文件系统的第四个版本。 Ext4 文件系统是日志文件系统,向后兼容遗留系统,非常稳定,并且拥有成熟的支持和工具。 如果您没有特殊需求,这是一个不错的选择。
- XFS:XFS 专注于性能和大型数据文件。 在处理大文件和使用大磁盘时,它可以快速格式化并具有良好的吞吐量特性。 它还具有实时快照功能。 XFS 使用元数据日志,而不是同时记录元数据和数据。 这会带来快速的性能,但在突然断电的情况下可能会导致数据损坏。
- Btrfs:Btrfs 是现代的、功能丰富的写时复制文件系统。 这种架构允许在文件系统层中集成一些卷管理功能,包括快照、克隆、卷等。 Btrfs 在处理满磁盘时仍然会遇到一些问题。 关于它是否适合生产工作负载存在一些争论,许多系统管理员正在等待文件系统达到更高的成熟度。
- ZFS:ZFS 是一种写时复制文件系统和卷管理器,具有强大而成熟的功能集。 它具有出色的数据完整性功能,可以处理大型文件系统,具有典型的卷功能,如快照和克隆,并且可以将卷组织成 RAID 和类似 RAID 的阵列以实现冗余和性能目的。 在 Linux 上的使用方面,由于许可问题,ZFS 有一段有争议的历史。 然而,Ubuntu 现在为其提供了一个二进制内核模块,而 Debian 将源代码包含在其存储库中。 其他发行版的支持尚未确定。
Linux 如何管理存储设备
/dev 中的设备文件
在 Linux 中,几乎所有内容都由文件表示。 这包括存储驱动器等硬件,它们在系统上表示为 /dev
目录中的文件。 通常,代表存储设备的文件以 sd
或 hd
开头,后跟一个字母。 例如,服务器上的第一个驱动器通常类似于 /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 或通用唯一标识符,是一长串唯一的字母和数字,可用作存储资源的 ID。 这些通常不是人类可读的,但几乎可以保证是唯一的,即使跨系统也是如此。 因此,使用 UUID 来引用可能在系统之间迁移的存储可能是一个好主意,因为命名冲突的可能性较小。by-partlabel
和by-partuuid
:GPT 表提供自己的一组标签和 UUID,也可用于标识。 这与前两个目录的功能大致相同,但使用 GPT 特定的标识符。by-id
:此目录包含由硬件自己的序列号和它们所连接的硬件生成的链接。 这并不完全持久,因为设备连接到系统的方式可能会更改其by-id
名称。by-path
:和by-id
一样,这个目录依赖于存储设备与系统本身的连接。 此处的链接是使用系统对用于访问设备的硬件的解释构建的。 这与by-id
具有相同的缺点,因为将设备连接到不同的端口可以更改此值。
通常,by-label
或 by-uuid
是持久识别特定设备的最佳选择。
笔记
DigitalOcean 块存储卷控制向操作系统报告的设备序列号。 这允许 by-id
分类在此平台上可靠地持久化。 这是引用 DigitalOcean 卷的首选方法,因为它是持久的,并且在首次启动时可预测。
安装块设备
/dev
中的设备文件用于与相关设备的内核驱动程序进行通信。 然而,为了将设备视为可用空间的一部分,需要进行更有用的抽象。
在 Linux 和其他类 Unix 操作系统中,整个系统,无论涉及多少物理设备,都由一个统一的文件树表示。 因此,当要使用驱动器或分区上的文件系统时,必须将其挂接到现有树中。 Mounting 是将格式化的分区或驱动器附加到 Linux 文件系统中的目录的过程。 然后可以从该目录访问驱动器的内容。
驱动器几乎总是安装在专用的空目录上(安装在非空目录上意味着在卸载驱动器之前无法访问该目录的通常内容)。 可以设置许多不同的安装选项来改变已安装设备的行为。 例如,可以以只读模式安装驱动器,以确保其内容不会被更改。
Filesystem Hierarchy Standard 建议使用 /mnt
或其下的子目录来临时挂载文件系统。 如果这与您的用例匹配,这可能是安装它的最佳位置。 它没有建议在何处安装更多永久存储,因此您可以选择您喜欢的任何方案。 在许多情况下,/mnt
或 /mnt
子目录也用于更永久的存储。
使用 /etc/fstab 使挂载永久化
Linux 系统查看一个名为 /etc/fstab
(文件系统表)的文件,以确定在引导过程中要挂载哪些文件系统。 在该文件中没有条目的文件系统将不会被自动挂载(由 systemd .mount
单元文件定义的文件系统除外,尽管目前这些并不常见)。
/etc/fstab
文件相当简单。 每行代表一个应该挂载的不同文件系统。 此行指定块设备、将其附加到的挂载点、驱动器的格式、挂载选项以及一些其他信息。
更复杂的存储管理
虽然大多数简单的用例不需要额外的管理结构,但更复杂的管理范式可以获得更高的性能、冗余或灵活性。
什么是 RAID?
RAID 代表 r 冗余 a 阵列的 i 独立 disks。 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 阵列可以承受任何 2 个驱动器的丢失。 阵列的容量再次受到奇偶校验量的影响,这意味着可用容量减少了两个磁盘的空间。
- RAID 10:RAID 10 是级别 1 和 0 的组合。 首先,制作两组镜像阵列。 然后,数据在它们之间进行条带化。 这将创建一个阵列,该阵列具有一些冗余特性,同时提供良好的性能。 然而,这需要相当多的驱动器,总容量是组合磁盘空间的一半。
什么是 LVM?
LVM 或 L 逻辑 Volume M 管理系统是一种抽象底层存储设备的物理特性以提供更高灵活性和功能的系统。 LVM 允许您创建物理设备组并像管理单个空间块一样对其进行管理。 然后,您可以根据需要将空间分段为逻辑卷,这些逻辑卷用作分区。
LVM 是在常规分区之上实现的,并且可以解决经典分区固有的许多限制。 例如,使用 LVM 卷,您可以轻松扩展分区、创建跨多个驱动器的分区、获取分区的实时快照以及将卷移动到不同的物理磁盘。 LVM 可以与 RAID 结合使用,以提供具有传统 RAID 性能特征的灵活管理。
下一步要去哪里?
如果您希望在 Linux 系统中使用新的存储设备,这篇文章 将指导您完成分区、格式化和挂载新文件系统的基本过程。 对于您主要关注添加额外容量的大多数用例,这应该足够了。 要了解如何执行基本的存储管理任务,请查看 这篇文章 。