文件系統
根據維基百科:
- 在計算機體系中,文件系統負責控制如何存放和讀取數據。如果沒有文件系統,存儲介質中的數據就會完全混在一起,無法進行區分。通過把數據分塊和命名,不同的信息就可以被隔離和區分。將各組數據命名為「文件」是取自紙質信息系統的命名方式,而「文件系統」是指用於管理信息的分組和命名的結構和邏輯規則。
文件系統有很多種,每個硬碟分區可以且僅可使用其中的一種。每種文件系統有自己的優缺點和獨有特性。以下內容是目前所支持的文件系統類型的概述,相應的連結會提供更加詳細的信息。
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