CertGrid CertGrid
Concepts·Linux Foundation Certified System Administrator

Ubuntu and AlmaLinux differences that matter

LFCS lets you choose the distribution at the start of the exam, which means the syllabus is really two syllabuses that overlap. This guide runs the same probe on Ubuntu and on RHEL and prints what each one has: four commands that differ, four that are identical, and one - the login shell - that is not what a Linux guide usually assumes.

Start Here Guide 3 of 38 Beginner

Captured on Ubuntu 26.04 and RHEL 10.0. The specific versions differ between them in every row of the table below, which is the point.

Both distributions, because the commands on this page differ between them. Every output is captured on the host it belongs to.
Server NameIP AddressOSRolesCPURAMHDD
LFCS-A01192.168.0.70Ubuntu 26.04 LTSPrimary host - most guides run only here2 Core4 GB50 GB
LFCS-C01192.168.0.72AlmaLinux 10.2The other distribution - dnf, firewalld and NetworkManager2 Core4 GB50 GB

This guide includes

Use this before choosing your exam distribution. This matters because you pick the family at the start of the exam - and the differences that decide anything are four questions deep, not the long list people expect.

Before you start

  1. Which tools each one has at all

    The same list of ten commands, looked up on both machines.

    bash Example session
    for c in apt dnf ufw firewall-cmd nft netplan nmcli networkctl systemctl journalctl; do printf '%-14s %s\n' "$c" "$(command -v $c || echo '-')"; doneapt            /usr/bin/aptdnfufw            /usr/sbin/ufwfirewall-cmdnft            /usr/sbin/nftnetplan        /usr/sbin/netplannmclinetworkctl     /usr/bin/networkctlsystemctl      /usr/bin/systemctljournalctl     /usr/bin/journalctlfor c in apt dnf ufw firewall-cmd nft netplan nmcli networkctl systemctl journalctl; do printf '%-14s %s\n' "$c" "$(command -v $c || echo '-')"; doneapt            /usr/bin/aptdnfufw            /usr/sbin/ufwfirewall-cmdnft            /usr/sbin/nftnetplan        /usr/sbin/netplannmclinetworkctl     /usr/bin/networkctlsystemctl      /usr/bin/systemctljournalctl     /usr/bin/journalctl

    Expected resultUbuntu has apt, ufw, netplan, networkctl. RHEL has dnf, firewall-cmd, nmcli. Both have nft, systemctl, journalctl.

    Success conditionYou can tell which family a machine belongs to in one command.

  2. The same four questions, two different answers

    Package manager, init system, firewall front end, network configuration - asked the same way on both.

    bash Example session
    printf '%-18s %s\n' "package manager" "$(command -v apt-get >/dev/null && echo apt || echo dnf)" "init system" "$(ps -p 1 -o comm=)" "firewall front end" "$(command -v ufw >/dev/null && echo ufw || echo firewall-cmd)" "network config" "$(command -v netplan >/dev/null && echo 'netplan + systemd-networkd' || echo NetworkManager)"package manager    aptinit system        systemdfirewall front end ufwnetwork config     netplan + systemd-networkdprintf '%-18s %s\n' "package manager" "$(command -v apt-get >/dev/null && echo apt || echo dnf)" "init system" "$(ps -p 1 -o comm=)" "firewall front end" "$(command -v ufw >/dev/null && echo ufw || echo firewall-cmd)" "network config" "$(command -v netplan >/dev/null && echo 'netplan + systemd-networkd' || echo NetworkManager)"package manager    aptinit system        systemdfirewall front end ufwnetwork config     netplan + systemd-networkd

    Expected resultapt / systemd / ufw / netplan + systemd-networkd against dnf / systemd / firewall-cmd / NetworkManager.

    Success conditionYou know the four decisions the distribution makes for you.

  3. And what is identical underneath

    Both firewall front ends are front ends. This asks what is actually loaded.

    bash Example session
    sudo nft list tables 2>/dev/null | head -4; echo "---"; systemctl --version | head -1table inet firewalld---systemd 257 (257-23.el10_2.1.alma.1-gb23e1c8)sudo nft list tables 2>/dev/null | head -4; echo "---"; systemctl --version | head -1table inet firewalld---systemd 257 (257-23.el10_2.1.alma.1-gb23e1c8)

    Expected resultUbuntu prints nothing at all; RHEL prints table inet firewalld. systemd 259 against systemd 257.

    Success conditionYou know what the firewall commands are really talking to.

  4. Which firewall is actually running

    Three commands that look like they ask the same question, and give three different answers.

    bash Example session
    ufw version 2>/dev/null | head -2; echo "---"; sudo ufw status | head -3; echo "---"; systemctl is-enabled ufw 2>&1; systemctl is-active ufw 2>&1ufw 0.36.2Copyright 2008-2023 Canonical Ltd.---Status: inactive---enabledactivesudo nft list ruleset | wc -l; echo "nft ruleset lines above"; nft --version170nft ruleset lines abovenftables v1.1.6 (Commodore Bullmoose #7)

    Expected resultufw 0.36.2, Status: inactive, and yet is-enabled enabled and is-active active - with a 0-line nft ruleset.

    Success conditionYou will not be fooled by a service that is running and doing nothing.

  5. The other one, for comparison

    The same three questions on RHEL, where the firewall is genuinely running.

    bash Example session
    firewall-cmd --version; echo "---"; sudo firewall-cmd --state; systemctl is-enabled firewalld; systemctl is-active firewalldAuthorization failed.    Make sure polkit agent is running or run the application as superuser.---runningenabledactivesudo nft list ruleset | wc -l; echo "nft ruleset lines above"; nft --version365nft ruleset lines abovenftables v1.1.5 (Commodore Bullmoose #6)

    Expected resultrunning, enabled, active - and a 367-line nftables ruleset. Plus firewall-cmd --version failing with Authorization failed.

    Success conditionYou can tell a configured firewall from an idle one.

  6. The login shell is not bash

    The assumption almost every Linux guide makes, checked.

    zsh Example session
    echo "SHELL=$SHELL"; echo "BASH_VERSION=[$BASH_VERSION]"; echo "ZSH_VERSION=[$ZSH_VERSION]"; getent passwd sysadmin | cut -d: -f7SHELL=/bin/zshBASH_VERSION=[]ZSH_VERSION=[5.9]/bin/zshecho "SHELL=$SHELL"; echo "BASH_VERSION=[$BASH_VERSION]"; getent passwd sysadmin | cut -d: -f7SHELL=/bin/zshBASH_VERSION=[]/bin/zshbash -c 'echo "under bash -c: BASH_VERSION=$BASH_VERSION"'under bash -c: BASH_VERSION=5.2.26(1)-release

    Expected resultUbuntu: SHELL=/usr/bin/zsh, empty BASH_VERSION, ZSH_VERSION=5.9. RHEL: bash 5.2.26. And bash -c on Ubuntu gets bash 5.3.9.

    Success conditionYou know which shell your commands are actually running in.

Troubleshooting

Official sources