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