F2FS

出自 Arch Linux 中文维基

F2FS (Flash-Friendly File System) 是一個為配備了 Flash Transition Layer 的 NAND 閃存開發的文件系統,與 JFFS 或 UBIFS 不同,它依靠 FTL 來處理寫入分發。 Linux從內核3.8開始支持 F2FS 。

警吿: 若運行的內核版本比創建F2FS文件系統的內核版本低,則文件系統可能無法使用。例如,使用linux提供的內核創建文件系統,當系統需要降級到linux-lts提供的內核時,就可能出現問題。詳見FS#69363

已知問題[編輯 | 編輯原始碼]

fsck錯誤[編輯 | 編輯原始碼]

F2FS的fsck不完善,可能在系統突然斷電後導致數據丟失[1][2]

如果經常遭遇突然斷電,建議使用其它文件系統

GRUB 支持[編輯 | 編輯原始碼]

儘管GRUB從2.0.4版本開始就支持F2FS,但它無法從啟用了extra_attrflag的F2FS分區中正確讀取啟動文件。(詳見GRUB#不支持的文件系統

創建 F2FS 文件系統[編輯 | 編輯原始碼]

本文假定設備已分區

首先,安裝f2fs-tools軟件包。

mkfs.f2fs命令創建一個文件系統(/dev/sdxY 是想要設置成 F2FS 的分區。):

# mkfs.f2fs -l mylabel -O extra_attr,inode_checksum,sb_checksum /dev/sdxY
注意: 推薦至少要設置上例中的選項,這些選項能幫助f2fs.fsck檢測並修復某些文件系統損壞。對於所有可用的選項,見mkfs.f2fs(8)

壓縮[編輯 | 編輯原始碼]

注意: 與其它支持inline compression的文件系統不同,F2FS的壓縮默認情況下並不會提供額外的可用空間。不論是否啟用壓縮,F2FS都會保留相同數目的block,這主要是為了減少寫入放大以延長閃存壽命,同時可能帶來微小的性能提升。詳見內核文檔中的Compression Implementation。可以通過iotcl系統調用傳遞F2FS_IOC_RELEASE_COMPRESS_BLOCKS命令將對應文件未使用的空間暴露出來,但這將使該文件不可變。

要使用壓縮,添加compression選項,例如:

# mkfs.f2fs -l mylabel -O extra_attr,inode_checksum,sb_checksum,compression /dev/sdxY

掛載文件系統時,指定compress_algorithm=(lzo|lz4|zstd|lzo-rle)掛載選項。此外,compress_extension=txt掛載選項可自動壓縮所有創建的txt文件。

要指定F2FS壓縮某一文件或目錄,使用:

$ chattr -R +c [FOLDER]

文件層面的加密[編輯 | 編輯原始碼]

從Linux內核4.2開始,F2FS原生支持文件加密。F2FS的加密是目錄層級的,不同的目錄可以使用不同的密鑰。這不同於 dm-crypt(塊設備層級)或eCryptfs(嵌套在已有文件系統上)。要使用F2FS的原生加密支持,用如下命令創建文件系統:

 # mkfs.f2fs -l mylabel -O extra_attr,inode_checksum,sb_checksum,encrypt /dev/sdxY

對於已有的文件系統,可使用fsck.f2fs -O encrypt /dev/sdxY啟用加密。關於如何使用加密,見fscrypt

掛載F2FS文件系統[編輯 | 編輯原始碼]

既可以手動掛載文件系統,也可以使用其它掛載機制:

# mount /dev/sdxY /mnt/foo

推薦的掛載選項[編輯 | 編輯原始碼]

因為F2FS是設計為在閃存設備上使用的,建議啟用壓縮。要啟用壓縮,必須在使用mkfs.f2fs創建文件系統時就指定相應選項。 可以使用以下掛載選項略微提升性能:

# mount -o compress_algorithm=zstd:6,compress_chksum,atgc,gc_merge,lazytime /dev/sdxY /mnt/foo
  • compress_algorithm=zstd:6:使用zstd壓縮等級6進行壓縮, 可提供很好的壓縮率。
  • compress_chksum:使用校驗碼檢查壓縮的block,可防止數據損壞。
  • atgc,gc_merge:啟用更好的GC方式,異步執行某些前台GC。
  • lazytime:不使用同步方式更新文件的訪問與修改時間,可提升IO性能與閃存壽命。

discard實現方式[編輯 | 編輯原始碼]

默認情況下,F2FS使用混合型TRIM模式(類似continuous TRIM)。該實現方式使用異步的discard線程來緩解RW IO的高discard延遲。其在內存中維護一個discard操作的等待隊列,並在空閒時執行它們(詳見[3])。若要使用periodic TRIM,則需要指定nodiscard掛載選項。

檢查與修復[編輯 | 編輯原始碼]

檢查與修復F2FS文件系統需要使用f2fs-tools提供的fsck.f2fs工具。要檢查一個F2FS文件系統,執行:

# fsck.f2fs /dev/sdxY

根據結果選擇不同的選項來修復不一致問題(詳見fsck.f2fs(8)),例如:

# fsck.f2fs -f /dev/sdxY

擴容 F2FS 文件系統[編輯 | 編輯原始碼]

如果文件系統未被掛載,且對應的分區已經被拓展,則可以擴容文件系統。但目前不支持收縮。 首先使用分區工具調整分區大小。例如,假設parted控制台中print命令的輸出如下:

Number  Start   End     Size        File system     Name                  Flag
 1      1049kB  106MB   105MB       fat32           EFI system partition  boot, esp
 2      106MB   11,0GB  10,9GB      ext4
 3      11,0GB  12,3GB  1322MB      f2fs
 4      31,0GB  31,3GB  261MB       ext4

要調整使得f2fs對應分區(3號)佔據4號分區前的所有空閒空間,執行resizepart 3 31GB。使用exit退出parted

然後擴容文件系統來填充新的分區,使用以下命令:

# resize.f2fs /dev/sdxY

/dev/sdxY是要擴容的 F2FS 分區。可用的選項見 resize.f2fs(8)

注意: 如果使用 GPT,分區的 GUID (可通過/dev/disk/by-partuuid/查看) 可能會改變,但是文件系統的 UUID (可通過/dev/disk/by-uuid/查看) 應該保持不變。