文件系统
摘自 维基百科
- 在计算领域,文件系统(file system 或 filesystem)控制着数据的存储和检索方式。如果没有文件系统,放置在存储介质中的信息将是一个巨大的数据体,无法区分一段信息的结束和下一段信息的开始。通过将数据分成碎片并给每个碎片一个名称,信息就可以轻松地被隔离和识别。取名自纸质信息系统的命名方式,每组数据被称为一个“文件”。用于管理信息组及其名称的结构和逻辑规则被称为“文件系统”。
可以使用许多不同的可用文件系统之一来设置单个驱动器分区。每种文件系统都有其自身的优点、缺点和独特的特性。以下是支持的文件系统的简要概述;链接指向提供更多信息的维基百科页面。
文件系统类型
请参阅 filesystems(5) 获取概览,以及 Wikipedia:文件系统对比 获取详细的功能比较。内核已加载或内置的文件系统列在 /proc/filesystems 中,而所有已安装的模块可以通过 ls /lib/modules/$(uname -r)/kernel/fs 查看。
| 文件系统 | 创建命令 | 内核补丁集 | 用户空间工具 | 备注 |
|---|---|---|---|---|
| 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 的功能。
- mergerfs — 一个基于 FUSE 的联合(union)文件系统。
- mhddfs — 多硬盘 FUSE 文件系统,一个基于 FUSE 的联合文件系统。
- http://mhddfs.uvw.ru || mhddfsAUR
- overlayfs — OverlayFS 是 Linux 的一种文件系统服务,它为其他文件系统实现联合挂载。
- unionfs-fuse — 用户空间 Unionfs 实现。
只读文件系统
- DwarFS — DwarFS 是一个用于 Linux 和 Windows 的快速高压缩率只读文件系统。DwarFS 大致支持与 SquashFS 相同的功能,但压缩效果更好,且具有可配置的哈希算法。
- EROFS — Enhanced Read-Only File System(增强型只读文件系统)是一个轻量级只读文件系统,旨在提高性能并压缩存储容量。
- SquashFS — SquashFS 是一个压缩只读文件系统。SquashFS 压缩文件、inode 和目录,并支持高达 1 MiB 的块大小以实现更高的压缩率。
集群文件系统
- BeeGFS — 并行文件系统,专为高性能计算开发和优化。
- Ceph — 统一的分布式存储系统,旨在提供卓越的性能、可靠性和可扩展性。
- https://ceph.net.cn/ || cephAUR
- Glusterfs — 能够扩展到数 PB 级别的集群文件系统。
- IPFS — 一种点对点超媒体协议,旨在使网络更快、更安全、更开放。IPFS 旨在取代 HTTP 并为我们所有人构建更好的网络。使用块来存储文件的一部分,每个网络节点仅存储其感兴趣的内容,提供去重、分发,以及仅受用户限制的可扩展系统。(目前处于 Alpha 阶段)
- MinIO — MinIO 提供高性能、兼容 S3 的对象存储。
- https://min-io.cn || minioAUR
- MooseFS — MooseFS 是一个容错、高可用且高性能的可扩展网络分布式文件系统。
- OpenAFS — AFS 分布式文件系统的开源实现
- OrangeFS — OrangeFS 是一种可扩展的网络文件系统,旨在透明地并行访问基于多服务器的磁盘存储。具有针对并行和分布式应用程序优化的 MPI-IO 支持。不仅简化了 Linux 客户端的并行存储使用,还简化了 Windows、Hadoop 和 WebDAV 的使用。兼容 POSIX。自 4.6 版本起作为 Linux 内核的一部分。
- https://www.orangefs.org/ || 未打包? 在 AUR 中搜索
- Sheepdog — 分布式对象存储系统,用于卷和容器服务,并智能管理磁盘和节点。
共享磁盘文件系统
- GFS2 — GFS2 允许集群的所有成员直接并发访问同一个共享块存储
- OCFS2 — Oracle Cluster File System (第 2 版) 是由 Oracle 公司开发并根据 GNU 通用公共许可证发布的共享磁盘文件系统
- VMware VMFS — VMware 的 VMFS (虚拟机文件系统) 用于该公司的旗舰服务器虚拟化套件 vSphere。
识别现有文件系统
要识别现有的文件系统,可以使用 lsblk
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT sdb └─sdb1 vfat Transcend 4A3C-A9E9
如果存在现有文件系统,它将显示在 FSTYPE 列中。如果已挂载,它将出现在 MOUNTPOINT 列中。
创建文件系统
文件系统通常创建在分区上,或是在 LVM、RAID 和 dm-crypt 等逻辑容器内部,又或者是创建在常规文件上(见 维基百科:回环设备)。本节描述分区的情况。
在继续之前,请先 识别设备,确定文件系统将要创建的位置以及它是否已被挂载。例如:
$ 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 包含多个选项,其中许多取决于指定的文件系统。可以通过以下方式更改选项:
欲了解更多信息,请参阅这些相关文章以及感兴趣的文件系统的专门文章。
- 文件系统也可以使用 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