Btrfs: Difference between revisions
→Compression: talk about compression algos and levels |
m Polish text in →Top-level vs nested subvolumes |
||
(7 intermediate revisions by 5 users not shown) | |||
Line 3: | Line 3: | ||
{{note| Use [https://github.com/nix-community/disko/ disko] to manage your NixOS storage layout declaratively. The following shows a manual approach as seen in traditional Linux distributions.}} | {{note| Use [https://github.com/nix-community/disko/ disko] to manage your NixOS storage layout declaratively. The following shows a manual approach as seen in traditional Linux distributions.}} | ||
= Installation of NixOS on btrfs = | |||
{{note|The following example is for EFI enabled systems. Adjust commands accordingly for a BIOS installation.}} | {{note|The following example is for EFI enabled systems. Adjust commands accordingly for a BIOS installation.}} | ||
== Partition the disk == | |||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
# printf "label: gpt\n,550M,U\n,,L\n" | sfdisk /dev/sdX | # printf "label: gpt\n,550M,U\n,,L\n" | sfdisk /dev/sdX | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Format partitions and create subvolumes == | |||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
# nix-shell -p btrfs-progs | # nix-shell -p btrfs-progs | ||
Line 26: | Line 26: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Mount the partitions and subvolumes == | |||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
# mount -o compress=zstd,subvol=root /dev/sdX2 /mnt | # mount -o compress=zstd,subvol=root /dev/sdX2 /mnt | ||
Line 37: | Line 37: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Install NixOS == | |||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
# nixos-generate-config --root /mnt | # nixos-generate-config --root /mnt | ||
Line 44: | Line 44: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
= Configuration = | |||
== Compression == | |||
<code>nixos-generate-config</code> doesn't detect mount options automatically. To enable compression, you must specify them manually and other mount options in your <code>configuration.nix</code>: | <code>nixos-generate-config</code> doesn't detect mount options automatically. To enable compression, you must specify them manually and other mount options in your <code>configuration.nix</code>: | ||
Line 73: | Line 73: | ||
{{note| Compression is applied only to newly written data. Existing data won't be compressed unless rewritten. (e.g., <code>btrfs filesystem defrag -r -v -czstd /path</code>)}} | {{note| Compression is applied only to newly written data. Existing data won't be compressed unless rewritten. (e.g., <code>btrfs filesystem defrag -r -v -czstd /path</code>)}} | ||
== Swap file == | |||
Creating a separate subvolume for the swap file is optional. It is not required for functionality but can help with organization or snapshot management. Be sure to regenerate your <code>hardware-configuration.nix</code> if you choose to do this. | |||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
# mkdir -p /mnt | # mkdir -p /mnt | ||
Line 83: | Line 84: | ||
# mkdir /swap | # mkdir /swap | ||
# mount -o noatime,subvol=swap /dev/sdXY /swap | # mount -o noatime,subvol=swap /dev/sdXY /swap | ||
# nixos-generate-config | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Finally, define a swap file in your configuration and run <code>nixos-rebuild switch</code>: | |||
{{file|/etc/nixos/configuration.nix|nix| | |||
<nowiki> | |||
swapDevices = [{ | |||
device = "/swap/swapfile"; | |||
size = 8*1024; # Creates an 8GB swap file | |||
}]; | |||
</nowiki> | |||
}} | |||
NixOS will automatically create the swap file with the appropriate attributes for Btrfs including disabling copy on write. | |||
< | {{note| On systems where you do need to manually prepare a swap file on Btrfs, you can use <code>btrfs filesystem mkswapfile</code> utility, e.g.: <br><code># btrfs filesystem mkswapfile --uuid clear /swap/swapfile</code>}} | ||
# btrfs filesystem mkswapfile | |||
</ | |||
For more NixOS swap configuration options, see [[Swap]]. Additonal Btrfs swapfile usage can be found at [https://btrfs.readthedocs.io/en/latest/Swapfile.html the Btrfs docs]. | |||
== Scrubbing == | |||
Btrfs filesystems by default keep checksums for all files, to monitor if the file has changed due to hardware malfunctions or other external effects. | Btrfs filesystems by default keep checksums for all files, to monitor if the file has changed due to hardware malfunctions or other external effects. | ||
Line 133: | Line 141: | ||
You can check the status of the ongoing scrubbing process with the same <code>status</code> command as above. | You can check the status of the ongoing scrubbing process with the same <code>status</code> command as above. | ||
== Deduplication == | |||
Files with (partially) equal contents can be deduplicated using [https://github.com/Zygo/bees bees] or [https://github.com/markfasheh/duperemove duperemove]. The [https://btrfs.readthedocs.io/en/latest/Deduplication.html upstream wiki entry] on deduplication provides an overview of available features of these programs. | |||
Files with (partially) equal contents can be deduplicated using [https://github.com/Zygo/bees bees] or [https://github.com/markfasheh/duperemove duperemove]. | |||
bees can be configured in <code>configuration.nix</code>: | bees can be configured in <code>configuration.nix</code>: | ||
Line 152: | Line 159: | ||
This will run the daemon in the background. To disable auto-start, use <code>systemd.services."beesd@root".wantedBy = lib.mkForce [ ];</code> for each filesystem. | This will run the daemon in the background. To disable auto-start, use <code>systemd.services."beesd@root".wantedBy = lib.mkForce [ ];</code> for each filesystem. | ||
== | = Usage = | ||
== Subvolumes == | |||
To display all subvolumes within a mounted btrfs filesystem: | |||
= | <syntaxhighlight lang="bash"> | ||
btrfs subvolume list -t /mnt | |||
</syntaxhighlight> | |||
To create a new subvolume at a specified location: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
Line 162: | Line 175: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
To remove an existing subvolume: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
Line 168: | Line 181: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Snapshots | === Top-level vs nested subvolumes === | ||
In btrfs, subvolumes can be created either at the top level of the filesystem or within other subvolumes. | |||
* Top-level subvolumes are created directly under the filesystem's root. By default, the root volume ID is 5. Top-level subvolumes are easier to snapshot, roll back or destroy independently. This is good for things such as <code>/home</code> or <code>/nix</code>. | |||
* Nested subvolumes are created inside an existing subvolume or directory within the filesystem. All nested subvolumes inherit the mount status of their parent unless mounted separately. This layout is useful for organizing related subvolumes under a common namespace. For example, a top-level subvolume such as <code>/srv/nfs</code> can contain multiple nested subvolumes like <code>/srv/nfs/export1</code> and <code>/srv/nfs/export2</code>. | |||
== Snapshots == | |||
A snapshot in btrfs is simply a subvolume that shares its data (and metadata) with some other subvolume, using btrfs's CoW capabilities. Because of that, there is no special location for snapshots and you can decide where you want to store them. It can be a simple directory inside the root subvolume, or a directory inside a dedicated "snapshots" subvolume. | A snapshot in btrfs is simply a subvolume that shares its data (and metadata) with some other subvolume, using btrfs's CoW capabilities. Because of that, there is no special location for snapshots and you can decide where you want to store them. It can be a simple directory inside the root subvolume, or a directory inside a dedicated "snapshots" subvolume. | ||
Line 204: | Line 227: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
After this you can mount <code>/home</code> again. | After this you can mount <code>/home</code> again. | ||
== Transfer snapshot == | |||
Sending the snapshot <code>/snapshots/nixos_snapshot_202302</code> compressed to a remote host via ssh at <code>root@192.168.178.110</code> and saving it to a subvolume mounted on a directory at <code>/mnt/nixos</code> | Sending the snapshot <code>/snapshots/nixos_snapshot_202302</code> compressed to a remote host via ssh at <code>root@192.168.178.110</code> and saving it to a subvolume mounted on a directory at <code>/mnt/nixos</code> | ||
Line 212: | Line 236: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
If both the sender and receiver side have Btrfs with the same compression algorithm and level, you can instead use <code>send --compressed-data</code> to avoid decompressing and recompressing the data. | |||
= Tips and tricks = | |||
== Backup == | |||
[[Btrbk]] is a tool for creating snapshots and remote backups of btrfs subvolumes. | |||
== Installation with encryption == | |||
Using [https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup Luks2]: | Using [https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup Luks2]: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
Line 226: | Line 257: | ||
<code>mkfs.vfat -n BOOT "$DISK"p1</code> | <code>mkfs.vfat -n BOOT "$DISK"p1</code> | ||
=== Creating subvolumes === | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
Line 292: | Line 323: | ||
</syntaxhighlight > | </syntaxhighlight > | ||
== Convert Ext3/Ext4 system partition to Btrfs == | |||
{{Warning|Note that migrating your existing root filesystem can cause data loss or make your system unbootable. Make sure to backup the partition or your files. Proceed only if you know what you're doing!}} | |||
To convert the existing filesystem (Ext3/4) to Btrfs, boot into a NixOS live system and run the following commandː<syntaxhighlight lang="sh"> | To convert the existing filesystem (Ext3/4) to Btrfs, boot into a NixOS live system and run the following commandː<syntaxhighlight lang="sh"> | ||
Line 320: | Line 348: | ||
btrfs subvolume delete /btrfs/ext2_saved | btrfs subvolume delete /btrfs/ext2_saved | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== TRIM support === | |||
{{main|Filesystems#SSD TRIM support}} | |||
Refer to [https://btrfs.readthedocs.io/en/latest/Trim.html btrfs docs] on how Trim works with btrfs through the <code>discard</code> mount option. | |||
[[Category: Configuration]] | [[Category: Configuration]] | ||
[[Category:Filesystem]] | [[Category:Filesystem]] |