文件系统
出自 Wikipedia
- 在计算机科学中,文件系统或文件系统控制着数据的存储和检索方式。如果没有文件系统,存储介质中的信息将是一个庞大的数据体,无法分辨信息的起始和结束位置。通过将数据分成小块并为每块数据命名,信息可以被轻松地隔离和识别。文件系统得名于纸质信息系统的命名方式,每组数据被称为“文件”。用于管理信息组及其名称的结构和逻辑规则被称为“文件系统”。
可以使用许多不同的可用文件系统来设置单个驱动器分区。每种文件系统都有其自身的优点、缺点和独特的特性。以下是对支持的文件系统的简要概述;链接指向 Wikipedia 页面,其中提供了更多信息。
文件系统类型
请参阅 filesystems(5) 以获得一般概述,以及 Wikipedia:文件系统比较 以获得详细的功能比较。内核已加载或内置的文件系统列在 /proc/filesystems
中,而所有已安装的模块可以使用 ls /lib/modules/$(uname -r)/kernel/fs
查看。
文件系统 | 创建命令 | 内核补丁集 | 用户空间实用程序 | 备注 |
---|---|---|---|---|
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 的默认值,但具有根本不同的“树”设计),以及一种称为 hybrid 的组合方法,该方法启发式地在两者之间交替。
其他文件系统提供有序模式日志,该模式仅记录元数据。虽然所有日志功能都将在崩溃后将文件系统恢复到有效状态,但数据模式日志提供了防止损坏和数据丢失的最大保护。然而,系统性能方面有所妥协,因为数据模式日志执行两次写入操作:首先写入日志,然后写入磁盘(Reiser4 通过其“漫游日志”功能避免了这种情况)。在选择文件系统类型时,应考虑系统速度和数据安全之间的权衡。Reiser4 是唯一一种通过设计以完全原子性运行的文件系统,并且还为元数据和内联数据提供校验和(操作完全发生,或者完全不发生,并且不会由于操作半发生而损坏或破坏数据),因此从设计上来说,比 Btrfs 等其他文件系统更不易发生数据丢失。
基于写时复制(也称为 write-anywhere)的文件系统,例如 Reiser4、Btrfs、Bcachefs 和 ZFS,无需使用传统日志来保护元数据,因为它们永远不会就地更新。虽然 Btrfs 仍然有一个类似日志的日志树,但它仅用于加速 fdatasync/fsync。
基于 FUSE 的文件系统
参见 FUSE。
堆叠式文件系统
- eCryptfs — 企业加密文件系统是一个用于 Linux 的磁盘加密软件包。它被实现为符合 POSIX 的文件系统级加密层,旨在提供类似于操作系统级别的 GnuPG 的功能。
- mergerfs — 基于 FUSE 的联合文件系统。
- mhddfs — 多 HDD FUSE 文件系统,基于 FUSE 的联合文件系统。
- http://mhddfs.uvw.ru || mhddfsAUR
- overlayfs — OverlayFS 是 Linux 的文件系统服务,它为其他文件系统实现联合挂载。
- unionfs-fuse — 用户空间 Unionfs 实现。
只读文件系统
- EROFS — 增强型只读文件系统是一种轻量级只读文件系统,旨在提高性能并压缩存储容量。
- SquashFS — SquashFS 是一种压缩的只读文件系统。SquashFS 压缩文件、inode 和目录,并支持高达 1 MiB 的块大小以实现更高的压缩率。
集群文件系统
- BeeGFS — 一种并行文件系统,为高性能计算开发和优化。
- Ceph — 统一的分布式存储系统,旨在实现卓越的性能、可靠性和可扩展性。
- https://ceph.com/ || cephAUR
- Glusterfs — 能够扩展到数 PB 的集群文件系统。
- IPFS — 一种点对点超媒体协议,旨在使网络更快、更安全、更开放。IPFS 旨在取代 HTTP,为我们所有人构建更好的网络。使用块来存储文件的各个部分,每个网络节点仅存储其感兴趣的内容,提供重复数据删除、分发、可扩展系统,仅受用户限制。(目前处于 alpha 阶段)
- MinIO — MinIO 提供高性能、S3 兼容的对象存储。
- MooseFS — MooseFS 是一种容错、高可用性和高性能横向扩展网络分布式文件系统。
- OpenAFS — AFS 分布式文件系统的开源实现
- OrangeFS — OrangeFS 是一种横向扩展网络文件系统,旨在透明地并行访问基于多服务器的磁盘存储。具有针对并行和分布式应用程序优化的 MPI-IO 支持。简化了并行存储的使用,不仅适用于 Linux 客户端,还适用于 Windows、Hadoop 和 WebDAV。兼容 POSIX。自 4.6 版本以来成为 Linux 内核的一部分。
- https://www.orangefs.org/ || 未打包? 在 AUR 中搜索
- Sheepdog — 用于卷和容器服务的分布式对象存储系统,并智能地管理磁盘和节点。
- Tahoe-LAFS — Tahoe Least-Authority File Store 是一种免费且开放、安全、去中心化、容错、点对点分布式数据存储和分布式文件系统。
- GFS2 — GFS2 允许集群的所有成员直接并发访问相同的共享块存储
- OCFS2 — Oracle 集群文件系统(版本 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)内部,或在常规文件上创建(请参阅 Wikipedia:Loop device)。本节描述分区的情况。
在继续之前,请识别设备将在其上创建文件系统的设备,以及它是否已挂载。例如
$ 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 包含多个选项,其中许多选项取决于指定的文件系统。可以通过以下方式更改选项
有关更多信息,请参阅这些相关文章和感兴趣的文件系统的文章。
- 文件系统也可以使用 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