Folding@Home with AMD RX 6600 XT on Fedora 44

This guide covers the setup I actually run at home on my rig: Folding@Home v8 (fah-client 8.5.6) on Fedora 44, with the AMD Radeon RX 6600 XT folding via OpenCL. The 2026 refresh has two big simplifications over the original 2025 guide: ROCm now ships in the stock Fedora repos (no third-party rocm.repo, no amdgpu.repo hacks, no manual ld.so.conf edits), and the whole thing is driven by one idempotent installer script (install-fah.sh, full source in the appendix) instead of hand-run steps.

No proprietary drivers are needed anywhere — the kernel’s in-tree amdgpu driver plus the Fedora-packaged ROCm OpenCL stack is enough.

Requirements

  • Fedora 44 (kernel 7.1.5-201.fc44.x86_64 at time of writing)
  • AMD Radeon RX 6600 XT (Navi 23 / gfx1032)
  • Folding@Home client v8.5.6 (latest release; 8.5.6-64bit-release)
  • rocm-opencl 7.1.1 + OpenCL-ICD-Loader (Fedora repos)

Steps

1) Install the ROCm OpenCL stack from the Fedora repos

No third-party repository, no amdgpu.repo removal, no manual /opt/rocm symlinks:

sudo dnf install rocm-opencl OpenCL-ICD-Loader -y

Verify the AMD ICD is visible:

clinfo | grep -i "platform name"

You should see AMD Accelerated Parallel Processing. The ICD file lives at /etc/OpenCL/vendors/amdocl64.icd and points at libamdocl64.so.

2) Create the fah-client system user with the right groups

The client needs access to /dev/dri/renderD* (via the render group) and the DRM nodes (video) for the GPU:

sudo useradd -r -s /usr/sbin/nologin -d /var/lib/fah-client fah-client
sudo usermod -aG video,render fah-client

3) Install the client binary

There is no Fedora RPM for the v8 client — the debian-10-64bit tarball is the generic Linux build and works fine on Fedora:

FAH_VERSION=8.5.6
curl -fsSL "https://download.foldingathome.org/releases/public/fah-client/debian-10-64bit/release/fah-client_${FAH_VERSION}-64bit-release.tar.bz2" \
  | tar xjf -
sudo install -m755 fah-client_${FAH_VERSION}-64bit-release/fah-client /usr/bin/fah-client

4) Fix the libbz2 ABI mismatch

Fedora 44 ships only libbz2.so.1; the client needs the old libbz2.so.1.0 name. Symlink it or the client won’t start:

sudo ln -s /usr/lib64/libbz2.so.1.0.8 /usr/lib64/libbz2.so.1.0
sudo ldconfig

5) Deploy config, systemd unit, and the polkit rule

config.xml sets the donor identity and power/GPU flags:

<config>
  <user v="your_name_here"/>
  <team v="0"/>
  <power v="full"/>
  <gpu v="true"/>
  <cpu-usage v="100"/>
  <paused v="false"/>
</config>

Systemd unit (/etc/systemd/system/fah-client.service) — run as fah-client, keep the log under /var/log/fah-client:

[Unit]
Description=Folding@home Client
After=network.target nss-lookup.target systemd-logind.service
Wants=systemd-logind.service

[Service]
User=fah-client
ExecStart=/usr/bin/fah-client --config=/etc/fah-client/config.xml --log=/var/log/fah-client/log.txt --log-rotate-dir=/var/log/fah-client/
WorkingDirectory=/var/lib/fah-client
Restart=always
StandardOutput=null
KillMode=mixed
TimeoutStopSec=60
PrivateTmp=yes
ProtectSystem=full
ProtectHome=yes

[Install]
WantedBy=multi-user.target

Polkit rule (/etc/polkit-1/rules.d/50-fah-client.rules) — lets fah-client hold a logind inhibitor so the rig doesn’t sleep mid-WU. Without it the client logs Failed to prevent sleep: Access denied:

polkit.addRule(function(action, subject) {
    if (action.id.indexOf('org.freedesktop.login1.inhibit') == 0 &&
        subject.user == 'fah-client') {
        return polkit.Result.YES;
    }
});

6) Enable the GPU — this is the step that’s easy to miss

The default resource group starts paused:true with gpus:{} (GPU disabled by default). Two traps here:

  • config.xml is only read on the first run. Afterwards all settings live in /var/lib/fah-client/client.db (SQLite, groups table) — editing config.xml later does nothing.
  • <paused v="false"/> in config.xml does not stick. Per the client source, Config::isGPUEnabled(id) defaults to false and the GPU only activates when the group’s gpus map contains {"gpu:XX:XX:XX": {"enabled": true}}.

So after the first boot the group must be unpaused and the GPU enabled in the database, and this must be done while the client is stopped (editing live is a race — the client rewrites its group state on shutdown):

sudo systemctl stop fah-client.service
sudo python3 - <<'EOF'
import json, re, sqlite3

LOG = "/var/log/fah-client/log.txt"
DB  = "/var/lib/fah-client/client.db"

text = open(LOG, encoding="utf-8", errors="replace").read()
gpus = sorted({g.strip('"') for g in re.findall(r'"gpu:[0-9a-f:]+"', text)})

con = sqlite3.connect(DB)
row = con.execute("select name,value from groups").fetchone()
d = json.loads(row[1])
d["paused"] = False
d["gpus"] = {g: {"enabled": True} for g in gpus}
con.execute("update groups set value=? where name=?", (json.dumps(d), row[0]))
con.commit()
print("gpus:", ",".join(gpus))
EOF
sudo systemctl start fah-client.service

On this rig the GPU id is the PCI BDF gpu:09:00:00.

Gotchas (learned the hard way)

  • config.xml is read once. Settings live in client.db afterwards — change the database, not the XML.
  • GPU is off by default. Enabled only via the gpus map in the resource group; see step 6.
  • libbz2.so.1.0 is missing on Fedora 44 — the symlink in step 4 is mandatory.
  • Runs clean under SELinux Enforcing — no AVC denials with this unit file.

Ops

sudo systemctl restart fah-client.service
tail -f /var/log/fah-client/log.txt

CPU WUs run FahCore_a8 (GROMACS); GPU WUs run FahCore_2x (OpenMM over OpenCL on the RX 6600 XT). rocm-smi --showuse should climb to ~99% once OpenMM finishes compiling its kernels. Web Control: http://127.0.0.1:7396 (redirects to v8-5.foldingathome.org, auto-connects to the local client).

Appendix: install-fah.sh

The idempotent installer this guide was distilled from — run as root, it downloads the client, creates the fah-client user, fixes libbz2, deploys config/unit/polkit, and unpauses + enables the GPU in client.db. FAH_VERSION overrides the pinned 8.5.6.

#!/usr/bin/env bash
# install-fah.sh - Fedora Folding@home client installer (v8).
# Idempotent; run as root. Installs + enables the F@H client that donates an
# AMD RX 6600 XT to protein folding.
#
# There is no Fedora RPM for the v8 client; the "debian-10-64bit" tarball is
# the generic linux build and works fine on Fedora.
set -euo pipefail

[[ $EUID -eq 0 ]] || { echo "Run as root." >&2; exit 1; }

# Resolve paths relative to this script's own directory, so it can be invoked
# as `sudo host/install-fah.sh` from anywhere.
cd "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

VERSION=${FAH_VERSION:-8.5.6}
URL="https://download.foldingathome.org/releases/public/fah-client/debian-10-64bit/release/fah-client_${VERSION}-64bit-release.tar.bz2"

echo "==> Creating fah-client system user (video/render groups for GPU/OpenCL)"
id -u fah-client >/dev/null 2>&1 || useradd -r -s /usr/sbin/nologin -d /var/lib/fah-client fah-client
usermod -aG video,render fah-client

echo "==> Creating directories"
install -d -o fah-client -g fah-client -m 750 /etc/fah-client
install -d -o fah-client -g fah-client -m 750 /var/lib/fah-client
install -d -o fah-client -g fah-client -m 750 /var/log/fah-client

echo "==> Installing fah-client binary v${VERSION}"
if ! /usr/bin/fah-client --version 2>/dev/null | grep -qx "${VERSION}"; then
    tmp=$(mktemp -d)
    curl -fsSL "$URL" -o "$tmp/fah.tar.bz2"
    tar xjf "$tmp/fah.tar.bz2" -C "$tmp"
    systemctl stop fah-client.service 2>/dev/null || true
    install -m755 "$tmp/fah-client_${VERSION}-64bit-release/fah-client" /usr/bin/fah-client
    rm -rf "$tmp"
fi

echo "==> Fixing libbz2 (Fedora 44 ships libbz2.so.1 only; client needs libbz2.so.1.0)"
[ -e /usr/lib64/libbz2.so.1.0 ] || ln -s /usr/lib64/libbz2.so.1.0.8 /usr/lib64/libbz2.so.1.0
ldconfig 2>/dev/null || true

echo "==> Installing config + unit + polkit rule"
install -Dm644 fah/config.xml /etc/fah-client/config.xml
install -Dm644 fah/fah-client.service /etc/systemd/system/fah-client.service
install -Dm644 fah/50-fah-client.rules /etc/polkit-1/rules.d/50-fah-client.rules
systemctl daemon-reload

echo "==> Enabling + starting"
systemctl enable fah-client.service
systemctl start fah-client.service || {
    echo "!! failed to start - check: journalctl -u fah-client.service" >&2
    exit 1
}

echo "==> Unpausing + enabling GPU folding in the default resource group"
# The default group is created paused:true with gpus:{} (GPU disabled) and, once
# created, config.xml is IGNORED (settings live in client.db). Stop first, then
# edit the sqlite db, then start again - editing while the client runs is a race
# (the client rewrites its group state on shutdown).
systemctl stop fah-client.service
sleep 2
python3 - <<'EOF'
import json, re, sqlite3, subprocess, sys, time

LOG = "/var/log/fah-client/log.txt"
DB = "/var/lib/fah-client/client.db"

for _ in range(12):
    try:
        text = open(LOG, encoding="utf-8", errors="replace").read()
        gpus = sorted({g.strip('"') for g in re.findall(r'"gpu:[0-9a-f:]+"', text)})
        if gpus:
            break
    except OSError:
        pass
    time.sleep(5)
else:
    print("!! could not find any detected GPU id in the log - GPU folding NOT enabled", file=sys.stderr)
    gpus = []

con = sqlite3.connect(DB)
cur = con.cursor()
row = cur.execute("select name,value from groups").fetchone()
if row is None:
    print("!! no resource group found in client.db - GPU folding NOT enabled", file=sys.stderr)
else:
    d = json.loads(row[1])
    d["paused"] = False
    d["gpus"] = {g: {"enabled": True} for g in gpus}
    cur.execute("update groups set value=? where name=?", (json.dumps(d), row[0]))
    con.commit()
    print("group:", "paused=False" if not d["paused"] else "", "gpus=" + ",".join(gpus) if gpus else "gpus=<none>")
con.close()
EOF

echo "==> Starting to apply resource group changes"
systemctl start fah-client.service

echo
echo "Done. Verify:"
echo "  systemctl status fah-client.service"
echo "  tail -f /var/log/fah-client/log.txt            (WU1.. = CPU/GROMACS a8, WU..23 = GPU/OpenMM)"
echo "  rocm-smi --showuse                             (GPU busy %% should climb to ~99)"
echo "  Web Control: http://127.0.0.1:7396              (redirects to v8.foldingathome.org, auto-connects)"

References

  1. Folding@home downloads — v8 client tarballs.
  2. Ultimate AMD GPU Linux FAH Guide for OpenCL (FAH-Client v8 only)