Connect Hyper-V VM from WSL,在Win Docker中挂载hv中的虚拟机smb
在最新的docker版本。。。4.45中此方法因为会重置wsl镜像的修改导致相关挂载彻底失效
4.43.2还可以。。。目前已经向社区反馈。。。经测试4.44.3还可以,所以只是4.45出现了这个问题。。。
当然4.45 还可以在 Docker\resources\wsl\wsl-bootstrap.tar
(得复制出来,原位置没有权限修改,修改完再复制回去,7-zip可以)中直接修改 etc\fstab
但是依旧很难自动加载成功。。。对了fstab 加载的目录得再tar中创建。。。不然出错。。。就是说第一次总是失败。。。所以说4.45的问题还是很严重。。。
4.46依旧没有修复,4.47也是。。。并且。。。升级会出错。。。
4.48不仅不没有恢复还把 wsl-bootstrap.tar
去除了。。。USB-FDD 格式的ext4.vhdx难以编辑。。。
No More /etc/fstab setup? - Docker Desktop - Docker Community Forums
etc setup not allowed in 4.45??? · Issue #14929 · docker/for-win
https://stackoverflow.com/questions/61868920/connect-hyper-v-vm-from-wsl-ubuntu
Get-NetIPInterface | where {$_.InterfaceAlias -eq 'vEthernet (WSL (Hyper-v firewall))' -or $_.InterfaceAlias -eq 'vEthernet (Default Switch)'} | Set-NetIPInterface -Forwarding Enabled
Get-NetIPInterface | where {$_.InterfaceAlias -eq 'vEthernet (WSL (Hyper-v firewall))' -or $_.InterfaceAlias -eq 'vEthernet (Default Switch)'} | Set-NetIPInterface -Forwarding Enabled
Get-NetIPInterface | where {$_.InterfaceAlias -eq 'vEthernet (WSL (Hyper-v firewall))' -or $_.InterfaceAlias -eq 'vEthernet (Default Switch)'} | Set-NetIPInterface -Forwarding Enabled
Get-NetIPInterface | where {$_.InterfaceAlias -eq 'vEthernet (WSL (Hyper-v firewall))' -or $_.InterfaceAlias -eq 'vEthernet (Default Switch)'} | Set-NetIPInterface -Forwarding Enabled
https://learn.microsoft.com/en-us/windows/wsl/networking
嗯。。。大概就是。。。wsl2是的hostname是跟windows主机是同一个名字。。。所以ping WSL的虚拟交换机无法实现。。。
那问题就是怎么把hyper V的虚拟机加入到WSL的虚拟交换机中。。。
防火墙设置
https://learn.microsoft.com/en-us/windows/security/operating-system-security/network-security/windows-firewall/hyper-v-firewall
基本上就这一个设置,如果没法加入hyper v的默认交换机 执行
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
就可以打开hv数据接入了
ping 不通。。。
https://blog.csdn.net/gelinyin/article/details/140364562
因为默认的公开网络是关闭这些的。。。
最后发现问题出在一个设备的默认网关设置成了上层设备的网关
而不是虚拟设备所在层的网关。。。
也就是说我们设置的是两个虚拟设备的默认网关应该都是两个虚拟交换机的主机所在位置,而不是上层物理路由的网关。。。
wsl -d docker-desktop
wsl -d docker-desktop
wsl -d docker-desktop
wsl -d docker-desktop
mount -t cifs -o username=用户名,password=密码 //虚拟机IP/共享文件夹 /mnt/host//挂载点
mount -t cifs -o username=用户名,password=密码 //虚拟机IP/共享文件夹 /mnt/host//挂载点
mount -t cifs -o username=用户名,password=密码 //虚拟机IP/共享文件夹 /mnt/host//挂载点
mount -t cifs -o username=用户名,password=密码 //虚拟机IP/共享文件夹 /mnt/host//挂载点
确定没问题就fstab
//虚拟机IP/共享文件夹 /mnt/host//挂载点 cifs username="用户名",password="密码",iocharset=utf8,nofail 0 0
//虚拟机IP/共享文件夹 /mnt/host//挂载点 cifs username="用户名",password="密码",iocharset=utf8,nofail 0 0
//虚拟机IP/共享文件夹 /mnt/host//挂载点 cifs username="用户名",password="密码",iocharset=utf8,nofail 0 0
//虚拟机IP/共享文件夹 /mnt/host//挂载点 cifs username="用户名",password="密码",iocharset=utf8,nofail 0 0
其实主要是因为windows 中管理员是读不到其他用户挂在的网络驱动器。。。
有两个办法,
- 不推荐!!!
在管理员权限中打开的应用中打开任何可以找文件的窗口,也就是windows自带的打开
然后再我的电脑
上右击就可以添加了。。。但是,,,已经添加的无法再添加,其次。。。管理员添加的。。。没法再在普通用户中看到。。。。 - 修改注册表
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
添加一个DWORD
名称:EnableLinkedConnections
值:1
debian中是
mount -t drvfs Z: /mnt/z
docker的wsl中是
mount -t drvfs Z: /mnt/host/z
就可以挂在了,大概是因为我总是再管理员模式的终端中运行wsl吧。。。
fstab中 vi /etc/fstab
Z: /mnt/host/z drvfs nofail 0 0
Z: /mnt/host/z drvfs nofail 0 0
Z: /mnt/host/z drvfs nofail 0 0
Z: /mnt/host/z drvfs nofail 0 0
esc
-- :wq
-- exit
保存退出对应的 wsl
结束 docker
的 wsl
wsl -t -d docker-desktop
wsl -t -d docker-desktop
wsl -t -d docker-desktop
wsl -t -d docker-desktop
然后
wsl -d docker-desktop
wsl -d docker-desktop
wsl -d docker-desktop
wsl -d docker-desktop
ls /mnt/host/z
ls /mnt/host/z
ls /mnt/host/z
ls /mnt/host/z
看看是否正常挂载了
使用过程中发现重启后有挂在顺序还有不在终端中运行 wsl
写一段 bat
然后设置个计划任务
@echo off
title Docker Delay Start
echo delay 2min for docker
timeout /t 120 /nobreak
wsl -d docker-desktop ls /mnt/host/z
start "" "D:\UX\Docker\Docker Desktop.exe"
@echo off
title Docker Delay Start
echo delay 2min for docker
timeout /t 120 /nobreak
wsl -d docker-desktop ls /mnt/host/z
start "" "D:\UX\Docker\Docker Desktop.exe"
@echo off
title Docker Delay Start
echo delay 2min for docker
timeout /t 120 /nobreak
wsl -d docker-desktop ls /mnt/host/z
start "" "D:\UX\Docker\Docker Desktop.exe"
@echo off
title Docker Delay Start
echo delay 2min for docker
timeout /t 120 /nobreak
wsl -d docker-desktop ls /mnt/host/z
start "" "D:\UX\Docker\Docker Desktop.exe"
120
是延迟秒数
/mnt/host/z
是检查挂载路径
"D:\UX\Docker\Docker Desktop.exe"
是 Windwos
中docker的路径
这个延迟秒数不固定的,因为如果正常关机truenas只是挂起而不是关机,恢复很快
但是如果是完全关机(不小心断电)那么truenas的启动时间在2min以上。
所以还是用判断目录是否存在比较合理
@echo off
chcp 65001 > nul
title Docker Delay Start
:A
IF EXIST Z:\ (
echo "SMB已挂起,检测Z盘内容"
wsl -d docker-desktop ls /mnt/host/z
echo "运行docker"
start "" "D:\UX\Docker\Docker Desktop.exe"
timeout /t 10
) else (
echo "SMB 没挂起,继续等待"
timeout /t 10 /nobreak
cls
goto A
)
@echo off
chcp 65001 > nul
title Docker Delay Start
:A
IF EXIST Z:\ (
echo "SMB已挂起,检测Z盘内容"
wsl -d docker-desktop ls /mnt/host/z
echo "运行docker"
start "" "D:\UX\Docker\Docker Desktop.exe"
timeout /t 10
) else (
echo "SMB 没挂起,继续等待"
timeout /t 10 /nobreak
cls
goto A
)
@echo off
chcp 65001 > nul
title Docker Delay Start
:A
IF EXIST Z:\ (
echo "SMB已挂起,检测Z盘内容"
wsl -d docker-desktop ls /mnt/host/z
echo "运行docker"
start "" "D:\UX\Docker\Docker Desktop.exe"
timeout /t 10
) else (
echo "SMB 没挂起,继续等待"
timeout /t 10 /nobreak
cls
goto A
)
@echo off
chcp 65001 > nul
title Docker Delay Start
:A
IF EXIST Z:\ (
echo "SMB已挂起,检测Z盘内容"
wsl -d docker-desktop ls /mnt/host/z
echo "运行docker"
start "" "D:\UX\Docker\Docker Desktop.exe"
timeout /t 10
) else (
echo "SMB 没挂起,继续等待"
timeout /t 10 /nobreak
cls
goto A
)
如果存在才去运行docker并且等10秒然后关闭,不存在就继续等10秒循环,
2025年7月11日更新一个版本加入自动加入挂载,因为每次更新都要手动加很麻烦。。。基本上一两周就有更新,
@echo off
chcp 65001 > nul
title Docker Delay Start
:A
IF EXIST Z:\ (
echo SMB已挂起,检测docker挂载
for /f "delims=" %%i in ('type "\\wsl.localhost\docker-desktop\etc\fstab" ^| findstr "Z:"') do set Z_fstab_test=%%i
IF DEFINED Z_fstab_test (
echo docker镜像中存在Z盘挂起
) ELSE (
echo docker镜像中不存在Z盘挂起,写入Z盘挂起
echo Z: /mnt/host/z drvfs nofail 0 0 >> \\wsl.localhost\docker-desktop\etc\fstab
MKDIR \\wsl.localhost\docker-desktop\mnt\host\z
)
timeout /t 3 > nul
wsl -d docker-desktop ls /mnt/host/z
echo 运行docker
start "" "D:\UX\Docker\Docker Desktop.exe"
timeout /t 10
) else (
echo "SMB 没挂起,继续等待"
timeout /t 10 /nobreak
cls
goto A
)
@echo off
chcp 65001 > nul
title Docker Delay Start
:A
IF EXIST Z:\ (
echo SMB已挂起,检测docker挂载
for /f "delims=" %%i in ('type "\\wsl.localhost\docker-desktop\etc\fstab" ^| findstr "Z:"') do set Z_fstab_test=%%i
IF DEFINED Z_fstab_test (
echo docker镜像中存在Z盘挂起
) ELSE (
echo docker镜像中不存在Z盘挂起,写入Z盘挂起
echo Z: /mnt/host/z drvfs nofail 0 0 >> \\wsl.localhost\docker-desktop\etc\fstab
MKDIR \\wsl.localhost\docker-desktop\mnt\host\z
)
timeout /t 3 > nul
wsl -d docker-desktop ls /mnt/host/z
echo 运行docker
start "" "D:\UX\Docker\Docker Desktop.exe"
timeout /t 10
) else (
echo "SMB 没挂起,继续等待"
timeout /t 10 /nobreak
cls
goto A
)
@echo off
chcp 65001 > nul
title Docker Delay Start
:A
IF EXIST Z:\ (
echo SMB已挂起,检测docker挂载
for /f "delims=" %%i in ('type "\\wsl.localhost\docker-desktop\etc\fstab" ^| findstr "Z:"') do set Z_fstab_test=%%i
IF DEFINED Z_fstab_test (
echo docker镜像中存在Z盘挂起
) ELSE (
echo docker镜像中不存在Z盘挂起,写入Z盘挂起
echo Z: /mnt/host/z drvfs nofail 0 0 >> \\wsl.localhost\docker-desktop\etc\fstab
MKDIR \\wsl.localhost\docker-desktop\mnt\host\z
)
timeout /t 3 > nul
wsl -d docker-desktop ls /mnt/host/z
echo 运行docker
start "" "D:\UX\Docker\Docker Desktop.exe"
timeout /t 10
) else (
echo "SMB 没挂起,继续等待"
timeout /t 10 /nobreak
cls
goto A
)
@echo off
chcp 65001 > nul
title Docker Delay Start
:A
IF EXIST Z:\ (
echo SMB已挂起,检测docker挂载
for /f "delims=" %%i in ('type "\\wsl.localhost\docker-desktop\etc\fstab" ^| findstr "Z:"') do set Z_fstab_test=%%i
IF DEFINED Z_fstab_test (
echo docker镜像中存在Z盘挂起
) ELSE (
echo docker镜像中不存在Z盘挂起,写入Z盘挂起
echo Z: /mnt/host/z drvfs nofail 0 0 >> \\wsl.localhost\docker-desktop\etc\fstab
MKDIR \\wsl.localhost\docker-desktop\mnt\host\z
)
timeout /t 3 > nul
wsl -d docker-desktop ls /mnt/host/z
echo 运行docker
start "" "D:\UX\Docker\Docker Desktop.exe"
timeout /t 10
) else (
echo "SMB 没挂起,继续等待"
timeout /t 10 /nobreak
cls
goto A
)
计划任务在我的电脑右键管理--任务计划程序
新建一个
只在用户登陆时运行
触发器:登陆时
操作中添加运行程序上面那个 bat
文件
然后在开启该用户的自动登录
https://iheld.net/post-246.html