MKFS.BTRFS(8) BTRFS MKFS.BTRFS(8)
NAME
mkfs.btrfs - create a btrfs filesystem
SYNOPSIS
mkfs.btrfs [options] <device> [<device>...]
DESCRIPTION
mkfs.btrfs is used to create the btrfs filesystem on a single or multi-
ple devices. The device is typically a block device but can be a
file-backed image as well. Multiple devices are grouped by UUID of the
filesystem.
Before mounting such filesystem, the kernel module must know all the de-
vices either via preceding execution of btrfs device scan or using the
device mount option. See section MULTIPLE DEVICES for more details.
The default block group profiles for data and metadata depend on number
of devices and possibly other factors. It's recommended to use specific
profiles but the defaults should be OK and allowing future conversions
to other profiles. Please see options -d and -m for further details and
btrfs-balance(8) for the profile conversion post mkfs.
OPTIONS
-b|--byte-count <size>
Specify the size of each device as seen by the filesystem. If not
set, the entire device size is used. The total filesystem size
will be the sum of all device sizes, for a single device filesys-
tem the option effectively specifies the size of the filesystem.
--csum <type>, --checksum <type>
Specify the checksum algorithm. Default is crc32c. Valid values
are crc32c, xxhash, sha256 or blake2. To mount such filesystem
kernel must support the checksums as well. See section CHECKSUM
ALGORITHMS in btrfs(5).
-d|--data <profile>
Specify the profile for the data block groups. Valid values are
raid0, raid1, raid1c3, raid1c4, raid5, raid6, raid10 or single or
dup (case does not matter).
See section DUP PROFILES ON A SINGLE DEVICE for more details.
On multiple devices, the default was raid0 until version 5.7,
while it is single since version 5.8. You can still select raid0
manually, but it was not suitable as default.
-m|--metadata <profile>
Specify the profile for the metadata block groups. Valid values
are raid0, raid1, raid1c3, raid1c4, raid5, raid6, raid10, single
or dup (case does not matter).
Default on a single device filesystem is DUP and is recommended
for metadata in general. The duplication might not be necessary
in some use cases and it's up to the user to changed that at mkfs
time or later. This depends on hardware that could potentially
deduplicate the blocks again but this cannot be detected at mkfs
time.
NOTE:
Up to version 5.14 there was a detection of a SSD device (more
precisely if it's a rotational device, determined by the con-
tents of file /sys/block/DEV/queue/rotational) that used to
select single. This has changed in version 5.15 to be always
dup.
Note that the rotational status can be arbitrarily set by the
underlying block device driver and may not reflect the true
status (network block device, memory-backed SCSI devices, real
block device behind some additional device mapper layer, etc).
It's recommended to always set the options --data/--metadata
to avoid confusion and unexpected results.
See section DUP PROFILES ON A SINGLE DEVICE for more details.
On multiple devices the default is raid1.
-M|--mixed
Normally the data and metadata block groups are isolated. The
mixed mode will remove the isolation and store both types in the
same block group type. This helps to utilize the free space re-
gardless of the purpose and is suitable for small devices. The
separate allocation of block groups leads to a situation where
the space is reserved for the other block group type, is not
available for allocation and can lead to ENOSPC state.
The recommended size for the mixed mode is for filesystems less
than 1GiB. The soft recommendation is to use it for filesystems
smaller than 5GiB. The mixed mode may lead to degraded perfor-
mance on larger filesystems, but is otherwise usable, even on
multiple devices.
The nodesize and sectorsize must be equal, and the block group
types must match.
NOTE:
Versions up to 4.2.x forced the mixed mode for devices smaller
than 1GiB. This has been removed in 4.3+ as it caused some
usability issues.
Mixed profile cannot be used together with other profiles. It
can only be set at creation time. Conversion to or from mixed
profile is not implemented.
-n|--nodesize <size>
Specify the nodesize, the tree block size in which btrfs stores
metadata. The default value is 16KiB (16384) or the page size,
whichever is bigger. Must be a multiple of the sectorsize and a
power of 2, but not larger than 64KiB (65536). Leafsize always
equals nodesize and the options are aliases.
Smaller node size increases fragmentation but leads to taller
b-trees which in turn leads to lower locking contention. Higher
node sizes give better packing and less fragmentation at the cost
of more expensive memory operations while updating the metadata
blocks.
NOTE:
Versions up to 3.11 set the nodesize to 4KiB.
-s|--sectorsize <size>
Specify the sectorsize, the minimum data block allocation unit.
NOTE:
Versions prior to 6.7 set the sectorsize matching the host CPU
page size, starting in 6.7 this is 4KiB for cross-architecture
compatibility. Please read more about the subpage block size
support and its status.
By default, the value is 4KiB, but it can be manually set to
match the system page size (e.g. using command getconf
PAGE_SIZE). However, if the sector size is different from the
page size, the resulting filesystem may not be mountable by the
current kernel, apart from the default 4KiB. Hence, using this
option is not advised unless you intend to mount it on a system
with the suitable page size.
In experimental build the size 2K (2048) is also allowed and
needs kernel that also allows that value, then it works in the
subpage mode.
-L|--label <string>
Specify a label for the filesystem. The string should be less
than 256 bytes and must not contain newline characters.
-K|--nodiscard
Do not perform whole device TRIM operation on devices that are
capable of that. This does not affect discard/trim operation
when the filesystem is mounted. Please see the mount option dis-
card for that in btrfs(5).
-r|--rootdir <rootdir>
Populate the toplevel subvolume with files from rootdir. This
does not require root permissions to write the new files or to
mount the filesystem.
Directories can be created as subvolumes, see also option --sub-
vol. Hardlinks are detected and created in the filesystem image.
NOTE:
This option may enlarge the image or file to ensure it's big
enough to contain the files from rootdir. Since version 4.14.1
the filesystem size is not minimized. Please see option
--shrink if you need that functionality.
--compress <algo>[:<level>]
Try to compress files when using --rootdir. Supported values for
algo are no (the default), zstd, lzo or zlib. The optional value
level is a compression level, 1..15 for zstd, 1..9 for zlib.
It is recommended to use the highest level to achieve maximum
space savings. Compression at mkfs time is not as constrained as
in kernel where it's desirable to use less CPU load. Otherwise
the default level is 3.
As with the kernel, mkfs.btrfs won't write compressed extents
when they would be larger than the uncompressed versions, and
will set file attribute NOCOMPRESS if its beginning is found to
be incompressible.
NOTE:
The support for ZSTD and LZO is a compile-time option, please
check the output of mkfs.btrfs --version for the actual sup-
port.
-u|--subvol <type>:<subdir>
Specify that subdir is to be created as a subvolume rather than a
regular directory. The option --rootdir must also be specified,
and subdir must be an existing subdirectory within it. This op-
tion can be specified multiple times.
The type is an optional additional modifier. Valid choices are:
• default: create as default subvolume
• ro: create as read-only subvolume
• rw: create as read-write subvolume (the default)
• default-ro: create as read-only default subvolume
Only one of default and default-ro may be specified.
If you wish to create a subvolume with a name containing a colon
and you don't want this to be parsed as containing a modifier,
you can prefix the path with ./:
$ mkfs.btrfs --rootdir dir --subvol ./ro:subdir /dev/loop0
If there are hardlinks inside rootdir and subdir will split the
subvolumes, like the following case:
rootdir/
|- hardlink1
|- hardlink2
|- subdir/ <- will be a subvolume
|- hardlink3
In that case we cannot create hardlink3 as hardlinks of hardlink1
and hardlink2 because hardlink3 will be inside a new subvolume.
--shrink
Shrink the filesystem to its minimal size, only works with
--rootdir option.
If the destination block device is a regular file, this option
will also truncate the file to the minimal size. Otherwise it
will reduce the filesystem available space. Extra space will not
be usable unless the filesystem is mounted and resized using
btrfs filesystem resize.
NOTE:
Prior to version 4.14.1, the shrinking was done automatically.
-O|--features <feature1>[,<feature2>...]
A list of filesystem features turned on at mkfs time. Not all
features are supported by old kernels. To disable a feature, pre-
fix it with ^.
See section FILESYSTEM FEATURES for more details. To see all
available features that mkfs.btrfs supports run:
$ mkfs.btrfs -O list-all
-f|--force
Forcibly overwrite the block devices when an existing filesystem
is detected. By default, mkfs.btrfs will utilize libblkid to
check for any known filesystem on the devices. Alternatively you
can use the wipefs utility to clear the devices.
-q|--quiet
Print only error or warning messages. Options --features or
--help are unaffected. Resets any previous effects of --verbose.
-U|--uuid <UUID>
Create the filesystem with the given UUID. For a single-device
filesystem, you can duplicate the UUID. However, for a multi-de-
vice filesystem, the UUID must not already exist on any currently
present filesystem.
--device-uuid <UUID>
Create the filesystem with the given device-uuid UUID (also known
as UUID_SUB in blkid). For a single device filesystem, you can
duplicate the device-uuid. However, used for a multi-device
filesystem this option will not work at the moment.
-v|--verbose
Increase verbosity level, default is 1.
-V|--version
Print the mkfs.btrfs version, builtin features and exit.
--help Print help.
DEPRECATED OPTIONS
-R|--runtime-features <feature1>[,<feature2>...]
Removed in 6.3, was used to specify features not affecting
on-disk format. Now all such features are merged into -O|--fea-
tures option. The option -R will stay for backward compatibility.
SIZE UNITS
The default unit is byte. All size parameters accept suffixes in the
1024 base. The recognized suffixes are: k, m, g, t, p, e, both uppercase
and lowercase.
MULTIPLE DEVICES
Before mounting a multiple device filesystem, the kernel module must
know the association of the block devices that are attached to the
filesystem UUID.
There is typically no action needed from the user. On a system that
utilizes a udev-like daemon, any new block device is automatically reg-
istered. The rules call btrfs device scan.
The same command can be used to trigger the device scanning if the btrfs
kernel module is reloaded (naturally all previous information about the
device registration is lost).
Another possibility is to use the mount options device to specify the
list of devices to scan at the time of mount.
# mount -o device=/dev/sdb,device=/dev/sdc /dev/sda /mnt
NOTE:
This means only scanning, if the devices do not exist in the system,
mount will fail anyway. This can happen on systems without
initramfs/initrd and root partition created with RAID1/10/5/6 pro-
files. The mount action can happen before all block devices are dis-
covered. The waiting is usually done on the initramfs/initrd systems.
WARNING:
RAID5/6 has known problems and should not be used in production.
FILESYSTEM FEATURES
Features that can be enabled during creation time. See also btrfs(5)
section FILESYSTEM FEATURES.
mixed-bg
(kernel support since 2.6.37)
mixed data and metadata block groups, also set by option --mixed
extref (default since btrfs-progs 3.12, kernel support since 3.7)
increased hardlink limit per file in a directory to 65536, older
kernels supported a varying number of hardlinks depending on the
sum of all file name sizes that can be stored into one metadata
block
raid56 (kernel support since 3.9)
extended format for RAID5/6, also enabled if RAID5 or RAID6 block
groups are selected
skinny-metadata
(default since btrfs-progs 3.18, kernel support since 3.10)
reduced-size metadata for extent references, saves a few percent
of metadata
no-holes
(default since btrfs-progs 5.15, kernel support since 3.14)
improved representation of file extents where holes are not ex-
plicitly stored as an extent, saves a few percent of metadata if
sparse files are used
zoned (kernel support since 5.12)
zoned mode, data allocation and write friendly to
zoned/SMR/ZBC/ZNS devices, see ZONED MODE in btrfs(5), the mode
is automatically selected when a zoned device is detected
quota (kernel support since 3.4)
Enable quota support (qgroups). The qgroup accounting will be
consistent, can be used together with --rootdir. See also
btrfs-quota(8).
free-space-tree
(default since btrfs-progs 5.15, kernel support since 4.5)
Enable the free space tree (mount option space_cache=v2) for per-
sisting the free space cache in a b-tree. This is built on top of
the COW mechanism and has better performance than v1.
Offline conversion from filesystems that don't have this feature
enabled at mkfs time is possible, see btrfstune(8).
Online conversion can be done by mounting with space_cache=v2,
this is sufficient to be done one time.
block-group-tree
(kernel support since 6.1)
Enable a dedicated b-tree for block group items, this greatly re-
duces mount time for large filesystems due to better data local-
ity that avoids seeking. On rotational devices the large size is
considered starting from the 2-4TiB. Can be used on other types
of devices (SSD, NVMe, ...) as well.
Offline conversion from filesystems that don't have this feature
enabled at mkfs time is possible, see btrfstune(8). Online con-
version is not possible.
raid-stripe-tree
(kernel support since 6.7, CONFIG_BTRFS_DEBUG/CONFIG_BTRFS_EXPER-
IMENTAL)
Separate tree for logical file extent mapping where the physical
mapping may not match on multiple devices. This is now used in
zoned mode to implement RAID0/RAID1* profiles, but can be used in
non-zoned mode as well. The support for RAID56 is in development
and will eventually fix the problems with the current implementa-
tion. This is a backward incompatible feature and has to be en-
abled at mkfs time.
NOTE:
Due to the status of implementation it is enabled only in
builds with CONFIG_BTRFS_DEBUG/CONFIG_BTRFS_EXPERIMENTAL.
Support by the kernel module can be found in the sysfs feature
list.
squota (kernel support since 6.7)
Enable simple quota accounting (squotas). This is an alternative
to qgroups with a smaller performance impact but no notion of
shared vs. exclusive usage.
BLOCK GROUPS, CHUNKS, RAID
The highlevel organizational units of a filesystem are block groups of
three types: data, metadata and system.
DATA store data blocks and nothing else
METADATA
store internal metadata in b-trees, can store file data if they
fit into the inline limit
SYSTEM store structures that describe the mapping between the physical
devices and the linear logical space representing the filesystem
Other terms commonly used:
block group, chunk
a logical range of space of a given profile, stores data, meta-
data or both; sometimes the terms are used interchangeably
A typical size of metadata block group is 256MiB (filesystem
smaller than 50GiB) and 1GiB (larger than 50GiB), for data it's
1GiB. The system block group size is a few megabytes.
RAID a block group profile type that utilizes RAID-like features on
multiple devices: striping, mirroring, parity
profile
when used in connection with block groups refers to the alloca-
tion strategy and constraints, see the section PROFILES for more
details
PROFILES
There are the following block group types available:
┌──────────┬─────────────┬────────────┬────────────┬─────────────┬─────────────┐
│ Profiles │ Redundancy │ Redundancy │ Redundancy │ Space uti- │ Min/max de- │
│ │ │ │ │ lization │ vices │
│ │ Copies │ Parity │ Striping │ │ │
├──────────┼─────────────┼────────────┼────────────┼─────────────┼─────────────┤
│ single │ 1 │ │ │ 100% │ 1/any │
├──────────┼─────────────┼────────────┼────────────┼─────────────┼─────────────┤
│ DUP │ 2 / 1 de- │ │ │ 50% │ 1/any (see │
│ │ vice │ │ │ │ note 1) │
├──────────┼─────────────┼────────────┼────────────┼─────────────┼─────────────┤
│ RAID0 │ 1 │ │ 1 to N │ 100% │ 1/any (see │
│ │ │ │ │ │ note 5) │
├──────────┼─────────────┼────────────┼────────────┼─────────────┼─────────────┤
│ RAID1 │ 2 │ │ │ 50% │ 2/any │
├──────────┼─────────────┼────────────┼────────────┼─────────────┼─────────────┤
│ RAID1C3 │ 3 │ │ │ 33% │ 3/any │
├──────────┼─────────────┼────────────┼────────────┼─────────────┼─────────────┤
│ RAID1C4 │ 4 │ │ │ 25% │ 4/any │
├──────────┼─────────────┼────────────┼────────────┼─────────────┼─────────────┤
│ RAID10 │ 2 │ │ 1 to N │ 50% │ 2/any (see │
│ │ │ │ │ │ note 5) │
├──────────┼─────────────┼────────────┼────────────┼─────────────┼─────────────┤
│ RAID5 │ 1 │ 1 │ 2 to N-1 │ (N-1)/N │ 2/any (see │
│ │ │ │ │ │ note 2) │
├──────────┼─────────────┼────────────┼────────────┼─────────────┼─────────────┤
│ RAID6 │ 1 │ 2 │ 3 to N-2 │ (N-2)/N │ 3/any (see │
│ │ │ │ │ │ note 3) │
└──────────┴─────────────┴────────────┴────────────┴─────────────┴─────────────┘
WARNING:
It's not recommended to create filesystems with RAID0/1/10/5/6 pro-
files on partitions from the same device. Neither redundancy nor
performance will be improved.
Note 1: DUP may exist on more than 1 device if it starts on a single de-
vice and another one is added. Since version 4.5.1, mkfs.btrfs will let
you create DUP on multiple devices without restrictions.
Note 2: It's not recommended to use 2 devices with RAID5. In that case,
parity stripe will contain the same data as the data stripe, making
RAID5 degraded to RAID1 with more overhead.
Note 3: It's also not recommended to use 3 devices with RAID6, unless
you want to get effectively 3 copies in a RAID1-like manner (but not ex-
actly that).
Note 4: Since kernel 5.5 it's possible to use RAID1C3 as replacement for
RAID6, higher space cost but reliable.
Note 5: Since kernel 5.15 it's possible to use (mount, convert profiles)
RAID0 on one device and RAID10 on two devices.
PROFILE LAYOUT
For the following examples, assume devices numbered by 1, 2, 3 and 4,
data or metadata blocks A, B, C, D, with possible stripes e.g. A1, A2
that would be logically A, etc. For parity profiles PA and QA are parity
and syndrome, associated with the given stripe. The simple layouts sin-
gle or DUP are left out. Actual physical block placement on devices de-
pends on current state of the free/allocated space and may appear ran-
dom. All devices are assumed to be present at the time of the blocks
would have been written.
RAID1
┌──────────┬──────────┬──────────┬──────────┐
│ device 1 │ device 2 │ device 3 │ device 4 │
├──────────┼──────────┼──────────┼──────────┤
│ A │ D │ │ │
├──────────┼──────────┼──────────┼──────────┤
│ B │ │ │ C │
├──────────┼──────────┼──────────┼──────────┤
│ C │ │ │ │
├──────────┼──────────┼──────────┼──────────┤
│ D │ A │ B │ │
└──────────┴──────────┴──────────┴──────────┘
RAID1C3
┌──────────┬──────────┬──────────┬──────────┐
│ device 1 │ device 2 │ device 3 │ device 4 │
├──────────┼──────────┼──────────┼──────────┤
│ A │ A │ D │ │
├──────────┼──────────┼──────────┼──────────┤
│ B │ │ B │ │
├──────────┼──────────┼──────────┼──────────┤
│ C │ │ A │ C │
├──────────┼──────────┼──────────┼──────────┤
│ D │ D │ C │ B │
└──────────┴──────────┴──────────┴──────────┘
RAID0
┌──────────┬──────────┬──────────┬──────────┐
│ device 1 │ device 2 │ device 3 │ device 4 │
├──────────┼──────────┼──────────┼──────────┤
│ A2 │ C3 │ A3 │ C2 │
├──────────┼──────────┼──────────┼──────────┤
│ B1 │ A1 │ D2 │ B3 │
├──────────┼──────────┼──────────┼──────────┤
│ C1 │ D3 │ B4 │ D1 │
├──────────┼──────────┼──────────┼──────────┤
│ D4 │ B2 │ C4 │ A4 │
└──────────┴──────────┴──────────┴──────────┘
RAID5
┌──────────┬──────────┬──────────┬──────────┐
│ device 1 │ device 2 │ device 3 │ device 4 │
├──────────┼──────────┼──────────┼──────────┤
│ A2 │ C3 │ A3 │ C2 │
├──────────┼──────────┼──────────┼──────────┤
│ B1 │ A1 │ D2 │ B3 │
├──────────┼──────────┼──────────┼──────────┤
│ C1 │ D3 │ PB │ D1 │
├──────────┼──────────┼──────────┼──────────┤
│ PD │ B2 │ PC │ PA │
└──────────┴──────────┴──────────┴──────────┘
RAID6
┌──────────┬──────────┬──────────┬──────────┐
│ device 1 │ device 2 │ device 3 │ device 4 │
├──────────┼──────────┼──────────┼──────────┤
│ A2 │ QC │ QA │ C2 │
├──────────┼──────────┼──────────┼──────────┤
│ B1 │ A1 │ D2 │ QB │
├──────────┼──────────┼──────────┼──────────┤
│ C1 │ QD │ PB │ D1 │
├──────────┼──────────┼──────────┼──────────┤
│ PD │ B2 │ PC │ PA │
└──────────┴──────────┴──────────┴──────────┘
DUP PROFILES ON A SINGLE DEVICE
The mkfs utility will let the user create a filesystem with profiles
that write the logical blocks to 2 physical locations. Whether there are
really 2 physical copies highly depends on the underlying device type.
For example, a SSD drive can remap the blocks internally to a single
copy--thus deduplicating them. This negates the purpose of increased re-
dundancy and just wastes filesystem space without providing the expected
level of redundancy.
The duplicated data/metadata may still be useful to statistically im-
prove the chances on a device that might perform some internal optimiza-
tions. The actual details are not usually disclosed by vendors. For ex-
ample we could expect that not all blocks get deduplicated. This will
provide a non-zero probability of recovery compared to a zero chance if
the single profile is used. The user should make the tradeoff decision.
The deduplication in SSDs is thought to be widely available so the rea-
son behind the mkfs default is to not give a false sense of redundancy.
As another example, the widely used USB flash or SD cards use a transla-
tion layer between the logical and physical view of the device. The data
lifetime may be affected by frequent plugging. The memory cells could
get damaged, hopefully not destroying both copies of particular data in
case of DUP.
The wear levelling techniques can also lead to reduced redundancy, even
if the device does not do any deduplication. The controllers may put
data written in a short time span into the same physical storage unit
(cell, block etc). In case this unit dies, both copies are lost. BTRFS
does not add any artificial delay between metadata writes.
The traditional rotational hard drives usually fail at the sector level.
In any case, a device that starts to misbehave and repairs from the DUP
copy should be replaced! DUP is not backup.
KNOWN ISSUES
SMALL FILESYSTEMS AND LARGE NODESIZE
The combination of small filesystem size and large nodesize is not rec-
ommended in general and can lead to various ENOSPC-related issues during
mount time or runtime.
Since mixed block group creation is optional, we allow small filesystem
instances with differing values for sectorsize and nodesize to be cre-
ated and could end up in the following situation:
# mkfs.btrfs -f -n 65536 /dev/loop0
btrfs-progs v3.19-rc2-405-g976307c
See https://btrfs.readthedocs.io for more information.
Performing full device TRIM (512.00MiB) ...
Label: (null)
UUID: 49fab72e-0c8b-466b-a3ca-d1bfe56475f0
Node size: 65536
Sector size: 4096
Filesystem size: 512.00MiB
Block group profiles:
Data: single 8.00MiB
Metadata: DUP 40.00MiB
System: DUP 12.00MiB
SSD detected: no
Incompat features: extref, skinny-metadata
Number of devices: 1
Devices:
ID SIZE PATH
1 512.00MiB /dev/loop0
# mount /dev/loop0 /mnt/
mount: mount /dev/loop0 on /mnt failed: No space left on device
The ENOSPC occurs during the creation of the UUID tree. This is caused
by large metadata blocks and space reservation strategy that allocates
more than can fit into the filesystem.
AVAILABILITY
btrfs is part of btrfs-progs. Please refer to the documentation at ]8;;https://btrfs.readthedocs.io\-
https://btrfs.readthedocs.io]8;;\.
SEE ALSO
btrfs(5), btrfs(8), btrfs-balance(8), ]8;;https://man7.org/linux/man-pages/man8/wipefs.8.html\wipefs(8)]8;;\
6.14 Apr 17, 2025 MKFS.BTRFS(8)
Generated by dwww version 1.16 on Tue Dec 16 04:37:20 CET 2025.