Format: Fedora <number> (no codenames)
Release cycle: ~6 months (April + October)
Support: ~13 months per release (2 releases overlap)
EOL: 1 month after the second subsequent release
Fedora 39 → released Nov 2023, EOL ~Nov 2024
Fedora 40 → released Apr 2024, EOL ~May 2025
Fedora 41 → released Oct 2024, EOL ~Nov 2025
Fedora 42 → expected Apr 2025
Fedora vs RHEL vs CentOS Stream
Feature
Fedora
CentOS Stream
RHEL
Purpose
Cutting-edge upstream
RHEL preview
Enterprise stable
Release cycle
~6 months
Rolling (RHEL-tracking)
~3 years
Support
~13 months
~5 years
10 years
Cost
Free
Free
Paid (free ≤16 systems)
Stability
Bleeding edge
Stable-ish
Very stable
Package manager
DNF
DNF
DNF
Target user
Developers, enthusiasts
Servers, CI/CD
Enterprise
Advantages
Cutting-edge software (latest kernel, GNOME, toolchains), strong SELinux enforcement by default, Wayland-first, Flatpak support, Podman/Buildah (rootless containers), Btrfs default filesystem, excellent developer tooling, free and open-source, strong upstream community, fast path to RHEL skills.
Disadvantages
Shorter support cycle (~13 months), frequent upgrades required, less stable than RHEL/Debian, some proprietary drivers/codecs need extra repos (RPM Fusion), not ideal for long-running production servers, smaller community than Ubuntu.
Use Cases
Developer workstations, upstream testing, learning RHEL/enterprise Linux, container development (Podman), immutable desktop (Silverblue), home servers (Cockpit), security research (Security Lab spin).
Bare metal (Anaconda installer), VirtualBox/VMware, Live USB (dd or Fedora Media Writer), WSL2 (limited), Docker (docker pull fedora), Cloud (AWS/Azure/GCP official images).
Creating Bootable USB
# Using Fedora Media Writer (recommended — GUI tool)# Download from: https://fedoraproject.org/workstation/download# Using dd (Linux/macOS)sudo dd if=Fedora-Workstation-Live-x86_64-41.iso of=/dev/sdX bs=4M status=progresssync# Using Ventoy (multi-boot USB)# Just copy the ISO to the Ventoy USB drive
Anaconda Installer Key Steps
1. Boot from USB → "Install Fedora"
2. Language & Keyboard selection
3. Installation Destination → select disk
- Automatic partitioning (recommended for beginners)
- Custom: /boot (1GB), /boot/efi (600MB), swap (2×RAM), / (rest, Btrfs)
4. Network & Hostname → configure if needed
5. Root Account → disable root login (recommended) or set password
6. User Creation → create admin user with sudo
7. Begin Installation → wait ~10-20 min
8. Reboot → remove USB
Fedora 33+ uses Btrfs by default for the root filesystem.
/boot/efi → EFI System Partition (FAT32, ~600MB)
/boot → ext4 (~1GB, kernel + initramfs)
/ → Btrfs (root subvolume @)
/home → Btrfs (home subvolume @home)
Btrfs subvolumes:
@ → mounted at /
@home → mounted at /home
Benefits: snapshots, copy-on-write, transparent compression,
checksums, easy rollback with Snapper or Timeshift.
Kernel & Architecture
Fedora Kernel
Fedora ships the latest stable Linux kernel — often 1-2 versions ahead of Ubuntu LTS.
Kernel updates arrive within days of upstream release.
Uses systemd as init system (PID 1).
uname -r # current kernel versionrpm -q kernel # all installed kernelssudo dnf list installed kernel* # kernel packages# Fedora keeps last 3 kernels by default (configurable in /etc/dnf/dnf.conf)# installonly_limit=3
Boot Process
Power On
→ UEFI/BIOS POST
→ GRUB2 bootloader (/boot/grub2/grub.cfg)
→ Kernel decompresses (vmlinuz)
→ initramfs (dracut-generated early root filesystem)
→ systemd (PID 1) starts
→ Targets: sysinit → basic → multi-user / graphical
→ Login prompt (GDM for Workstation, TTY for Server)
Linux File System Hierarchy (FHS)
/ Root filesystem (Btrfs on Fedora)
├── /bin → symlink to /usr/bin (merged usr)
├── /boot Kernel, initramfs, GRUB2
├── /dev Device files
├── /etc System configuration files
├── /home User home directories (Btrfs @home subvolume)
├── /lib → symlink to /usr/lib
├── /lib64 → symlink to /usr/lib64
├── /media Auto-mount removable media
├── /mnt Manual mount point
├── /opt Optional third-party software
├── /proc Virtual: process + kernel info
├── /root Root user home
├── /run Runtime data (cleared on reboot)
├── /sbin → symlink to /usr/sbin
├── /srv Service data
├── /sys Virtual: hardware/driver info
├── /tmp Temporary files (tmpfs — in RAM)
├── /usr All user programs, libraries, docs
│ ├── /usr/bin User commands
│ ├── /usr/sbin Admin commands
│ ├── /usr/lib Libraries
│ ├── /usr/lib64 64-bit libraries
│ └── /usr/share Architecture-independent data
└── /var Variable data (logs, databases, spool)
Note: Fedora uses "UsrMerge" — /bin, /sbin, /lib, /lib64
are all symlinks into /usr (cleaner, container-friendly).
GRUB2 Management
# List GRUB entriessudo grub2-editenv listsudo grubby --info=ALL# Set default kernelsudo grubby --set-default /boot/vmlinuz-<version># Add kernel parameter (e.g., disable mitigations for testing)sudo grubby --update-kernel=ALL --args="mitigations=off"sudo grubby --update-kernel=ALL --remove-args="mitigations=off"# Regenerate GRUB config (UEFI)sudo grub2-mkconfig -o /boot/grub2/grub.cfg# or on EFI systems:sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
DNF Package Management
What is DNF?
DNF (Dandified YUM) — the default package manager for Fedora, RHEL, and CentOS.
Manages RPM packages. Successor to YUM with better dependency resolution and performance.
# Fedora uses the "wheel" group for sudo (not "sudo" like Ubuntu)sudo visudo # safely edit /etc/sudoers# Add user to wheel groupsudo usermod -aG wheel username# /etc/sudoers.d/ — drop-in files (preferred)echo "username ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/username# Verify sudo accesssudo -l -U username
Group Commands
sudo groupadd groupname # create groupsudo groupdel groupname # delete groupsudo gpasswd -a user group # add user to groupsudo gpasswd -d user group # remove from groupgroups username # show user's groupsgetent group groupname # group info
Systemd & Service Management
systemctl
# Service controlsudo systemctl start nginxsudo systemctl stop nginxsudo systemctl restart nginxsudo systemctl reload nginx # reload config without restartsudo systemctl status nginx # status + recent logs# Boot behaviorsudo systemctl enable nginx # start on bootsudo systemctl disable nginx # don't start on bootsudo systemctl enable --now nginx # enable + start immediatelysudo systemctl disable --now nginx # disable + stop immediately# Inspectsystemctl list-units --type=service --state=runningsystemctl list-units --type=service --state=failedsystemctl list-unit-files --type=servicesystemctl is-active nginxsystemctl is-enabled nginx# System targets (runlevels)systemctl get-default # current default targetsudo systemctl set-default multi-user.target # server (no GUI)sudo systemctl set-default graphical.target # desktopsudo systemctl isolate rescue.target # rescue mode# Reload after editing unit filessudo systemctl daemon-reload
journalctl — Logs
journalctl -f # follow livejournalctl -u nginx # service logsjournalctl -u nginx -f # follow service logsjournalctl -b # since last bootjournalctl -b -1 # previous bootjournalctl -p err # errors onlyjournalctl -p warning..err # warning to errorjournalctl --since "2024-01-01 00:00"journalctl --since "1 hour ago"journalctl -n 50 # last 50 linesjournalctl --disk-usage # log disk usagesudo journalctl --vacuum-time=7d # delete logs older than 7 dayssudo journalctl --vacuum-size=500M # keep only 500MB of logs
ip a # all interfaces + IPsip route # routing tableip neigh # ARP tablehostname -I # all IP addressescat /etc/hosts # local DNScat /etc/resolv.conf # DNS serversss -tulnp # listening ports + processeslsof -i :80 # what uses port 80nmcli device status # NetworkManager device statusnmcli connection show # all connections
NetworkManager (nmcli)
# Fedora uses NetworkManager by defaultnmcli device status # show all devicesnmcli device show eth0 # detailed device infonmcli connection show # all connectionsnmcli connection show "Wired connection 1"# Connect/disconnectnmcli device connect eth0nmcli device disconnect eth0# Wi-Finmcli device wifi list # scan for networksnmcli device wifi connect "SSID" password "password"nmcli device wifi hotspot ifname wlan0 ssid "MyHotspot" password "pass123"# Static IPnmcli connection modify "Wired connection 1" \ ipv4.method manual \ ipv4.addresses "192.168.1.100/24" \ ipv4.gateway "192.168.1.1" \ ipv4.dns "8.8.8.8,8.8.4.4"nmcli connection up "Wired connection 1"# DNSnmcli connection modify "Wired connection 1" ipv4.dns "1.1.1.1 8.8.8.8"sudo systemctl restart NetworkManager
Network Testing
ping -c 4 8.8.8.8traceroute google.commtr google.com # real-time traceroutedig domain.com # DNS lookupdig domain.com MX # MX recordsnslookup domain.com # DNS lookup (simple)curl -I https://example.com # HTTP headerswget URL # download filenc -zv host 80 # test TCP portnmap -sV host # port + service scan
Firewalld (Fedora Default Firewall)
# Fedora uses firewalld (zone-based firewall) — NOT iptables directlysudo systemctl status firewalldsudo systemctl enable --now firewalld# Zones (default: public)firewall-cmd --get-default-zonefirewall-cmd --get-active-zonesfirewall-cmd --list-all # show current zone rulesfirewall-cmd --list-all --zone=public# Allow servicessudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --permanent --add-service=httpssudo firewall-cmd --permanent --add-service=sshsudo firewall-cmd --permanent --add-service=cockpit# Allow portssudo firewall-cmd --permanent --add-port=8080/tcpsudo firewall-cmd --permanent --add-port=5000-5010/tcp# Remove rulessudo firewall-cmd --permanent --remove-service=httpsudo firewall-cmd --permanent --remove-port=8080/tcp# Apply changes (reload required after --permanent)sudo firewall-cmd --reload# Rich rules (advanced)sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'# Port forwardingsudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080# Panic mode (block all traffic)sudo firewall-cmd --panic-onsudo firewall-cmd --panic-off# List available servicesfirewall-cmd --get-services
Policy NOT enforced — violations logged only (debug mode)
Disabled
SELinux completely off (requires reboot, not recommended)
getenforce # Enforcing / Permissive / Disabledsestatus # detailed statussudo setenforce 1 # set Enforcing (temp, no reboot)sudo setenforce 0 # set Permissive (temp, for debugging)# Permanent: edit /etc/selinux/config# SELINUX=enforcing (or permissive / disabled)# Requires reboot to take effect
SELinux Contexts
# View contextsls -Z file.txt # file contextls -Z /var/www/html/ # directory contextps -eZ | grep httpd # process contextid -Z # current user context# Context format: user:role:type:level# Example: system_u:object_r:httpd_sys_content_t:s0# user = system_u (SELinux user)# role = object_r (for files)# type = httpd_sys_content_t (the important part)# level = s0 (MLS sensitivity level)# Change contextsudo chcon -t httpd_sys_content_t /var/www/html/myfile.htmlsudo chcon -R -t httpd_sys_content_t /var/www/html/# Restore default context (from policy)sudo restorecon -v /var/www/html/myfile.htmlsudo restorecon -Rv /var/www/html/ # recursive# Set persistent context (survives restorecon)sudo semanage fcontext -a -t httpd_sys_content_t "/myapp(/.*)?"sudo restorecon -Rv /myapp/
SELinux Booleans
# Booleans are on/off switches for policy behaviorgetsebool -a # list all booleansgetsebool httpd_can_network_connect # check specific boolean# Common booleanssudo setsebool -P httpd_can_network_connect on # allow httpd to connect to networksudo setsebool -P httpd_can_network_connect_db on # allow httpd to connect to DBsudo setsebool -P httpd_enable_homedirs on # allow httpd to serve ~/public_htmlsudo setsebool -P allow_user_exec_content on # allow users to exec in homesudo setsebool -P container_manage_cgroup on # for Podman/Docker# -P = permanent (survives reboot)# List booleans related to httpdsemanage boolean -l | grep httpd
Installed by default on Fedora Server. Available for Workstation too.
Setup & Access
# Install (if not present)sudo dnf install cockpit cockpit-podman cockpit-storaged cockpit-networkmanager# Enable and startsudo systemctl enable --now cockpit.socket# Allow through firewallsudo firewall-cmd --permanent --add-service=cockpitsudo firewall-cmd --reload# Access in browser# https://localhost:9090# https://your-server-ip:9090# Login with your system username + password
Cockpit Modules
Module
Package
Capability
Overview
cockpit
CPU, memory, disk, network dashboard
Logs
cockpit
journald log viewer
Storage
cockpit-storaged
Disk, RAID, LVM, Btrfs management
Networking
cockpit-networkmanager
Network interface config
Accounts
cockpit
User management
Services
cockpit
systemd service control
Software Updates
cockpit-packagekit
DNF updates via UI
Containers
cockpit-podman
Podman container management
Virtual Machines
cockpit-machines
libvirt/KVM VM management
SELinux
cockpit-selinux
SELinux status + troubleshoot
Wayland & Desktop (Workstation)
Wayland on Fedora
Fedora Workstation uses Wayland as the default display protocol since Fedora 25.
Wayland replaces X11 — better security (apps can’t spy on each other), better HiDPI, smoother.
GNOME on Wayland is the default session. X11 fallback available at login screen.
echo $WAYLAND_DISPLAY # check if running Wayland (wayland-0)echo $XDG_SESSION_TYPE # "wayland" or "x11"loginctl show-session $(loginctl | grep $(whoami) | awk '{print $1}') -p Type
GNOME Shell Basics
Super key → Activities overview (app launcher + workspace switcher)
Super + A → App grid
Super + Tab → Switch applications
Alt + Tab → Switch windows
Super + H → Hide window
Super + Up/Down → Maximize / restore window
Super + Left/Right → Snap window to half screen
Ctrl + Alt + T → Open terminal (if configured)
Super + L → Lock screen
GNOME Extensions
# Install GNOME Extensions appsudo dnf install gnome-extensions-app gnome-tweaks# Popular extensions (install from extensions.gnome.org or via app)# - Dash to Dock / Dash to Panel# - AppIndicator (system tray icons)# - Blur my Shell# - GSConnect (KDE Connect for GNOME)# - Caffeine (prevent screen lock)# CLI managementgnome-extensions listgnome-extensions enable extension-name@domaingnome-extensions disable extension-name@domain
Display & HiDPI
# Check display infoxrandr # X11 display infowlr-randr # Wayland display info (wlroots)# GNOME scaling (Wayland)gsettings set org.gnome.desktop.interface scaling-factor 2 # 2x scalinggsettings set org.gnome.desktop.interface text-scaling-factor 1.25# Fractional scaling (experimental)gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"# Then set in Settings → Displays
Fedora Workstation Developer Tools
# GNOME Builder (IDE)sudo dnf install gnome-builder# or via Flatpak (recommended — latest version)flatpak install flathub org.gnome.Builder# VS Codesudo rpm --import https://packages.microsoft.com/keys/microsoft.ascsudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'sudo dnf install code# or Flatpak:flatpak install flathub com.visualstudio.code# Toolbox (isolated dev environments)sudo dnf install toolboxtoolbox create # create Fedora toolbox containertoolbox enter # enter toolboxtoolbox list # list toolboxes# Inside toolbox: install anything without affecting host
Security Hardening
Fedora Security Defaults
Fedora ships with strong security defaults out of the box:
Feature
Default State
SELinux
Enforcing
Firewalld
Enabled
SSH root login
Disabled
ASLR
Enabled (level 2)
Stack canaries
Enabled (compiler)
NX/XD bit
Enabled
Secure boot
Supported
Crypto policies
System-wide policy
System-Wide Crypto Policies
# Fedora has a unified crypto policy systemupdate-crypto-policies --show # current policy# Available policies:# DEFAULT → balanced security + compatibility# FUTURE → stricter (TLS 1.2+, SHA-256+, RSA 3072+)# LEGACY → maximum compatibility (TLS 1.0+, SHA-1)# FIPS → FIPS 140-2 compliancesudo update-crypto-policies --set FUTURE # stricter policysudo update-crypto-policies --set DEFAULT # restore defaultsudo update-crypto-policies --set FIPS # FIPS mode# Requires reboot to fully apply
# Toolbox creates Fedora containers for development# Host system stays clean — install anything inside toolboxsudo dnf install toolboxtoolbox create # create default Fedora toolboxtoolbox create --distro ubuntu --release 22.04 myubuntu # Ubuntu toolboxtoolbox enter # enter default toolboxtoolbox enter myubuntu # enter specific toolboxtoolbox list # list all toolboxestoolbox rm myubuntu # remove toolbox# Inside toolbox: full dnf/apt access, no SELinux restrictions# Files in $HOME are shared with host
Fedora Silverblue (Immutable Desktop)
What is Silverblue?
Fedora Silverblue is an immutable variant of Fedora Workstation.
The OS root filesystem is read-only — you can’t accidentally break it.
Updates are atomic — applied as a whole, easy to rollback.
Apps installed via Flatpak (GUI apps) or Toolbox (CLI dev tools).
Based on OSTree — like git for the OS filesystem.
OSTree Commands
# Check current deploymentrpm-ostree status# Update (downloads in background, applies on reboot)rpm-ostree upgraderpm-ostree upgrade --check # check only# Rollback to previous deploymentrpm-ostree rollback# Layer RPM packages (persists across updates)rpm-ostree install vim git htoprpm-ostree uninstall vim# Override packages (replace base packages)rpm-ostree override replace package.rpmrpm-ostree override reset package# Pin a deployment (prevent garbage collection)ostree admin pin 0 # pin current (index 0)ostree admin pin 1 # pin previous (index 1)# List deploymentsrpm-ostree status -v
Silverblue Workflow
GUI Apps → Flatpak (from Flathub or Fedora Flatpaks)
CLI Tools → Toolbox (isolated Fedora containers)
System RPMs → rpm-ostree install (layered, survives updates)
Dev Envs → Toolbox or Distrobox (any distro)
Distrobox (Any Distro in a Container)
sudo dnf install distrobox# or on Silverblue:rpm-ostree install distroboxdistrobox create --name ubuntu22 --image ubuntu:22.04distrobox create --name arch --image archlinux:latestdistrobox enter ubuntu22distrobox listdistrobox rm ubuntu22# Export app from distrobox to hostdistrobox-export --app firefox # inside distrobox
# SELinux provides defense-in-depth — even if an app is exploited,# SELinux confines what the attacker can do.# Check if a process is confinedps -eZ | grep httpd # confined: httpd_tps -eZ | grep unconfined # unconfined: less secure# Audit what a process is allowed to dosesearch --allow --source httpd_t | head -20# Check port labelingsemanage port -l | grep http # http portssemanage port -l | grep ssh # ssh ports
Disk & Storage Management
Disk Info & Partitioning
lsblk / lsblk -f # list block devices / with filesystemsfdisk -l # all disks and partitionsdf -hT # disk space + filesystem typedu -sh /* 2>/dev/null | sort -rh | head -20blkid # UUIDs and filesystem types# Partitioningsudo fdisk /dev/sdb # MBR partitioningsudo parted /dev/sdb # GPT + MBRsudo gdisk /dev/sdb # GPT only# Formatsudo mkfs.btrfs /dev/sdb1 # Btrfs (Fedora default)sudo mkfs.ext4 /dev/sdb1 # ext4sudo mkfs.xfs /dev/sdb1 # XFSsudo mkfs.vfat /dev/sdb1 # FAT32 (USB/EFI)
# Fedora Server is a minimal CLI-based server OS# Comes with Cockpit pre-installed# Uses same DNF + SELinux + firewalld as Workstation# Initial server setup checklist:sudo dnf update -ysudo systemctl enable --now cockpit.socketsudo firewall-cmd --permanent --add-service=cockpitsudo firewall-cmd --reload# Access: https://server-ip:9090
Fedora CoreOS
# Fedora CoreOS = immutable, container-optimized, auto-updating OS# Designed for running containers at scale (Kubernetes nodes, etc.)# Provisioned via Ignition config (JSON/YAML)# Check CoreOS versionrpm-ostree status# CoreOS auto-updates (zincati daemon)systemctl status zincati# Manual updatesudo rpm-ostree upgradesudo systemctl reboot# Rollbacksudo rpm-ostree rollback
ps aux # all running processesps aux | grep nginx # find specific processtop / htop / btop # real-time monitorpgrep nginx # get PID by namepstree -p # process tree with PIDs# Kill processeskill PID # SIGTERM (graceful)kill -9 PID # SIGKILL (force)killall nginx # kill all by namepkill -f "python" # kill by pattern# Background jobscommand & # start in backgroundCtrl+Z → bg # suspend then backgroundfg # bring to foregroundjobs # list background jobsnohup command & # survive logoutdisown %1 # detach from shell
System Information
uname -a # kernel + system infohostnamectl # hostname + OS info (systemd)cat /etc/fedora-release # Fedora versioncat /etc/os-release # detailed OS infowhoami / id # current useruptime # system uptime + loaddf -hT # disk spacefree -h # RAM + swaplscpu # CPU infolsblk # block deviceslsusb / lspci # USB / PCI devicesdmidecode # hardware info from BIOSinxi -Fxz # full system info (dnf install inxi)
Contributing to This Note
How to Contribute
This note follows the Code-Note contribution guidelines. See CONTRIBUTING for full details.
Fork the repository → create/edit pages/Fedora.md → submit a Pull Request.
PR title format: Add: Fedora or Update: Fedora – <section name>
What to Add
Missing Fedora-specific tools or workflows
New Fedora release features (update version numbers, new defaults)
Additional security hardening techniques
More Podman/container examples
Fedora Atomic/Silverblue/CoreOS deep dives
Real-world server setup examples (LAMP, LEMP, Docker Compose stacks)
Ansible playbooks for Fedora automation
Contribution Rules (Summary)
Follow the OS Page Format from CONTRIBUTING.md
Use collapsed:: true on all top-level sections except # More Learn
Use Logseq bullet syntax (- prefix)
Use fenced code blocks with language tags (```bash, ```ini, etc.)
Internal links use [[Page Name]] syntax
End keywords frontmatter with , VR-Rathod, Code-Note, code note vr, vr book
No broken links — only link to pages that exist in /pages/
Depth is valued — bigger, more detailed notes are better