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_64at 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-opencl7.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.xmlis only read on the first run. Afterwards all settings live in/var/lib/fah-client/client.db(SQLite,groupstable) — editingconfig.xmllater 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’sgpusmap 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.xmlis read once. Settings live inclient.dbafterwards — change the database, not the XML. -
GPU is off by default. Enabled only via the
gpusmap in the resource group; see step 6. -
libbz2.so.1.0is 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
- Folding@home downloads — v8 client tarballs.
- Ultimate AMD GPU Linux FAH Guide for OpenCL (FAH-Client v8 only)