文件系统

出自 ArchWiki

出自 Wikipedia

在计算机科学中,文件系统或文件系统控制着数据的存储和检索方式。如果没有文件系统,存储介质中的信息将是一个庞大的数据体,无法分辨一段信息的结束和下一段信息的开始。通过将数据分成若干部分并为每个部分命名,信息可以很容易地被隔离和识别。借鉴纸质信息系统的命名方式,每组数据被称为“文件”。用于管理信息组及其名称的结构和逻辑规则称为“文件系统”。

可以使用许多不同的可用文件系统之一来设置单个驱动器分区。每种文件系统都有其自身的优点、缺点和独特的特性。以下是受支持文件系统的简要概述;链接指向维基百科页面,其中提供了更多信息。

文件系统类型

有关一般概述,请参阅 filesystems(5),有关详细的功能比较,请参阅 Wikipedia:文件系统比较。内核已加载或内置的文件系统列在 /proc/filesystems 中,而所有已安装的模块可以在 ls /lib/modules/$(uname -r)/kernel/fs 中看到。

内核内和 FUSE 文件系统
文件系统 创建命令 用户空间实用程序 Archiso [1] 内核文档 [2] 注释
Bcachefs bcachefs(8) bcachefs-tools Linux 6.7+ 中可用,实验性
Btrfs mkfs.btrfs(8) btrfs-progs btrfs.html 稳定性状态
VFAT mkfs.fat(8) dosfstools vfat.html Windows 9x 文件系统。常用于 USB 闪存驱动器和 SD 卡。
exFAT mkfs.exfat(8) exfatprogs Linux 5.4 中的原生文件系统。[3] 常用于 USB 闪存驱动器和 SD 卡。
mkexfatfs(8) exfat-utils N/A (基于 FUSE)
F2FS mkfs.f2fs(8) f2fs-tools f2fs.html 基于闪存的设备
ext3 mkfs.ext3(8) e2fsprogs ext3.html
ext4 mkfs.ext4(8) e2fsprogs ext4.html
HFS mkfs.hfsplus(8) hfsprogsAUR hfs.html Classic Mac OS 文件系统
HFS+ mkfs.hfsplus(8) hfsprogsAUR hfsplus.html macOS (8–10.12) 文件系统
JFS mkfs.jfs(8) jfsutils jfs.html
NILFS2 mkfs.nilfs2(8) nilfs-utils nilfs2.html 主要用于基于闪存的设备。不支持 xattrsACL
NTFS ntfs3.html Windows NT 文件系统。 新驱动,自 Linux 5.15 起可用。
mkfs.ntfs(8) ntfs-3g N/A (基于 FUSE) 具有扩展功能的 FUSE 驱动程序。
ReiserFS mkfs.reiserfs(8) reiserfsprogsAUR 自 Linux 5.18 起已弃用,并 在 Linux 6.13 中移除
UDF mkfs.udf(8) udftools udf.html
XFS mkfs.xfs(8) xfsprogs

xfs.html
xfs-delayed-logging-design.html
xfs-self-describing-metadata.html

无法缩小
树外文件系统
文件系统 创建命令 内核补丁集 用户空间实用程序 注释
APFS mkapfs(8) linux-apfs-rw-dkms-gitAUR apfsprogs-gitAUR macOS (10.13 及更高版本) 文件系统。只读,实验性写入支持。另请参阅 apfs-fuse-gitAUR FUSE 版本。
Reiser4 mkfs.reiser4(8) reiser4progsAUR
ZFS zfs-linuxAUR, zfs-dkmsAUR zfs-utilsAUR OpenZFS 端口

日志

除了 exFAT、ext2、FAT16/32、Reiser4 (可选)、Bcachefs、Btrfs 和 ZFS 之外,以上所有文件系统都使用 日志。日志通过在将更改提交到文件系统之前记录更改来提供容错能力。在系统崩溃或断电的情况下,此类文件系统可以更快地恢复联机,并且不太可能损坏。日志记录发生在文件系统的专用区域中。

并非所有日志技术都相同。Ext3 和 ext4 提供数据模式日志,它记录数据和元数据,以及仅记录元数据更改的可能性。数据模式日志会带来速度损失,并且默认情况下未启用。同样,Reiser4 提供所谓的 “事务模型”,它不仅改变了它提供的功能,而且改变了它的日志模式。它使用不同的日志技术:一种称为 漫游日志 的特殊模型,它消除了两次写入磁盘的需要,write-anywhere—一种纯粹的写入时复制方法(主要等同于 btrfs 的默认设置,但具有根本不同的“树”设计)以及一种称为 混合 的组合方法,它启发式地在两者之间交替。

注意: Reiser4 通过使用 node41 插件,确实提供了几乎等同于 ext4 默认日志行为(仅元数据)的功能,该插件还具有元数据和内联校验和,可以选择与它提供的漫游日志行为相结合,具体取决于挂载时选择的事务模型。

其他文件系统提供有序模式日志,它仅记录元数据。虽然所有日志记录都将在崩溃后将文件系统恢复到有效状态,但数据模式日志提供了最大的保护,防止损坏和数据丢失。然而,系统性能会受到影响,因为数据模式日志执行两次写入操作:首先写入日志,然后写入磁盘(Reiser4 通过其“漫游日志”功能避免了这种情况)。在选择文件系统类型时,应考虑系统速度和数据安全性之间的权衡。Reiser4 是唯一一个设计上以完全原子性运行的文件系统,并且还为元数据和内联数据提供校验和(操作完全发生,或者完全不发生,并且不会由于操作半发生而损坏或破坏数据),因此在设计上比其他文件系统(如 Btrfs)更不容易丢失数据。

基于写入时复制(也称为 write-anywhere)的文件系统,例如 Reiser4、Btrfs、Bcachefs 和 ZFS,无需使用传统日志来保护元数据,因为它们永远不会就地更新。尽管 Btrfs 仍然有一个类似日志的日志树,但它仅用于加速 fdatasync/fsync。

基于 FUSE 的文件系统

参见 FUSE

堆叠文件系统

  • eCryptfs — 企业加密文件系统是一个用于 Linux 的磁盘加密软件包。它被实现为符合 POSIX 标准的文件系统级加密层,旨在提供类似于 GnuPG 在操作系统级别的功能。
https://ecryptfs.org || ecryptfs-utils
  • mergerfs — 基于 FUSE 的联合文件系统。
https://github.com/trapexit/mergerfs || mergerfsAUR
  • mhddfs — Multi-HDD FUSE 文件系统,基于 FUSE 的联合文件系统。
http://mhddfs.uvw.ru || mhddfsAUR
  • overlayfs — OverlayFS 是 Linux 的文件系统服务,它为其他文件系统实现联合挂载。
https://docs.linuxkernel.org.cn/filesystems/overlayfs.html || linux
  • unionfs-fuse — 用户空间 Unionfs 实现。
https://github.com/rpodgorny/unionfs-fuse || unionfs-fuseAUR

只读文件系统

  • EROFS — Enhanced Read-Only File System 是一种轻量级的只读文件系统,旨在提高性能和压缩存储容量。
https://erofs.docs.kernel.org/ || erofs-utils
  • SquashFS — SquashFS 是一种压缩的只读文件系统。SquashFS 压缩文件、inode 和目录,并支持高达 1 MiB 的块大小以获得更高的压缩率。
https://github.com/plougher/squashfs-tools || squashfs-tools

集群文件系统

  • BeeGFS — 一种并行文件系统,为高性能计算开发和优化。
https://www.beegfs.io/c/ || beegfs-clientAUR
  • Ceph — 统一的分布式存储系统,专为卓越的性能、可靠性和可扩展性而设计。
https://ceph.com/ || cephAUR
  • Glusterfs — 可扩展到数 PB 的集群文件系统。
https://www.gluster.org/ || glusterfs
  • IPFS — 一种点对点超媒体协议,旨在使网络更快、更安全、更开放。IPFS 旨在取代 HTTP,为我们所有人构建更好的网络。使用块来存储文件的各个部分,每个网络节点仅存储其感兴趣的内容,提供重复数据删除、分发,可扩展系统仅受用户限制。(目前处于 alpha 阶段)
https://ipfs.io/ || kubo
  • MinIO — MinIO 提供高性能、与 S3 兼容的对象存储。
https://min-io.cn || minio
  • MooseFS — MooseFS 是一种容错、高可用性和高性能横向扩展网络分布式文件系统。
https://moosefs.com || moosefs
  • OpenAFS — AFS 分布式文件系统的开源实现
https://www.openafs.org || openafsAUR
  • OrangeFS — OrangeFS 是一种横向扩展网络文件系统,旨在透明地并行访问基于多服务器的磁盘存储。针对并行和分布式应用程序优化了 MPI-IO 支持。简化了并行存储的使用,不仅适用于 Linux 客户端,还适用于 Windows、Hadoop 和 WebDAV。与 POSIX 兼容。自 4.6 版本以来成为 Linux 内核的一部分。
https://www.orangefs.org/ || 未打包? 在 AUR 中搜索
  • Sheepdog — 用于卷和容器服务的分布式对象存储系统,智能地管理磁盘和节点。
https://sheepdog.github.io/sheepdog/ || sheepdogAUR
  • Tahoe-LAFS — Tahoe Least-Authority File Store 是一个免费开源、安全、去中心化、容错、点对点分布式数据存储和分布式文件系统。
https://tahoe-lafs.org/ || tahoe-lafsAUR

共享磁盘文件系统

  • GFS2 — GFS2 允许集群的所有成员直接并发访问同一共享块存储
https://pagure.io/gfs2-utils || gfs2-utilsAUR
  • OCFS2 — Oracle Cluster File System (版本 2) 是 Oracle 公司开发的共享磁盘文件系统,并根据 GNU 通用公共许可证发布
https://oss.oracle.com/projects/ocfs2/ || ocfs2-toolsAUR
  • VMware VMFS — VMware 的 VMFS (Virtual Machine File System) 由该公司旗舰服务器虚拟化套件 vSphere 使用。
https://core.vmware.com/resource/vmware-vsphere-vmfs || vmfs-toolsAUR

识别现有文件系统

要识别现有文件系统,可以使用 lsblk

$ lsblk -f
NAME   FSTYPE LABEL     UUID                                 MOUNTPOINT
sdb
└─sdb1 vfat   Transcend 4A3C-A9E9

如果存在现有文件系统,则将在 FSTYPE 列中显示。如果 已挂载,它将出现在 MOUNTPOINT 列中。

创建文件系统

文件系统通常在 分区、逻辑容器(如 LVMRAIDdm-crypt)内或常规文件(请参阅 Wikipedia:环回设备)上创建。本节描述分区情况。

注意: 文件系统可以直接写入磁盘,称为超级软盘无分区磁盘。此方法涉及某些限制,特别是如果从这样的驱动器启动。有关示例,请参阅 Btrfs#无分区 Btrfs 磁盘
警告
  • 创建新文件系统后,以前存储在此分区上的数据不太可能恢复。创建要保留的任何数据的备份
  • 给定分区的用途可能会限制文件系统的选择。例如,EFI 系统分区必须包含 FAT32 文件系统,并且包含 /boot 目录的文件系统必须受 引导加载程序 支持。

在继续之前,识别将在其中创建文件系统的设备,以及它是否已挂载。例如

$ lsblk -f
NAME   FSTYPE   LABEL       UUID                                 MOUNTPOINT
sda
├─sda1                      C4DA-2C4D
├─sda2 ext4                 5b1564b2-2e2c-452c-bcfa-d1f572ae99f2 /mnt
└─sda3                      56adc99b-a61e-46af-aab7-a6d07e504652

已挂载的文件系统必须在继续之前卸载。在上面的示例中,现有文件系统位于 /dev/sda2 上,并挂载在 /mnt。可以使用以下命令卸载它

# umount /dev/sda2

要查找仅已挂载的文件系统,请参阅 #列出已挂载的文件系统

要创建新文件系统,请使用 mkfs(8)。有关确切类型以及您可能希望为特定文件系统安装的用户空间实用程序,请参阅 #文件系统类型

例如,要在 /dev/sda1 上创建类型为 ext4(Linux 数据分区的常用类型)的新文件系统,请运行

# mkfs.ext4 /dev/sda1
提示
  • 使用 mkfs.ext4-L 标志来指定 文件系统标签e2label 可用于更改现有文件系统上的标签。
  • 文件系统可以在创建后调整大小,但有一定的限制。例如,XFS 文件系统的大小可以增加,但不能缩小。有关详细信息,请参阅 Wikipedia:文件系统比较#调整大小功能 和相应的文件系统文档。

现在可以将新文件系统挂载到所选目录。

挂载文件系统

要手动将设备(例如,分区)上的文件系统挂载到目录,请使用 mount(8)。此示例将 /dev/sda1 挂载到 /mnt

# mount /dev/sda1 /mnt

这会将 /dev/sda1 上的文件系统附加到目录 /mnt,使文件系统的内容可见。在此操作之前 /mnt 中存在的任何数据都将变得不可见,直到设备被卸载。

fstab 包含有关如果设备存在应如何自动挂载的信息。有关如何修改此行为的更多信息,请参阅 fstab 文章。

如果在 /etc/fstab 中指定了设备,并且命令行上仅给出了设备或挂载点,则该信息将用于挂载。例如,如果 /etc/fstab 包含一行指示 /dev/sda1 应挂载到 /mnt,则以下命令将自动将设备挂载到该位置

# mount /dev/sda1

# mount /mnt

mount 包含多个选项,其中许多选项取决于指定的文件系统。可以通过以下方式更改选项

  • 使用 mount 命令行上的标志
  • 编辑 fstab
  • 创建 udev 规则
  • 自行编译内核
  • 或使用特定于文件系统的挂载脚本(位于 /usr/bin/mount.*)。

有关更多信息,请参阅这些相关文章和感兴趣的文件系统的文章。

提示
  • 也可以使用 systemd-mount 而不是 mount 来挂载文件系统。如果未指定挂载点,文件系统将挂载在 /run/media/system/device_identifier/。这允许轻松挂载文件系统,而无需决定将其挂载到何处。有关用法和更多详细信息,请参阅 systemd-mount(1)
  • 要以普通用户身份挂载文件系统,请参阅 udisks#用法。这也允许在没有 root 权限、完整图形环境或利用 udisks 的文件管理器的情况下进行挂载。

列出已挂载的文件系统

要列出所有已挂载的文件系统,请使用 findmnt(8)

$ findmnt

findmnt 接受各种参数,可以过滤输出并显示其他信息。例如,它可以将设备或挂载点作为参数,以仅显示指定内容的信息

$ findmnt /dev/sda1

findmnt/etc/fstab/etc/mtab/proc/self/mounts 收集信息。

卸载文件系统

要卸载文件系统,请使用 umount(8)。可以指定包含文件系统的设备(例如,/dev/sda1)或挂载点(例如,/mnt

# umount /dev/sda1

# umount /mnt

故障排除

“linux Structure needs cleaning”

卸载文件系统并在有问题的卷上运行 fsck

参见