文件系統 - 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

文件系統
新增話題