LiMount is a Windows desktop application that mounts Linux disk partitions into WSL2 and exposes them in Windows Explorer.
Windows access is now mode-based:
NetworkLocation(default): creates an Explorer Network Location under NetHood.DriveLetterLegacy: maps UNC to a Windows drive letter.None: mount-only, with no Windows integration.
Built with C# WinUI 3 (.NET 10) and PowerShell.
- Disk Enumeration: Detects physical disks and partitions using WMI
- Smart Filtering: Prioritizes likely Linux partitions (ext4, xfs, btrfs, etc.)
- Safety Checks: Blocks system/boot disks from mount workflows
- WSL2 Integration: Uses
wsl --mountfor Linux filesystem mounting - Windows Access Modes:
NetworkLocation(default)DriveLetterLegacy(explicit legacy mode)None(no Windows-side access surface)
- Explorer Integration: Opens mounted paths directly in Explorer (mode-aware)
- Deterministic UI Tests: FlaUI automation with optional screenshot artifact capture
- Operating System: Windows 10 (Build 19041+) or Windows 11 (Build 22000+ recommended)
- WSL: WSL2 installed and configured
- Requires
wsl --mountsupport (Windows 11 Build 22000+ or Microsoft Store WSL)
- Requires
- PowerShell: Windows PowerShell 5.1 or later
- Privileges: Administrator access (for mount/unmount scripts)
- .NET SDK 10.0.101+ (
global.jsonpins 10.0.101 withrollForward: latestPatch) - Visual Studio 2022 or Visual Studio Code (optional)
limount/
├── LiMount.sln
├── LiMount.Core/
│ ├── Interfaces/
│ │ ├── IMountOrchestrator.cs
│ │ ├── IUnmountOrchestrator.cs
│ │ ├── IWindowsAccessService.cs
│ │ └── ...
│ ├── Models/
│ │ ├── ActiveMount.cs
│ │ ├── MountAndMapResult.cs
│ │ ├── UnmountAndUnmapResult.cs
│ │ ├── MountHistoryEntry.cs
│ │ ├── WindowsAccessRequest.cs
│ │ ├── WindowsAccessInfo.cs
│ │ └── ...
│ └── Services/
│ ├── MountOrchestrator.cs
│ ├── UnmountOrchestrator.cs
│ ├── MountStateService.cs
│ ├── Access/WindowsAccessService.cs
│ └── ...
├── LiMount.WinUI/
│ ├── ViewModels/
│ ├── Views/
│ ├── TestMode/
│ └── App.xaml.cs
├── LiMount.Tests/
├── LiMount.UITests/
└── scripts/
├── Mount-LinuxDiskCore.ps1
├── Unmount-LinuxDisk.ps1
├── Map-WSLShareToDrive.ps1
├── Unmap-DriveLetter.ps1
└── network/
├── Create-NetworkLocation.ps1
└── Remove-NetworkLocation.ps1
dotnet restore
dotnet build --configuration Release
dotnet run --project LiMount.WinUIdotnet test LiMount.Tests$env:LIMOUNT_RUN_UI_TESTS='1'
dotnet test LiMount.UITests
Remove-Item Env:\LIMOUNT_RUN_UI_TESTSOptional screenshot capture:
$env:LIMOUNT_RUN_UI_TESTS='1'
$env:LIMOUNT_CAPTURE_SCREENSHOT='1'
dotnet test LiMount.UITests
Remove-Item Env:\LIMOUNT_RUN_UI_TESTS
Remove-Item Env:\LIMOUNT_CAPTURE_SCREENSHOTFull deterministic screenshot batch:
$env:LIMOUNT_RUN_UI_TESTS='1'
$env:LIMOUNT_CAPTURE_SCREENSHOT_BATCH='1'
dotnet test LiMount.UITests --filter "FullyQualifiedName~ScreenshotBatchUiTests"
Remove-Item Env:\LIMOUNT_RUN_UI_TESTS
Remove-Item Env:\LIMOUNT_CAPTURE_SCREENSHOT_BATCHBatch output:
screenshots\ui-batch\<yyyyMMdd-HHmmss>\- Deterministic files
01-main-initial.pngthrough12-main-after-wizard.png
Expected-failure validation (unsupported XFS feature cases):
powershell -ExecutionPolicy Bypass -File .\scripts\run-hil-mount-test.ps1 -DiskIndex 1 -Partition 2 -ExpectXfsUnsupportedDrive-level end-to-end validation (failure partition + success partition):
powershell -ExecutionPolicy Bypass -File .\scripts\run-hil-mount-test.ps1 -DiskIndex 1 -VerifyDriveEndToEnd -FailurePartition 2- Launch LiMount and refresh disks.
- Select a non-system disk and Linux partition.
- Select filesystem type.
- Choose Windows access mode:
NetworkLocation(default, no drive letter required)DriveLetterLegacy(requires drive letter)None(mount-only)
- Click Mount and approve elevation.
- Use Open in Explorer:
NetworkLocation: opens UNC/network location targetDriveLetterLegacy: opens<DriveLetter>:\None: Explorer action is disabled
- Click Unmount to clean up WSL and Windows access artifacts.
Mounts a physical disk partition into WSL2 (wsl --mount) and returns key-value output including:
STATUSDistroNameMountPathLinuxMountPathUNCAlreadyMountedUncVerified- Optional diagnostics (
ErrorCode,ErrorHint,DmesgSummary)
Creates an Explorer Network Location under:
%AppData%\Microsoft\Windows\Network Shortcuts\<Name>\
Output keys:
STATUSNetworkLocationNameNetworkLocationPathTargetUNC
Removes the Network Location folder created under NetHood.
Output keys:
STATUSNetworkLocationName
Used only when DriveLetterLegacy is selected.
- Orchestrator contracts are access-mode-first (
IMountOrchestrator,IUnmountOrchestrator). IWindowsAccessServiceroutes Windows integration by mode:NetworkLocation-> NetHood scriptsDriveLetterLegacy-> drive mapping scriptsNone-> no-op
- State and history are mode-aware:
ActiveMounttracksAccessMode, optionalDriveLetter, optionalNetworkLocationName- History/result models persist access metadata for restore and diagnostics
- Mount state reconciliation is mode-specific:
- Drive-letter pruning applies to
DriveLetterLegacyonly NetworkLocation/Noneentries are not pruned for missing drive letters
- Drive-letter pruning applies to
- Single active mount UX: state can track multiple records, but main UI still presents a single active mount workflow.
- Windows 11 preferred:
wsl --mountreliability/features are best on modern builds. - Kernel compatibility limits: some XFS/ext feature sets may still be unsupported by the installed WSL kernel.
- No VM fallback yet: unsupported filesystem fallback to a Linux VM remains planned work.
- Use Windows 11 Build 22000+ or Microsoft Store WSL.
- Run
wsl --update.
Check WSL kernel logs:
wsl -e sh -lc "dmesg | tail -n 200"If you see unknown incompatible filesystem features, this is a kernel/filesystem compatibility issue.
- Refresh Explorer (
F5). - Confirm NetHood path exists:
%AppData%\Microsoft\Windows\Network Shortcuts
- Verify UNC is reachable:
Test-Path \\wsl.localhost\<Distro>\mnt\wsl\PHYSICALDRIVEXpY
- Legacy mode only: verify
substmappings:subst
- Choose another free drive letter if conflict exists.
Expected behavior: None intentionally performs no Windows integration surface creation.
Built for the WSL community.