Certifications · LFCS

LFCS — the exam

The Linux Foundation Certified System Administrator (LFCS) is the odd entry on this whole shelf. It carries no CNCF logo, tests no cloud-native project by name, and is issued directly by the Linux Foundation rather than its cloud-native sub-foundation — and yet Golden Kubestronaut lists it as the sixteenth and final requirement, sitting beside eight CNCF project associates and the five-exam Kubernetes core this course assumes you already hold. It is also the only exam on the entire ladder, other than CKA itself, that hands you a live terminal instead of a multiple-choice form: two hours, a real machine, graded on the state you leave it in. And since a revision on 11 May 2023 it no longer even asks which distribution you prefer — it tests the Linux that is the same everywhere. This page is the hub: what it actually is, the five official domains and weights, a live trace of what a container really is underneath Kubernetes' abstractions, and the exam logistics as of writing.

☺ Explain it like I'm 10

Picture a space station. The astronauts float between shiny control panels, run experiments, talk to mission control — that's the exciting part everyone photographs, and it's what Kubernetes feels like. But under the floor panels is a whole other deck: oxygen scrubbers, water recyclers, power routing, waste management. Nobody puts that deck on a poster, but if the scrubber clogs, it doesn't matter how good the astronaut is at the control panel — the station stops being safe. LFCS is the badge for knowing your way around that lower deck: not flashy, never photographed, and the actual reason the shiny part keeps working.

🦥Your host for this topic: Sol the Sloth — deliberately unhurried, and exactly the right pace for an exam that punishes anyone who rushes a systemctl command or a partition table.

Linux Foundation, not CNCF — and why it counts anyway

☺ Like you're 10: The CNCF is one club inside a bigger club called the Linux Foundation. This exam belongs to the bigger club, not the cloud-native one — but the bigger club's badge is still required to finish the whole set.

Every other credential on this ladder — the five Kubernetes core exams and the eight project associates covered elsewhere in this course — is a CNCF certification: written by a curriculum committee tied to a specific open-source project, branded with the CNCF mark, announced on cncf.io. LFCS has none of that. It has no sponsoring project, no maintainer-written curriculum, no CNCF logo anywhere on the certificate. It is issued straight from the Linux Foundation — the parent organization the CNCF itself lives inside — and it existed years before Kubestronaut or Golden Kubestronaut were invented, as a general-purpose Linux sysadmin credential aimed at nobody in particular running clusters.

Golden Kubestronaut bolts it on anyway, and the reasoning is sound once you say it out loud: fifteen CNCF-branded exams can certify that you understand every layer of the cloud-native stack down to the container boundary, and still say nothing about what's underneath that boundary. A Pod is not made of YAML at runtime — it's a Linux process, in namespaces, on a cgroup budget, started by a container engine that is itself a systemd unit. LFCS is the one exam on the ladder that tests the floor the other fifteen are standing on.

◆ Key idea

Golden Kubestronaut's sixteen exams break down as 15 CNCF-branded + 1 Linux Foundation exam: the 5-exam Kubernetes core, the 8 project associates this course covers, the 2 Platform Engineering exams (CNPA, CNPE) — all CNCF — plus LFCS, the sole non-CNCF credential, required precisely because none of the other fifteen touch the operating system directly.

Linux Foundation CNCF (a Linux Foundation project) 5 Kubernetes core certs KCNA · KCSA · CKA · CKAD · CKS 8 CNCF project associates CGOA · CAPA · CBA · CCA · ICA · KCA · OTCA · PCA CNPA + CNPE — the Platform Engineering pair + LFCS Linux administration No CNCF badge. No project curriculum committee. Issued directly by the LF. 15 CNCF-branded exams + this 1 Linux Foundation exam = the 16-exam Golden Kubestronaut ladder

What LFCS shares with the CNCF pack is format kinship in one direction only: it is performance-based, exactly like CKA and ICA's hands-on half — a live terminal, real tasks, graded on final state — rather than the multiple-choice format the other seven project associates use. If you've already sat CKA, the exam-day mechanics here will feel familiar even though the subject matter has nothing to do with a cluster.

Distribution-agnostic since 11 May 2023 — what changed

☺ Like you're 10: The test used to make you pick which brand of Linux you'd be tested on. Now it doesn't — it only asks about the parts that work the same no matter which brand you're running.

Before May 2023, candidates chose a distribution family in the preparation checklist, and a meaningful slice of the exam leaned on distribution-specific package tooling. The Linux Foundation revised the exam effective 11 May 2023: distribution selection was removed entirely, and the five domains were restated in their current, distribution-agnostic form. The practical effect is that apt-versus-yum trivia is now worthless prep, while the tools that behave identically everywhere — systemd, journalctl, ip, ss, LVM, ACLs, the /proc and /sys filesystems — are exactly what gets tested.

⚠ Any prep material written before mid-2023 is describing a different exam

If a study guide, video course, or blog post spends time telling you to pick a distribution, or drills package-manager syntax as if it were the point, it predates the revision. The domains, competencies, and distribution-agnostic framing on this page reflect the exam as revised on 11 May 2023 — cross-check anything older against the official curriculum before you trust it.

The five official domains and their weights

☺ Like you're 10: Five topics, and two of them — running things and talking to the network — together make up half the whole test.

Unlike some of the knowledge-based exams on this ladder, the Linux Foundation does publish percentage weights for LFCS, and they're worth planning a study schedule around. The five domains below sum to exactly 100% (25 + 25 + 20 + 20 + 10), as revised 11 May 2023.

⚙️Operations Deployment
25%
📡Networking
25%
💾Storage
20%
⌨️Essential Commands
20%
👥Users and Groups
10%
DomainWeightCompetencies (as published)
Operations Deployment25%Kernel parameters, persistent and non-persistent · process/service diagnosis and troubleshooting · job scheduling · package management · recovery from hardware, OS or filesystem failures · virtual machines (libvirt) · container engines · SELinux mandatory access control
Networking25%IPv4/IPv6 configuration and hostname resolution · time synchronization · network troubleshooting · OpenSSH server and client · packet filtering, port redirection and NAT · static routing · bridge and bonding devices · reverse proxies and load balancers
Storage20%LVM · the virtual file system · filesystem creation and troubleshooting · remote filesystems and network block devices · swap · filesystem automounters · storage performance monitoring
Essential Commands20%Basic Git operations · service creation, configuration and troubleshooting · system performance monitoring · application/service constraints · disk-space troubleshooting · SSL certificates
Users and Groups10%Local user/group accounts · environment profiles · resource limits · ACLs · LDAP account integration

Two things to notice before you build a study plan. First: "Essential Commands" is not the beginner survival kit its name implies — it's Git, service troubleshooting, disk-space forensics, and SSL certificates, the exact problem cert-manager automates inside a cluster and that someone still has to debug by hand on a bare host. Second: Networking and Operations Deployment are each 25%, and together are half the paper — a fair reflection of where 3am pages actually come from, and precisely the ground the next two sections cover.

systemd and journald — the commands that run everything

☺ Like you're 10: One program starts almost everything on the machine, and one program writes down almost everything that happens. Learn those two and half the exam gets easier.

On any modern Linux node, systemd is PID 1 — the first process the kernel starts, and effectively the operating system's own API for starting, stopping, restarting and supervising everything else. The kubelet is a unit. The container engine is a unit. The SSH daemon is a unit. Knowing units, drop-in overrides, dependency ordering and restart policy is the difference between "the service is broken" and "containerd.service failed its start because a config key is malformed — here's the exact line."

# What's broken, and since when?
systemctl status sshd.service           # state, PID, its cgroup, last log lines
systemctl list-units --failed           # everything that failed to start
systemctl is-enabled sshd               # will it come back after a reboot?
systemctl cat sshd.service              # the EFFECTIVE unit: vendor file + drop-ins

# Override a unit WITHOUT editing the vendor file (writes a drop-in snippet)
systemctl edit sshd.service
systemctl daemon-reload && systemctl restart sshd

# journald — the one place every unit's output actually lands
journalctl -u sshd -f                          # follow one unit live
journalctl -u sshd --since "10 min ago" --no-pager
journalctl -p err -b                            # errors only, this boot
journalctl -b -1                                # the PREVIOUS boot — did it crash?
journalctl -k                                   # kernel ring buffer (dmesg) — look for OOM
journalctl --disk-usage                         # journald is a classic /var space eater

And writing a unit is examinable in its own right — "create, configure and troubleshoot services" is named directly in the Operations Deployment domain:

# /etc/systemd/system/mission-agent.service
[Unit]
Description=Mission telemetry agent
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mission-agent --config /etc/mission/agent.yaml
Restart=on-failure
RestartSec=5s
User=mission
MemoryMax=512M          # a cgroup v2 limit, written in systemd's own dialect
CPUQuota=50%             # ...and so is this

[Install]
WantedBy=multi-user.target

Those last two lines matter more than they look. MemoryMax and CPUQuota aren't systemd inventions — they're cgroup v2 controls with a friendlier spelling, and the same controls are what Kubernetes writes on your behalf every time you set resources.limits on a container. That link is the whole point of the next section.

Namespaces and cgroups — what a container actually is, traced live

☺ Like you're 10: A container isn't a special box. It's a normal program that's been told a small lie about what it can see, and put on a strict allowance for how much it can use.

A container is a normal Linux process that has been lied to about the world (namespaces — its own private view of PIDs, mounts, network interfaces, hostname, users and IPC) and put on a budget (cgroups — a hard cap on what it can consume, and an account of what it actually used). Kubernetes never invented either mechanism; it schedules them. So when a Pod reports OOMKilled, no Kubernetes component made that call — the kernel's cgroup memory controller did, because a cgroup crossed memory.max. Kubernetes only reported the verdict after the fact. Walking down to that evidence, rather than staring at kubectl describe pod and shrugging, is the entire skill this domain is testing.

# The Pod that starts this whole chain
resources:
  limits:
    memory: 512Mi     # kubelet turns this into a cgroup v2 file, not a suggestion
① Pod manifest resources.limits.memory: 512Mi declared by you, in YAML the kubelet creates the cgroup ② cgroup v2 slice — kubepods.slice memory.max = 536870912 # 512Mi in bytes written by the kubelet's cgroup driver the app allocates beyond the limit ③ Kernel memory controller process crosses memory.max the kernel's own OOM killer fires — not Kubernetes the kernel records the kill ④a memory.events oom_kill counter +1 ④b Pod status container state: OOMKilled ⑤ Where you actually look: journalctl -k · memory.events · kubectl describe pod
# Which cgroup is a process in? (cgroup v2 = one unified hierarchy)
cat /proc/$(pgrep -f my-app | head -1)/cgroup
systemd-cgls                        # the cgroup tree, as systemd sees it
systemd-cgtop                       # top(1), but per cgroup

# Kubernetes' pods live under the same tree — the YAML limit ends up here.
# Path depends on the kubelet's cgroup driver: 'systemd' gives kubepods.slice/,
# the older 'cgroupfs' driver gives /sys/fs/cgroup/kubepods/. Check before you guess.
ls /sys/fs/cgroup/kubepods.slice/
cat /sys/fs/cgroup/kubepods.slice/<pod-slice>/memory.max      # your resources.limits.memory
cat /sys/fs/cgroup/kubepods.slice/<pod-slice>/memory.events   # oom_kill counter -> OOMKilled
journalctl -k | grep -i "out of memory"                        # the kernel's own log line

# Namespaces: what isolation does this PID really have?
lsns -p 1234
nsenter -t 1234 -n ip addr          # run 'ip addr' INSIDE that pod's network namespace
nsenter -t 1234 -m ls /             # ...and inside its mount namespace

That nsenter trick is worth the whole domain on its own: it's how you inspect the network of a container whose image ships no debugging tools at all — the exact situation a distroless production image puts you in.

The rest of the syllabus, fast: kernel, networking, storage, users

☺ Like you're 10: The remaining three-and-a-bit domains are mostly muscle memory — the kind of thing you only remember by actually typing it, over and over.

Operations Deployment, continued — kernel parameters, VMs, SELinux

# Kernel parameters — persistent and non-persistent
sysctl net.ipv4.ip_forward                 # read one live value
sysctl -w net.ipv4.ip_forward=1            # set it now — gone at reboot
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/99-mission.conf
sysctl --system                            # reload every persistent file

# Virtual machines (libvirt) and container engines
virsh list --all                           # every defined VM, running or not
virsh start mission-vm ; virsh shutdown mission-vm
podman ps -a ; podman inspect mission-agent --format '{{.State.Status}}'

# SELinux — mandatory access control (MAC)
getenforce                                 # Enforcing, Permissive, or Disabled
semanage fcontext -l | grep httpd_sys      # what context is expected where
restorecon -Rv /srv/www                    # fix a mislabeled tree
setsebool -P httpd_can_network_connect on  # a documented, persistent policy toggle

Networking — 25% of the paper, and most of the 3am pages

ip -br addr ; ip route                # modern replacement for ifconfig/route
ss -ltnp                              # who is listening, and which process owns it
resolvectl status                     # what resolver is this host ACTUALLY using?
nft list ruleset                      # nftables — the modern packet filter, not raw iptables
timedatectl status                    # clock skew breaks TLS handshakes and cluster health
ssh -F /dev/null user@host            # a client config sanity check, ignoring your own dotfile

Storage — 20%

lsblk -f ; df -hT ; findmnt /var/lib/containers
du -xhd1 /var | sort -h | tail        # who ate the disk? (images and journals, usually)
pvs ; vgs ; lvs                       # LVM, top to bottom
lvextend -r -L +10G /dev/vg0/var      # grow the LV and its filesystem in one step
mkswap /swapfile && swapon /swapfile  # swap space, configured on demand

Users and Groups — 10%

useradd -m -G mission -s /bin/bash dot
getfacl /srv/mission
setfacl -m u:dot:rx /srv/mission      # finer-grained than owner/group/other
id dot ; groups dot
ulimit -Sn                            # a resource limit, shell-scoped
🦆 Dot's-eye view

"I lost most of a morning convinced our platform had a bug, because a Pod kept dying at exactly the same memory number, every single time. Someone from infra ran three commands, found the cgroup, showed me memory.events ticking up, and said 'the kernel killed it — your limit is 512Mi and your heap wants 700.' It wasn't a platform bug. It was arithmetic, in a place I'd genuinely never looked. That was the afternoon I stopped treating Linux as somebody else's job."

Exam logistics — and the retired LFCE

☺ Like you're 10: Two hours at a real terminal, someone watching over video, a real machine to configure — and there used to be a "level two" version of this badge, but it doesn't exist anymore.

LFCS is performance-based, not multiple-choice: 17–20 real tasks, solved on a live terminal, graded on the final state of the machine — the same family of exam as CKA, not the knowledge-based format used by the other eight badges on this ladder. There is no formal prerequisite: nothing gates it, and gating aside, it is one of only two exams on the whole sixteen-exam ladder built this way, alongside CKA and the hands-on half of ICA.

ItemDetail
FormatPerformance-based — real tasks solved from the command line on a live system. No multiple choice, no cluster in sight
Task count17–20 performance-based tasks
Duration2 hours
Passing score67%
DeliveryOnline, remote-proctored — system check, room scan, government-issued photo ID, one monitor only
DistributionAgnostic since the 11 May 2023 revision — you no longer choose a platform
PrerequisitesNone
Related, now-retired credentialThe LFCE (Linux Foundation Certified Engineer) — once marketed as the "next step" after LFCS — was retired 1 May 2022, with no direct replacement. Any "LFCS then LFCE" career path you find online is describing a ladder that no longer exists
⚠ Verify officially before booking

This is an independent, unofficial study resource — not affiliated with the CNCF or The Linux Foundation. Price, task count, retake terms, eligibility and validity windows, proctoring rules, and even domain weights are all figures the Linux Foundation revises without much notice. Before you register or pay for anything, read the current official LFCS page and the candidate handbook yourself, end to end. If anything on this page disagrees with them, they are right and this page is stale.

↗ Official LFCS page — Linux Foundation ◆ Candidate handbook ◆ LFCE retirement notice

How to prepare, and what comes next

☺ Like you're 10: Learn the two domains worth half the test first, then drill the parts that only stick from typing them yourself, over and over, until your hands remember.

Start with the LFCS study plan, which maps every domain above to a pacing schedule built around a live terminal rather than flashcards, then work through the practice task bank and three timed papers — Mock Exam · Set 1, Set 2 and Set 3. For the conceptual foundation underneath this whole page, read Linux Fundamentals for Platform Engineers, and go deeper on the two tools this page leans on hardest in systemd & journald and LVM & Linux Storage Tools. For hands-on practice tracing exactly the failure this page walked through, run the broken cgroup-limit drill.

If you want the fuller comparison against a platform engineer's actual daily use of this material — including an honest verdict on when to skip the exam entirely — the deeper cross-reference lives on Platform Engineering's own LFCS page. And because this course assumes the five-exam Kubernetes core rather than re-teaching it, if Pod, Deployment and basic cluster fluency aren't solid yet, that foundation belongs before this page, not after it — see What Is Kubestronaut? and The Kubernetes Baseline You Need.

🦫 Benny's thirty-minute experiment

Do this before you spend a penny on the exam — it tells you exactly how much of this page was already familiar. On a throwaway Linux VM, run a container with a hard memory limit and a small program that allocates past it. Now, without the container tool's own commands: find the process with ps, read /proc/<pid>/cgroup, then cat memory.max and memory.events under /sys/fs/cgroup and watch oom_kill increment the moment it dies. Find the kernel's own message with journalctl -k. Finally, lsns -p <pid>, then nsenter -t <pid> -n ip addr. If that felt completely natural, you're most of the way to exam-ready. If any step sent you to a search engine, that step just told you where to start studying.

🎬 At Mission Control
🦊

Foxy: Wait, LFCS isn't even a CNCF badge? Why does it count toward Golden Kubestronaut at all?

🦥

Sol: Because... every Pod anyone here has ever built... is a process... in a cgroup... on a machine somebody has to keep alive.

🐘

Ellie: And when a node goes quiet, my dashboards stop right at the boundary. The next move is journalctl -b -1 — the previous boot. Did it crash, or was it rebooted on purpose?

👺

Gizmo: Node acting weird? Just reboot it. Or chmod 777 the whole directory, nobody actually checks. 😈

🐢

Timmy: That fails two domains at once, Gizmo. Users and Groups wants ACLs, not 777 — and Operations Deployment wants you to recover from the failure, not hide the evidence of it.

🦥

Sol: Slow... is a feature. Rushed lvextend commands... are how people lose a partition table.

🐿️

Nutty: For the record: sixteenth exam, five domains, seventeen-to-twenty tasks, sixty-seven percent to pass. Filed and cross-referenced.

🐢 Timmy's checkpoint

1. Is LFCS a CNCF exam? Explain how it still counts toward the sixteen-exam Golden Kubestronaut ladder. 2. Name the five LFCS domains and their published weights. 3. What changed on 11 May 2023, and why does it matter for anyone using older prep material? 4. A Pod reports OOMKilled. Which subsystem actually made that decision, and which two files would you check to prove it? 5. What happened to the LFCE, and what should you tell someone showing you an "LFCS then LFCE" career path? 6. What exam format does LFCS share with CKA that it does not share with the other eight badges on this ladder? 7. Name one command each for inspecting a process's cgroup and its network namespace from outside the container.

Check your answers
  1. No — LFCS is issued directly by the Linux Foundation, not the CNCF, and carries no CNCF branding or project curriculum. It counts because Golden Kubestronaut's sixteen exams are 15 CNCF-branded exams plus this one Linux Foundation exam, added specifically to test the operating-system layer none of the fifteen touch directly.
  2. Operations Deployment 25%, Networking 25%, Storage 20%, Essential Commands 20%, Users and Groups 10%.
  3. The exam became distribution-agnostic — candidates no longer choose a Linux distribution, and the five domains were restated in their current form. Any study guide that still has you picking a distribution, or leaning on distro-specific package syntax as the point of a section, predates the revision and should be treated as describing a different exam.
  4. The kernel's cgroup memory controller made the call — Kubernetes only reports the verdict afterward. Check memory.max (the limit) and memory.events (its oom_kill counter) under /sys/fs/cgroup, and confirm with journalctl -k.
  5. The LFCE was retired 1 May 2022, with no direct replacement. Correct someone showing an "LFCS then LFCE" path — the realistic next step today is sideways into the Kubernetes core ladder, or a hands-on badge like ICA, not a nonexistent LFCE.
  6. Performance-based — a live terminal and real tasks graded on final machine state, rather than the multiple-choice format the other eight project associates on this ladder use.
  7. Cgroup: cat /proc/<pid>/cgroup (or systemd-cgls). Network namespace: nsenter -t <pid> -n ip addr (after finding the PID with lsns -p <pid>).