跳至內容

文件系統

出自 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

參閱

[編輯 | 編輯原始碼]