[BUG] Cowork VM download fails with EXDEV: cross-device link not permitted on Windows 11 Pro (MSIX install)
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
[BUG] Cowork VM download fails with EXDEV: cross-device link not permitted on Windows 11 Pro (MSIX install)
Environment
- OS: Windows 11 Pro, version 10.0.26200, x64
- Claude Desktop version: 1.1.7714.0 (latest as of 2026-03-20)
- Install method: MSIX via official Claude Setup.exe (claude.ai/download)
- Package family: Claude_pzs8sxrjxfjjc
- Hyper-V: Enabled, vmms service Running
- CoworkVMService: Installed, Stopped (fails to start)
Preflight Checklist
- [x] I have searched existing issues and this is not a duplicate (related: #27010, #25663, #29428)
- [x] This is a single bug report
- [x] I am using the latest version of Claude Desktop
What's Wrong?
Every time Cowork attempts to download rootfs.vhdx, the download succeeds and the checksum validates, but the final rename operation fails with:
EXDEV: cross-device link not permitted, rename
'C:\Users\<user>\AppData\Local\Temp\wvm-<random>\rootfs.vhdx'
-> 'C:\Users\<user>\AppData\Roaming\Claude\vm_bundles\claudevm.bundle\rootfs.vhdx'
The UI shows: "Failed to start Claude's workspace — VM service not running. The service failed to start."
Root Cause Analysis
The MSIX packaging system on Windows virtualizes AppData\Roaming into a separate VFS namespace from AppData\Local. When the Node.js download manager:
- Downloads
rootfs.vhdx.zsttoAppData\Local\Temp\wvm-<random>\ - Decompresses it to
rootfs.vhdxin the same temp folder - Attempts
fs.rename()to move it toAppData\Roaming\Claude\vm_bundles\claudevm.bundle\
...the rename crosses the MSIX VFS device boundary, which Node.js (and the underlying Win32 MoveFile) does not allow across different virtual "devices". The error code EXDEV is the POSIX equivalent of ERROR_NOT_SAME_DEVICE.
The fix requires the app to use fs.copyFile() + fs.unlink() instead of fs.rename() when the destination is across a device boundary, OR to change the temp download directory to be on the same VFS namespace as the destination.
Reproduction Steps
- Install Claude Desktop via official
Claude Setup.exeon Windows 11 Pro - Ensure Hyper-V is enabled (
State: EnabledviaGet-WindowsOptionalFeature) - Open Claude Desktop and navigate to the Cowork tab
- Observe the workspace fails to initialize
Log Evidence
From %LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\logs\cowork_vm_node.log:
[info] rootfs.vhdx not found, downloading...
[info] Downloading rootfs.vhdx...
[info] rootfs.vhdx.zst checksum validated
[error] [download] VM download failed: EXDEV: cross-device link not permitted,
rename 'C:\Users\Serranpa\AppData\Local\Temp\wvm-LpxWbG\rootfs.vhdx'
-> 'C:\Users\Serranpa\AppData\Roaming\Claude\vm_bundles\claudevm.bundle\rootfs.vhdx'
This error repeats consistently on every attempt.
Workarounds Attempted (all failed)
| Approach | Result |
|---|---|
| Changing TEMP/TMP user env variables to AppData\Roaming\Temp | Node still used Local\Temp |
| Setting Environment registry key on CoworkVMService to custom TEMP path | Ignored by the service |
| Junction (mklink /J) from Roaming\Claude\vm_bundles → Local\Claude\vm_bundles | Node resolves real path before rename, EXDEV persists |
| Junction from Roaming\Claude\vm_bundles → Local\Temp | Same — real path resolved, EXDEV persists |
| Symbolic link (mklink /D) from Roaming\Claude\vm_bundles → Local\Temp | EXDEV persists — Node resolves symlink target |
| Full uninstall + clean reinstall (removed AppData, registry, service) | EXDEV persists after clean install |
All filesystem redirection approaches fail because Node.js fs.rename resolves the final real paths before calling the OS rename, bypassing any junctions or symlinks.
Expected Behavior
The rootfs.vhdx file should be successfully placed in the bundle directory, and the Cowork workspace should start.
Suggested Fix
In the download manager, replace:
fs.rename(tempPath, destPath)
with a cross-device safe alternative:
await fs.copyFile(tempPath, destPath);
await fs.unlink(tempPath);
Or alternatively, resolve the temp download directory at runtime to ensure it shares the same VFS mount as the destination path.
Related Issues
- #27010 — Windows 10 Pro MSIX, identical EXDEV root cause
- #25663 — EXDEV after workspace corruption on Windows 11 Home
- #29428 — Windows 11 Home, VM service not running
- #24918 — Windows 11, API unreachable from workspace
What Should Happen?
The rootfs.vhdx file should be successfully downloaded and placed in the bundle directory, and the Cowork workspace VM should start normally.
Error Messages/Logs
[info] rootfs.vhdx not found, downloading...
[info] Downloading rootfs.vhdx...
[info] rootfs.vhdx.zst checksum validated
[error] [download] VM download failed: EXDEV: cross-device link not permitted, rename 'C:\Users\Serranpa\AppData\Local\Temp\wvm-LpxWbG\rootfs.vhdx' -> 'C:\Users\Serranpa\AppData\Roaming\Claude\vm_bundles\claudevm.bundle\rootfs.vhdx'
Steps to Reproduce
- Install Claude Desktop on Windows 11 Pro via official Claude Setup.exe (MSIX install)
- Enable Hyper-V via: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
- Reboot
- Open Claude Desktop as Administrator
- Navigate to the Cowork tab
- Observe workspace fails with "VM service not running"
- Check log at: %LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\logs\cowork_vm_node.log
- Error repeats on every attempt: EXDEV: cross-device link not permitted
Claude Model
None
Is this a regression?
No, this never worked
Last Working Version
n/a
Claude Code Version
N/A (issue is in Claude Desktop / Cowork, not Claude Code CLI)
Platform
Anthropic API
Operating System
Windows
Terminal/Shell
PowerShell
Additional Information
Root cause: MSIX VFS virtualizes AppData\Roaming into a separate device namespace
from AppData\Local. Node.js fs.rename() across this boundary fails with EXDEV.
Workarounds attempted and failed:
- TEMP/TMP env variable changes (user and service registry)
- Junction links (mklink /J) in multiple configurations
- Symbolic links (mklink /D)
- Full uninstall + clean reinstall
Fix: replace fs.rename() with fs.copyFile() + fs.unlink() in the download manager,
or ensure temp download dir shares the same VFS namespace as the destination.
Related issues: #27010, #25663, #29428, #24918
This issue has 5 comments on GitHub. Read the full discussion on GitHub ↗