Bcachefs: Difference between revisions

Onny (talk | contribs)
Usage: Change partition encryption password
Onny (talk | contribs)
NixOS installation on bcachefs: Cleanup instruction
 
(9 intermediate revisions by 4 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 114: Line 114:
== Tips and tricks ==
== Tips and tricks ==


=== Generate bcachefs enabled installation media ===
=== Generate bcachefs enabled installation media ===
 
Use following Nix [[Flakes|Flake-expression]] to generate a ISO installation image with a bcachefs enabled kernel
Use following Nix [[Flakes|Flake-expression]] to generate a ISO installation image with a bcachefs enabled kernel
 
{{file|flake.nix|nix|<nowiki>
{{file|flake.nix|nix|<nowiki>
{
{
   description = "Bcachefs enabled installation media";
   description = "Bcachefs enabled installation media";
   inputs.nixos.url = "nixpkgs/nixos-24.11";
   inputs.nixos.url = "nixpkgs/nixos-25.11";
   outputs = { self, nixos }: {
   outputs = { self, nixos }: {
     nixosConfigurations = {
     nixosConfigurations = {
Line 129: Line 131:
           "${nixos}/nixos/modules/installer/cd-dvd/installation-cd-minimal-new-kernel-no-zfs.nix"
           "${nixos}/nixos/modules/installer/cd-dvd/installation-cd-minimal-new-kernel-no-zfs.nix"
           ({ lib, pkgs, ... }: {
           ({ lib, pkgs, ... }: {
             # Might be required as a workaround for bug
             # Required as a workaround for bug
             # https://github.com/NixOS/nixpkgs/issues/32279
             # https://github.com/NixOS/nixpkgs/issues/32279
             environment.systemPackages = [ pkgs.keyutils ];
             environment.systemPackages = [ pkgs.keyutils ];
Line 142: Line 144:


The following commands will generate the iso-image which will be available in the directory <code>./result/iso</code>
The following commands will generate the iso-image which will be available in the directory <code>./result/iso</code>
 
<syntaxhighlight lang="console">
<syntaxhighlight lang="console"># nix build .#nixosConfigurations.exampleIso.config.system.build.isoImage
# nix build .#nixosConfigurations.exampleIso.config.system.build.isoImage
</syntaxhighlight>
</syntaxhighlight>


Line 172: Line 173:


<syntaxhighlight lang="console">
<syntaxhighlight lang="console">
# nix-shell -p keyutils --run 'keyctl link @u @s'
# keyctl link @u @s
# bcachefs format --encrypted /dev/sda2
# bcachefs format --label=nixos --encrypted /dev/sda2
# bcachefs unlock /dev/sda2
# bcachefs unlock /dev/sda2
</syntaxhighlight>
</syntaxhighlight>


Mount filesystems
Mount filesystems. Use <code>lsblk -o +uuid,fsType | grep bcachefs</code> to get bcachefs partition uuid.
 
There are two ways to mount a bcachefs filesystem. First, by device:


<syntaxhighlight lang="console">
<syntaxhighlight lang="console">
# mount /dev/sda2 /mnt
# mount /dev/disk/by-uuid/<...> /mnt
# mkdir /mnt/boot
# mkdir /mnt/boot
# mount /dev/disk/by-label/boot /mnt/boot
# mount /dev/disk/by-label/boot /mnt/boot
</syntaxhighlight>
</syntaxhighlight>
For better reliability as with any other filesystem, one should mount the filesystem by UUID, by replacing any drive specifiers with it.
When you formatted, there was an external UUID shown, but if you lost it, you can retrieve it using
<syntaxhighlight lang="console">
# lsblk -o +uuid,fsType | grep bcachefs
</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>.
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/<UUID>` or `/dev/disk/by-id` instead. This seems to work for single device systems atleast, although atleast at the time of this writing I could not get it to work on my 4+ device raid system.


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 213: Line 196:
   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 = {