Bcachefs: Difference between revisions

Note about currently broken bcachefs mounting on NixOS, and add link to github issue.
github issue referenced in wiki is now fixed, so remove note.
 
(8 intermediate revisions by 5 users not shown)
Line 1: Line 1:
[https://bcachefs.org Bcachefs] is a next-generation CoW filesystem that aims to provide features from [[Btrfs]] and [[ZFS]] with a cleaner codebase, more stability, greater speed and a GPL-compatible license. It is built upon Bcache and is mainly developed by Kent Overstreet.  
[https://bcachefs.org Bcachefs] is a next-generation CoW filesystem that aims to provide features from [[Btrfs]] and [[ZFS]] with a cleaner codebase<ref name=":0">citation needed</ref>, more stability<ref name=":0" />, greater speed<ref name=":0" /> and a GPL-compatible license. It is built upon Bcache and is mainly developed by Kent Overstreet.  


== Installation ==
== Installation ==
Line 57: Line 57:
     --label=hdd.hdd3 /dev/sde \
     --label=hdd.hdd3 /dev/sde \
     --label=ssd.ssd1 /dev/sdf \
     --label=ssd.ssd1 /dev/sdf \
     --label=ssd.ssd2 /dev/sdg
     --label=ssd.ssd2 /dev/sdg \
     --foreground_target=ssd \
     --foreground_target=ssd \
     --promote_target=ssd \
     --promote_target=ssd \
Line 71: Line 71:
     --label=hdd.hdd3 /dev/sde \
     --label=hdd.hdd3 /dev/sde \
     --label=ssd.ssd1 /dev/sdf \
     --label=ssd.ssd1 /dev/sdf \
     --label=ssd.ssd2 /dev/sdg
     --label=ssd.ssd2 /dev/sdg \
     --foreground_target=ssd \
     --foreground_target=ssd \
     --promote_target=ssd \
     --promote_target=ssd \
Line 88: Line 88:
<syntaxhighlight lang="console">
<syntaxhighlight lang="console">
# bcachefs fsck /dev/sda
# bcachefs fsck /dev/sda
</syntaxhighlight>Change partition encryption password for <code>/dev/sda1</code><syntaxhighlight lang="console">
# bcachefs set-passphrase /dev/sda1
</syntaxhighlight>
</syntaxhighlight>


Line 111: Line 113:


== Tips and tricks ==
== Tips and tricks ==
=== Generate bcachefs enabled installation media ===
Use following Nix [[Flakes|Flake-expression]] to generate a ISO installation image with a bcachefs enabled kernel
{{file|flake.nix|nix|<nowiki>
{
  description = "Bcachefs enabled installation media";
  inputs.nixos.url = "nixpkgs/nixos-24.05";
  outputs = { self, nixos }: {
    nixosConfigurations = {
      exampleIso = nixos.lib.nixosSystem {
        system = "x86_64-linux";
        modules = [
          "${nixos}/nixos/modules/installer/cd-dvd/installation-cd-minimal-new-kernel-no-zfs.nix"
          ({ lib, pkgs, ... }: {
            # Might be required as a workaround for bug
            # https://github.com/NixOS/nixpkgs/issues/32279
            environment.systemPackages = [ pkgs.keyutils ];
            boot.supportedFilesystems = [ "bcachefs" ];
          })
        ];
      };
    };
  };
}
</nowiki>}}
The following commands will generate the iso-image which will be available in the directory <code>./result/iso</code>
<syntaxhighlight lang="console">
# git init
# git add flake.nix
# nix build .#nixosConfigurations.exampleIso.config.system.build.isoImage
</syntaxhighlight>


=== NixOS installation on bcachefs ===
=== NixOS installation on bcachefs ===
Line 166: Line 133:
<syntaxhighlight lang="console">
<syntaxhighlight lang="console">
# mkfs.fat -F 32 -n boot /dev/sda1
# mkfs.fat -F 32 -n boot /dev/sda1
# nix shell -p bcachefs-tools
# mkfs.bcachefs -L nixos /dev/sda2
# mkfs.bcachefs -L nixos /dev/sda2
</syntaxhighlight>
</syntaxhighlight>


In case you want to enable filesystem encryption, there's a workaround for [https://github.com/NixOS/nixpkgs/issues/32279 a bug] affecting NixOS 23.11. Formatting and unlocking the encrypted partition would look like this
Formatting and unlocking the encrypted partition would look like this


<syntaxhighlight lang="console">
<syntaxhighlight lang="console">
# nix-env -iA nixos.keyutils
# nix-shell -p keyutils --run 'keyctl link @u @s'
# keyctl link @u @s
# nix-shell -p bcachefs-tools
# bcachefs format --encrypted /dev/sda2
# bcachefs format --encrypted /dev/sda2
# bcachefs unlock /dev/sda2
# bcachefs unlock /dev/sda2
Line 194: Line 162:
</syntaxhighlight>
</syntaxhighlight>
And using it like <code>UUID=<UUID></code> in place of <code>/dev/sda1:/dev/sdb1</code> or even just <code>/dev/sda</code>.
And using it like <code>UUID=<UUID></code> in place of <code>/dev/sda1:/dev/sdb1</code> or even just <code>/dev/sda</code>.
Note: this is currently broken as per this [https://github.com/NixOS/nixpkgs/issues/317901 github issue]. As a workaround, use `/dev/disk/by-uuid/<UUID1>:/dev/disk/by-uuid/<UUID2>` instead.


Continue installation as recommended by the [https://nixos.org/manual/nixos/stable/index.html#ch-installation NixOS manual].
Continue installation as recommended by the [https://nixos.org/manual/nixos/stable/index.html#ch-installation NixOS manual].
Before <code>nixos-install</code> you'll have to adapt the generated NixOS configuration to also use the latest Linux kernel supporting Bcachefs. Add the following line to the <code>configuration.nix</code> in your installation root (/mnt):
{{file|/mnt/etc/nixos/configuration.nix|nix|<nowiki>
boot.supportedFilesystems = [ "bcachefs" ];
boot.kernelPackages = pkgs.linuxPackages_latest;
</nowiki>}}


=== Remote encrypted disk unlocking ===
=== Remote encrypted disk unlocking ===
Line 214: Line 173:
   after = [ "local-fs.target" ];
   after = [ "local-fs.target" ];
   wantedBy = [ "multi-user.target" ];
   wantedBy = [ "multi-user.target" ];
  environment = {
    DEVICE_PATH = "/dev/sda1";
    MOUNT_POINT = "/mnt";
  };
   script = ''
   script = ''
     #!${pkgs.runtimeShell} -e
     #!${pkgs.runtimeShell} -e
     ${pkgs.keyutils}/bin/keyctl link @u @s
     ${pkgs.keyutils}/bin/keyctl link @u @s
     while [ ! -b /dev/sda1 ]; do
 
       echo "Waiting for /dev/sda1 to become available..."
    # Check if the device path exists
     if [ ! -b "$DEVICE_PATH" ]; then
      echo "Error: Device path $DEVICE_PATH does not exist."
      exit 1
    fi
 
    # Check if the drive is already mounted
    if ${pkgs.util-linux}/bin/mountpoint -q "$MOUNT_POINT"; then
      echo "Drive already mounted at $MOUNT_POINT. Skipping..."
      exit 0
    fi
 
    # Wait for the device to become available
    while [ ! -b "$DEVICE_PATH" ]; do
       echo "Waiting for $DEVICE_PATH to become available..."
       sleep 5
       sleep 5
     done
     done
     ${pkgs.bcachefs-tools}/bin/bcachefs mount -f /etc/keyfile_test /dev/sda1 /mnt
 
    # Mount the device
     ${pkgs.bcachefs-tools}/bin/bcachefs mount -f /etc/keyfile_test "$DEVICE_PATH" "$MOUNT_POINT"
   '';
   '';
   serviceConfig = {
   serviceConfig = {