文件系统
根据维基百科:
- 在计算机体系中,文件系统负责控制如何存放和读取数据。如果没有文件系统,存储介质中的数据就会完全混在一起,无法进行区分。通过把数据分块和命名,不同的信息就可以被隔离和区分。将各组数据命名为“文件”是取自纸质信息系统的命名方式,而“文件系统”是指用于管理信息的分组和命名的结构和逻辑规则。
文件系统有很多种,每个硬盘分区可以且仅可使用其中的一种。每种文件系统有自己的优缺点和独有特性。以下内容是目前所支持的文件系统类型的概述,相应的链接会提供更加详细的信息。
filesystems(5) 包含一个简单介绍,详细比较请参考 zhwp:文件系统的对比。内核已经加载和内置的文件系统可以通过 /proc/filesystems 查看。通过 ls /lib/modules/$(uname -r)/kernel/fs 可以查看所有已安装的内核模块。
| 文件系统 | 创建命令 | 内核补丁 | 用户空间工具 | 说明 |
|---|---|---|---|---|
| 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。
- eCryptfs — 企业级加密文件系统,这是一个 Linux 平台上的硬盘加密软件包。它被设计为与 POSIX 兼容的文件系统级加密层,目标是在操作系统级别提供类似 GnuPG 的功能。
- mergerfs — 基于 FUSE 的联合文件系统。
- mhddfs — 多机械硬盘 FUSE 文件系统,是基于 FUSE 的联合文件系统。
- http://mhddfs.uvw.ru || mhddfsAUR
- overlayfs — OverlayFS 是为 Linux 设计的文件系统服务,为其它文件系统实现了联合挂载的功能。
- unionfs-fuse — Unionfs 的用户空间实现。
- 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.
- EROFS — Enhanced Read-Only File System is a lightweight read-only file system, it aims to improve performance and compress storage capacity.
- SquashFS — SquashFS 是一个压缩的只读文件系统,它会压缩文件、inodes 和目录,而且最高支持 1 MiB 的块大小来实现更强力的压缩。
- BeeGFS — A parallel file system, developed and optimized for high-performance computing.
- Ceph — 统一的分布式存储系统,旨在实现出色的性能,可靠性和可扩展性。
- https://ceph.com/ || cephAUR
- Glusterfs — 支持扩展到几 PB 的集群文件系统。
- IPFS — 一种点对点超媒体协议,使网络更快,更安全,更开放。IPFS 旨在取代 HTTP 并为所有人构建更好的互联网。它使用块来存储文件的各个部分,每个网络节点仅存储它感兴趣的内容,并提供了仅受用户限制的去重、分布式的可扩展文件系统。(现为 alpha 阶段)
- https://ipfs.io/ || kubo包
- MinIO — MinIO offers high-performance, S3 compatible object storage.
- https://min.io || minio包
- MooseFS — MooseFS 是一个容错、高可用性和高性能的向外扩展的网络分布式文件系统。
- OpenAFS — AFS 分布式文件系统的开源实现
- OrangeFS — OrangeFS 是一个向外扩展的网络文件系统,为透明、并行地访问基于多个服务器的硬盘储存而设计。它为并行分布式应用提供了优化的 MPI-IO。它使 Linux 客户端、Windows、Hadoop 和 WebDAV 使用存储集群变得更为简便。它与 POSIX 兼容,而且是 Linux 内核(4.6+)的一部分。
- https://www.orangefs.org/ || 未被打包?在 AUR 里搜索
- Sheepdog — 用于卷和容器服务的分布式对象存储系统,能智能地管理硬盘和节点。
- GFS2 — GFS2 allows all members of a cluster to have direct concurrent access to the same shared block storage
- 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
- VMware VMFS — VMware's VMFS (Virtual Machine File System) is used by the company's flagship server virtualization suite, vSphere.
用 lsblk 查看现有的文件系统:
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT sdb └─sdb1 vfat Transcend 4A3C-A9E9
如果文件系统存在,那 FSTYPE 列会显示它的名字;如果它被挂载了,那么挂载点会显示在 MOUNTPOINT 那一列。
文件系统可以被创建在一个分区上,逻辑容器(如 LVM,RAID,或是 dm-crypt)上,或是普通文件上(参考 Loop 设备)。下文将描述创建在分区上的情况。
在进行下一步前,需识别文件系统目标分区所在的设备,以及其是否已被挂载。例如:
$ 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