跳转到内容

文件系统

来自 Arch Linux 中文维基

根据维基百科

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

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

文件系统类型

[编辑 | 编辑源代码]

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 设计用在基于闪存的设备上,不支持 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 用于光盘映像,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-gitAUR apfsprogs-gitAUR 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 那一列。

创建文件系统

[编辑 | 编辑源代码]

文件系统可以被创建在一个分区上,逻辑容器(如 LVMRAID,或是 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 外,还可以使用 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

参阅

[编辑 | 编辑源代码]