Skip to content

garuda-health

garuda-health is the health checker of Garuda Linux. It runs a fixed list of checks, prints each problem it finds grouped by severity, and offers fixes for some of them. garuda-update runs it at the end of every update. The Toolbox offers it as “System health check” and “Repair system health”.

Terminal window
garuda-health
OptionDescription
--fixApply the fixes offered for the printed issues, then run the checks again. See Applying fixes.
--jsonPrint the results as JSON. Cannot be combined with --fix.
--debugPrint the run time of each check and the errors of checks that failed to run.
--forcettyKeep colored output when the output is not a terminal.
--ignore-liveRun the checks on a live system too. Without it, garuda-health prints a notice and exits on live systems.

Only the levels CRITICAL, HIGH, LOW and INFO are printed. Each printed issue shows (fix available) when a fix exists.

LevelPrinted asMeaningEffect on exit code
CRITICAL--- CRITICAL ---The system may not boot or update. Act on these first.Exit code 1
HIGH--- HIGH ---A serious problem, for example a missing kernel or a full disk.Exit code 1
LOW--- LOW ---A minor problem or cleanup task.Exit code 1
INFO--- INFO ---A suggestion, for example an optional package or a hardware hint.No effect
ERRORnot printedThe check could not run. It is left out of the checks run count.No effect
NOT_APPLICABLEnot printedThe check does not apply, for example because the tool it needs is missing.No effect
NO_ISSUEnot printedThe check passed.No effect

The report starts with the number of checks that ran, for example 26/26 checks run. The denominator is the number of active checks. Checks that ended with ERROR are not counted in the numerator.

If no issue is printed, the report ends with System health check passed. No issues found.

--fix applies the fixes attached to the printed issues, in order of priority from highest to lowest. It then runs all checks again.

  • Most fixes print the command and ask Continue? [y/N] before they run. The update fix runs garuda-update without this question. garuda-update then asks for its own confirmation.
  • When a fix succeeds, the fixes it excludes are skipped. A successful garuda-update remote fix skips the update fix.
  • Commands that need root use sudo, or garuda-update elevates itself.
  • The summary after a --fix run can show the counts from the first run. The list of remaining issues is current.

Only the bootloader check has a bypass. The bypass is a file in /etc/garuda/garuda-health/. The check skips itself while the file exists. The other checks have no bypass in the code. Their only options are to fix the cause or to remove the package they check.

  1. Create the bypass file for the bootloader check: sudo touch /etc/garuda/garuda-health/bypass-wrong-bootloader-check
  2. Run garuda-health again. The message "Garuda" is not the current bootloader no longer appears.
  3. To enable the check again, remove the file: sudo rm /etc/garuda/garuda-health/bypass-wrong-bootloader-check

The message links to the page Why the Garuda bootloader, which explains how to make the Garuda entry the default.

garuda-health runs 26 checks. They are listed below by group. Messages are shown as printed. Text in <...> is replaced by the names or values found on the system.

CheckSeverityPrinted messageFix
Core packagesCRITICALCore garuda linux packages are missing: <packages>Install with sudo pacman -S
Important packagesHIGHImportant garuda linux packages are missing: <packages>Install with sudo pacman -S
Optional utilitiesINFOOptional garuda linux utilities are missing: <packages>Install with sudo pacman -S
Deprecated or removed packagesLOWDeprecated/Outdated/Removed packages should be removed: <packages>Remove with sudo pacman -Rs
PackageKitLOWPackageKit is currently installed. PackageKit (Discover, GNOME Software) is not a supported method to manage packages on Garuda Linux.Remove with sudo pacman -Rs
Pacman configurationCRITICALPacman configuration file is missinggaruda-update remote fix
Pacman configurationCRITICALPacman configuration file is missing required repositoriesgaruda-update remote fix
Pacman configurationINFOPacman configuration file does not have the multilib repository enabledNone

The core group checks base, chaotic-keyring and chaotic-mirrorlist. The important group checks garuda-common-settings, garuda-update, garuda-libs and garuda-config-agent. The optional group checks garuda-toolbox, garuda-hardware-tool and garuda-system-maintenance.

The deprecated group checks garuda-hotfixes and steam-native-runtime. For steam-native-runtime, the fix first marks steam as explicitly installed when it is not. See garuda-migrations for the status of garuda-hotfixes.

The pacman configuration check requires the repositories [garuda], [core], [extra] and [chaotic-aur] in /etc/pacman.conf.

CheckSeverityPrinted messageFix
NVIDIA driversINFONvidia drivers are not installedsudo garuda-hardware-tool --nonfree
NVIDIA driversINFONvidia drivers are installed, but no hardware profile is activesudo garuda-hardware-tool --nonfree
NVIDIA driversINFONvidia drivers are installed, but an incorrect or a suboptimal hardware profile is activesudo garuda-hardware-tool --nonfree
NVIDIA kernel moduleHIGHNvidia kernel module is not loadedNone
NVIDIA kernel modulesHIGHNvidia kernel module is not installed for the following kernels: <kernels>sudo dkms-rebuild, only when NVIDIA sources exist in /usr/src
dracutINFOSystem is not using dracut for initramfsInstall garuda-dracut-support
dracutHIGHSystem is using dracut, but garuda-dracut-support is not installedInstall garuda-dracut-support
PipeWireINFOSystem is not using PipeWire for audioInstall pipewire-support
PipeWireLOWSystem is using PipeWire, but pipewire-support is not installedInstall pipewire-support

The NVIDIA drivers check runs only when garuda-hardware-tool is installed. The NVIDIA kernel module checks run only when an NVIDIA module package is installed. The kernel module check looks for nvidia.ko in the kernel’s updates/dkms directory, its extramodules directory and the kernel directory itself.

The CPU temperature check exists in the code but is disabled, because the code marks it as unreliable with false positives.

CheckSeverityPrinted messageFix
Root Btrfs free spaceHIGHRoot Btrfs filesystem has less than 5GB free spaceNone
Root Btrfs free spaceLOWRoot Btrfs filesystem has less than 10GB free spaceNone
Btrfs maintenance timersLOWBtrfs maintenance timers are not enabled: <timers>Enable with systemctl enable
Old Btrfs snapshotsLOWOld Btrfs snapshots found that can be deletedsudo snapper-tools delete-old
Snapper servicesINFOSnapper (automatic btrfs system restore) is not installed and configuredInstall snapper-support
Snapper servicesINFOSnapper (automatic btrfs system restore) is not using the official Garuda Linux configurationInstall snapper-support
Snapper servicesLOWSnapper cleanup timer is not enabledEnable snapper-cleanup.timer
Snapper configurationHIGHSnapper configuration for root is missinggaruda-update remote reset-snapper
Snapper configurationHIGHSnapper snapshots directory is missinggaruda-update remote reset-snapper

The Btrfs free space check reads the estimated free space from btrfs filesystem usage /. It prints the HIGH message below 3000 MB and the LOW message below 10000 MB. The HIGH message text says 5GB, while the threshold in the code is 3000 MB.

The Btrfs maintenance timers are btrfs-scrub.timer, btrfs-balance.timer and btrfs-defrag.timer. The old snapshot check runs snapper-tools find-old through pkexec, so it can ask for a password.

CheckSeverityPrinted messageFix
Partial upgradeCRITICALSystem is partially upgradedgaruda-update
Outdated systemHIGHSystem is outdated (last update more than 2 weeks ago)garuda-update
Pending rebootINFOA reboot is pending (update applied since last reboot)None
Initramfs buildCRITICALPacman hooks report that the initramfs build has failed. System may not boot.sudo dracut-rebuild
Kernels in /bootCRITICALNo (intended) kernels are installed in /bootsudo dracut-rebuild
Kernels in /bootCRITICALKernels in /boot are invalid (do not match expected files)sudo dracut-rebuild
Kernels in /bootHIGHThe following kernels are missing in /boot: <kernels>sudo dracut-rebuild
Kernels in /bootHIGHThe following kernels in /boot are invalid: <kernels>sudo dracut-rebuild
BootloaderLOW"Garuda" is not the current bootloader: https://wiki.garudalinux.org/why-garuda-bootloaderNone, see Bypass

The partial upgrade check reads the flag file /var/lib/garuda/partial_upgrade. The outdated check and the pending reboot check read the timestamp file /var/lib/garuda/last_update. The outdated check uses 14 days as the limit. The pending reboot check compares that timestamp with the boot time.

The initramfs check reads /var/lib/garuda/initramfs_error, which the dracut hook writes when the initramfs build fails. The kernel checks compare each kernel in /usr/lib/modules with its vmlinuz and initramfs files in /boot. When /etc/garuda/secureboot/enabled exists, the byte comparison of the kernel image is skipped.

The bootloader check runs only on UEFI systems with efibootmgr installed. It reads the label of the current boot entry.

CheckSeverityPrinted messageFix
Failed servicesLOWFailed systemd services found: <units>None
Time syncHIGHNTP is not enabled, system time may not be synchronizedsudo timedatectl set-ntp true
SMART statusCRITICALSMART status for <device> is failingNone
Available RAMHIGHAvailable RAM is below 10% of total RAM: <value> MBNone
Available RAMHIGHAvailable RAM is below 5% of total RAM: <value> MBNone
Available RAM and swapHIGHAvailable RAM and swap are both below 15% of total: <value> MB available RAM, <value> MB available swapNone

The SMART check needs smartctl, root rights and a physical machine. It runs smartctl --scan and then smartctl -H for each disk. A disk is reported when the output says the test failed or when no PASSED line appears. The RAM check uses 10% of total RAM when no swap exists. With swap, it uses 5% and then the combined 15% rule.