Skip to content

Add Btrfs fallback for other Linux distros#956

Open
locnnil wants to merge 2 commits into
canonical:mainfrom
locnnil:add-btrfs-fallback
Open

Add Btrfs fallback for other Linux distros#956
locnnil wants to merge 2 commits into
canonical:mainfrom
locnnil:add-btrfs-fallback

Conversation

@locnnil

@locnnil locnnil commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Description

Enables Btrfs fallback for other Linux distributions.

ZFS is the preferred storage driver, but it isn't available everywhere: WSL, SUSE, Arch, Fedora, and other distributions may ship without it. Keying the fallback off the distribution name is too coarse; it assumes every non-Ubuntu host lacks ZFS and every Ubuntu-derived one has it, neither of which holds for Debian and its derivatives.

Instead, detect whether the host provides a usable ZFS kernel module, already loaded (present at /dev/zfs AND /sys/module/zfs ) or loadable for the running kernel per modules.dep(5) (/lib/modules/$(uname -r)/modules.dep) or modules.builtin (/lib/modules/$(uname -r)/modules.builtin) and keep ZFS only then, falling back to btrfs otherwise. Only the kernel module is checked: LXD ships as a snap that bundles the zpool/zfs userspace tools, so a loaded or loadable module is what actually determines usability from the host side, tested on Arch Linux and openSUSE tumbleweed.

Self-review quick check

  • Make decisions that cost a lot to reverse explicit in the PR description.
  • Avoid nested conditions.
  • Delete dead code and redundant comments. TODO: check if it is okay to delete isWSL()
  • Normalise symmetries by sticking to doing identical things identically.
// one way to handle errors
if err := f(); err != nil {
   ...
}

// one way to handle multiple returns
val, err := f()
if err != nil {
   ...
}
...
  • Check that coupled code elements, files, and directories are adjacent. For example, test data is stored as close as possible to a test.
  • Put variable declaration and initialisation together.
  • Divide large expressions into digestable and self-explanatory ones. Use multiple variables if required.
  • Put a blank line between two logically different chunks of code.
  • Follow the style guide for new error messages.

Docs

Procedure:

  • I have checked and added or updated relevant documentation.
  • I have checked and added or updated relevant release notes.
  • I have included the technical author in the review.

Content:

  • Headings and titles accurately describe the content.
  • New and updated pages include correct metadata.
  • Documentation tests are added or updated where applicable (for tutorial/ and how-to/ sections).
  • Documentation follows the style guide.
  • If needed, docs/.coverage.yaml updated, coverage tags added (.. artefact).

Or:

  • I confirm the PR has no implications for documentation.

locnnil added 2 commits July 21, 2026 17:34
ZFS is the preferred storage driver, but it isn't available everywhere:
WSL, SUSE, Arch, Fedora and other distributions may ship without it. Keying
the fallback off the distribution name is too coarse -- it assumes every
non-Ubuntu host lacks ZFS and every Ubuntu-derived one has it, neither of
which holds for Debian and its derivatives.

Instead, detect whether the host provides a usable ZFS kernel module
(already loaded, or loadable for the running kernel per modules.dep /
modules.builtin) and keep ZFS only then, falling back to btrfs otherwise.
Only the kernel module is checked: LXD ships as a snap that bundles the
zpool/zfs userspace tools, so a loaded or loadable module is what actually
determines usability from the host side.

Signed-off-by: Lincoln Wallace <lincoln.wallace@canonical.com>
The storage docs described the Btrfs fallback as WSL-specific. Reword the
three affected passages to reflect that Workshop uses ZFS wherever it
detects ZFS is available and otherwise falls back to Btrfs, keeping WSL as
an example rather than the sole case.

Signed-off-by: Lincoln Wallace <lincoln.wallace@canonical.com>
@jonathan-conder

Copy link
Copy Markdown
Contributor

It looks to me like the way LXD does it is just trying to load the zfs module; maybe we should follow their lead on that

@jonathan-conder

Copy link
Copy Markdown
Contributor

I think we also need to be more careful about where we use the storagePoolDriver variable. Currently we can assume it's accurate, since whether the host is WSL or not is unlikely to change. The availability of the ZFS module can easily change, though; we need a separate mechanism to indicate "what's the current driver of the workshop pool."

@locnnil

locnnil commented Jul 22, 2026

Copy link
Copy Markdown
Contributor Author

I think we also need to be more careful about where we use the storagePoolDriver variable. Currently we can assume it's accurate, since whether the host is WSL or not is unlikely to change. The availability of the ZFS module can easily change, though; we need a separate mechanism to indicate "what's the current driver of the workshop pool."

So, considering the case where ZFS was available when the pool was created but later stops being present, most likely because the user installed a different kernel that doesn't ship the ZFS module. What should we do with the now-unusable ZFS pool?

I can think of those options:

  • Put the daemon into a degraded state and add an actionable error message like "restore the ZFS-capable kernel, or remove the pool to recreate it as Btrfs"
  • Warn the user with an actionable message like "Old ZFS pool detected on system without support for ZFS on path <path-to-zfs-pool>" but create a new Btrfs pool under a different name.

I believe that the first option is better, right?

@jonathan-conder

Copy link
Copy Markdown
Contributor

I believe that the first option is better, right?

I agree, but we should not suggest removing the pool, it will probably break the workshops using it (if it's even possible to remove it). Instead maybe it's best to reinstall the Workshop snap.

We just need to test what actually happens in that scenario, maybe LXD will fail to start and we probably handle that already.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

workshop does not work on non-Ubuntu systems

2 participants