-
-
Notifications
You must be signed in to change notification settings - Fork 6
Linux Installation
Before you start, make sure you have:
- Linux. systemd is recommended, the setup wizard installs and manages the daemon as a service. Without systemd (OpenRC, runit, s6, etc.) the installer still works; it prints the manual daemon start command at the end and you run it yourself.
-
Python 3.10 or newer. Most distros from 2022 onward ship this. Check with
python3 --version. The install script can install it for you if it's missing. - Root / sudo access, needed for the daemon service and the kernel module.
- An AMD Ryzen APU or desktop CPU. Intel is not supported. If you're not sure whether your CPU is supported, install the app and run it; hardware detection will tell you.
- A terminal at least 50x25 characters. The app shows a "terminal too small" notice below that size.
The Python dependencies are pyzmq, textual, textual-plotext and zenmaster (the cross-platform SMU backend library); the installer puts them all in a private virtual environment (/opt/zentune/venv), so they never touch your system Python.
Note
Skip this section if Secure Boot is off. Check first:
mokutil --sb-stateSecureBoot disabled -> skip to step 3. SecureBoot enabled -> continue here.
Secure Boot on means the kernel blocks unsigned modules and raw PCI config writes. The daemon needs ryzen_smu to reach the SMU. Minimum version is 0.1.7.
You need cmake, gcc, g++ (or gcc-c++), dkms and openssl. DKMS rebuilds the module automatically on kernel updates.
Debian / Ubuntu / Linux Mint / Pop!_OS:
sudo apt update
sudo apt install cmake gcc g++ dkms opensslFedora:
sudo dnf install cmake gcc gcc-c++ dkms opensslAlmaLinux / Rocky Linux 9:
sudo dnf install epel-release
sudo dnf install cmake gcc gcc-c++ dkms opensslDKMS lives in EPEL on RHEL-based systems, so
epel-releasehas to go in first. On RHEL itself you also need the CodeReady Builder repo enabled throughsubscription-manager.
CentOS Stream 9:
sudo dnf config-manager --set-enabled crb
sudo dnf install epel-release
sudo dnf install cmake gcc gcc-c++ dkms opensslArch Linux / Manjaro / EndeavourOS:
sudo pacman -S cmake gcc dkms opensslopenSUSE Tumbleweed / Leap:
sudo zypper install cmake gcc gcc-c++ dkms opensslVoid Linux:
sudo xbps-install -S cmake gcc dkms opensslGentoo:
sudo emerge --ask dev-build/cmake sys-kernel/dkms dev-libs/opensslFor more information, visit ryzen_smu.
git clone https://github.com/amkillam/ryzen_smu
cd ryzen_smu
sudo make dkms-installRegisters with DKMS and builds for your running kernel.
Verify:
sudo modprobe ryzen_smu
lsmod | grep ryzen_smuryzen_smu should appear in the output. If modprobe fails with "Operation not permitted" or a signature error, go to the Secure Boot section below.
If Secure Boot is on, the kernel won't load unsigned modules. You need to enroll the DKMS signing key that was created during make dkms-install.
Enroll the key:
sudo mokutil --import /var/lib/dkms/mok.pubSet a one-time password when prompted. You'll type it on the next boot.
Reboot:
sudo rebootA blue MOK Manager screen appears on boot, it only stays for a few seconds, so watch for it:
- Enroll MOK
- Continue
- Yes
- Type the one-time password
- Reboot
After booting, verify:
sudo modprobe ryzen_smu
lsmod | grep ryzen_smuIf the MOK Manager screen never appeared, check your BIOS/UEFI for something like "Secure Boot Key Management" or "MOK Management".
ls /sys/kernel/ryzen_smu_drv/Should show files like drv_version, smn, pm_table, etc. If the directory is there and not empty, it's working.
Check version:
cat /sys/kernel/ryzen_smu_drv/drv_versionNeeds to be 0.1.7 or newer.
curl -fsSL https://raw.githubusercontent.com/HorizonUnix/ZenTune/main/install.sh | bashRun as your normal user, not root. The script asks for sudo only where it's needed.
What it does:
- Installs
wget,unzipandcurlvia your package manager (apt, dnf, yum, pacman, zypper), plus Python 3.10+ if missing - Downloads the latest release to
/opt/zentune/src/ - Creates a venv at
/opt/zentune/venv/withpyzmq,textual,textual-plotextandzenmaster - Creates the launcher at
/usr/local/bin/zentune - Chowns
/opt/zentuneto your user so the TUI can write config without root - On update: replaces app files, restarts daemon, keeps your
config.iniandcustom.json
The systemd service is set up by the first-run wizard, not the installer.
Unsupported package manager (Void, Gentoo, NixOS, etc.): the installer checks whether wget/curl and unzip are already present. If they are, it skips the package step. If anything is missing it lists what's needed and exits.
No systemd (OpenRC, runit, s6, etc.): the installer completes normally and prints the daemon start command at the end:
sudo /opt/zentune/venv/bin/python3 /opt/zentune/src/Assets/daemon/daemon.py
Run that before launching the app. For service file examples, see Manual installation.
zentuneThe setup wizard runs automatically the first time. It's a three-step dialog:
Step 1: Welcome. An intro screen. Press Begin setup to continue.
Step 2: Background daemon. Press Install / enable daemon. You'll be asked for your password (the daemon needs root). The wizard creates and starts zentune.service, then shows Daemon: running. Continue unlocks once it's up. Without systemd, this step prints the manual start command; run it in another terminal (see Manual installation), and it'll be detected.
Step 3: Detect hardware. Runs automatically when you reach this step. Shows your CPU family, architecture, type and preset profile, e.g. Family HawkPoint, Type Amd_Apu. If it shows Unknown, see Linux Troubleshooting and press Detect again. Press Finish to get to the main screen.
Once setup finishes, the app opens on the Home tab. Press 1 (or open the Premade tab) to apply your first preset.
The interface is a set of tabs. Switch between them with the number keys or by clicking:
| Key | Tab | What it's for |
|---|---|---|
h |
Home | Live CPU graphs and a jump-off point to every other tab |
1 |
Premade | Apply Eco / Balance / Performance / Extreme |
2 |
Custom | Build and apply your own preset (Custom Presets) |
3 |
Adaptive | Live tuning from temperature and load (Adaptive Mode) |
4 |
Auto | AC/battery and resume preset switching |
5 |
Info | CPU, board and cache details |
6 |
Status | Daemon state and the last SMU apply output |
7 |
Settings | Daemon service, reapply, hardware re-detect, reset |
? |
- | About / check for updates |
q |
- | Quit |
The app checks GitHub on launch (when Software update is on) and offers to update when a newer version is out. It backs up config.ini and custom.json, replaces the app files, restores settings, restarts the daemon and relaunches.
Force an update anytime from About (?) -> Check updates: Update now for the latest stable, Switch to beta for the rolling beta build.
Re-running the install script also works: pulls the latest release, reinstalls deps into the venv, restarts the daemon if systemd is active, keeps your config and presets.
If you're still on UXTU4Linux v1.1.0, "Check updates" walks you through a one-time automatic migration to ZenTune instead, your settings and presets carry over, no manual steps required.
Run the install script with --uninstall. It removes the systemd service, launcher, /opt/zentune, and any leftover sockets and lock files.
If you still have the script locally:
bash install.sh --uninstallOr fetch and run it in one line:
curl -fsSL https://raw.githubusercontent.com/HorizonUnix/ZenTune/main/install.sh | bash -s -- --uninstallAsks for confirmation, then removes:
| Item | Path |
|---|---|
| systemd service (if present) | /etc/systemd/system/zentune.service |
| Launcher | /usr/local/bin/zentune |
| App, venv and config | /opt/zentune |
| Runtime socket / lock |
/run/zentune.sock, /run/zentune_daemon.lock
|
| TUI lock | /tmp/zentune_tui.lock |
To skip the confirmation prompt (for scripts), set ZENTUNE_ASSUME_YES=1:
ZENTUNE_ASSUME_YES=1 bash install.sh --uninstallSettings (7) -> Daemon service -> Uninstall removes the systemd service only: stops, disables, deletes the unit. App files and venv stay. Use the script above to remove everything.
If you installed manually or want to remove things one at a time:
# If you have systemd
sudo systemctl disable --now zentune.service
sudo rm -f /etc/systemd/system/zentune.service
sudo systemctl daemon-reload
# Everything else
sudo rm -f /usr/local/bin/zentune
sudo rm -rf /opt/zentune
sudo rm -f /run/zentune.sock /run/zentune_daemon.lock
rm -f /tmp/zentune_tui.lockThe ryzen_smu kernel module is installed separately and isn't touched by any of this. To remove it:
cd ryzen_smu
sudo make dkms-uninstallDon't want to curl a script straight into bash? Clone the repo and run the installer from your own checkout instead of downloading a release:
git clone https://github.com/HorizonUnix/ZenTune.git
cd ZenTune
./install.sh --localThis is the same installer as the one-line command in step 3, just pointed at your local clone instead of the latest GitHub release. It sets up the venv, copies the app to /opt/zentune, creates the zentune launcher, and (on systemd systems) installs the service, same as a normal install. Everything in steps 4 onward applies the same way.
For OpenRC, runit, s6 or another non-systemd init system, install.sh skips the service step and the setup wizard offers a manual-start command instead; wrap that command in a service definition for your init system to have the daemon start automatically.
Getting started
Using the app
Internals