F2FS (简体中文)

From ArchWiki
翻译状态:本文是 F2FS翻译。上次翻译日期:2022-08-17。如果英文版本有所更改,则您可以帮助同步翻译。

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/查看) 应该保持不变。