Deployment guide

Fedora 44 Minimal

Overview

Fedora Linux is the community distribution produced by the Fedora Project and sponsored by Red Hat. A great deal of enterprise Linux technology appears in it first.

This guide covers deploying and configuring SecureAnyCloud's Fedora Linux 44 Minimal image from the Azure Marketplace on Microsoft Azure. The image differs from SecureAnyCloud's standard Fedora Linux 44 image in its package profile.

Fedora publishes no "minimal" environment for cloud images, but it does define its smallest package set. This is the core group in Fedora's own package metadata, which Fedora describes as the "Smallest possible installation". This image keeps the mandatory packages of that group, the Azure provisioning, boot and security stack, and their dependencies, and removes everything else. Measured on this image against the standard image it is cut from, the result is:

  • 369 installed packages instead of 446 (77 fewer)
  • 275 MiB less installed software (rpm payload 838 MiB instead of 1113 MiB)

The largest part of that saving is the container stack that Fedora Cloud Edition ships: podman, netavark, crun, criu, passt and the qemu-user-static user-mode emulators (17 per-architecture packages). On its own, that stack is 43 packages and 246 MiB.

The rest is 34 packages and 29 MiB: an unused DNF 4 Python stack, rsync, the nftables command-line tool, unbound-anchor, the console login helper messages and the libraries only they used. If all you want is the standard image without Podman, sudo dnf remove podman gets you most of the way. This image goes the rest of the way to Fedora's own core definition.

The image describes itself. A manifest generated from its own package database ships at /usr/share/sac/fedora-44-minimal.manifest, with the measured numbers and a trim ledger alongside it. Anything you miss is one dnf install away from Fedora's own repositories.

What you get:

  • Fedora Linux 44 Cloud Edition with the Minimal package profile: 369 packages, cut to Fedora's core group plus the Azure provisioning stack
  • The full Azure provisioning path, protected from the trim by construction: cloud-init, the Azure Linux Agent (waagent), azure-vm-utils, the Hyper-V daemons, OpenSSH, NetworkManager and the kernel and boot chain
  • A shipped manifest and trim ledger derived from the image's own package database
  • Every available update applied at build time and again immediately before capture
  • Automatic security updates installed, armed and enabled
  • Chrony for time synchronization against the Azure host clock
  • SELinux in enforcing mode, the Fedora default
  • SSH as the only network listener, with no swap on the operating system disk
  • Gen2 Hyper-V virtual machine support
  • 24/7 SecureAnyCloud support

Deliberately not included (each is one dnf install away): Podman and the container runtime stack, the qemu-user-static emulators, rsync, the nftables command-line tool, the DNF 4 Python bindings, unbound-anchor and the console login helper messages. LVM2, mdadm, tar, curl, man and vi all remain, because something in Fedora's core set or the Azure stack depends on them.

Platform: Microsoft Azure (Gen2 Hyper-V, x64); Default user: azureuser.

Read this first: Fedora's support window is about 13 months

Fedora Linux is a fast-moving distribution, which means recent kernels, compilers and runtimes. It is not a long-term support distribution, and this listing does not pretend otherwise.

Fedora Linux 44 was released on 28 April 2026 and reaches end of life on 2 June 2027. That date comes from the Fedora Project's own release system, Bodhi, which records Fedora 44 as state: current, eol: 2027-06-02. After that date there are no further updates of any kind, including security updates.

  • Plan the upgrade to Fedora 45 before June 2027. Fedora is upgraded in place. The procedure is in Step 10 below.
  • If you need a multi-year support window, this is the wrong image. SecureAnyCloud publishes AlmaLinux, Rocky Linux and Oracle Linux Minimal images with ten-year enterprise lifecycles. Those are the right choice for a long-lived production fleet.

The image's own /etc/os-release carries SUPPORT_END=2027-05-19. That value was baked into the Fedora 44 compose in April 2026 and is two weeks earlier than the date Bodhi now records. 2 June 2027 is the authoritative figure.

This is Fedora Cloud Edition

The base is Fedora Cloud Edition, the headless, server-ready edition that Fedora publishes for cloud platforms. It is not Fedora Server Edition, and this listing does not call itself "Fedora Server" for that reason.

The Fedora Project publishes no official Fedora image to the Azure Marketplace, and every other Fedora offer there comes from a third-party repackager. This image is built from the Fedora Project's own official Azure disk image, downloaded from dl.fedoraproject.org. Its SHA-256 is checked against Fedora's published checksum file, and that file's GPG signature is verified against the Fedora 44 signing key. The image carries no Marketplace purchase plan of its own.

What this image changes

Everything below was measured before it was changed, and every change is reversible.

Compared with the stock Fedora Cloud Base image (and identical to SecureAnyCloud's standard Fedora Linux 44 image):

  • Automatic security updates are installed and armed. The stock image has no automatic update mechanism. This image installs dnf5-plugin-automatic and enables its timer, configured to apply security updates daily and never to reboot on its own.
  • The zram swap device is removed. Azure image certification requires a Marketplace image to ship with no swap on the operating system disk. Step 3 shows how to put it back.
  • LLMNR is switched off. The stock image's systemd-resolved listens for Link-Local Multicast Name Resolution on port 5355 from off the machine. LLMNR is a well-known spoofing vector and is useless on a cloud server.
  • SSH is hardened by a drop-in file that sorts ahead of every other SSH configuration file.

Compared with SecureAnyCloud's standard Fedora Linux 44 image:

  • 77 packages are removed by a guarded transaction. Rpm's own dependency check and DNF's solver must both agree on the exact removal set, and a trial transaction that includes systemd must be refused. The build stops if the result is not measurably smaller than the standard image. Step 4 shows how to check the result yourself.

Security posture

This image ships with no known credential. There is no default password and no baked-in SSH key:

  • The root account password is locked, and no account on the image has a usable password.
  • PasswordAuthentication and keyboard-interactive authentication are disabled in the SSH daemon, so every login is by key.
  • PermitRootLogin is prohibit-password, so root can never log in with a password. Use sudo from azureuser.
  • SSH host keys and /etc/machine-id are removed before capture and regenerated on each machine at first boot, so no two machines share a host identity.
  • The build account is deleted before capture, and the image is checked to confirm that no account with a user ID of 1000 or above survives.
  • SELinux is left in enforcing mode and pinned to enforcing for the next boot.
  • The trim itself is a security property. 77 fewer installed packages means 77 fewer things to carry vulnerabilities, patch and audit, including a container runtime and emulators you may never have used.

Prerequisites

  • An active Microsoft Azure subscription.
  • Access to the Azure Portal or Azure CLI.
  • An SSH key pair for Linux VM access.
  • Familiarity with Azure VM management.

Recommended VM size: Standard_B2s (2 vCPU, 4 GB RAM) or larger.

1

Deploy the Virtual Machine

Option A: Azure Portal

  • Open the Azure Marketplace and search for "Fedora Linux 44 Minimal SecureAnyCloud".
  • Select the image and click Create.
  • Choose your subscription, resource group and region.
  • Pick a size such as Standard_B2s.
  • Set the administrator username and paste your SSH public key.
  • Allow inbound port 22 (SSH), then create the machine.

Option B: Azure CLI

Run these commands on your own workstation. Substitute your resource group, VM name and preferred region. Accept the Marketplace terms once per subscription, then create the machine:

az vm image terms accept --urn sac1647283583153:fedora-44-minimal:default:latest
az vm create \
  --resource-group myResourceGroup \
  --name my-fedora-44-minimal-vm \
  --image sac1647283583153:fedora-44-minimal:default:latest \
  --size Standard_B2s \
  --admin-username azureuser \
  --generate-ssh-keys \
  --public-ip-sku Standard
2

Connect via SSH

ssh azureuser@<your-vm-public-ip>

Only the key you supplied at create time is accepted. There is no password login.

3

Confirm the release, the kernel and the disk

cat /etc/os-release
NAME="Fedora Linux" VERSION="44 (Cloud Edition)" RELEASE_TYPE=stable ID=fedora VERSION_ID=44 VERSION_CODENAME="" PRETTY_NAME="Fedora Linux 44 (Cloud Edition)" ANSI_COLOR="0;38;2;60;110;180" LOGO=fedora-logo-icon CPE_NAME="cpe:/o:fedoraproject:fedora:44" HOME_URL="https://fedoraproject.org/" DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f44/" SUPPORT_URL="https://ask.fedoraproject.org/" BUG_REPORT_URL="https://bugzilla.redhat.com/" REDHAT_BUGZILLA_PRODUCT="Fedora" REDHAT_BUGZILLA_PRODUCT_VERSION=44 REDHAT_SUPPORT_PRODUCT="Fedora" REDHAT_SUPPORT_PRODUCT_VERSION=44 SUPPORT_END=2027-05-19 VARIANT="Cloud Edition" VARIANT_ID=cloud

The kernel is a packaged, managed kernel. Superseded kernels are removed before capture, so exactly one is installed:

uname -r && rpm -q kernel-core
7.2.5-200.fc44.x86_64 kernel-core-7.2.5-200.fc44.x86_64

The disk layout

The image uses a flat GPT layout with no LVM. It has a small BIOS boot partition, an EFI system partition and a btrfs root partition that carries Fedora's standard subvolumes:

lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT && findmnt -no SOURCE,FSTYPE /
NAME SIZE FSTYPE MOUNTPOINT sda 30G ├─sda1 2M ├─sda2 100M vfat /boot/efi └─sda3 29.9G btrfs /var sdb 8G └─sdb1 8G ext4 /mnt sr0 630K /dev/sda3[/root] btrfs

findmnt is the authoritative answer for /. The root filesystem is the btrfs root subvolume. lsblk prints only one of the several subvolumes mounted from sda3, and which one it picks is arbitrary. sr0 is the virtual CD-ROM Azure uses to pass provisioning data in.

sdb is the local resource disk that Standard_B2s provides, mounted at /mnt. It is ephemeral: its contents are lost whenever the machine is stopped and deallocated or moved to another host. Use it for scratch data only. Sizes without a local disk have no sdb.

sudo btrfs subvolume list /
ID 256 gen 177 top level 5 path root ID 257 gen 155 top level 5 path boot ID 258 gen 177 top level 5 path home ID 259 gen 177 top level 5 path var

The gen numbers are btrfs generation counters and differ on your machine. The four subvolume names are what matter.

The operating system disk is 30 GB and carries no swap:

df -hT / /boot/efi && swapon --show
Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 btrfs 30G 726M 29G 3% / /dev/sda2 vfat 100M 22M 79M 22% /boot/efi

swapon --show prints nothing, which means no swap is configured. If a workload needs Fedora's zram swap back, run:

printf '[zram0]\nzram-size = ram / 2\n' | sudo tee /etc/systemd/zram-generator.conf
sudo systemctl unmask systemd-zram-setup@zram0.service
sudo systemctl start systemd-zram-setup@zram0.service
4

Check the Minimal package profile

Count the installed packages. The gpg-pubkey entries are the imported Fedora signing keys rather than software, so the count leaves them out:

rpm -qa | grep -vc '^gpg-pubkey'
369

The image carries a manifest generated from its own package database. The header records the contract and the measured difference from the standard image:

grep '^#' /usr/share/sac/fedora-44-minimal.manifest
# Fedora Linux 44 Minimal - sac shipped manifest
# DERIVED from the rpm database of this image at capture, 2026-09-15T19:30:29Z - never hand-written.
# Contract: Fedora's own @core comps group ('Smallest possible installation', mandatory # packages) + the Azure provisioning/boot/security lineage + their dependencies. # Measured against the sac Fedora Linux 44 (std) image it is cut from: 446 -> 369 packages (-77), rpm payload -275 MiB. # Largest single removal on the std image ('dnf5 remove aardvark-dns'): -43 packages / -246 MiB. # Installed now: 369 packages. # # --- capability notes, each DERIVED from the rpm database of this image --- # CONTAINERS: no podman/container runtime (the std image ships one). Restore:
sudo dnf install podman
# LVM: lvm2 is installed.
# RAID: mdadm is installed.
# NFTABLES: no nftables CLI (the Azure agent's firewall uses iptables-legacy, which is kept). Restore:
sudo dnf install nftables
# RSYNC: no rsync. Restore:
sudo dnf install rsync
# PROVISIONING: cloud-init + WALinuxAgent + azure-vm-utils + hyperv-daemons installed - the full Azure path is retained.
# UPDATES: dnf5-plugin-automatic installed - security updates auto-apply, exactly as on the std image.
#
# name epoch:version-release.arch

Below the header, every installed package is listed with its exact version. The image's build gate checks that list against the package database in both directions. The full list of the 77 removed packages is in the trim ledger, /usr/share/sac/fedora-44-minimal-trim.json.

Confirm the main packages that the standard image carries and this one does not:

rpm -q podman qemu-user-static rsync nftables; echo "exit code: $?"
package podman is not installed package qemu-user-static is not installed package rsync is not installed package nftables is not installed exit code: 4

rpm -q exits with the number of packages it did not find, so 4 means none of the four is installed.

The trim leaves nothing orphaned, so your first dnf autoremove has nothing to remove:

sudo dnf autoremove --assumeno
Nothing to do.

The definition the image was cut to is Fedora's own, and you can read it from the package metadata:

dnf -q group info core
Id : core Name : Core Description : Smallest possible installation Installed : yes Order : Langonly : Uservisible : no Repositories : @System Mandatory packages : audit : bash : coreutils : curl : dnf5 : e2fsprogs : filesystem : glibc : hostname : iproute : iputils : kbd : less : man-db : ncurses : openssh-clients : openssh-server : parted : policycoreutils : procps-ng : rootfiles : rpm : selinux-policy-targeted : setup : shadow-utils : sssd-common : sssd-kcm :
sudo : systemd : util-linux : vim-minimal Default packages : NetworkManager : dnf5-plugins : dracut-config-rescue : firewalld : fwupd : plymouth : prefixdevname : systemd-resolved : zram-generator-defaults Optional packages : dracut-config-generic : initial-setup : initscripts

All 31 mandatory packages are installed. Of the default packages, NetworkManager, systemd-resolved and dnf5-plugins are kept because the image needs them. firewalld, fwupd, plymouth, zram-generator-defaults and dracut-config-rescue were never on Fedora Cloud Edition, and prefixdevname is removed.

To put anything back, install it by name. For example, to install the container runtime:

sudo dnf install podman
5

Check the patch level and automatic updates

Fedora 44 uses DNF 5. The dnf command is dnf5, and almost every familiar command works unchanged. The image was fully updated immediately before capture:

sudo dnf check-update; echo "exit code: $?"
Updating and loading repositories: Repositories loaded. exit code: 0

dnf check-update exits 0 when nothing is pending and 100 when updates are available. The first run on a new machine also downloads the repository metadata, so you see progress lines above Repositories loaded.

Your update path is Fedora's own repositories, with GPG checking enabled:

dnf repolist
repo id repo name fedora Fedora 44 - x86_64 fedora-cisco-openh264 Fedora 44 openh264 (From Cisco) - x86_64 updates Fedora 44 - x86_64 - Updates

Those definitions ship in Fedora's own fedora-repos package. No third-party repository is pre-loaded, and nothing from fedora-cisco-openh264 is installed.

Automatic updates are armed:

systemctl is-enabled dnf5-automatic.timer && cat /etc/dnf/automatic.conf
enabled
# sac: keep this Fedora Linux 44 Minimal VM patching itself.
# Overrides /usr/share/dnf5/dnf5-plugins/automatic.conf (see dnf5-automatic(8)). [commands] apply_updates = yes upgrade_type = security download_updates = yes random_sleep = 300 reboot = never [emitters] emit_via = motd

Security updates are applied automatically, and the machine never reboots itself. To run the update now, or to turn it off:

sudo systemctl start dnf5-automatic.service
sudo systemctl disable --now dnf5-automatic.timer

Check whether a reboot is needed to activate what is installed:

sudo dnf needs-restarting -r
Updating and loading repositories: Repositories loaded. No core libraries or services have been updated since boot-up. Reboot should not be necessary.
6

Verify the security posture

sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication|kbdinteractiveauthentication|permitemptypasswords)'
permitrootlogin prohibit-password passwordauthentication no kbdinteractiveauthentication no permitemptypasswords no
sudo passwd -S root && getenforce
root L 2009-12-22 -1 -1 -1 -1 Enforcing

The L means the root password is locked. The date is only the value left by the Azure agent's deprovisioning and carries no meaning.

Confirm SSH is the only thing listening off the machine:

ss -tln && ss -uln
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 4096 127.0.0.54:53 0.0.0.0:* LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* LISTEN 0 128 [::]:22 [::]:* State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 127.0.0.54:53 0.0.0.0:* UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* UNCONN 0 0 127.0.0.1:323 0.0.0.0:* UNCONN 0 0 [::1]:323 [::]:*

Port 22 is the only port reachable from outside the machine. The port 53 sockets are systemd-resolved's DNS stubs, and the port 323 sockets are chrony's control interface. Both are bound to loopback only.

7

Verify Azure integration

waagent --version
WALinuxAgent-2.15.0.1 running on fedora 44 Python: 3.14.7 Goal state agent: 2.16.0.2
cloud-init status --long
status: done extended_status: done boot_status_code: enabled-by-generator last_update: Thu, 01 Jan 1970 00:00:48 +0000 detail: DataSourceAzure [seed=/dev/sr0] errors: [] recoverable_errors: {}

The result you want is extended_status: done, not degraded.

azure-vm-utils provides stable names for the operating system and resource disks, independent of whether a size presents them as SCSI or NVMe:

ls /dev/disk/azure/
os os-part1 os-part2 os-part3 resource resource-part1 root root-part1 root-part2 root-part3

Confirm time synchronization against the Azure host clock (PHC0) and that nothing failed during boot:

chronyc tracking | head -2 && systemctl list-units --state=failed
Reference ID : 50484330 (PHC0) Stratum : 1 UNIT LOAD ACTIVE SUB DESCRIPTION 0 loaded units listed.

The Azure serial console uses ttyS0:

cat /proc/cmdline | tr ' ' '\n' | grep console=
console=tty1 console=ttyS0,115200n8
8

Networking and the firewall

No host firewall is installed. Fedora Cloud Edition does not ship firewalld, and this image also removes the nftables command-line tool. Your Azure Network Security Group is the firewall. The Azure Linux Agent's own protection of the Azure platform endpoint uses iptables, which is kept.

If you also want a host firewall, install one. This also brings back nftables:

sudo dnf install firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reload

Add the firewall after you have confirmed SSH access, and always keep port 22 open.

9

Install software

Install packages with dnf:

sudo dnf install nginx

Search for a package, or find which package provides a command you expected to have:

dnf -q provides /usr/bin/rsync

If you need a package that is not in Fedora's repositories, prefer a container or a language-level package manager over a third-party repository. Third-party repositories are the usual cause of a broken release upgrade later.

10

Upgrading to the next Fedora release

Fedora is upgraded in place. Plan to do this before 2 June 2027:

sudo dnf upgrade --refresh sudo dnf system-upgrade download --releasever=45 sudo dnf offline reboot

The machine reboots, applies the upgrade offline and reboots again. Take a snapshot of the operating system disk first, read the release notes for the version you are moving to, and try the upgrade on a test machine before a production one.

A release upgrade upgrades the packages that are installed. It does not reinstall the packages removed from this image, although a new release can bring in new dependencies of its own.

Common Use Cases

  • Automation and configuration-managed hosts that want the smallest practical Fedora base
  • Security-conscious deployments that want fewer installed packages to patch, scan and audit
  • Development and build hosts that need current Fedora toolchains without a bundled container stack

Troubleshooting

Cannot connect via SSH

Check that the Network Security Group allows inbound TCP 22 from your address, that the machine is running, and that you are using the private key that matches the public key you supplied. Password authentication is disabled by design.

A command I expected is missing

Find the package that provides the command, then install it. For example, run dnf provides /usr/bin/rsync, then sudo dnf install rsync. The manifest header in /usr/share/sac/fedora-44-minimal.manifest lists the notable removals.

Azure agent not running

sudo systemctl status waagent
sudo systemctl restart waagent

Disk is full

The root filesystem is btrfs. Grow the operating system disk in the Azure Portal, then extend the filesystem:

sudo btrfs filesystem resize max /

The boot log shows error lines

On the first boot of a freshly launched Standard_B2s machine, journalctl -p err -b --no-pager shows lines like these. All of them are harmless:

kernel: virt/tdx: TDX not supported by the host platform (udev-worker)[600]: sr0: /usr/lib/udev/rules.d/60-block-scheduler.rules:3 ATTR{queue/scheduler}="bfq": Failed to write "bfq" to sysfs attribute "queue/scheduler", ignoring: Device or resource busy (udev-worker)[594]: sdb: /usr/lib/udev/rules.d/60-block-scheduler.rules:3 ATTR{queue/scheduler}="bfq": Failed to write "bfq" to sysfs attribute "queue/scheduler", ignoring: Device or resource busy kernel: I/O error, dev sr0, sector 0 op 0x0:(READ) flags 0x880700 phys_seg 1 prio class 2 kernel: Buffer I/O error on dev sr0, logical block 0, async page read

The first line is the kernel noting that the host does not offer Intel TDX confidential computing.

The bfq lines are udev failing to change the I/O scheduler on a device that is busy at that moment, then carrying on. Note the word ignoring. The devices they name (sr0, sdb, occasionally sda) vary from boot to boot.

The sr0 I/O errors appear on the first boot only. sr0 is the virtual CD-ROM Azure uses to pass provisioning data in, and it is read once more after it has been ejected. An I/O error naming sda or sdb is different and worth raising with support.

Within minutes of exposing port 22 you may also see kex_exchange_identification lines from internet SSH scanners. Restrict the source range on your port 22 rule if you would rather not see them.

After you stop (deallocate) and start the machine, or Azure redeploys it to another host, the error log may also show systemd-fsck[…]: fsck failed with exit status 16. followed by Ignoring error. This is harmless too. Azure provides a fresh temporary disk, still NTFS-formatted, and the file-system check runs on it before cloud-init reformats it for /mnt. No service is left in a failed state.

Important Notes

Fedora Linux is free and open source. It is not covered by a single license. The distribution is a collection of independently licensed packages. On this image, 369 installed packages carry 123 distinct license strings, most commonly GPL-3.0-or-later, MIT, LGPL-2.1-or-later, GPL-2.0-or-later and BSD-3-Clause. Read any package's terms with rpm -qi <package> or under /usr/share/licenses/. No subscription, entitlement or license key is required.

Fedora and the Infinity design logo are trademarks of Red Hat, Inc. SecureAnyCloud is not affiliated with, endorsed by or sponsored by the Fedora Project or Red Hat, and uses the name only to identify the distribution this image contains. This image is not provided or supported by the Fedora Project; support for it comes from SecureAnyCloud. Everything installed in it comes from Fedora's own repositories, and this variant only removes Fedora packages. For the distribution itself, see fedoraproject.org.

Fedora Linux 44 was released on 28 April 2026 and reaches end of life on 2 June 2027. Check the Fedora release schedule and plan your upgrade before support ends.

Support

For assistance with this image, contact SecureAnyCloud support:

  • Website: secureanycloud.com
  • Product catalog: secureanycloud.com/products
  • User guides: secureanycloud.com/guides
  • SLA: 24-hour response guaranteed

Deploy on Azure

Launch Fedora Linux 44 Minimal on Azure with 24/7 support from SecureAnyCloud.

View this image

Need Help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on Azure