Starting the VPN client is a convenient timestamp rather than a cause, and that distinction decides what happens next. When a kernel Oops lands near that moment, the choice is between collecting a usable fault report and provoking the same crash five more times on a production box. Save four things before rebooting: the exact kernel build, the first fault trace, the taint state, and a short description of everything else that changed at the same minute. The rest is interpretation, and interpretation can wait until the evidence is somewhere safe.

Capture the First Fault, Not the Last Line

The first Oops in the log is the one that matters, because every later fault may be collateral damage from a kernel that is already unhealthy. Copy the header along with the call trace, since the header carries the faulting instruction and the register state that identify the code path. A report that starts at the final line is worth very little to whoever reads it a week later.

If the machine has already rebooted, the previous boot's kernel buffer is often still in the journal, provided persistent storage was enabled at the time. Read it from the saved file instead of recreating the workload, because a second reproduction can overwrite what you need. Where the box cannot keep a journal across reboots, a serial console or netconsole is the only way the fault will ever be visible.

Pin the Build Before You Read Any Symbol

Function names and offsets mean something only against the binary that produced them, so record the kernel release string and the distribution build identifier together. A symbol file from a different build points at the wrong line with complete confidence, which is worse than having no symbol at all. Keep the kernel package version, not only the upstream number, because distributions backport heavily.

Out-of-tree modules deserve their own line in the record, since a tainted kernel limits what a maintainer is allowed to conclude. Read the taint value rather than inferring it from a module list.

A non-zero taint is not an accusation and does not make the report worthless. It tells the reader which components were loaded when the fault happened, and some flags cause a report to be deprioritized by policy rather than by judgement. Record the value, the module names, and whether the same hardware and workload ever ran a kernel without them. That last comparison is what separates a new regression from a long-standing bug.

Separate a Trigger From a Defect

Starting the tunnel normally exercises a path that already existed: a network driver, a queue discipline, an offload feature, or a power state. The trigger explains when the fault appears, not which code is wrong, and treating the trigger as the cause leads to a series of configuration changes that fix nothing.

A working earlier image is evidence, not proof. Change one component per boot when comparing, and keep the results somewhere that survives the machine.

Check What the Maintainer Can Actually Use

Read the report as a stranger would before sending it. If the configuration, the exact sequence and the build identity are present, and the credentials are gone, the report is usable. If it is a screenshot of a stack trace, it will come back with a request for the same information. The kernel bug-hunting guide describes what a useful trace and matching symbols look like.

uname -r
cat /proc/sys/kernel/tainted
journalctl -k -b -1 --no-pager | sed -n '/BUG:/,/Call Trace/p'
dmesg -T | grep -A 40 'RIP:'

Every command above only reads state, and the first two should run before the next reboot if the machine can still answer them. Where the journal does not persist, those two are the only ones that will ever work again.

Redact keys, passwords and unrelated traffic, but keep the function names and offsets somebody needs in order to read the trace. Send the material through the reporting path that applies to the distribution or the kernel, not a public paste with a hostname attached. Then wait for a question instead of harvesting more crashes, because a located fault against a matching build is the only result that moves the report forward. If nothing comes back, the fallback is a controlled reproduction on spare hardware, never on the machine other people depend on.

Nsɛm a ɛfa ho