The error is never where it says it is. It only tells you where it was standing when it fell.
Could Not Resolve Host
1.1.1.1. No names involved.
Network is unreachable.
So it was never DNS. The machine couldn't reach a number either. The resolver was just the outermost complaint on a stack of failures, and it had confidently pointed me at the wrong floor. That's the pattern in its smallest form: the symptom tells the truth about what hurts and lies about where.
One layer down: no IP address, no route. The wired interface had no cable. The wireless one was up, awake, and connected to nothing.
Two Programs, One Card
Connect Is Not Configure
The Update That Broke Everything
bsdtar Was Innocent
Two Hundred Megabytes
Measure the Prisoner Before You Build the Cell
Existence Is Not Permission
The password was never wrong. The permission was missing. Same lesson, wearing new clothes.
The Resolver That Worked, For Everyone But Me
getaddrinfo ETIMEDOUT. Couldn't resolve the download host.
I'd been here on day one, so I moved fast. Cleared a stray proxy that had been sitting in my environment as a literal placeholder. Pointed the resolver at reliable public DNS. Then I tested it: resolvectl query came back instantly with an IP. Resolution worked. I ran the installer again. Same timeout.
The resolver worked. The installer, doing the exact same lookup, timed out. Two tools, one name, opposite results. Which meant the name wasn't the problem and the network wasn't the problem. Something between them was.
The tell was in a file I'd glanced past twice: /etc/resolv.conf. Empty. Comments, no nameserver. And that is the seam. resolvectl talks to the resolver directly over its own socket, so of course it worked. But ordinary programs (curl, the installer, everything) call the old libc lookup, which reads /etc/resolv.conf, finds nothing, and gives up. My manual test had been passing precisely because it bypassed the broken part. I'd been checking the one path that couldn't fail.
One symlink pointed that file at the resolver that already worked, and the install went through on the first try.
There was a smaller lesson folded inside it. The installer kept suggesting I re-run with --force. I never did, and it would never have helped: --force skips a version check, but the failure wasn't the check. It was the DNS underneath it. Forcing past the check just marches the same broken lookup one step further before it falls over.
When the flag that skips the check doesn't help, the check was never the thing that was broken.
Can't Find Ext4 Filesystem
EXT4-fs: VFS: Can't find ext4 filesystem, over and over, dropping me into emergency mode on a locked root account. The machine was telling me the filesystem holding everything I'd built was gone.
I booted the rescue USB and checked. The partition was there. ext4, valid UUID, correct label. A full filesystem check came back clean across all five passes. The filesystem the kernel swore it couldn't find was sitting right there, intact.
Which meant the kernel wasn't wrong about failing. It was wrong about why. It hadn't lost the filesystem; it had been handed the wrong address for it. When I reformatted the disk, mkfs had minted a brand-new UUID, a new identity for the same room, and something downstream was still holding the old one. The system was knocking on a door that had been renumbered.
Then the fix introduced its own small comedy. I updated the boot entry to reference the partition by its stable ID, rebooted, and watched it hang: a start job is running for /dev/disk/by-partuuid/..., waiting patiently for a device that would never appear. I'd transcribed one character wrong off a console screen. A lowercase l where the real value had a 1. They are the same handful of pixels in that font. A partition ID is hexadecimal; it cannot contain the letter l at all, which means the typo was detectable from first principles and I still made it.
The lesson isn't "be more careful." I was being careful. The lesson is that any value you retype by eye is a value you can corrupt, so don't retype it. Have the machine read its own identifier and write it into the config directly. Remove the human from the copy and you remove the entire category of failure.
The Floor Below
The error is never where it says it is. Keep walking down until you reach the quiet layer that's actually broken and has been saying nothing at all.