F2FS
F2FS (Flash-Friendly File System) 是一個為配備了 Flash Transition Layer 的 NAND 閃存開發的文件系統,與 JFFS 或 UBIFS 不同,它依靠 FTL 來處理寫入分發。 Linux從內核3.8開始支持 F2FS 。
已知問題[編輯 | 編輯原始碼]
fsck錯誤[編輯 | 編輯原始碼]
F2FS的fsck不完善,可能在系統突然斷電後導致數據丟失[1][2]。
如果經常遭遇突然斷電,建議使用其它文件系統。
GRUB 支持[編輯 | 編輯原始碼]
儘管GRUB從2.0.4版本開始就支持F2FS,但它無法從啟用了extra_attr
flag的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)。壓縮[編輯 | 編輯原始碼]
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)。
/dev/disk/by-partuuid/
查看) 可能會改變,但是文件系統的 UUID (可通過/dev/disk/by-uuid/
查看) 應該保持不變。