Native Package Migration
Silo publishes silo packages for RPM, DEB, and APK on amd64/arm64 via GitHub Releases, with SHA-256 sums and build-provenance attestations. This page records what changes relative to a minio package installation: the file layout, the service account, and the caveats. General migration scope is in the migration guide.
Installing
Install the package that matches your platform from the release assets, then verify the checksum before installing:
If you use the Pigsty package repository, dnf install silo / apt install silo resolves the same artifacts (the repository may lag GitHub Releases). The package intentionally provides no minio alias or Provides: relationship — minio and silo are separate packages that coexist, and the takeover happens at the systemd level, not through package replacement (see Takeover).
File layout
| MinIO installation | Silo package |
|---|---|
/usr/bin/minio |
/usr/bin/silo (also provides silo healthcheck) |
minio.service |
/usr/lib/systemd/system/silo.service |
/etc/default/minio |
Still read, first; /etc/default/silo overrides per variable (noreplace/conffile — upgrades never overwrite edits) |
service account minio-user (upstream) / minio (Pigsty) |
silo:silo, declared in /usr/lib/sysusers.d/silo.conf, created on install |
| — | /usr/share/doc/silo/LICENSE, NOTICE (AGPL-3.0-or-later) |
Two package properties:
- Installation never starts or enables the service;
postinstallonly creates thesiloaccount and reloads systemd. - The package installs alongside the
miniopackage — no file conflicts, so the old package stays available for rollback.
Service account
The unit defaults to User=silo, but existing data, TLS keys, and KMS credentials belong to the old MinIO user. Do not chown the data. Run Silo as the current owner via a drop-in:
This also keeps TLS working: Silo resolves certificates from the runtime user’s home (~/.silo/certs, falling back to the legacy ~/.minio/certs), so the existing public.crt/private.key/CAs/ are found without copying. Without the drop-in, a TLS deployment fails to start:
Adopting the silo account is an optional later change: move the certificates to a silo-readable path, set --certs-dir in MINIO_OPTS, and transfer data ownership outside the migration window.
Takeover and rollback
The unit is a takeover unit:
Conflicts=minio.service: systemd never runs both; starting one stops the other. This implements takeover and rollback in both directions.- The
EnvironmentFilechain meansMINIO_VOLUMES,MINIO_OPTS, credentials, and KMS settings from/etc/default/minioapply unchanged. Type=notify:systemctl startreturns success only after the server is actually ready.
Switch over:
Roll back (nothing to restore — data ownership, certificates, and the old unit were never touched):
After validation completes and the rollback window closes, optionally mask the old unit so nothing but an explicit systemctl unmask can bring it back:
Caveats
- Clusters switch all nodes together. Two different binaries do not form a cluster — MinIO next to Silo, or one Silo version next to another; a mixed node waits indefinitely in
activating(details). Prepare every node first (install package, create drop-in), then flip all nodes in quick succession:systemctl disable --now minio && systemctl enable --now --no-block silo. Rollback and later upgrades likewise: all nodes together. - Non-packaged installations work the same way. A
/usr/local/bin/miniowith a custom unit is taken over identically, as long as its configuration lives in/etc/default/minio. - Crash loops rate-limit. A misconfigured start (for example, missing certificates) repeats under
Restart=alwaysuntil systemd’s start limit trips (Start request repeated too quickly). Fix the cause, thensystemctl reset-failed silo && systemctl start silo. - An old
minio.servicestop can hang. Legacy units commonly setTimeoutSec=infinity. If graceful shutdown remains stuck after traffic is drained and the shutdown allowance expires, an operator can force it withsudo systemctl kill --signal=SIGKILL minio.service, then confirm the old process has exited before starting Silo. This interrupts any remaining requests; plainsystemctl killdefaults to anotherSIGTERMand does not resolve a process that ignores it. - The environment chain can surprise you during the bridge period.
/etc/default/miniois still read while/etc/default/siloexists: deleting a variable from/etc/default/silodoes not disable it — the old value from/etc/default/minioapplies again. Remove the variable from both files, or comment it out in the file that still carries it. - Keep the rollback window. Leave the
miniopackage, unit, and binary installed until validation completes; a disabled unit costs nothing. Remove the old package afterwards if desired. - Rolling restarts after migration: gate each with
silo healthcheck --maintenance cluster; exit0means stopping this node keeps write quorum, HTTP412means it does not.