{"id":6192,"date":"2026-09-05T21:43:31","date_gmt":"2026-09-05T12:43:31","guid":{"rendered":"https:\/\/eternalsphere.net\/echoes\/?p=6192"},"modified":"2026-09-12T17:17:58","modified_gmt":"2026-09-12T08:17:58","slug":"292tchfwrr830rr","status":"publish","type":"post","link":"https:\/\/blog.eternalsphere.net\/index.php\/2026\/09\/05\/292tchfwrr830rr\/","title":{"rendered":"Installing WSL 2 and Ubuntu on Windows When Network Conditions Make WSL Update Unreliable"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Modern WSL installation is normally simple. On a well-connected Windows 11 machine, a few commands can enable WSL, install the runtime, download a Linux distribution, and complete the first-run setup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On restricted, unstable, metered, or geographically problematic networks, however, the installation can fail at a less obvious layer: the Linux distribution may already be installed while the WSL runtime itself remains incomplete or outdated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This article describes how to distinguish those layers and recover cleanly using an offline WSL MSI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All machine names, usernames, paths, network details, and environment-specific values are anonymized.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. WSL Is More Than One Component<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A working WSL 2 environment consists of several layers:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Windows\n  |\n  +-- Windows Subsystem for Linux optional feature\n  |\n  +-- Virtual Machine Platform\n  |\n  +-- WSL runtime\n  |\n  +-- WSL Linux kernel\n  |\n  +-- Linux distribution\n       |\n       +-- Ubuntu\n       +-- Debian\n       +-- other distributions\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This distinction becomes important when installation partially succeeds.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A Linux distribution may already exist while the runtime required to start it is still missing or outdated.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Check the Windows Features First<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The two relevant Windows features can be inspected with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If disabled, enable them without immediately rebooting:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Enable-WindowsOptionalFeature `\n  -Online `\n  -FeatureName Microsoft-Windows-Subsystem-Linux `\n  -All `\n  -NoRestart\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Enable-WindowsOptionalFeature `\n  -Online `\n  -FeatureName VirtualMachinePlatform `\n  -All `\n  -NoRestart\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A reboot is normally required before WSL 2 can operate correctly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Remote Reboots Need Planning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On a remotely administered machine, rebooting Windows can sever every control path.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Before restarting, verify how remote access returns after boot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Remote administrator\n       |\n       v\nTunnel service\n       |\n       v\nWindows SSH\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the tunnel client is normally started manually, a temporary startup mechanism may be required for a maintenance reboot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Remote-access continuity should be solved before enabling features that require restart.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. The Distribution Can Be Installed While WSL Still Fails<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After reboot, launching Ubuntu may show a message equivalent to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Windows Subsystem for Linux must be updated\nRun: wsl.exe --update\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is an important diagnostic clue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It means:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Ubuntu distribution        installed\nWindows WSL features       enabled\nWSL runtime                insufficient\nUbuntu startup             blocked by runtime requirement\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Reinstalling Ubuntu at this point does not solve the actual problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The missing dependency is the WSL runtime.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Why <code>wsl --update<\/code> Can Be Problematic<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The normal update path is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wsl --update\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On some networks, this can exhibit:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>very slow downloads;<\/li>\n\n\n\n<li>long stalls;<\/li>\n\n\n\n<li>intermittent disconnects;<\/li>\n\n\n\n<li>repeated restarts from the beginning;<\/li>\n\n\n\n<li>inconsistent access to Microsoft or GitHub infrastructure.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A partial download reaching a visible percentage does not necessarily imply that command-line resume functionality is available.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a large runtime package, repeated retries may waste substantial time.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Separate Download Location from Installation Location<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A practical solution is to download the WSL MSI from a different machine with better network connectivity.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The process becomes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Well-connected machine\n       |\n       | download official WSL MSI\n       v\n&lt;WslRuntime.x64.msi&gt;\n       |\n       | transfer\n       v\nTarget Windows machine\n       |\n       | local MSI installation\n       v\nWorking WSL runtime\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The package should come from Microsoft&#8217;s official WSL release source.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Choose the architecture that matches the Windows host:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>x64      -&gt; x64 MSI\nARM64    -&gt; ARM64 MSI\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">7. Version Matching Is Flexible<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An important practical point is that an offline WSL MSI does not always need to match the exact version that an interrupted <code>wsl --update<\/code> operation was attempting to retrieve.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Installing a newer supported official release is normally acceptable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Updater attempted: &lt;OLDER_WSL_VERSION&gt;\nManual MSI:        &lt;NEWER_WSL_VERSION&gt;\nResult:            valid upgrade path\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The key requirements are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>correct CPU architecture;<\/li>\n\n\n\n<li>official package;<\/li>\n\n\n\n<li>supported Windows version.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">8. Install the WSL Runtime Locally<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once the MSI reaches the Windows host:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>msiexec.exe \/i \"&lt;WSL_MSI_PATH&gt;\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">After installation, verify:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wsl --version\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A healthy result should report values for:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>WSL version\nLinux kernel version\nWSLg version\nWindows version\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wsl --status\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">should show the default WSL generation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a WSL 2 environment:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Default Version: 2\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">9. Verify the Distribution<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">List installed distributions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wsl -l -v\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A healthy installation may resemble:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NAME       STATE      VERSION\n&lt;Ubuntu&gt;   Stopped    2\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Launching it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wsl -d &lt;DISTRO_NAME&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">should enter the Linux environment.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10. First-Run Ubuntu Provisioning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The first launch creates the Linux filesystem and requests a default UNIX account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The username does not need to match the Windows account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typical flow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Enter new UNIX username:\nNew password:\nRetype new password:\nInstallation successful\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once the prompt becomes something like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;LINUX_USER&gt;@&lt;WSL_HOST&gt;:~$\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">the Ubuntu instance is ready.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">11. Verify the Linux Environment<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Useful checks include:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>whoami\nuname -a\ncat \/etc\/os-release\npwd\ndf -h \/\nfree -h\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This confirms:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>the UNIX user;<\/li>\n\n\n\n<li>WSL kernel;<\/li>\n\n\n\n<li>distribution release;<\/li>\n\n\n\n<li>home-directory location;<\/li>\n\n\n\n<li>virtual filesystem capacity;<\/li>\n\n\n\n<li>available memory;<\/li>\n\n\n\n<li>swap.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">12. WSL Filesystem Capacity Can Be Misleading<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A WSL 2 filesystem may report a very large virtual capacity:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/dev\/&lt;VIRTUAL_DEVICE&gt;     &lt;VERY_LARGE_SIZE&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This does not mean the Windows host physically has that much free storage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">WSL uses a dynamically expanding virtual disk.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>WSL filesystem free space\n        !=\nWindows physical free space\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The actual limiting resource remains the Windows volume that stores the WSL virtual disk.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This matters enormously for data-intensive workloads.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">13. Proxy Warnings Do Not Necessarily Mean Failure<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When Windows uses a localhost proxy, WSL may display a warning such as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>localhost proxy configuration detected\nnot mirrored into WSL\nNAT-mode WSL does not support localhost proxy mapping\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The warning means that:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Windows localhost\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>WSL localhost\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">are different network namespaces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It does not automatically mean that WSL has no Internet connectivity.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">14. Test Real Connectivity Instead of Guessing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check external HTTPS access:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -I --max-time &lt;TIMEOUT&gt; https:\/\/github.com\/\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then test the package manager:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If both succeed, the network is usable even if WSL continues displaying the localhost-proxy warning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Actual application-level connectivity is more useful than interpreting the warning in isolation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">15. Final State<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A successfully recovered WSL deployment may look like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Windows\n  |\n  +-- WSL feature enabled\n  +-- Virtual Machine Platform enabled\n  +-- WSL runtime installed from official MSI\n  +-- WSL 2 default\n  |\n  +-- Ubuntu\n       |\n       +-- x86-64 Linux\n       +-- working network\n       +-- apt repositories reachable\n       +-- normal UNIX user\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The main lesson is to separate:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Windows features\nWSL runtime\nLinux kernel\nLinux distribution\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">into distinct layers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When the distribution is already installed but startup demands <code>wsl --update<\/code>, reinstalling Ubuntu is usually the wrong direction. Repairing or replacing the WSL runtime directly is faster, cleaner, and much easier to troubleshoot.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Modern WSL installation is normally simple. On a well-connected Windows 11 machine, a few commands can enable WSL, install the runtime, download a Linux distribution, and complete the first-run setup. On restricted, unstable, metered, or geographically problematic networks, however, the installation can fail at a less obvious layer: the Linux &hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[218],"tags":[228,229],"class_list":["post-6192","post","type-post","status-publish","format-standard","hentry","category-windows","tag-ubuntu","tag-wsl"],"_links":{"self":[{"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/posts\/6192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/comments?post=6192"}],"version-history":[{"count":1,"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/posts\/6192\/revisions"}],"predecessor-version":[{"id":6193,"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/posts\/6192\/revisions\/6193"}],"wp:attachment":[{"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/media?parent=6192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/categories?post=6192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/tags?post=6192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}