Troubleshooting
Applies to SynapseOS builds from 2026-10-09 (20261009-141152 and later). See What changed.
Find the message you see; each entry says what caused it and what to do.
Where the logs are
The journal holds every service's output. Two things are written elsewhere: the audit
records, in /var/log/audit/audit.log (auditd rotates it itself), and the syslog files
the forwarder also writes locally, /var/log/messages, auth.log, kern.log and
daemon.log.
journalctl -b # this boot, everything
journalctl -b -1 # the previous boot: what happened before a rollback or reboot
journalctl -u synapse-agent -f # the data plane, live
journalctl -u synapseos-firewall -u systemd-networkd -b
ausearch -ts boot # audit records since boot, from /var/log/audit/audit.log
synapseos-ab-update status and synapseos-synapse status are the two commands to run
before anything else when a unit misbehaves after an update.
Boot
device-mapper: verity: ... data block N is corrupted then Timed out waiting for device /dev/mapper/usr
Cause. The system partition's content does not match its hash tree. On a unit you imaged yourself this is almost always a writer that skipped blocks it thought were empty (balenaEtcher's "trim unallocated space" does this); on a delivered unit it is a failing disk.
Fix. A unit you imaged: write the image again with a tool that writes every block
(dd from the decompressed image). A delivered unit: synapseos-ab-update rollback from
the console returns to the other slot if it still verifies; if both fail, the disk is the
problem, contact support.
A start job is running for Wait for Network to be Online for two minutes
Cause. A managed interface has no link or no address, and systemd-networkd-wait-online
waits for every managed interface. The unit boots fine afterwards; only the wait is lost.
Fix. Cable or configure every interface that networkctl lists as configuring, or
leave it: the delay is bounded and nothing depends on it.
The unit boots but has no address
Cause. No .network file matched the interface. The default runs DHCP on interfaces
named en* and eth* only; an interface with another name, or one you gave a .network
file with a wrong MACAddress=, stays unconfigured.
Fix. On the console, networkctl status shows which file applied to which interface
(unmanaged means none). Match on the MAC the console shows, then networkctl reload.
See Configuring the appliance.
synapseos-ab-update status shows the previous slot running after an update and a reboot
Cause. The unit rolled back: the new slot did not confirm within its trial boots. The
login banner and /etc/os-release do not tell you this; they name the build the unit was
delivered with and are not rewritten by updates. status and /usr/lib/os-release name
the running one.
Fix. journalctl -b -1 -u synapse-agent shows why the data plane did not come up in
the previous boot. See "A new slot keeps rolling back" below.
Access
Permission denied (publickey)
Cause. SSH accepts root with a key only, and the key offered is not in
/root/.ssh/authorized_keys. As shipped, a password is not accepted over SSH; a unit
delivered with password SSH turned on carries a drop-in under /etc/ssh/sshd_config.d/
that says so, and sshd -T | grep -i passwordauthentication shows which applies.
Fix. Use the key delivered with the unit (ssh -i), or add yours from the console. See
Logging in.
The console asks for a password and refuses every one
Cause. No password is set. Root is locked until one is.
Fix. Over SSH, passwd root. Set it before changing addressing, since the console is
the way back in. See Logging in.
The serial console shows nothing
See Serial console: the speed, the port and the driver, in that order.
Updates
no UPDATE_BASE_URL in /etc/synapseos/update.conf -- offline appliance; use: install <bundle-dir>
Cause. The unit has no channel configured, so check and update have nowhere to
look.
Fix. Put the URL Gen0Sec gave you for this platform in the file, or update from external media. See Updating.
cannot reach <base>
Cause. The update host is not reachable from the unit: no route, a firewall, DNS, or a proxy the updater was not told about.
Fix. curl -sS -o /dev/null -w '%{http_code}\n' <base> from the unit tells which. A
proxy goes in update.conf with export. See Network requirements.
bundle serial N is not newer than the running M. Refusing a downgrade
Cause. The channel, or the media, holds a version equal to or older than the one running. Equal counts: reinstalling the running version is refused too.
Fix. If that is what you want, synapseos-ab-update update --allow-downgrade (or
install <dir> --allow-downgrade). See Updating.
bundle is variant 'X' but this appliance runs 'Y'
Cause. The update was built for a different variant (hardened versus baseline).
Installing it would change the unit's security posture, so the updater refuses, and the
--allow-downgrade its message mentions does not override this check.
Fix. Check UPDATE_BASE_URL against what you were given for this platform; this
usually means the wrong channel. A unit that is meant to change variant is re-imaged.
SIGNATURE VERIFICATION FAILED or the UKI is not signed by any certificate this device trusts
Cause. Either the archive was damaged in transit, or it was signed with a key this unit does not trust: a build for another platform, or a unit whose trusted keys predate a key rotation.
Fix. Compare the archive's checksum with the one published beside it. If it matches,
the keys are the problem; contact support with the output of synapseos-ab-update status,
since a unit in this state cannot take an update on its own.
slot B FAILED verity verification -- not switching to it
Cause. The slot was written but its content does not match the hash tree it came with: a damaged archive, or faulty media.
Fix. Nothing changed on the unit; the bootloader still points at the running slot.
Unpack the archive again from a fresh copy and run install again.
A new slot keeps rolling back
Cause. The new system booted but Synapse (and the jailer on hardened units) did not reach a running state within 120 seconds, so the slot was never confirmed and the bootloader returned to the previous one after three attempts.
Fix. journalctl -b -1 -u synapse-agent shows what the agent did in the trial boot.
The usual causes are a configuration key the new version rejects (compare
/etc/synapse/config.yaml with /usr/share/synapse/<new version>/config.yaml) and a
pinned Synapse version the new image no longer ships. Fix the configuration, then
synapseos-ab-update update again.
A service the release notes mention reports disabled after the update
See Known limitations:
once per unit, systemctl enable --now <unit>.
Synapse
synapseos-synapse use refuses the version
Cause. Either the version is not on the unit (list shows what is), or its binary
failed the test run use performs before switching: a release that cannot start on this
image.
Fix. list first. If the version is there and still refused, the message from the
test run says why; the running version is untouched. See
Synapse versions.
synapse-agent.service: Failed to create reference to PID from file '/run/synapse-agent.pid': Invalid argument
Cause. A message systemd prints while the agent writes its PID file; the next line is
Started Synapse. It does not indicate a failure.
Fix. None. If the unit is actually not filtering, look at the lines after it.
The proxy was enabled and the agent stopped filtering
Cause. synapse-proxy.service was started with the shipped unit file, so it read the
agent's configuration and took over the kernel packet filter.
Fix. systemctl stop synapse-proxy, then follow Running the proxy from
the first step: the proxy needs its own configuration before it starts.
The proxy answers 404 for every host
Cause. /etc/synapse/upstreams.yaml did not parse, so the proxy has no routes at all.
One bad host takes every host down.
Fix. journalctl -u synapse-proxy -n 50 names the line. Every terminating host needs
its tls.terminate block. See Running the proxy.
Collecting diagnostics for support
One command gathers what support asks for first, into a file you can send:
D=/var/tmp/diag-$(hostname)-$(date -u +%Y%m%dT%H%M%SZ); mkdir -p "$D"
synapseos-ab-update status > "$D/ab-update-status.txt" 2>&1
synapseos-synapse status > "$D/synapse-status.txt" 2>&1
cat /etc/os-release > "$D/os-release.txt"
networkctl status > "$D/networkctl.txt" 2>&1
nft list ruleset > "$D/nft.txt" 2>&1
journalctl -b --no-pager > "$D/journal-this-boot.txt"
journalctl -b -1 --no-pager > "$D/journal-previous-boot.txt" 2>/dev/null
cp /var/log/audit/audit.log /var/log/messages "$D/" 2>/dev/null
tar -C /var/tmp -czf "$D.tar.gz" "$(basename "$D")" && rm -r "$D" && echo "$D.tar.gz"
Copy it off with scp, then delete it; the journal in it may contain addresses from your
traffic. Send it to [email protected] with the message you
saw and when.