Mask console-getty.service to prevent multi-distro failures (#13595)#14490
Mask console-getty.service to prevent multi-distro failures (#13595)#14490
Conversation
When multiple WSL distros run concurrently, /dev/tty devices are shared at the VM level. The second distro's console-getty.service fails because the tty is already held by the first, causing systemd to report failed units and triggering user@UID.service failures. Mask console-getty.service during WSL systemd unit generation, similar to the existing masking of networkd-wait-online. This service provides no value in WSL since users don't connect to the underlying tty. Fixes #13595
There was a problem hiding this comment.
Pull request overview
Masks console-getty.service during WSL systemd unit generation to prevent failures when multiple WSL distros run concurrently and share VM-level /dev/tty devices.
Changes:
- Mask
console-getty.serviceby generating a/dev/nullsymlink unit, similar to existing masking behavior. - Add a Windows unit test asserting
console-getty.serviceis masked viasystemctl status.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
src/linux/init/init.cpp |
Adds masking for console-getty.service during systemd unit generation. |
test/windows/UnitTests.cpp |
Adds a unit test check that console-getty.service reports as masked. |
test/windows/UnitTests.cpp
Outdated
| // Validate that console-getty.service is masked (tty devices are shared at VM level across distros). | ||
| auto [outGetty, ___] = | ||
| LxsstuLaunchWslAndCaptureOutput(L"systemctl status console-getty.service | grep -iF Loaded:"); | ||
|
|
||
| VERIFY_ARE_EQUAL(outGetty, L" Loaded: masked (Reason: Unit console-getty.service is masked.)\n"); |
There was a problem hiding this comment.
systemctl status | grep Loaded: output is relatively brittle across systemd versions/distros (spacing/punctuation and the exact “Reason” text can vary). To make the test more stable, consider querying machine-readable properties instead (e.g., systemctl show -p LoadState -p UnitFileState console-getty.service) and asserting on masked/LoadState=masked rather than an exact formatted status line.
test/windows/UnitTests.cpp
Outdated
| auto [outGetty, ___] = | ||
| LxsstuLaunchWslAndCaptureOutput(L"systemctl status console-getty.service | grep -iF Loaded:"); | ||
|
|
There was a problem hiding this comment.
The placeholder name ___ is unclear. Prefer a conventional unused name like ignored, or avoid introducing a named variable by using an approach that explicitly discards the second return value (e.g., assign to a named ignored variable and mark it intentionally unused if needed).
| auto [outGetty, ___] = | |
| LxsstuLaunchWslAndCaptureOutput(L"systemctl status console-getty.service | grep -iF Loaded:"); | |
| auto [outGetty, ignored] = | |
| LxsstuLaunchWslAndCaptureOutput(L"systemctl status console-getty.service | grep -iF Loaded:"); | |
| (void)ignored; |
|
Should |
That's a really good call. |
When multiple WSL distros run concurrently, /dev/tty devices are shared at the VM level. The second distro's console-getty.service fails because the tty is already held by the first, causing systemd to report failed units and triggering user@UID.service failures.
Mask console-getty.service during WSL systemd unit generation, similar to the existing masking of networkd-wait-online. This service provides no value in WSL since users don't connect to the underlying tty.
Fixes #13595