F2FS: Difference between revisions
Lahwaacz.bot (talk | contribs) (link to the kernel documentation on docs.kernel.org) |
m (→Cannot set file attributes for '/var/log/journal': grammar) |
||
(10 intermediate revisions by 5 users not shown) | |||
Line 12: | Line 12: | ||
{{Warning|The data contained on F2FS partitions can become unusable if the kernel version on the running machine is ''older'' than the kernel version used to create the partition. For example, this limitation can manifest if the F2FS partition was created on a mainline kernel provided by {{pkg|linux}} yet the system has a need to downgrade to an older series of kernels provided by {{pkg|linux-lts}}. See {{Bug|69363}}.}} | {{Warning|The data contained on F2FS partitions can become unusable if the kernel version on the running machine is ''older'' than the kernel version used to create the partition. For example, this limitation can manifest if the F2FS partition was created on a mainline kernel provided by {{pkg|linux}} yet the system has a need to downgrade to an older series of kernels provided by {{pkg|linux-lts}}. See {{Bug|69363}}.}} | ||
{{Expansion|What advantages f2fs has over other fs, such as ext4? Is it recommended for being used inside lvm?}} | |||
== Known issues == | == Known issues == | ||
Line 32: | Line 34: | ||
While GRUB supports F2FS since version 2.0.4, it cannot correctly read its boot files from an F2FS partition that was created with the {{ic|extra_attr}} flag enabled (for more details, see [[GRUB#Unsupported file systems]]). | While GRUB supports F2FS since version 2.0.4, it cannot correctly read its boot files from an F2FS partition that was created with the {{ic|extra_attr}} flag enabled (for more details, see [[GRUB#Unsupported file systems]]). | ||
=== Cannot set file attributes for '/var/log/journal' === | |||
If the error: | |||
Cannot set file attributes for '/var/log/journal', maybe due to incompatibility in specified attributes, previous=0x10001000, current=0x10001000, expected=0x10801000, ignoring. | |||
is present in your [[journal]], it can be [https://github.com/systemd/systemd/issues/26318 safely ignored]: it is due to [[systemd-tmpfiles]] trying to use a file system feature that is not supported by F2FS. | |||
== Creating a F2FS file system == | == Creating a F2FS file system == | ||
Line 74: | Line 84: | ||
A few mount options can be used to improve things slightly. | A few mount options can be used to improve things slightly. | ||
# mount -o compress_algorithm=zstd:6,compress_chksum,atgc,gc_merge,lazytime /dev/ | # mount -o compress_algorithm=zstd:6,compress_chksum,atgc,gc_merge,lazytime /dev/sd''xY'' /mnt/''mountpoint'' | ||
* {{ic|1=compress_algorithm=zstd:6}} tells F2FS to use [[w:Zstandard|zstd]] for compression at level 6, which should give pretty good compression ratio. | * {{ic|1=compress_algorithm=zstd:6}} tells F2FS to use [[w:Zstandard|zstd]] for compression at level 6, which should give pretty good compression ratio. | ||
* {{ic|compress_chksum}} tells the filesystem to verify compressed blocks with a checksum (to avoid corruption) | * {{ic|compress_chksum}} tells the filesystem to verify compressed blocks with a checksum (to avoid corruption) | ||
* {{ic|atgc,gc_merge}} Enable better garbage collector, and enable some foreground garbage collections to be asynchronous. | * {{ic|atgc,gc_merge}} Enable better garbage collector, and enable some foreground garbage collections to be asynchronous. | ||
:{{Note|See [[#Remounting impossible with some options]].}} | |||
* {{ic|lazytime}} Do not synchronously update access or modification times. Improves IO performance and flash durability. | * {{ic|lazytime}} Do not synchronously update access or modification times. Improves IO performance and flash durability. | ||
Line 97: | Line 108: | ||
When the filesystem is unmounted, it can be grown if the partition is expanded. [https://lore.kernel.org/linux-f2fs-devel/1461630518-16944-1-git-send-email-jaegeuk@kernel.org/ Shrinking is not currently supported]. | When the filesystem is unmounted, it can be grown if the partition is expanded. [https://lore.kernel.org/linux-f2fs-devel/1461630518-16944-1-git-send-email-jaegeuk@kernel.org/ Shrinking is not currently supported]. | ||
First use a [[Partitioning# | First use a [[Partitioning#Partitioning tools|partition tool]] to resize the partition: for example, suppose the output of the {{ic|print}} command in the {{ic|parted}} console is the following: | ||
Number Start End Size File system Name Flag | Number Start End Size File system Name Flag | ||
Line 112: | Line 123: | ||
{{Note|If using GPT, the partition's GUID (seen in {{ic|/dev/disk/by-partuuid/}}) might change, but the filesystem UUID (seen in {{ic|/dev/disk/by-uuid/}}) should stay the same.}} | {{Note|If using GPT, the partition's GUID (seen in {{ic|/dev/disk/by-partuuid/}}) might change, but the filesystem UUID (seen in {{ic|/dev/disk/by-uuid/}}) should stay the same.}} | ||
== Troubleshooting == | |||
=== Remounting impossible with some options === | |||
As alluded to in [[Fsck#Boot time checking]], the kernel keeps file systems in a read-only state by default, and it is either explicitly needed to pass the {{ic|rw}} [[kernel parameter]] or have systemd remounting the filesystems as read-write with the {{ic|systemd-remount-fs.service}}. | |||
When remounting the file system from a read-only state to a read-write state, the {{ic|mount -o remount,... /}} steps can fail for multiple reasons, which will either leave the root file system read-only or make the system unable to boot with the error message: | |||
Failed to start Remount Root and Kernel File Systems. | |||
If the {{ic|atgc}} option is specified in the fstab file but has not been passed as a kernel parameter, the F2FS kernel module will not permit re-mounting with an added or cleared {{ic|atgc}} option[https://github.com/systemd/systemd/issues/22982][https://github.com/systemd/systemd/issues/26763], either: | |||
* add the [[kernel parameter]] {{ic|1=rootflags=atgc}} to your boot loader configuration, | |||
* add the [[kernel parameter]] {{ic|rw}} to your boot loader configuration, | |||
* remove the {{ic|atgc}} mount option from the fstab. | |||
Since {{Pkg|linux}} 6.2, a [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=967eaad1fed5f6335ea97a47d45214744dc57925 check] is made in the kernel to disable {{ic|flush_merge}} when the file system is read-only, but it is the state of the file system before remounting that is checked. As explained in {{Bug|77596}}, either: | |||
* add the [[kernel parameter]] {{ic|rw}} to your boot loader configuration, | |||
* remove the {{ic|flush_merge}} mount option from the fstab. |
Latest revision as of 17:34, 28 December 2023
F2FS (Flash-Friendly File System) is a file system intended for NAND-based flash memory equipped with Flash Translation Layer. Unlike JFFS or UBIFS it relies on FTL to handle write distribution. It is supported from kernel 3.8 onwards.
An FTL is found in all flash memory with a SCSI/SATA/PCIe/NVMe interface [1], opposed to bare NAND Flash and SmartMediaCards [2].
Known issues
fsck failures
F2FS has a weak fsck that can lead to data loss in case of a sudden power loss [3][4].
If power losses are frequent, consider an alternative file system.
Long running fsck delays boot
If the kernel version has changed between boots, the fsck.f2fs utility will perform a full file system check which will take longer to finish[5].
This may be mitigated in the future thanks to a recent commit [6].
GRUB support
While GRUB supports F2FS since version 2.0.4, it cannot correctly read its boot files from an F2FS partition that was created with the extra_attr
flag enabled (for more details, see GRUB#Unsupported file systems).
Cannot set file attributes for '/var/log/journal'
If the error:
Cannot set file attributes for '/var/log/journal', maybe due to incompatibility in specified attributes, previous=0x10001000, current=0x10001000, expected=0x10801000, ignoring.
is present in your journal, it can be safely ignored: it is due to systemd-tmpfiles trying to use a file system feature that is not supported by F2FS.
Creating a F2FS file system
This article assumes the device has partitions already setup. Install f2fs-tools. Use mkfs.f2fs
to format the target partition referred to as /dev/sdxY
:
# mkfs.f2fs -l mylabel -O extra_attr,inode_checksum,sb_checksum /dev/sdxY
f2fs.fsck
to detect and to fix some types of filesystem corruption. See mkfs.f2fs(8) for all available options.Compression
F2FS_IOC_RELEASE_COMPRESS_BLOCKS
can be used to expose unused space on a per-file basis, but it makes the file immutable in the process.To use compression, include the compression
option. Example:
# mkfs.f2fs -l mylabel -O extra_attr,inode_checksum,sb_checksum,compression /dev/sdxY
When mounting the filesystem, specify compress_algorithm=(lzo|lz4|zstd|lzo-rle)
. Using compress_extension=txt
will cause all txt files to be compressed by default.
In order to tell F2FS to compress a file or a directory, use :
$ chattr -R +c [FOLDER]
File-based encryption support
Since Linux 4.2, F2FS natively supports file encryption. Encryption is applied at the directory level, and different directories can use different encryption keys. This is different from both dm-crypt, which is block-device level encryption, and from eCryptfs, which is a stacked cryptographic filesystem. To use F2FS's native encryption support, see the fscrypt article. Create the file system with
# mkfs.f2fs -l mylabel -O extra_attr,inode_checksum,sb_checksum,encrypt /dev/sdxY
or add encryption capability at a later time with fsck.f2fs -O encrypt /dev/sdxY
.
Mounting a F2FS file system
The file system can then be mounted manually or via other mechanisms:
# mount /dev/sdxY /mnt/foo
Recommended mount options
Since F2FS is designed to be used on flash devices, compression is a good idea. You have to enable it at mkfs.f2fs
time.
A few mount options can be used to improve things slightly.
# mount -o compress_algorithm=zstd:6,compress_chksum,atgc,gc_merge,lazytime /dev/sdxY /mnt/mountpoint
compress_algorithm=zstd:6
tells F2FS to use zstd for compression at level 6, which should give pretty good compression ratio.compress_chksum
tells the filesystem to verify compressed blocks with a checksum (to avoid corruption)atgc,gc_merge
Enable better garbage collector, and enable some foreground garbage collections to be asynchronous.
- Note: See #Remounting impossible with some options.
lazytime
Do not synchronously update access or modification times. Improves IO performance and flash durability.
Implementation of discard
By default, F2FS is mounted using a hybrid TRIM mode which behaves as continuous TRIM. This implementation creates asynchronous discard threads to alleviate long discarding latency among RW IOs. It keeps candidates in memory, and the thread issues them in idle time [7]. As a result of this, users wanting periodic TRIM will need to implicitly set the nodiscard
mount option in /etc/fstab
or pass it to mount if mounting manually.
Checking and repair
Checking and repairs to F2FS file systems are accomplished with fsck.f2fs
provided by f2fs-tools. To check a file system, execute
# fsck.f2fs /dev/sdxY
Depending on the result, see fsck.f2fs(8) for available switches to repair inconsistencies. For example:
# fsck.f2fs -f /dev/sdxY
Grow an F2FS file system
When the filesystem is unmounted, it can be grown if the partition is expanded. Shrinking is not currently supported.
First use a partition tool to resize the partition: for example, suppose the output of the print
command in the parted
console is the following:
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
To resize the f2fs
partition to occupy all the space up to the fourth one, just give resizepart 3 31GB
and exit
. Now expand the filesystem to fill the new partition using:
# resize.f2fs /dev/sdxY
where /dev/sdxY
is the target F2FS volume to grow. See resize.f2fs(8) for supported options.
/dev/disk/by-partuuid/
) might change, but the filesystem UUID (seen in /dev/disk/by-uuid/
) should stay the same.Troubleshooting
Remounting impossible with some options
As alluded to in Fsck#Boot time checking, the kernel keeps file systems in a read-only state by default, and it is either explicitly needed to pass the rw
kernel parameter or have systemd remounting the filesystems as read-write with the systemd-remount-fs.service
.
When remounting the file system from a read-only state to a read-write state, the mount -o remount,... /
steps can fail for multiple reasons, which will either leave the root file system read-only or make the system unable to boot with the error message:
Failed to start Remount Root and Kernel File Systems.
If the atgc
option is specified in the fstab file but has not been passed as a kernel parameter, the F2FS kernel module will not permit re-mounting with an added or cleared atgc
option[8][9], either:
- add the kernel parameter
rootflags=atgc
to your boot loader configuration, - add the kernel parameter
rw
to your boot loader configuration, - remove the
atgc
mount option from the fstab.
Since linux 6.2, a check is made in the kernel to disable flush_merge
when the file system is read-only, but it is the state of the file system before remounting that is checked. As explained in FS#77596, either:
- add the kernel parameter
rw
to your boot loader configuration, - remove the
flush_merge
mount option from the fstab.