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
Download the package that matches your platform from the release assets, then verify its checksum before installing:
This example selects the x86_64 RPM. For ARM64 use .aarch64.rpm; on Debian/Ubuntu select the .deb file and matching checksum from the download page.
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 units; starting one stops the other. This switches processes, but does not establish that state can safely be rolled back between versions.- 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:
Before rollback, validate the target version, complete recovery point and IAM/bucket-configuration state under rollback scope. Retaining ownership, certificates and the old unit does not mean state needs no restoration; the following commands only illustrate service switching on one node:
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
- Coordinate the switch across all cluster nodes. Prepare every node first (install packages and create drop-ins), stop all old processes, confirm they have exited, then start all new processes. Avoid old and new versions accessing storage together. See migration notes for mixed versions and binary consistency; for shared IAM or site replication, coordinate every participant under the IAM upgrade procedure. Rollback must also meet the applicable state-recovery requirements.
- 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.