Home/Linux Administration/Linux Fundamentals
🐧

Level 1 of 24

Linux Fundamentals

What Linux actually is, the kernel, distributions, and how a command becomes hardware activity.

Before touching a single command, you need a mental model of what Linux actually is — because "Linux" is used to mean at least three different things depending on context, and that ambiguity causes real confusion later when you're debugging a kernel panic versus a broken package install.

Prerequisites

  • • None — this is the starting point of the curriculum.

By the end of this level, you can

  • ✓ Explain the difference between the Linux kernel, GNU/Linux, and a Linux distribution
  • ✓ Name the major distribution families and what genuinely differs between them
  • ✓ Describe the path from a typed command to hardware, in the right order
  • ✓ Set up a real, disposable Linux environment to practice in

What is Linux, really?

Kernel vs. operating system vs. distribution — the distinction that avoids a year of confusion. · 9 min

Strictly speaking, "Linux" is a kernel — the core program that manages a computer's CPU, memory, and hardware devices, and mediates every request a program makes to use them. It was started by Linus Torvalds in 1991 as a personal project to build a free, Unix-like kernel for his own PC, and released it publicly so others could use and improve it. The kernel by itself is not something you install and use directly; it has no file manager, no package installer, no login screen.

What most people call "Linux" — Ubuntu, Fedora, Debian, and so on — is technically a Linux distribution: the kernel bundled with the GNU userland tools (the shell, core utilities like `ls` and `grep`, compilers), a package manager, and usually a desktop environment or server tooling on top. This is why some people insist on saying "GNU/Linux": the kernel provides the low-level engine, but the GNU Project's tools (started years before Linux existed, aiming to build a free Unix-like operating system) provide most of what you actually type at a command line every day.

The practical reason this distinction matters: when someone says "which Linux are you running", they almost always mean the distribution (Ubuntu 24.04, Rocky Linux 9, etc.), not the kernel version — but when you're debugging something at the level of device drivers, filesystems, or system calls, you're dealing with kernel behavior that can be identical across very different-looking distributions running the same kernel version.

CommandPurposeExample
uname -rPrint the running kernel versionuname -r → 6.8.0-45-generic
uname -aPrint full kernel/system information in one line—
cat /etc/os-releasePrint the distribution name, version, and ID — works across virtually all modern distros—
  • • Kernel — manages CPU, memory, devices, and system calls (the engine)
  • • GNU tools — the shell and core utilities most command-line work uses daily
  • • Distribution — kernel + GNU tools + package manager + configuration, packaged for end users (Ubuntu, RHEL, Debian, etc.)

Quick Check

What does the Linux kernel actually do?

Takeaway: "Linux" the kernel, GNU/Linux the toolset, and a "distribution" the packaged product are three different (if related) things — and knowing which one you mean saves real confusion later.

Linux distributions and distribution families

Why Ubuntu, Debian, RHEL, and Arch feel different, and which ones are actually related under the hood. · 11 min

A distribution ("distro") takes the Linux kernel and GNU tools and adds a package manager, default configuration, release cycle, and often a specific philosophy. Distributions cluster into families based on shared packaging systems and ancestry, and knowing the family tells you far more about how a system behaves than its name alone. The two families you will meet constantly in system administration are the Debian family and the Red Hat family.

The Debian family uses the `.deb` package format and the `apt`/`dpkg` tooling. Debian itself is the upstream project; Ubuntu is built on top of Debian with its own release cadence, defaults, and commercial backing from Canonical; Ubuntu Server is the variant used heavily in cloud and DevOps environments. The Red Hat family uses the `.rpm` package format and `dnf`/`rpm` tooling. Red Hat Enterprise Linux (RHEL) is the commercial, support-backed product; Rocky Linux and AlmaLinux are community rebuilds that aim for bug-for-bug compatibility with RHEL (both emerged after CentOS changed its model in 2020, ending CentOS as a free RHEL rebuild); Fedora is Red Hat's faster-moving upstream distribution where newer features land before eventually reaching RHEL. Amazon Linux is AWS's own RHEL-family-adjacent distribution, optimized for and defaulted to on EC2.

Outside those two families: Arch Linux uses `pacman` and a rolling-release model (no fixed version numbers — the system continuously updates), popular for its minimalism and the depth of the Arch Wiki. Kali Linux is a Debian-based distribution purpose-built for penetration testing and security research, pre-loaded with security tooling — it is not intended as a general-purpose server or desktop OS. This course teaches Ubuntu Server (Debian family) as the default hands-on environment and calls out RHEL-family differences explicitly wherever a command or concept diverges, rather than pretending the two families are interchangeable.

CommandPurposeExample
cat /etc/os-releaseConfirm which distribution and version you're actually on before running distro-specific commands—
lsb_release -aPrint distribution info (Debian-family systems; may need installing separately on minimal images)—
  • • Debian family (.deb, apt/dpkg): Debian, Ubuntu, and Ubuntu Server
  • • Red Hat family (.rpm, dnf/rpm): RHEL, Rocky Linux, AlmaLinux, Fedora, Amazon Linux
  • • Independent: Arch Linux (rolling release, pacman), Kali Linux (Debian-based, security-focused)

Common Mistakes

  • ⚠ Assuming a command that works on Ubuntu (`apt install nginx`) will work unchanged on RHEL/Rocky — it won't (`dnf install nginx`)
  • ⚠ Confusing "server" and "desktop" editions of the same distribution — Ubuntu Server has no GUI by default and a different default package set than Ubuntu Desktop
  • ⚠ Treating CentOS documentation as current — CentOS as a free RHEL rebuild ended; Rocky Linux and AlmaLinux are its modern successors

Takeaway: Identify a system's distribution family first (Debian vs. RHEL) — it tells you the package manager, the format, and roughly which documentation and commands actually apply.

Open source and Linux licensing

Why Linux is free, what the GPL actually requires, and why that matters for a sysadmin, not just a developer. · 6 min

The Linux kernel is licensed under the GNU General Public License version 2 (GPL v2), one of the foundational open-source licenses. In practice, this means the kernel's source code is freely available, anyone can study, modify, and redistribute it, and — the key "copyleft" clause — anyone who distributes a modified version must also make that modified source code available under the same license. This is different from a permissive license (like MIT or Apache 2.0), which allows closed-source modification and redistribution.

Most GNU userland tools are also GPL-licensed, which is why the free-software movement historically insisted on the "GNU/Linux" naming — the license and philosophy of the GNU tools are a deliberate, foundational part of the system, not an afterthought bolted onto the kernel.

For a system administrator, the practical relevance isn't writing license text — it's understanding that "free" here means freedom (to inspect, modify, and redistribute), not merely "free of charge", and that this is exactly why the same kernel underlies wildly different commercial and community products: RHEL is a paid, support-backed product built on the same freely-licensed kernel that Debian ships at no cost.

Takeaway: GPL "copyleft" licensing is why Linux can be simultaneously free-of-cost, commercially supported, and endlessly forked into different distributions — the license guarantees the source stays open at every step.

Linux architecture: from command to hardware

What actually happens between you pressing Enter and the hardware responding — user space, the kernel, and system calls. · 10 min

Every Linux system is split into two protection domains: user space and kernel space. User space is where your applications, the shell, and almost everything you interact with directly runs — it has restricted, mediated access to hardware. Kernel space is where the kernel itself runs, with full, direct access to memory and hardware. This separation exists for stability and security: a crashing application in user space cannot normally bring down the whole system, because it never had direct hardware access to break in the first place.

When a user-space program needs something only the kernel can provide — reading a file, opening a network socket, allocating memory, creating a process — it makes a system call (syscall), a strictly defined request that crosses from user space into kernel space, gets serviced by the kernel, and returns a result. Every single file read, every network packet sent, and every process you start ultimately happens through a system call, whether or not the program you're running makes that visible to you.

The shell (commonly `bash` on Linux) is a user-space program like any other — it is not part of the kernel. It reads the command you type, parses it, and either runs a built-in behavior itself or launches an external program, which in turn makes system calls to actually do its work. This is the full chain: you type a command into a terminal (the program that displays the shell and handles keyboard/screen I/O) → the shell parses and executes it → the resulting program makes system calls → the kernel services those calls → the kernel talks to the hardware. Understanding this chain is what lets you reason about *where* a problem actually lives — a "command not found" error is a shell-level problem, while a "permission denied" reading a file is a kernel-enforced permission check surfaced back up through a syscall's return value.

The full path from keystroke to hardware

You (keyboard)
  ↓
Terminal emulator (displays the shell, handles I/O)
  ↓
Shell — bash (parses your command)
  ↓
Application (e.g. cat, ls, a compiled program)
  ↓
System call (e.g. open(), read(), write())
  ↓
Linux kernel (services the call, enforces permissions)
  ↓
Hardware (disk, network card, memory)

Quick Check

Which of these runs in kernel space, not user space?

Takeaway: A shell command is never talking to hardware directly — it always goes through a system call into the kernel, which is exactly why permission and hardware-access problems show up as kernel-enforced errors, not shell errors.

Setting up a real Linux environment to practice in

VMs vs. cloud instances vs. WSL — and getting a disposable Ubuntu Server running for every lab in this course. · 12 min

You cannot learn system administration by reading about it — every lesson from here on assumes you have a real, disposable Linux system you can break, fix, and reset without consequence. You have three realistic options, and this course is written against the first one.

A local virtual machine (VirtualBox, VMware Workstation/Fusion, or Hyper-V on Windows) running Ubuntu Server is the most controllable option: fully isolated from your host machine, snapshot-able so you can revert a lab that went badly, and free. A cloud VM (a small instance on any major provider) is closer to real production administration — you'll manage it entirely over SSH from day one, which is realistic, but it costs money while running and isn't as easy to snapshot/reset for free. WSL (Windows Subsystem for Linux) is the fastest to start with zero setup, but it deliberately blurs some boundaries with the Windows host (shared filesystem access, a different init/service model in WSL1 and partial systemd support in WSL2) that make certain lessons in this course — full systemd administration, boot process work, LVM — behave differently or not work as described. Use WSL for quick command-line practice; use a real VM for anything involving services, storage, or boot behavior.

Before installing, the boot chain matters conceptually even if you never touch it directly during a normal install: your computer's firmware (legacy BIOS or modern UEFI) runs first and hands control to a bootloader (GRUB, on almost all Linux systems), which loads the Linux kernel and an initial RAM filesystem (initramfs) into memory, and the kernel then hands control to `systemd` (PID 1 on virtually all modern distributions), which brings the rest of the system up through a sequence of boot targets and services. You'll revisit this exact chain in more depth in the Boot Process lesson later in the course — for now, just recognize the names.

CommandPurposeExample
ssh user@server-ipConnect to a VM or cloud instance once it has an IP and SSH running—
cat /etc/os-releaseConfirm the installed distribution and version after first boot—
🧪

Hands-On Lab

Install and connect to Ubuntu Server

Objectives

  • ✓ Create a new VM with reasonable resource allocation for a learning environment
  • ✓ Install Ubuntu Server from the official ISO
  • ✓ Confirm the network configuration and find the VM's IP address
  • ✓ Connect to the VM over SSH from your host machine

Instructions

  1. Download the current Ubuntu Server LTS ISO from ubuntu.com — always use the official source, never a mirror you can't verify.
  2. Create a new VM with at least 1 vCPU, 1–2GB RAM, and 10–20GB of disk — this is a learning environment, not a production sizing exercise.
  3. Attach the ISO, boot the VM, and follow the guided installer: language, network (DHCP is fine for a lab), disk partitioning (accept the guided/default option unless a later lesson tells you otherwise), and create your admin user during setup — the installer will offer to install the OpenSSH server; say yes.
  4. After the VM reboots into the installed system, log in locally once and run `ip addr` to find its assigned IP address.
  5. From your host machine's terminal, connect with `ssh yourusername@vm-ip-address` and confirm you land at a shell prompt.
Hints (2)
  • If the VM has no network connectivity, check that your VM software is set to "NAT" or "Bridged" networking, not "Host-only", for it to reach the internet during install.
  • If SSH connection is refused, confirm you selected "Install OpenSSH server" during setup, or install it after the fact with `sudo apt update && sudo apt install openssh-server`.

Takeaway: Get a real, disposable Ubuntu Server VM running and reachable over SSH before the next lesson — every subsequent lab in this course assumes you have exactly this.

Sponsor / Advertisement