Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 储存管理指南 / 文件系统与装入 / Linux 中的文件系统的概述
Applies to SUSE Linux Enterprise Server 15 SP2

1 Linux 中的文件系统的概述

SUSE Linux Enterprise Server 随附了不同的文件系统供您选择,包括 Btrfs、Ext4、Ext3、Ext2 和 XFS。每个文件系统都有各自的优点和缺点。有关 SUSE Linux Enterprise Server 中主要文件系统的并排功能比较,请参见 https://www.suse.com/releasenotes/x86_64/SUSE-SLES/15-SP2/#allArch-filesystems(文件系统支持和大小)。本章概述了这些文件系统的工作原理以及它们的优点。

在 SUSE Linux Enterprise 12 中,Btrfs 是操作系统的默认文件系统,XFS 是所有其他使用案例的默认文件系统。此外,SUSE 仍继续支持 Ext 系列的文件系统以及 OCFS2。根据默认设置,Btrfs 文件系统将设置为使用子卷。对于使用 snapper 基础结构的根文件系统,将会自动启用快照。有关 snapper 的详细信息,请参见第 7 章 “通过 Snapper 进行系统恢复和快照管理

专业的高性能设置可能需要高可用性的储存系统。为符合高性能群集案例的要求,SUSE Linux Enterprise Server 在 High Availability Extension 附加产品中加入了 OCFS2(Oracle Cluster File System 2) 与 Distributed Replicated Block Device (DRBD)。本指南中不涉及这些高级储存系统的内容。有关信息,请参见 《SUSE Linux Enterprise High Availability Extension 管理指南》

记住一点很重要:没有任何一种文件系统适合所有种类的应用。每个文件系统都有各自的特定优点和缺点,必须将这些因素考虑在内。此外,即使是最复杂的文件系统也不能替代合理的备份策略。

本节中使用的术语数据完整性数据一致性并不是指用户空间数据(您的应用程序写入其文件的数据)的一致性。此数据是否一致必须由应用程序本身控制。

除非本节特别指明,否则设置或更改分区以及文件系统所需的一切步骤,都可以使用 YaST 分区程序(强烈推荐使用)来执行。有关信息,请参见第 10 章 “专家分区程序

1.1 术语

元数据

文件系统内部的一种数据结构。它可确保磁盘上的所有数据都有条不紊,并且可供访问。。几乎每一种文件系统都有自己的元数据结构,这也是文件系统展现出不同性能特性的原因所在。维护元数据的完整性非常重要,因为如果不这样,则可能无法访问文件系统中的所有数据。

inode

文件系统的数据结构包含文件的各种信息,包括大小、链接数量、实际储存文件内容的磁盘块的指针、创建、修改和访问的日期与时间。

日记

在提及文件系统时,日记是包含某种日志的磁盘上结构,文件系统将要对文件系统的元数据进行的更改储存在此日志中。日记可大大降低文件系统的恢复时间,因为有了它就不需要在系统启动时执行文件系统全面检查这一冗长的搜索程序。而只是重放日记。

1.2 Btrfs

Brtfs 是由 Chris Mason 开发的一种写时复制 (COW) 文件系统。它基于 Ohad Rodeh 开发的适用于 COW 的 B 树。Btrfs 是日志记录样式的文件系统。它不记录块更改,而是将块更改写入新位置,然后链接上更改。新更改在上一次写后才提交。

1.2.1 主要特征

Btrfs 提供容错、修复和易于管理的功能,比如:

  • 可写快照,允许应用更新后按需轻松回滚系统或允许备份文件。

  • 子卷支持:Btrfs 会在为其指派的空间池中创建默认子卷。它允许您在相同空间池中创建更多的子卷,作为不同的文件系统。子卷的数目仅受分配给池的空间所限。

  • Btrfs 命令行工具中提供了在线检查和修复功能 scrub。它会在假设树状结构没有问题的前提下,验证数据和元数据的完整性。您可以在安装的文件系统上定期运行 scrub;正常操作期间,它将在后台运行。

  • 不同 RAID 级别,适用于元数据和用户数据。

  • 用于元数据和用户数据的不同校验和,可改进错误检测。

  • 与 Linux 逻辑卷管理器 (LVM) 储存对象集成。

  • SUSE Linux Enterprise Server 上的 YaST 分区程序及 AutoYaST 整合。这还包括在多个设备 (MD) 和设备映射程序 (DM) 储存配置上创建 Btrfs 文件系统。

  • 从现有的 Ext2、Ext3 以及 Ext4 文件系统进行脱机迁移。

  • /boot 的引导加载程序支持,允许从 Btrfs 分区引导。

  • SUSE Linux Enterprise Server }15 SP2 中的 RAID0、RAID1 和 RAID10 配置文件支持多卷 Btrfs。更高的 RAID 级别尚不受支持,但安装将来发布的服务包后可能会支持。

  • 使用 Btrfs 命令设置透明压缩。

1.2.2 SUSE Linux Enterprise Server 上的根文件系统设置

SUSE Linux Enterprise Server 默认设置为对根分区使用 Btrfs 和快照。快照可让您在应用更新之后有需要时轻松地回滚系统,也可让您备份文件。快照可通过 SUSE Snapper 基础结构轻松管理,如第 7 章 “通过 Snapper 进行系统恢复和快照管理所述。有关 SUSE Snapper 项目的一般信息,请参见 OpenSUSE.org (http://snapper.io) 上的 Snapper 门户网站 Wiki。

使用快照回滚系统时,必须确保在回滚期间,数据(例如用户的主目录、Web 和 FTP 服务器内容或日志文件)不会遗失或被重写。这一点通过使用根文件系统上的 Btrfs 子卷实现。子卷可从快照中排除。安装期间,根据 YaST 建议,SUSE Linux Enterprise Server 上的默认根文件系统设置包含下列子卷。由于以下原因,它们会从快照中排除。

/boot/grub2/i386-pc/boot/grub2/x86_64-efi/boot/grub2/powerpc-ieee1275/boot/grub2/s390x-emu

不能回滚引导加载程序配置。上面列出的目录是架构专属目录。前两个目录位于 AMD64/Intel 64 计算机上,后两个目录分别位于 IBM POWER 和 IBM Z 上。

/home

如果独立的分区中没有 /home,便会将该目录排除以免在回滚时发生数据丢失。

/opt

第三方产品通常安装到 /opt 下。排除此目录是为了防止在回滚时卸装这些应用程序。

/srv

包含 Web 和 FTP 服务器的数据。排除此目录是为了防止在回滚时发生数据丢失。

/tmp

包含临时文件和超速缓存的所有目录都会排除在快照范围之外。

/usr/local

在手动安装软件时会用到此目录。系统会将该目录排除以免在回滚时卸载这些安装的软件。

/var

此目录包含许多变量文件(包括日志、暂时超速缓存、/var/opt 中的第三方产品),是虚拟机映像和数据库的默认位置。因此,创建此子卷是为了从快照中排除所有这些变量数据,且已禁用“写入时复制”。

Warning
Warning: 回滚支持

仅当您未去除任何预先设置的子卷时,SUSE 支持才支持回滚。不过,您可以使用 YaST 分区程序添加子卷。

1.2.2.1 装入压缩的 Btrfs 文件系统

Note
Note: GRUB 2 和 LZO 压缩根目录

GRUB 2 无法读取 lzo 压缩根目录。如果要使用压缩,您需要创建单独的 /boot 分区。

从 SLE12 SP1 开始,支持压缩 Btrfs 文件系统。使用 compresscompress-force 选项,并选择压缩算法 lzozlib(默认)。zlib 压缩的压缩率更高,而 lzo 的压缩速度更快,并且所需的 CPU 负载更小。

例如:

root # mount -o compress /dev/sdx /mnt

如果您创建了一个文件并在其中写入数据,而压缩后的结果大于或等于未压缩时的大小,则将来针对此文件执行写入操作后,Btrfs 会始终跳过压缩。如果您不希望有这种行为,请使用 compress-force 选项。对于包含一些初始不可压缩数据的文件而言,此选项可能很有用。

请注意,压缩只会作用于新文件。如果使用 compresscompress-force 选项装入文件系统,则在未压缩的情况下写入的文件将不会压缩。此外,包含 nodatacow 属性的文件的内容永远不会压缩:

root # chattr +C FILE
root # mount -o nodatacow  /dev/sdx /mnt

加密与任何压缩操作均无关。在此分区中写入一些数据后,请打印细节:

root # btrfs filesystem show /mnt
btrfs filesystem show /mnt
Label: 'Test-Btrfs'  uuid: 62f0c378-e93e-4aa1-9532-93c6b780749d
        Total devices 1 FS bytes used 3.22MiB
      devid    1 size 2.00GiB used 240.62MiB path /dev/sdb1

如果您希望此设置是永久性的,请在 /etc/fstab 配置文件中添加 compresscompress-force 选项。例如:

UUID=1a2b3c4d /home btrfs subvol=@/home,compress 0 0

1.2.2.2 装入子卷

SUSE Linux Enterprise Server 上,从快照进行系统回滚的程序通过先从快照引导来执行。这样一来,您便可以在运行回滚之前,在运行的同时检查快照。只要装入子卷,就可以实现从快照引导(通常没必要)。

除了Section 1.2.2, “SUSE Linux Enterprise Server 上的根文件系统设置”中列出的子卷之外,系统中还存在一个名为 @ 的卷。这是默认的子卷,将作为根分区 (/) 装入。其他子卷将装入到此卷中。

从快照引导时,使用的不是 @ 子卷,而是快照。快照中包括的文件系统部分将以只读方式装入为 /。其他子卷将以可写入方式装入到快照中。此状态默认为临时状态,下次重引导时将还原先前的配置。若要使它成为永久状态,请执行 snapper rollback 命令。这将使目前引导的快照成为新的默认子卷,在重引导之后将会使用它。

1.2.2.3 检查可用空间

通常可通过运行 df 命令来检查文件系统的用量。在 Btrfs 文件系统上,df 的输出可能有误导性,因为除了原始数据分配的空间以外,Btrfs 文件系统还会为元数据分配并使用空间。

因此,即使看上去仍有大量的可用空间,Btrfs 文件系统也可能会报告空间不足。发生这种情况时,为元数据分配的全部空间都已用尽。使用以下命令可检查 Btrfs 文件系统上已用和可用的空间:

btrfs filesystem show
tux > sudo btrfs filesystem show /
Label: 'ROOT'  uuid: 52011c5e-5711-42d8-8c50-718a005ec4b3
        Total devices 1 FS bytes used 10.02GiB
        devid    1 size 20.02GiB used 13.78GiB path /dev/sda3

显示文件系统的总大小及其用量。如果最后一行中的这两个值匹配,则表示文件系统上的全部空间都已分配出去。

btrfs filesystem df
tux > sudo btrfs filesystem df /
Data, single: total=13.00GiB, used=9.61GiB
System, single: total=32.00MiB, used=16.00KiB
Metadata, single: total=768.00MiB, used=421.36MiB
GlobalReserve, single: total=144.00MiB, used=0.00B

显示文件系统的已分配 (total) 空间和已用空间值。如果元数据的 totalused 值基本上相等,则表示元数据的全部空间都已分配出去。

btrfs filesystem usage
tux > sudo btrfs filesystem usage /
Overall:
    Device size:                  20.02GiB
    Device allocated:             13.78GiB
    Device unallocated:            6.24GiB
    Device missing:                  0.00B
    Used:                         10.02GiB
    Free (estimated):              9.63GiB      (min: 9.63GiB)
    Data ratio:                       1.00
    Metadata ratio:                   1.00
    Global reserve:              144.00MiB      (used: 0.00B)

             Data     Metadata  System
Id Path      single   single    single   Unallocated
-- --------- -------- --------- -------- -----------
 1 /dev/sda3 13.00GiB 768.00MiB 32.00MiB     6.24GiB
-- --------- -------- --------- -------- -----------
   Total     13.00GiB 768.00MiB 32.00MiB     6.24GiB
   Used       9.61GiB 421.36MiB 16.00KiB

显示类似于前两个命令输出合并所得的数据。

有关详细信息,请参见 man 8 btrfs-filesystemhttps://btrfs.wiki.kernel.org/index.php/FAQ

1.2.3 从 ReiserFS 和 Ext 文件系统迁移到 Btrfs

您可以使用 btrfs-convert 工具,将数据卷从现有 ReiserFS 或 Ext(Ext2、Ext3 或 Ext4)迁移到 Btrfs 文件系统。该过程允许您对未装入(脱机)的文件系统进行就地转换,执行此操作可能需要使用包含 btrfs-convert 工具的可引导安装媒体。该工具会在原始文件系统的可用空间内构建 Btrfs 文件系统,并直接链接到其中包含的数据。设备上必须有足够用于创建元数据的可用空间,否则转换将失败。原始文件系统将保持不变,Btrfs 文件系统不会占用任何可用空间。需要的空间大小取决于文件系统的内容,可能会因其中包含的文件系统对象(例如文件、目录、扩展属性)数量而异。由于系统会直接参照数据,文件系统上的数据量不会影响转换所需的空间,但使用尾部封装且大小超过 2 KiB 的文件除外。

要将原始文件系统转换为 Btrfs 文件系统,请运行:

root # btrfs-convert /path/to/device
Important
Important: 检查 /etc/fstab

转换后,需确保 /etc/fstab 中对原始文件系统的所有参照都已调整,现指示设备包含 Btrfs 文件系统。

转换后,Btrfs 文件系统的内容将会反映源文件系统的内容。源文件系统将一直保留到您去除了在 fs_root/reiserfs_saved/image 中创建的相关只读映像为止。该映像文件实际上是转换前 ReiserFS 文件系统的一个“快照”,修改 Btrfs 文件系统时不会修改该映像。要去除该映像文件,请去除 reiserfs_saved 子卷:

root # btrfs subvolume delete fs_root/reiserfs_saved

要将文件系统还原到原始文件系统,请使用以下命令:

root # btrfs-convert -r /path/to/device
Warning
Warning: 更改将丢失

您在文件系统装载为 Btrfs 文件系统时所做的任何更改都将丢失。切勿在此期间执行任何平衡操作,否则将无法正确恢复文件系统。

1.2.4 Btrfs 管理

Btrfs 与 YaST 分区程序和 AutoYaST 集成。您可以在安装期间使用它来为根文件系统建立解决方案。安装之后,您可以使用 YaST 分区程序来查看和管理 Btrfs 卷。

btrfsprogs 包中提供了 Btrfs 管理工具。有关使用 Btrfs 命令的信息,请参见 man 8 btrfsman 8 btrfsckman 8 mkfs.btrfs 命令。有关 Btrfs 功能的信息,请参见 Btrfs Wiki,网址为 http://btrfs.wiki.kernel.org

1.2.5 Btrfs 子卷定额支持

Btrfs 根文件系统子卷 /var/log/var/crash/var/cache 在正常运作情况下可能会使用所有可用的磁盘空间,此时将导致系统故障。为避免出现此状况,SUSE Linux Enterprise Server 现在提供了 Btrfs 子卷配额支持。如果您按照相应的 YaST 建议设置根文件系统,系统会为根文件系统进行相应的准备:所有子卷的配额组 (qgroup) 均已设置。若要设置根文件系统中子卷的配额,请执行下列步骤:

  1. 启用配额支持:

    tux > sudo btrfs quota enable /
  2. 取得子卷列表:

    tux > sudo btrfs subvolume list /

    只能为现有子卷设置配额。

  3. 为上一步中所列的其中一个子卷设置配额。子卷可以用路径识别(例如 /var/tmp),也可以用 0/子卷 ID 识别(例如 0/272)。下面的示例为 /var/tmp 设置了 5 GB 的定额。

    tux > sudo btrfs qgroup limit 5G /var/tmp

    大小单位可以是字节 (5000000000)、KB (5000000K)、MB (5000M) 或 GB (5G)。以字节为单位产生的值略有不同,因为 1024 字节 = 1 KB,1024 KB = 1 MB 等。

  4. 若要列出现有配额,请使用以下命令。max_rfer 列以字节为单位显示配额。

    tux > sudo btrfs qgroup show -r /
Tip
Tip: 取消配额

如果您要取消现有定额,请将定额大小设置为 none

tux > sudo btrfs qgroup limit none /var/tmp

若要禁用某个分区及其所有子卷的配额支持,请使用 btrfs quota disable

tux > sudo btrfs quota disable /

有关细节,请参见 man 8 btrfs-qgroupman 8 btrfs-quota。Btrfs Wiki (https://btrfs.wiki.kernel.org/index.php/UseCases) 上的 UseCases 页面也提供了更多信息。

1.2.6 Btrfs 发送/接收

Btrfs 允许生成快照来捕获文件系统的状态。例如,Snapper 可使用此功能在系统更改之前及之后创建快照,以便允许回滚。不过,将快照与发送/接收功能结合使用还可以在远程位置创建和维护文件系统的副本。例如,此功能可用于执行增量备份。

btrfs send 操作可计算同一子卷中两个只读快照之间的差异,并将差异发送到某个文件或 STDOUT。btrfs receive 操作会接收 send 命令的结果,并将其应用到快照。

1.2.6.1 先决条件

要使用发送/接收功能,需要满足以下要求:

  • 源端(发送)和目标端(接收)各有一个 Btrfs 文件系统。

  • Btrfs 发送/接收是对快照执行的,因此,相应的数据需要驻留在 Btrfs 子卷中。

  • 源端中的快照必须为只读模式。

  • SUSE Linux Enterprise 12 SP2 或更高版本。早期版本的 SUSE Linux Enterprise 不支持发送/接收。

1.2.6.2 增量备份

以下过程展示了 Btrfs 发送/接收操作的基本用法,其中示范了如何在 /backup/data(目标端)中创建 /data(源端)的增量备份。/data 必须是一个子卷。

Procedure 1.1: 初始设置
  1. 在源端创建初始快照(在本示例中名为 snapshot_0),并确保将它写入该磁盘:

    tux > sudo btrfs subvolume snapshot -r /data /data/bkp_data
    sync

    即会创建一个新子卷 /data/bkp_data。该子卷将用作后续增量备份的基础,应将它保留为参照。

  2. 将初始快照发送到目标端。由于这是初始的发送/接收操作,因此需要发送整个快照:

    tux > sudo bash -c 'btrfs send /data/bkp_data | btrfs receive /backup'

    目标端上即会创建一个新子卷 /backup/bkp_data

完成初始设置后,可以创建增量备份,并将当前快照与先前快照之间的差异发送到目标端。操作过程始终是相同的:

  1. 在源端创建新快照。

  2. 将差异发送到目标端。

  3. 可选:重命名和/或清理两端中的快照。

Procedure 1.2: 执行增量备份
  1. 在源端创建新快照,并确保将它写入该磁盘。在下面的示例中,快照命名为 bkp_data_当前日期

    tux > sudo btrfs subvolume snapshot -r /data /data/bkp_data_$(date +%F)
    sync

    创建新子卷,例如 /data/bkp_data_2016-07-07

  2. 将先前快照与您创建的快照之间的差异发送到目标端。为此,可以使用选项 -p SNAPSHOT 指定先前的快照。

    tux > sudo bash -c 'btrfs send -p /data/bkp_data /data/bkp_data_2016-07-07 \
    | btrfs receive /backup'

    即会创建一个新子卷 /backup/bkp_data_2016-07-07

  3. 如此我们有了四个快照,每端各有两个:

    /data/bkp_data
    /data/bkp_data_2016-07-07
    /backup/bkp_data
    /backup/bkp_data_2016-07-07

    现在,关于如何继续,您有三种选择:

    • 保留两端中的所有快照。如果采用这种选择,您可以回滚到两端中的任一快照,同时会复制所有数据。不需要执行额外操作。执行后续增量备份时,请记得使用倒数第二个快照作为发送操作的父项。

    • 仅保留源端中的最后一个快照,保留目标端中的所有快照。此外,允许回滚到两端中的任一快照 - 要回滚到源端中的特定快照,请对整个快照执行从目标端到源端的发送/接收操作。在源端执行删除/移动操作。

    • 仅保留两端中的最后一个快照。采用这种方法,您会在目标端创建一个备份,该备份代表源端中生成的最后一个快照的状态。系统无法回滚到其他快照。在源端和目标端执行删除/移动操作。

    1. 如果只想保留源端中的最后一个快照,请执行以下命令:

      tux > sudo btrfs subvolume delete /data/bkp_data
      tux > sudo mv /data/bkp_data_2016-07-07 /data/bkp_data

      第一条命令将删除先前的快照,第二条命令将当前快照重命名为 /data/bkp_data。这可确保备份的最后一个快照始终命名为 /data/bkp_data。因此,您也可以始终使用此子卷名称作为增量发送操作的父项。

    2. 如果只想保留目标端中的最后一个快照,请执行以下命令:

      tux > sudo btrfs subvolume delete /backup/bkp_data
      tux > sudo mv /backup/bkp_data_2016-07-07 /backup/bkp_data

      第一条命令将删除先前的备份快照,第二条命令将当前备份快照重命名为 /backup/bkp_data。这可确保最新的备份快照始终命名为 /backup/bkp_data

Tip
Tip: 发送到远程目标端

要将快照发送到远程计算机,请使用 SSH:

tux > btrfs send /data/bkp_data | ssh root@jupiter.example.com 'btrfs receive /backup'

1.2.7 重复数据删除支持

Btrfs 支持重复数据删除功能,具体办法是以指向通用储存位置中的块单一副本的逻辑链接替换文件系统中完全相同的块。SUSE Linux Enterprise Server 提供 duperemove 工具来扫描文件系统中有没有完全相同的块。在 Btrfs 文件系统上使用时,也可以用来删除这些重复的块,从而节省文件系统上的空间。系统上默认不会安装 duperemove。要使此功能可用,请安装包 duperemove

Note
Note: 删除重复的大型数据集

如果您要删除重复的大量文件,请使用 --hashfile 选项:

tux > sudo duperemove --hashfile HASH_FILE file1 file2 file3

--hashfile 选项会将所有指定文件的哈希储存到 HASH_FILE(而不是 RAM 中),防止耗尽 RAM。HASH_FILE 可重复使用 - 当完成生成基线哈希文件的初始运行后,即可删除对大型数据集的重复更改。

duperemove 可以针对一系列文件操作,也可以以递归方式扫描某个目录:

tux > sudo duperemove OPTIONS file1 file2 file3
tux > sudo duperemove -r OPTIONS directory

它有两种操作模式:只读和重复数据删除。以只读模式运行时(即不使用 -d 开关),它会扫描给定文件或目录中的重复块,并将其打印出来。此模式适用于所有文件系统。

以重复数据删除模式执行 duperemove 仅在 Btrfs 文件系统上受支持。扫描给定文件或目录之后,将会提交重复的块以进行重复数据删除。

有关详细信息,请参见 man 8 duperemove

1.2.8 从根文件系统中删除子卷

出于特定目的,您可能需要从根文件系统中删除某个默认的 Btrfs 子卷。目的之一是将某个子卷(例如 @/home@/srv)转换成单独设备上的文件系统。以下过程演示如何删除 Btrfs 子卷:

  1. 确定要删除的子卷(例如 @/opt)。请注意,根路径始终使用子卷 ID“5”。

    tux > sudo btrfs subvolume list /
    ID 256 gen 30 top level 5 path @
    ID 258 gen 887 top level 256 path @/var
    ID 259 gen 872 top level 256 path @/usr/local
    ID 260 gen 886 top level 256 path @/tmp
    ID 261 gen 60 top level 256 path @/srv
    ID 262 gen 886 top level 256 path @/root
    ID 263 gen 39 top level 256 path @/opt
    [...]
  2. 查找托管根分区的设备名称:

    tux > sudo btrfs device usage /
    /dev/sda1, ID: 1
      Device size:            23.00GiB
      Device slack:              0.00B
      Data,single:             7.01GiB
      Metadata,DUP:            1.00GiB
      System,DUP:             16.00MiB
      Unallocated:            14.98GiB
  3. 在单独的装入点(例如 /mnt)上装入根文件系统(ID 为 5 的子卷):

    tux > sudo mount -o subvolid=5 /dev/sda1 /mnt
  4. 从装入的根文件系统中删除 @/opt 分区:

    tux > sudo btrfs subvolume delete /mnt/@/opt
  5. 卸载以前装入的根文件系统:

    tux > sudo umount /mnt

1.3 XFS

SGI 在 20 世纪 90 年代初开始开发 XFS,最初计划将 XFS 作为 IRIX OS 的文件系统。开发 XFS 的目的是创建一个高性能的 64 位日记文件系统来满足对计算能力的极高要求。XFS 适合操纵大型文件,在高端硬件上表现优异。XFS 是 SUSE Linux Enterprise Server 中数据分区的默认文件系统。

快速回顾 XFS 的关键功能可解释为什么此文件系统经证明在高端计算方面是其他日记文件系统的强大竞争对手。

1.3.1 使用分配组实现高可伸缩性

在创建 XFS 文件系统时,文件系统底层的块设备被分成 8 个或 8 个以上相同大小的线性区域。这些区域称为分配组。每个分配组管理自己的 inode 和可用空间。实际上,可以将分配组看作文件系统中的文件系统。因为分配组相互独立,所以内核可同时对多个分配组进行寻址。此功能是 XFS 优异的可伸缩性关键之所在。独立分配组的概念自然适合多处理器系统的需要。

1.3.2 通过有效管理磁盘空间获得高性能

可用空间和 inode 是由分配组内的 B+ 树处理的。使用 B+ 树将大大增强 XFS 的性能和可伸缩性。XFS 使用延迟分配,它可以通过将进程分为两部分而处理分配。将挂起事务储存在 RAM 中并保留适当数量的空间。XFS 仍不决定应储存数据的准确位置(即不指出文件系统块)。此决定将被延迟到最后的时刻。某些生存期很短的临时数据可能永远不会被储存到磁盘上,这是因为在 XFS 决定保存它们的实际位置时,这些数据可能已经过时了。以这种方式,XFS 增强了写性能并减少了文件系统分段。因为延迟分配引起写事件的频率比其他文件系统引起写事件的频率要低,所以如果写操作期间发生系统崩溃,则数据丢失可能会更加严重。

1.3.3 进行预分配以避免文件系统碎片

在将数据写入文件系统前,XFS 保留(预分配)文件所需的可用空间。这样会大大减少文件系统碎片的数目。因为文件的内容不会分散在整个文件系统中,所以性能得以提高。

Note
Note: 新的 XFS 磁盘格式

从 12 版开始,SUSE Linux Enterprise Server 支持 XFS 文件系统的新磁盘格式 (v5)。由 YaST 创建的 XFS 文件系统将使用这种新格式。这种格式的主要优点包括,所有 XFS 元数据的自动检查总数、文件类型支持以及支持文件更多数量的访问控制列表。

请注意,低于 3.12 版的 SUSE Linux Enterprise 内核、低于 3.2.0 版的 xfsprogs,以及在 SUSE Linux Enterprise 12 之前发布的 GRUB 2 版本均支持这种格式。如果同时还要从不符合上述先决条件的系统中使用该文件系统,就会出现问题。

如果您需要在较旧 SUSE 系统或其他 Linux 发行套件与 XFS 文件系统之间实现互操作性,请使用 mkfs.xfs 命令手动格式化文件系统。这将创建一个采用旧格式的 XFS 文件系统(除非您使用 -m crc=1 选项)。

1.4 Ext2

Ext2 的原身可以追溯到 Linux 历史的早期。其前身是“扩展文件系统”,于 1992 年 4 月实施,集成在 Linux 0.96c 中。扩展文件系统经历了数次修改,后来才称为 Ext2,曾经是多年来最受欢迎的 Linux 文件系统。但随着日记文件系统的创建以及其恢复时间的缩短,Ext2 的重要性逐渐降低。

简要总结 Ext2 的优点有助于您了解为什么它以前是(在某些领域现在仍是)许多 Linux 用户最喜欢使用的 Linux 文件系统。

可靠性和速度

Ext2 是一个老古董,它经历了许多改进和频繁的测试。这可能是人们经常称之为坚如磐石的文件系统的原因。在系统中断后,如果无法彻底卸装文件系统,则 e2fsck 将开始分析文件系统数据。系统使元数据恢复一致的状态,并将挂起的文件或数据块写入指定的目录(名为 lost+found)。与日记文件系统相比,e2fsck 会分析整个文件系统,而不仅仅是元数据中最近修改的位。这种操作所花的时间要远远超过检查日记文件系统的日志数据所花的时间。根据文件系统的大小,此过程可能需要半小时或更长时间。因此,对于任何要求高可用性的服务器,不要选择 Ext2。但是,因为 Ext2 不维护日记且使用的内存也更少,所以其速度往往快于其他文件系统。

可方便地升级

因为 Ext3 以 Ext2 代码为基础并且共享 Ext2 的磁盘上格式和元数据格式,所以从 Ext2 升级到 Ext3 非常容易。

1.5 Ext3

Ext3 由 Stephen Tweedie 设计。与所有其他下一代文件系统不同,Ext3 并没有采用全新的设计原则。它是在 Ext2 的基础上设计的。这两个文件系统密切关联。可以方便地在 Ext2 文件系统上建立 Ext3 文件系统。Ext2 和 Ext3 最重要的区别是 Ext3 支持日记。总之,Ext3 有三个主要优点:

1.5.1 方便并高度可靠地从 Ext2 升级

Ext2 的代码为 Ext3 奠定了坚实的基础,使后者成为受到高度评价的下一代文件系统。在 Ext3 中,它的可靠性和稳定性与日记文件系统的优点完美地结合在一起。不像转换至其他日记文件系统(例如 XFS)那么费时(备份整个文件系统,然后从头开始重新创建),转换到 Ext3 只需几分钟时间。升级到 Ext3 还很安全,因为从头重新创建整个文件系统可能会出现问题。考虑到等待升级到日记文件系统的现有 Ext2 系统的数量,就很容易明白为什么 Ext3 对许多系统管理员来说如此重要。从 Ext3 降级到 Ext2 与升级一样简单。将 Ext3 文件系统完全卸载,然后重新装入成 Ext2 文件系统即可。

1.5.2 可靠性和性能

某些其他日记文件系统采用仅元数据的日记方法。这意味着元数据始终保持一致的状态,但无法自动保证文件系统数据本身一致。Ext3 的设计既可以照顾到元数据,又可以照顾到数据。照顾的程度可以自定义。在 data=journal 方式中启用 Ext3 可以提供最大的安全性(数据完整性),但因为要将元数据和数据都记入日记,所以可能会降低系统的速度。一个相对较新的方法是采用 data=ordered 方式,这种方式确保了数据和元数据的完整性,但只对元数据使用日记。文件系统驱动程序收集与一次元数据更新对应的所有数据块。这些数据块在更新元数据之前被写入磁盘中。这样,在不牺牲性能的情况下,元数据和数据的一致性得以实现。第三个要使用的选项是 data=writeback,允许数据在其元数据已经提交至日记后再写入主要文件系统。在性能方面,此选项常被认为是最佳选项。但它在维护内部文件系统完整性的同时,允许以前的数据在系统崩溃并恢复后再次出现在文件中。Ext3 使用 data=ordered 选项作为默认值。

1.5.3 将 Ext2 文件系统转换为 Ext3

要将 Ext2 文件系统转换为 Ext3:

  1. 作为 root 用户运行 tune2fs -j 来创建 Ext3 日记。

    此命令将用默认参数创建 Ext3 日记。

    要指定日记的大小和所驻留的设备,请改为运行 tune2fs -J,同时使用所需的日记选项 size=device=tune2fs 手册页中有关于 tune2fs 程序的更多信息。

  2. 作为 root 用户编辑文件 /etc/fstab,以将为相应分区指定的文件系统类型从 ext2 更改为 ext3,然后保存更改。

    这确保可以正确识别出 Ext3 文件系统。此更改将在下次重引导后生效。

  3. 若引导已设置为 Ext3 分区的根文件系统,请在 initrd 中添加模块 ext3jbd。操作步骤如下:

    1. 打开或创建 /etc/dracut.conf.d/10-filesystem.conf 并添加以下行(请注意前导空格):

      force_drivers+=" ext3 jbd"
    2. 然后运行 dracut -f 命令。

  4. 重引导系统。

1.5.4 Ext3 文件系统 inode 大小及 inode 数量

inode 用于存储文件的相关信息及其在文件系统中的块位置。为了让 inode 有空间可以容纳扩展属性以及 ACL,Ext3 的默认 inode 大小从 SLES 10 上的 128 字节增加到了 SLES 11 上的 256 字节。与 SLES 10 相比,当您在 SLES 11 上创建新的 Ext3 文件系统时,为相同数量的 Inode 预先分配的默认空间容量会增加一倍,文件系统中文件的可用空间则会减少相应的容量。因此,要容纳与 SLES 10 上的 Ext3 文件系统中数量相同的 inode 和文件,您必须使用更大的分区。

当您创建新的 Ext3 文件系统时,系统将根据可创建的 Inode 总数预先分配 Inode 表格中的空间。每 inode 的字节数比率以及文件系统的大小决定了可以创建的 inode 数量。建立文件系统时,将根据每 inode 字节数的单位空间创建 inode:

number of inodes = total size of the file system divided by the number of bytes per inode

inode 的数量控制着文件系统中可容纳的文件数:一个文件对应一个 inode。为解决 inode 大小增加而使可用空间变少的问题,每 inode 的字节数比率的默认值由 SLES 10 上的 8192 字节增加到了 SLES 11 上的 16384 字节。比率翻倍意味着可以创建的文件数量将只有 SLES 10 上 Ext3 文件系统中可容纳文件数量的一半。

Important
Important: 更改现有 Ext3 文件系统的 Inode 大小。

inode 分配完毕后,将无法更改 inode 大小的设置或每 inode 的字节数比率。如果不使用其他设置重新创建文件系统,或不扩展文件系统,则无法添加 Inode。超过 inode 最大数量时,只有删除部分文件才能在文件系统上创建新文件。

新建 Ext3 文件系统时,您可以指定 inode 大小和每 inode 的字节数比率,以控制文件系统上可容纳 inode 空间占用量以及文件数量。如果未指定块大小、inode 大小以及每 inode 的字节数比率值,则将应用 /etc/mked2fs.conf 中的默认值。有关信息,请参见 mke2fs.conf(5) 手册页。

使用以下指标:

  • inode 大小:.  默认的 inode 大小为 256 字节。指定字节值,即介于 128 字节(含)到块大小(含)之间的 2 的乘方值,如 128、256、512,以此类推。只有当 Ext3 文件系统上不使用扩展属性或 ACL 时才可使用 128 字节。

  • 每 inode 的字节数比率:.  默认的每 inode 的字节数比率为 16384 字节。有效的每 inode 的字节数比率值必须是大于等于 1024 字节的 2 的乘方值,如 1024、2048、4096、8192、16384、32768,以此类推。该值不应小于文件系统的块大小,因为块大小是用于存储数据的最小空间大块。Ext3 文件系统默认的块大小为 4 KB。

    此外,请考虑需要储存的文件数量及大小。例如,如果您的文件系统上将会有许多小文件,则可以指定一个较小的每 inode 的字节数比率,这样会增加 inode 的数量。如果文件系统将储存超大型文件,您可以指定一个较大的每 Inode 的字节数比率,这样可减少可能的 Inode 数。

    通常情况下,最好要保证有足够多的 inode 可供使用。如果 inode 数量过少且文件很小,则可能当磁盘上的文件数量已达最大值时实际上磁盘却还很空。如果 inode 过多且文件很大,则可能虽然报告仍有可用空间,但却无法使用,这是因为您无法在为 inode 预留的空间中新建文件。

如果您在 Ext3 文件系统上不使用扩展属性或 ACL,则在创建文件系统时可通过将 inode 大小指定为 128 字节,并将每 inode 的字节数比率指定为 8192 字节,来恢复到 SLES 10 行为。使用以下任何一种方法设置 inode 大小以及每 inode 的字节数比率:

  • 更改所有新的 Ext3 文件的默认设置:.  在文本编辑器中,修改 /etc/mke2fs.conf 文件的 defaults 部分,以为 inode_sizeinode_ratio 设置所需的默认值。这些值将应用到所有新的 Ext3 文件系统。例如:

    blocksize = 4096
    inode_size = 128
    inode_ratio = 8192
  • 在命令行处:.  新建 Ext3 文件系统时,将 inode 大小 (-I 128) 以及每 inode 的字节数比率 (-i 8192) 传递给 mkfs.ext3(8) 命令或 mke2fs(8) 命令。例如,使用以下任一命令:

    tux > sudo mkfs.ext3 -b 4096 -i 8092 -I 128 /dev/sda2
    tux > sudo mke2fs -t ext3 -b 4096 -i 8192 -I 128 /dev/sda2
  • 在使用 YaST 安装期间:.  在安装期间,新建 Ext3 文件系统时要传递 inode 大小和每 inode 的字节数比率值。在格式化选项下的编辑分区页面的 YaST 分区程序中,选择格式化分区Ext3,然后单击选项。从文件系统选项对话框中的块大小 (B)每 inode 的字节数以及 Inode 大小下拉框中,选择所需的值。

    例如,在块大小 (B) 下拉框中选择 4096、在每 inode 的字节数下拉框中选择 8192、在 Inode 大小下拉框中选择 128,然后单击确定

    Image
  • 在使用 AutoYaST 安装期间:.  在 AutoYaST 配置文件中,您可以使用 fs_options 标记来设置 opt_bytes_per_inode 比率值(-i 为 8192)以及 opt_inode_density 值(-I 为 128):

    <partitioning config:type="list">
      <drive>
        <device>/dev/sda</device>
        <initialize config:type="boolean">true</initialize>
        <partitions config:type="list">
          <partition>
            <filesystem config:type="symbol">ext3</filesystem>
            <format config:type="boolean">true</format>
            <fs_options>
              <opt_bytes_per_inode>
                <option_str>-i</option_str>
                <option_value>8192</option_value>
              </opt_bytes_per_inode>
              <opt_inode_density>
                <option_str>-I</option_str>
                <option_value>128</option_value>
              </opt_inode_density>
            </fs_options>
            <mount>/</mount>
            <partition_id config:type="integer">131</partition_id>
            <partition_type>primary</partition_type>
            <size>25G</size>
          </partition>
        </partitions>
      </drive>
    <partitioning>

有关相关信息,请参见 https://www.suse.com/support/kb/doc.php?id=7009075SLES11 ext3 分区只能储存 SLES10 上可储存的文件数的 50% [技术信息文档 7009075])。

1.6 Ext4

2006 年,Ext4 做为 Ext3 的传承面市。它支持最大大小为 1 EiB 的卷、最大大小为 16 TiB 的文件和无限个子目录,消除了 Ext3 在储存上的一些局限。它还引入了多项性能增强功能,例如延迟块分配和速度大幅加快的文件系统检查例程。Ext4 还支持日记校验和,并可提供以纳秒度量的时间戳,因而更加可靠。Ext4 完全反向兼容于 Ext2 和 Ext3,后两个文件系统都可以作为 Ext4 装入。

1.7 ReiserFS

SUSE Linux Enterprise Server 15 中完全去除了 ReiserFS 支持。要将现有分区迁移到 Btrfs,请参见Section 1.2.3, “从 ReiserFS 和 Ext 文件系统迁移到 Btrfs”

1.8 支持的其他文件系统

Table 1.1, “Linux 中的文件系统类型”对 linux 支持的其他一些文件系统进行了总结。支持这些文件系统主要是为了确保与不同类型的媒体或异操作系统实现兼容和数据交换。

Table 1.1: Linux 中的文件系统类型

文件系统类型

描述

cramfs

压缩的 ROM 文件系统:一种经压缩的只读 ROM 文件系统。

hpfs

高性能文件系统:IBM OS/2 标准文件系统。只在只读模式下支持。

iso9660

CD-ROM 上的标准文件系统。

minix

此文件系统源自有关操作系统的学术项目,是在 Linux 中使用的第一个文件系统。目前,它被用作软盘的文件系统。

msdos

fat(最初由 DOS 使用的文件系统)现在已被多种操作系统采用。

nfs

网络文件系统:在此文件系统中,可以将数据储存在网络中的任何计算机上,并可以通过网络授予访问权限。

ntfs

Windows NT 文件系统;只读。

smbfs

Windows 等产品使用服务器消息块来支持通过网络启用文件访问。

sysv

在 SCO Unix、Xenix 和 Coherent(用于 PC 的商用 Unix 系统)上使用。

ufs

供 BSD、SunOS 和 NextStep 使用。只在只读方式下支持此文件系统。

umsdos

MS-DOS 上的 Unix:在标准 fat 文件系统之上应用,通过创建特殊文件获得 Unix 功能(权限、链接和长文件名)。

vfat

虚拟 FAT:fat 文件系统的扩展(支持长文件名)。

1.9 Linux 中对大型文件的支持

最初,Linux 支持的最大文件大小为 2 GiB(231 字节)。除非文件系统支持大型文件,否则 32 位系统上的最大文件大小为 2 GiB。

目前,所有标准文件系统都具有 LFS(大型文件支持)功能,理论上可支持的最大文件大小为 263 字节。Table 1.2, “文件和文件系统的最大大小(磁盘格式,4 KiB 块大小)”概述了 Linux 文件和文件系统的当前磁盘上格式的限制。表中的数字基于文件系统使用 4 KiB 块大小的假设得出,这是通用的标准。使用不同的块大小,结果也就不同。使用较稀疏的块时,Table 1.2, “文件和文件系统的最大大小(磁盘格式,4 KiB 块大小)”中的最大文件大小可能会大于文件系统的实际大小。

Note
Note: 二进制倍数

在此文档中:1024 字节 = 1 KiB;1024 KiB = 1 MiB;1024 MiB = 1 GiB;1024 GiB = 1 TiB;1024 TiB = 1 PiB;1024 PiB = 1 EiB(另请参见 NIST:二进制倍数的前缀)。

Table 1.2: 文件和文件系统的最大大小(磁盘格式,4 KiB 块大小)

文件系统(4 KiB 块大小)

最大文件系统大小

最大文件大小

Btrfs

16 EiB

16 EiB

Ext3

16 TiB

2 TiB

Ext4

1 EiB

16 TiB

OCFS2(高可用性扩展中可使用的集群感知文件系统)

16 TiB

1 EiB

XFS

8 EiB

8 EiB

NFSv2(客户端)

8 EiB

2 GiB

NFSv3/NFSv4(客户端)

8 EiB

8 EiB

Important
Important: 限制

Table 1.2, “文件和文件系统的最大大小(磁盘格式,4 KiB 块大小)”介绍了有关磁盘上格式的限制。 Linux 内核自身的大小限制同样适用于其处理的文件和文件系统大小。下面介绍了这些限制:

文件大小

在 32 位系统上,文件不能超过 2 TiB(241 字节)。

文件系统大小

文件系统最大可以为 273 个字节。但是,目前可用的硬件尚不会超出这一限制。

1.10 Linux 内核储存的限制

Table 1.3, “储存限制” 总结了与 SUSE Linux Enterprise Server 相关联的储存的内核限制。

Table 1.3: 储存限制

储存功能

限制

支持的 LUN 最大数量

每个目标 16384 个 LUN。

每一个单独 LUN 的最大路径数量

默认情况下没有限制。每个路径视作一个常规 LUN。

每个目标的 LUN 数量以及每个 HBA 的目标数量决定了实际的限制(光纤通道 HBA 为 16777215)。

HBA 的最大数量

不限。实际限制取决于系统的 PCI 槽的数量。

每个操作系统使用 device-mapper-multipath 的最大路径数量(总计)

大约为 1024。实际数量取决于每个多路径设备的设备号字符串长度。它是 multipath-tools 中的一个编译时间变量,如果此限制会导致问题,则可提高其值。

每一个块设备的最大大小

最多 8 EiB。

1.11 文件系统疑难解答

本节说明文件系统的一些已知问题和可能的解决方案。

1.11.1 Btrfs 错误:设备上没有剩余空间

使用 Btrfs 文件系统的根 (/) 分区停止接受数据。您收到错误设备上没有剩余空间

请参见下列各部分,了解有关此问题的可能原因和预防措施的信息。

1.11.1.1 Snapper 快照使用的磁盘空间

如果 Snapper 是针对 Btrfs 文件系统运行的,则设备上没有剩余空间问题通常是由于系统上做为快照储存的数据过多所致。

您可以从 Snapper 中去除一些快照,不过,快照不会立即删除,可能不能释放您需要的空间容量。

若要从 Snapper 中删除文件:

  1. 打开一个终端控制台。

  2. 在命令提示符处,输入 btrfs filesystem show,例如:

    tux > sudo btrfs filesystem show
    Label: none uuid: 40123456-cb2c-4678-8b3d-d014d1c78c78
     Total devices 1 FS bytes used 20.00GB
     devid 1 size 20.00GB used 20.00GB path /dev/sda3
  3. 输入

    tux > sudo btrfs fi balance start MOUNTPOINT -dusage=5

    此命令会尝试将数据重新放置在空的或接近空的数据块中,从而允许收回空间并将其重新指派给元数据。此操作可能需要一些时间(1 TB 数据可能需要很多小时),不过,在此期间系统仍可以使用。

  4. 列出 Snapper 中的快照。输入

    tux > sudo snapper -c root list
  5. 从 Snapper 中删除一或多个快照。输入

    tux > sudo snapper -c root delete SNAPSHOT_NUMBER(S)

    务必先删除最旧的快照。快照生成的时间越长,其占用的空间就越大。

为了避免此问题发生,您可以更改 Snapper 清理算法。有关细节,请参见第 7.6.1.2 节 “清理算法”。控制快照清理的配置值为 EMPTY_*NUMBER_*TIMELINE_*

如果在文件系统磁盘上搭配使用 Snapper 和 Btrfs,建议您保留两倍于标准储存建议的磁盘空间容量。YaST 分区程序会自动在 Btrfs 储存建议中为根文件系统建议标准磁盘空间的两倍容量。

1.11.1.2 日志、崩溃和缓存文件使用的磁盘空间

如果系统磁盘填满了数据,您可以尝试从 /var/log/var/crash/var/lib/systemd/coredump/var/cache 中删除文件。

Btrfs 文件系统子卷 /var/log/var/crash/var/cache 在正常运作情况下可能会使用所有可用的磁盘空间,此时将导致系统故障。为避免出现此状况,SUSE Linux Enterprise Server 提供了 Btrfs 子卷配额支持。有关详细信息,请参见Section 1.2.5, “Btrfs 子卷定额支持”

在测试和开发计算机上,尤其是当应用程序频繁崩溃时,您也可能想查看 /var/lib/systemd/coredump,内核转储就储存在其中。

1.11.2 释放未使用的文件系统块

在固态硬盘 (SSD) 和精简配置的卷中,释放未被文件系统使用的块会很有用。SUSE Linux Enterprise Server 完全支持在支持取消映射释放方法的所有文件系统上执行这些操作。

建议通过运行 /sbin/wiper.sh,来释放 SUSE Linux Enterprise Server 上支持的文件系统(Btrfs 除外)。在运行此脚本之前,请务必阅读 /usr/share/doc/packages/hdparm/README.wiper。对于大多数桌面和服务器系统,每周释放一次便已足够。使用 -o discard 装入文件系统会降低性能,并可能对 SSD 的寿命造成负面影响,因此不建议使用此选项。

Warning
Warning: 不要在 Btrfs 上使用 wiper.sh

wiper.sh 脚本会释放装入的读写 Ext4 或 XFS 文件系统,以及装入/未装入的只读 Ext2、Ext3、Ext4 和 XFS 文件系统。请在 Btrfs 文件系统上使用 wiper.sh,否则可能会损坏数据。应该使用 btrfsmaintenance 包中的 /usr/share/btrfsmaintenance/btrfs-trim.sh

1.11.3 不要在 SSD 中进行碎片整理

Linux 文件系统包含相应的机制用于避免数据碎片,因此通常没有必要执行碎片整理。但在某些使用场合下,数据碎片不可避免,而对硬盘进行碎片整理可以明显提高性能。

这种做法仅适用于传统的硬盘。在使用闪存储存数据的固态硬盘 (SSD) 中,固件提供的算法可以确定要将数据写入哪些芯片。数据通常分散在设备的各个位置。因此,对 SSD 进行碎片整理并不能获得所需的效果,反而会因为写入不必要的数据而缩短 SSD 的寿命。

出于上述原因,SUSE 肯定地建议不要对 SSD 进行碎片整理。某些供应商还会警告对其固态硬盘进行碎片整理所产生的后果。这些品牌包括但不限于:

  • HPE 3PAR StoreServ All-Flash

  • HPE 3PAR StoreServ Converged Flash

1.12 其他信息

上面介绍的每个文件系统项目都有自己的主页,可以在其中找到邮件列表信息、更多文档和常见问题:

Wikipedia 项目上的“Comparison of File Systems”(文件系统比较,网址:http://en.wikipedia.org/wiki/Comparison_of_file_systems#Comparison)中提供了对各种文件系统(不仅仅是 Linux 文件系统)更深入的比较。