跳转至内容

文件系统

来自 ArchWiki
(重定向自 Mount)

摘自 维基百科

在计算领域,文件系统(file system 或 filesystem)控制着数据的存储和检索方式。如果没有文件系统,放置在存储介质中的信息将是一个巨大的数据体,无法区分一段信息的结束和下一段信息的开始。通过将数据分成碎片并给每个碎片一个名称,信息就可以轻松地被隔离和识别。取名自纸质信息系统的命名方式,每组数据被称为一个“文件”。用于管理信息组及其名称的结构和逻辑规则被称为“文件系统”。

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

文件系统类型

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

树内和 FUSE 文件系统
文件系统 创建命令 用户空间工具 Archiso [1] 内核文档 [2] 备注
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 不适用(基于 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
JFFS2 mkfs.jffs2(1) mtd-utils
NILFS2 mkfs.nilfs2(8) nilfs-utils nilfs2.html 主要用于基于闪存的设备。不支持 xattrsACL
NTFS ntfs3.html Windows NT 文件系统。新驱动,自 Linux 5.15 起可用。
mkfs.ntfs(8) ntfs-3g 不适用(基于 FUSE) 具有扩展功能的 FUSE 驱动程序。
ReiserFS mkfs.reiserfs(8) reiserfsprogsAUR 自 Linux 5.18 起弃用,并 在 Linux 6.13 中移除
UDF mkfs.udf(8) udftools udf.html 用于光盘镜像和 DVD/蓝光光盘的 ISO/IEC 13346 文件系统。
XFS mkfs.xfs(8) xfsprogs

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

不支持缩小容量
树外文件系统
文件系统 创建命令 内核补丁集 用户空间工具 备注
Bcachefs bcachefs format bcachefs-dkms bcachefs-tools 已于 6.18 从内核中移除
APFS mkapfs(8) linux-apfs-rw-dkms apfsprogs macOS (10.13 及更新版本) 文件系统。只读,实验性写入支持。另见 apfs-fuse-gitAUR FUSE 版本。
Reiser4 mkfs.reiser4(8) reiser4progsAUR
ZFS zfs-linuxAUR, zfs-dkmsAUR zfs-utilsAUR OpenZFS 移植版

日志

ext3/4, HFS+, JFS, NTFS, ReiserFS, 和 XFS 文件系统使用日志 (journaling)。日志通过在更改提交到文件系统之前记录更改来提供容错能力。在系统崩溃或断电的情况下,此类文件系统能够更快地重新上线,并且不太可能发生损坏。日志记录发生在文件系统的专用区域中。

ext3/4 提供数据模式日志,除了元数据外,还可以选择记录数据。数据模式日志会带来速度损失,因为它执行两次写操作:先写入日志,然后写入磁盘。因此,数据模式日志默认不启用。在选择文件系统类型和功能时,应考虑系统速度与数据安全之间的权衡。

同样,Reiser4 提供可配置的 “事务模型”:一种称为 wandering logs 的特殊模型,它消除了向磁盘写入两次的需要;write-anywhere,一种纯粹的写时复制(copy-on-write)方法;以及一种称为 hybrid 的组合方法,它根据启发式算法在两者之间交替。

基于写时复制(也称为 write-anywhere)的文件系统,如 Reiser4、Btrfs、Bcachefs 和 ZFS,在设计上实现了完全的原子性,并为元数据和内联数据提供校验和(操作要么完全发生,要么完全不发生,在正常工作的硬件上,数据不会因为操作只发生了一半而损坏)。因此,这些文件系统在设计上比其他文件系统更不容易丢失数据,并且不需要使用传统日志来保护元数据,因为它们永远不会在原位更新。虽然 Btrfs 仍然有一个类似于日志的日志树,但它仅用于加速 fdatasync/fsync。

FAT、exFAT、ext2 和 HFS 既不提供日志也不提供原子性。它们用于临时或旧系统用途,在需要可靠存储时不建议使用。

基于 FUSE 的文件系统

参见 FUSE

可堆叠文件系统

  • eCryptfs — 企业级加密文件系统是 Linux 的磁盘加密软件方案。它被实现为符合 POSIX 标准的文件系统级加密层,旨在操作系统级别提供类似于 GnuPG 的功能。
https://ecryptfs.org || ecryptfs-utils
  • mergerfs — 一个基于 FUSE 的联合(union)文件系统。
https://github.com/trapexit/mergerfs || mergerfsAUR
  • mhddfs — 多硬盘 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

只读文件系统

  • DwarFS — DwarFS 是一个用于 Linux 和 Windows 的快速高压缩率只读文件系统。DwarFS 大致支持与 SquashFS 相同的功能,但压缩效果更好,且具有可配置的哈希算法。
https://github.com/mhx/dwarfs || dwarfsAUR
  • 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.net.cn/ || cephAUR
  • Glusterfs — 能够扩展到数 PB 级别的集群文件系统。
https://www.gluster.org/ || glusterfs
  • IPFS — 一种点对点超媒体协议,旨在使网络更快、更安全、更开放。IPFS 旨在取代 HTTP 并为我们所有人构建更好的网络。使用块来存储文件的一部分,每个网络节点仅存储其感兴趣的内容,提供去重、分发,以及仅受用户限制的可扩展系统。(目前处于 Alpha 阶段)
https://ipfs.io/ || kubo
  • MinIO — MinIO 提供高性能、兼容 S3 的对象存储。
https://min-io.cn || minioAUR
  • 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

共享磁盘文件系统

  • 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 (虚拟机文件系统) 用于该公司的旗舰服务器虚拟化套件 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 等逻辑容器内部,又或者是创建在常规文件上(见 维基百科:回环设备)。本节描述分区的情况。

注意: 文件系统可以直接写入磁盘,这被称为 superfloppy无分区磁盘。这种方法存在某些限制,尤其是从驱动器 启动 时。示例请参见 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 文件系统的容量可以增加,但不能缩小。详情请参阅 维基百科:文件系统对比#容量调整能力 以及各自的文件系统文档。

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

挂载文件系统

要手动将位于设备(例如分区)上的文件系统挂载到目录,请使用 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

参见