我的笔记本电脑上运行着 Windows 10,该笔记本电脑运行着 VirtualBox,而 VirtualBox 又运行着 Linux 客户机。
我为 Linux 环境做了很多编程工作,并且使用位于 Windows 主机和 Linux 客户机之间共享的 FS / 目录树中的源代码存储库,例如使用在 Windows 下运行的 SublimeText 进行编辑,但在连接到 Linux 客户机的终端中进行编译、测试、版本控制等。
由于各种原因,我需要托管源代码存储库的目录允许完整的 unix 语义,即能够为所有者设置 uid/gid、权限位、创建 fifo、符号链接等。
我不在乎这些功能是否在 Windows 和 Linux 之间有意义地共享。我只需要在 Linux 端明确定义这些内容。在 Windows 端,我只需要能够读取/写入文件内容。
我希望文件托管在 Windows/主机端,而不是 Linux 客户机上,因为我不想必须启动 Linux 客户机才能使文件在 Windows 上可见/可访问。
我怎样才能设置这样的功能?
我尝试过各种各样的方法。
看来,vboxsf 只提供了一小部分 unix 功能。如果我错了,请纠正我。
我尝试在 vboxsf 安装上使用 posixovl,但似乎无法让它支持“mkdir mydir; rm -rf mydir”之类的简单操作。这样的操作会失败,并显示“rm:无法删除‘mydir’:目录不为空”。我对这个问题的诊断是,它会创建一个文件“somedir/.pxovl”,以将 somedir 的权限位和类似内容保留在下层 FS 上。在上层 FS 上看不到该文件,因此“rm -rf”无法删除该文件。当“rm -rf”尝试在上层 FS 上“rmdir mydir”时,这将触发在下层 FS 上执行此操作的尝试,但会失败,因为文件“.pxovl”仍在那里。如果有解决方案,请纠正我,但这让我抓狂了。
我尝试在 Windows 端将目录设置为网络共享,然后在 Linux 上通过 mount.cifs 进行挂载。看来这样的挂载方式也无法正确提供 unix 功能,并且在这方面具有与 vboxsf 类似的限制,而且我找不到允许任何类型的模拟或类似操作的任何选项。
我突然想到,也许可以在 Windows 主机端设置一些程序,提供真正的 unix 语义并执行某种 unix 功能的模拟,例如 NFS 服务器或其他类型的网络共享文件系统服务器,但我似乎找不到任何程序。
我还想到覆盖文件系统可能是实现这种解决方案的有用工具,但无法真正概念化这种解决方案可能是什么样子。
有任何想法吗?
答案1
事实证明,通过以下方法我能够接近我想要的结果:
- WSL 使用新的 drvfs 功能,其中 unix 语义的某些方面在 WSL 下模拟(
metadata
drvfs 挂载的选项); - sshd 在 Windows 主机上的 WSL 上运行;
- sshfs 在 Linux 下的 VirtualBox 客户机上运行。
解决方案是:
- 安装适用于 Windows 的 Ubuntu(WSL)。
%sudo ALL=(ALL:ALL) NOPASSWD: ALL
使用 WSL 上的行在WSL 下启用无密码 sudo/etc/sudoers
。"bash -c 'sudo /etc/init.d/ssh start'"
使用注册表将命令置于 Windows 下的自动启动,以便基于 WSL 的 OpenSSH 服务器在我登录时立即自动启动。- 配置 Windows Defender 防火墙以允许连接到端口 22。
- 设置 SSH 密钥,以便允许从 Linux 客户机无密码登录基于 WSL 的 SSH 服务器。
- 用于在 WSL 上挂载 drvfs 时
wsl.conf
注入选项。metadata,umask=0002,fmask=0113
- 在 Linux 客户机上,
user_allow_other
输入/etc/fuse.conf
- 在 Linux 客户机上,共享
sudo -u myuser sshfs -o allow_other myuser@windowshost:/mnt/c /mnt/c
C 盘。 - 确保 WSL 和 Linux 之间的 UID
myuser
相同。
结果:这样,文件名和文件内容可以在客户虚拟机上的 Windows、WSL 和 Linux 之间共享,可以模拟权限位和链接等其他 unix 功能,并且可以在 WSL 和 Linux 之间共享这些模拟功能。但是:
- 限制:当我创建一个文件时,即使通过 Linux 客户机以外的用户
myuser
,它最终也会归所有myuser
。 - 限制:不支持 fifos。
- 我可以忍受这些限制,因为我不需要 fifo,并且真正只关心我在笔记本电脑上用于软件开发的一个用户下处理的文件会发生什么。
答案2
不幸的是,Windows 不认为文件具有与 Linux/Unix 系统相同的元数据 - 这导致了您当前遇到的麻烦。
我的解决方案(对您来说不幸的是)是将文件保存在 Linux VM 上,并使用 CIFS / Samba 与 Windows 主机共享它们 - 我经常这样做。
我不知道在 Windows(非 Unix)文件系统上托管文件时,有什么方法可以实现您所追求的透明度和可靠性。
也许值得深入研究适用于 Linux 的 Windows 子系统。他们最近取得了长足进步(例如:Chmod/Chown WSL 改进), 那么你可能能够在 WSL 下安装 NFS 服务器或其他东西来实现您的目标,但考虑到 NFS 在 Linux 上的实现位置(在内核中),这可能是不可能的。