从Windows 10共享文件夹给Docker虚拟机中的Docker的神奇bug
一,回顾
这篇文章是基于之前发布的脚本
http://blog.csdn.net/hu_zhenghui/article/details/79087151
不过在更多的设备上测试的时候,发现时灵时不灵,为了排查问题,花了很多时间,走了很多弯路,把这些经验做个总结,希望当您遇到类似的问题的时候可以节约时间。
二,测试环境
设备 | CPU | OS | 其他 |
---|---|---|---|
Surface Pro 3 | X86_64 | Windows 10 | 在Hyper-V上安装有Docker虚拟机 |
Surface Pro 1 | X86_64 | Windows 10 | 在Hyper-V上安装有Docker虚拟机 |
Macbook Air | X86_64 | Mac OS X | |
NAS | ARM | Embeded Linux | 提供CIFS服务 |
三,成功的用例
之前发布的脚本是在Surface Pro 1上共享文件夹给Surface Pro 1上Docker虚拟机,测试成功,也就没有想到会有什么问题
四,发现问题
使用同样的脚本在Surface Pro 3上共享文件夹给Surface Pro 1上Docker虚拟机,失败。
Docker虚拟机的版本相同
Surface Pro 3和Surface Pro 1都是Windows 10自动更新的
五,更多的测试
访问来源 | 访问目标 | 结果 |
---|---|---|
Surface Pro 3 | 访问Surface Pro 1上的共享文件夹 | 成功 |
Surface Pro 3 | 访问NAS上的CIFS文件夹 | 成功 |
Surface Pro 1 | 访问Surface Pro 3上的共享文件夹 | 成功 |
Surface Pro 1 | 访问NAS上的CIFS文件夹 | 成功 |
Macbook Air | 访问Surface Pro 3上的共享文件夹 | 成功 |
Macbook Air | 访问Surface Pro 1上的共享文件夹 | 成功 |
Macbook Air | 访问NAS上的CIFS共享文件夹 | 成功 |
Surface Pro 3中的Docker虚拟机 | mount NAS上的CIFS共享文件夹 | 成功 |
Surface Pro 1中的Docker虚拟机 | mount NAS上的CIFS共享文件夹 | 成功 |
Surface Pro 3中的Docker虚拟机 | mount Surface Pro 1上的共享文件夹 | 成功 |
Surface Pro 1中的Docker虚拟机 | mount Surface Pro 1上的共享文件夹 | 成功 |
Surface Pro 3中的Docker虚拟机 | mount Surface Pro 3上的共享文件夹 | 失败 |
Surface Pro 1中的Docker虚拟机 | mount Surface Pro 3上的共享文件夹 | 失败 |
六,分析
很显然,只有两种情况失败,都和Surface Pro 3有关,上网搜索。
强调一下,上网搜索可能是捷径,也可能被误导。
看到的信息比较多的谈论SMB协议的版本问题,也就是说Linux只能访问较低版本,而Windows出于已知的安全隐患禁止了SMB协议的较低版本。
在这个方向上的调查浪费了很多时间……
七,柳暗花明
在网上和咨询专家获得的各种思路都尝试了一下,没有收获,最后在整理文档的时候,偶然发现了一个可行的情况。
Surface Pro 3上有两个盘,一个是系统盘C,一个是数据盘D,一直在数据盘D上做实验,整理文档的时候,把代码移动到了系统盘C上的OneDrive文件夹,顺手实验了一下,就成功了!!!
为了验证,构建测试用例如下
创建用户userc
创建用户userd
在系统盘C的根目录中创建文件夹 C:/sharec,设置用户userc具有完全控制权限,共享为文件夹sharec,设置共享权限为userc具有完全控制权限。
在数据盘D的根目录中创建文件夹 D:/shared,设置用户userd具有完全控制权限,共享为文件夹shared,设置共享权限为userd具有完全控制权限。
进入Docker虚拟机的命令行界面。
创建加载文件夹/mntc
mkdir /mntc
创建加载文件夹/mntd
mkdir /mntd
加载前面共享的sharec
mount -t cifs //192.168.1.58/sharec /mntc -o username=userc,password=userc
成功
创建文件
touch /mntc/test.txt
成功
加载前面共享的shared
mount -t cifs //192.168.1.58/shared /mntd -o username=userd,password=userd
报错
mount: mounting //192.168.1.58/shared on /mntd failed: Input/output error
后续又尝试把shared的权限改成和sharec相同,也不成,也许是Windows 10的某个安全策略有关,也许是我的移动硬盘有关,以后有了对比的条件后再记录。