Manage quadlets and systemd units from Cockpit

Start, stop and debug quadlet services from Cockpit, and know which tasks still belong in the terminal.

Part 3 of 5 in Cockpit on openSUSE. Last updated

In short: Cockpit's Services page has a switch between System and User units; quadlets of the logged-in user are under User. Quadlet services show as Generated: start, stop, restart and read logs there, but boot start comes from the [Install] section of the .container file, not from the enable toggle. Cockpit has no quadlet editor: edit the file in the Terminal page, run systemctl --user daemon-reload, then restart the service. Timers can be created and inspected on the Timers tab.

The Services page: System and User

Services lists systemd units with their state, and has tabs for services, targets, sockets, timers and paths. At the top is a switch between System units (root's service manager, needs administrative access to change) and User units (the service manager of the user you logged in as). Rootless quadlets live under User.

Click a unit for its detail page: status, the unit file path, dependencies, the recent log lines, and the actions Start, Stop, Restart, Reload and Disallow running (mask). It is the same as systemctl status, just clickable. The command-line side is in the systemctl and journalctl guide.

Quadlet services show as Generated

Find your quadlet (for whoami.container, look for whoami.service). Its state reads Generated, because podman's generator wrote it at the last daemon-reload. For a quadlet, Cockpit also links from the service to its container on the Podman containers page.

  • Start, Stop, Restart: use them here. systemd then knows what you meant.
  • Enable at boot: not here. systemd does not enable generated units; the [Install] section of the .container file decides, as the quadlet basics guide explains.
  • Unit file: the path shown is the generated file in /run. Changes there are lost at the next daemon-reload; edit the .container file instead.
Cockpit shows the generated unit; the .container file stays the source.

What Cockpit reads, asked of systemd directly for a real quadlet and for a mount from /etc/fstab, which is generated the same way:

$ systemctl --user show -p Id,UnitFileState,FragmentPath,SourcePath snippetbox.service
Id=snippetbox.service
FragmentPath=/run/user/1000/systemd/generator/snippetbox.service
SourcePath=/home/user/.config/containers/systemd/snippetbox.container
UnitFileState=generated

Real output on openSUSE Tumbleweed, podman 6.0.2, 2026-09-28; user and host names and addresses redacted.

$ systemctl show -p Id,UnitFileState,FragmentPath,SourcePath home.mount
Id=home.mount
FragmentPath=/run/systemd/generator/home.mount
SourcePath=/etc/fstab
UnitFileState=generated

Real output on openSUSE Tumbleweed, 2026-09-28; user and host names and addresses redacted.

Editing a quadlet from the browser

Cockpit has no quadlet editor, but its Terminal page is a real shell as your logged-in user:

nano ~/.config/containers/systemd/whoami.container
/usr/lib/systemd/user-generators/podman-user-generator --dryrun   # optional: check it
systemctl --user daemon-reload
systemctl --user restart whoami

Skip the daemon-reload and the restart runs the old version: the generator only reads your file at reload time. After the restart, the Services page and the Podman page both show the new state.

Logs for one service

The service detail page shows its latest log lines; "View all logs" opens the Logs page filtered to that unit, with priority and time filters. For the same view in a shell, or for filters Cockpit does not offer, the journalctl command builder writes the command. For a rootless service that is journalctl --user -u whoami.

Timers

The Timers tab lists every timer with its last and next run. Cockpit can also create a simple timer for a command. For anything you want to keep and version, write the .timer and .service files yourself; the cron to systemd timer converter turns an old crontab line into both.

Frequently asked questions

Why is the enable switch greyed out or failing for my quadlet?

Quadlet services are generated by podman at daemon-reload, and systemd does not enable generated units. Add WantedBy=default.target (rootless) to the [Install] section of the .container file and daemon-reload; that is what starts it at boot.

Why do I not see another user's services?

The User view shows the service manager of the user you logged in as. Log in to Cockpit as that user, or use the Terminal page with sudo machinectl shell username@ and systemctl --user.

Can Cockpit restart a service that keeps failing?

It can restart it by hand, but the automatic part belongs in the unit: Restart=on-failure in the [Service] section of the quadlet. Cockpit shows the failed state and the log lines that explain why.