文件系统 - Arch Linux 中文维基

跳转到内容

# 文件系统

来自 Arch Linux 中文维基
翻译状态：

- 本文（或部分内容）译自 File systems，最近一次同步于 2025-10-23，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

相关文章

- 分区
- 设备文件#lsblk
- 文件权限与属性
- fsck
- fstab
- 应用程序列表/工具#挂载工具
- QEMU#挂载 raw 镜像内的分区
- udev
- udisks
- umask
- USB 存储设备

根据维基百科：

  在计算机体系中，文件系统负责控制如何存放和读取数据。如果没有文件系统，存储介质中的数据就会完全混在一起，无法进行区分。通过把数据分块和命名，不同的信息就可以被隔离和区分。将各组数据命名为“文件”是取自纸质信息系统的命名方式，而“文件系统”是指用于管理信息的分组和命名的结构和逻辑规则。

文件系统有很多种，每个硬盘分区可以且仅可使用其中的一种。每种文件系统有自己的优缺点和独有特性。以下内容是目前所支持的文件系统类型的概述，相应的链接会提供更加详细的信息。

## 文件系统类型

filesystems(5) 包含一个简单介绍，详细比较请参考 zhwp:文件系统的对比。内核已经加载和内置的文件系统可以通过 `/proc/filesystems` 查看。通过 `ls /lib/modules/$(uname -r)/kernel/fs` 可以查看所有已安装的内核模块。

内核树内和 FUSE 文件系统
文件系统 | 创建命令 | 用户空间工具 | Archiso [1] | 内核文档 [2] | 说明
--- | --- | --- | --- | --- | ---
Bcachefs | bcachefs(8) | bcachefs-tools包 | 是 | [3] | Linux 6.7+ 版本可用，实验性
Btrfs | mkfs.btrfs(8) | btrfs-progs包 | 是 | btrfs.html | 可靠性
VFAT | mkfs.fat(8) | dosfstools包 | 是 | vfat.html | Windows 9x 的文件系统，常用于 U 盘和 SD 卡。
exFAT | mkfs.exfat(8) | exfatprogs包 | 是 |  | 从 Linux 内核 5.4 [4] 开始，内核原生支持该文件系统。常用于 U 盘和 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 | 设计用在基于闪存的设备上，不支持 xattrs 和 ACL。
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 | 用于光盘映像，DVD 和蓝光盘的 ISO/IEC 13346 文件系统。
XFS | mkfs.xfs(8) | xfsprogs包 | 是 | xfs.html xfs-delayed-logging-design.html xfs-self-describing-metadata.html | 无法缩容

代码在单独仓库的文件系统
文件系统 | 创建命令 | 内核补丁 | 用户空间工具 | 说明
--- | --- | --- | --- | ---
APFS | mkapfs(8) | linux-apfs-rw-dkms包 | apfsprogs包 | macOS（10.13 及更新版本）的文件系统。只读，并带有实验性的写入支持。另外也请参考 FUSE 版的 apfs-fuse-gitAUR。
Reiser4 | mkfs.reiser4(8) |  | reiser4progsAUR |
ZFS |  | zfs-linuxAUR, zfs-dkmsAUR | zfs-utilsAUR | OpenZFS 移植

### 文件系统日志

ext3/4，HFS+，JFS，NTFS，ReiserFS 和 XFS 文件系统都使用文件系统日志。文件系统日志通过在数据更改写入储存设备前，把变更写入日志来提供故障恢复能力。当出现系统崩溃或电源故障的时候，这些文件系统能够更快的恢复到可用状态，并且在恢复过程中更不容易出现错误。日志活动在文件系统中专用的一部分空间里进行。

ext3/4 还可以记录数据日志（data-mode journaling），可以除元数据外额外记录数据本身。由于需要进行两次写入，该模式的速度损耗较大：首先需要写入日志，然后再将数据写入硬盘。因此，该模式默认不启用。在选择文件系统和功能时，必须考虑系统速度和数据安全性之间的平衡。

与之类似，Reiser4 提供了可配置的“事务模型”（transaction models）：一种被称为 wandering logs，使得无需两次写入硬盘；另一种被称为 write-anywhere，纯粹是是写时复制（copy-on-write）的实现；还有一种被称为 hybrid，可以智能地在前两种间进行切换。

类似 Reiser4，Btrfs，Bcachefs 和 ZFS 等基于写时复制（copy-on-write，又被称作 write-anywhere）的文件系统，其运行方式在设计上是完全原子化的，并为元数据和内联数据都提供了校验和（效果为操作只存在“完成”和“未发生”两种状态，在正常硬件上不会因操作卡在一半而导致数据损坏）。因此，这一类文件系统在设计上就相对不易发生数据丢失，且由于数据永远不会被就地更新，它们也不需要使用传统的日志来保护元数据。虽然 Btrfs 还在使用日志树，但这个树仅仅是为了加快 fdatasync/fsync 的速度。

FAT，exFAT，ext2 和 HFS 既不提供日志，也不具备原子性，因此只建议用于临时或是旧设备兼容上，不建议用于需要存储可靠性的情况。

### 基于 FUSE 的文件系统

参考 FUSE。

### 堆栈式文件系统

- eCryptfs — 企业级加密文件系统，这是一个 Linux 平台上的硬盘加密软件包。它被设计为与 POSIX 兼容的文件系统级加密层，目标是在操作系统级别提供类似 GnuPG 的功能。

  https://ecryptfs.org || ecryptfs-utils包

- mergerfs — 基于 FUSE 的联合文件系统。

  https://github.com/trapexit/mergerfs || mergerfsAUR

- mhddfs — 多机械硬盘 FUSE 文件系统，是基于 FUSE 的联合文件系统。

  http://mhddfs.uvw.ru || mhddfsAUR

- overlayfs — OverlayFS 是为 Linux 设计的文件系统服务，为其它文件系统实现了联合挂载的功能。

  https://docs.kernel.org/filesystems/overlayfs.html || linux包

- unionfs-fuse — Unionfs 的用户空间实现。

  https://github.com/rpodgorny/unionfs-fuse || unionfs-fuseAUR

### 只读文件系统

- DwarFS — DwarFS is a fast high compression read-only file system for Linux and Windows. DwarFS more or less supports the same features as SquashFS, but is able to compress better, and has configurable hash algorithm.

  https://github.com/mhx/dwarfs || dwarfsAUR

- EROFS — Enhanced Read-Only File System is a lightweight read-only file system, it aims to improve performance and compress storage capacity.

  https://erofs.docs.kernel.org/ || erofs-utils包

- SquashFS — SquashFS 是一个压缩的只读文件系统，它会压缩文件、inodes 和目录，而且最高支持 1 MiB 的块大小来实现更强力的压缩。

  https://github.com/plougher/squashfs-tools || squashfs-tools包

### 集群文件系统

- BeeGFS — A parallel file system, developed and optimized for high-performance computing.

  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 offers high-performance, S3 compatible object storage.

  https://min.io || minio包

- MooseFS — MooseFS 是一个容错、高可用性和高性能的向外扩展的网络分布式文件系统。

  https://moosefs.com || moosefs包

- OpenAFS — AFS 分布式文件系统的开源实现

  https://www.openafs.org || openafsAUR

- OrangeFS — OrangeFS 是一个向外扩展的网络文件系统，为透明、并行地访问基于多个服务器的硬盘储存而设计。它为并行分布式应用提供了优化的 MPI-IO。它使 Linux 客户端、Windows、Hadoop 和 WebDAV 使用存储集群变得更为简便。它与 POSIX 兼容，而且是 Linux 内核（4.6+）的一部分。

  https://www.orangefs.org/ || 未被打包？在 AUR 里搜索

- Sheepdog — 用于卷和容器服务的分布式对象存储系统，能智能地管理硬盘和节点。

  https://sheepdog.github.io/sheepdog/ || sheepdogAUR

### 共享硬盘文件系统

- GFS2 — GFS2 allows all members of a cluster to have direct concurrent access to the same shared block storage

  https://pagure.io/gfs2-utils || gfs2-utilsAUR

- OCFS2 — The Oracle Cluster File System (version 2) is a shared disk file system developed by Oracle Corporation and released under the GNU General Public License

  https://oss.oracle.com/projects/ocfs2/ || ocfs2-toolsAUR

- VMware VMFS — VMware's VMFS (Virtual Machine File System) is used by the company's flagship server virtualization suite, 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` 那一列。

## 创建文件系统

文件系统可以被创建在一个分区上，逻辑容器（如 LVM，RAID，或是 dm-crypt）上，或是普通文件上（参考 Loop 设备)。下文将描述创建在分区上的情况。

注意：文件系统可以直接被写入到硬盘上，这样的设备叫做 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 可用来修改现有文件系统的标签。
- 文件系统在创建之后是有条件地 改变大小（resized）的。比如 XFS 可以扩容，但是不能缩小。参考 Resize capabilities。
- 在创建文件系统后或许可以调整大小，但会有一定限制。例如 XFS 可以扩容，但是不能缩小。具体请参考 Wikipedia:Comparison of file systems#Resize capabilities 和对应文件系统的文档。

创建完成后就可以将新文件系统挂载到目录了。

## 挂载文件系统

如果要手动挂载一个设备（例如分区）上的文件系统到某个目录，需使用 mount(8)。下面这个例子将把 `/dev/sda1` 挂载到 `/mnt`：

    # mount /dev/sda1 /mnt

挂载之后，在 `/mnt` 下面就能看见 `/dev/sda1` 里的内容。在卸载设备前，`/mnt` 文件夹里挂载前的内容将会变得不可见。

fstab 描述了如果某个设备存在的话系统应该怎么自动挂载它，相关修改方法请参考 fstab。

如果 `/etc/fstab` 里描述了一个设备的挂载参数，而用 `mount` 时只给了设备名字或者挂载点，这时就会用 fstab 里的参数自动补全。比如，`/etc/fstab` 里指示 `/dev/sda1` 应该挂载到 `/mnt`，那下面的命令就会把 `/dev/sda1` 挂载到 `/mnt`，即使你没有显式指明：

    # mount /dev/sda1

或者

    # mount /mnt

mount 接受很多参数，这些参数依赖于文件系统是否支持。要改变这些参数的话，可以通过以下形式：

- `mount ... ... -o options`
- 修改 fstab
- 创建 udev 规则
- 自己编译内核
- 使用针对不同文件系统的 mount 脚本（`/usr/bin/mount.*`）

更多信息请参考相关文件系统的页面。

提示：

- 除了 mount 外，还可以使用 systemd-mount 进行挂载。如果没有指定挂载点，那么文件系统会被挂载到 `/run/media/system/device_identifier/`，这样就不用考虑具体要挂载到哪了。具体用法等信息请参考 systemd-mount(1)。
- 如果需要以普通用户身份挂载文件系统，请参考 udisks#使用。这将使得无需图形环境或调用 udisk 的文件管理器就能免根用户权限进行挂载。

### 列出挂载的文件系统

使用 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。

## 参阅

- filesystems(5)
- systemd-mount(1)
- Linux 支持的文件系统
- zhwp:文件系统
- zhwp:mount (Unix)

分类：​

- 文件系统
- 列表
- Pages with missing package links

文件系统
添加话题