我在打开 Visual Studio 代码时遇到了麻烦。
场景是我使用 SSHFS 在本地电脑(UBUNTU WSL)上安装了服务器文件系统。
在正常情况下,我可以使用命令使用 Visual Studio Code 打开文件code <filename>
。
但是,当我在服务器文件系统目录中并尝试使用此命令时,出现错误
/mnt/c/Users/kurti/AppData/Local/Programs/Microsoft VS Code/Code.exe: Invalid argument
令人惊讶的是,我可以以相同的方式使用 gedit 而没有任何问题,例如gedit <filename>
。
然后奇怪的是,当我在本地文件系统中的任何文件夹中时,我可以使用代码打开服务器文件系统中的文件/目录。这样,我可以轻松使用 打开服务器文件code </full/path/to/file>
。
这是 Visual Studio 代码中的可能错误还是我的系统存在问题?
编辑:我创建了一个新的函数/命令,其
命令名称为:vcode
#!/bin/bash
fpath=$(realpath $1)
(cd $HOME; code fpath)
更新:我在 WSL github 页面上将其报告为一个问题https://github.com/microsoft/WSL/issues/7890
具体细节如下
回购步骤
在 WSL 终端中,
- 使用 sshfs 挂载服务器文件系统(在我的例子中,它是一台大学超级计算机)
sshfs -C <server_name_and_ip> <mount_location>
指定的 mount_location 是一个名为 smith_server 的空目录,其路径为/home/k/smith_server/
- 转至目录
cd /home/k/smith_server
- 在 Visual Studio Code 中打开目录
code .
预期行为
预期的行为是,无论当前工作目录如何,Visual Studio 都会打开目录/文件。
实际行为
实际行为是,当当前工作目录位于已挂载的服务器文件系统内时,启动命令code .
或code <filename>
将导致错误代码。
/mnt/c/Users/kurti/AppData/Local/Programs/Microsoft VS Code/Code.exe: Invalid argument
一些有效的例子,
- 当工作目录不是已挂载服务器文件系统的一部分时,
code .
或者code <file>
工作正常。 - 当工作目录不是已挂载的服务器文件系统的一部分时,使用代码获取服务器文件系统中文件/目录的完整路径(例如)
code /home/k/smith_server
可以成功打开该文件/目录而不会出现问题。 - 当工作目录位于已安装的服务器文件系统内时,
gedit <file>
工作正常 - 当工作目录位于已挂载的服务器文件系统内时,
code $HOME
也会出现错误。
我的结论是,在已安装的服务器文件系统内调用 code 命令时会出现问题。此外,使用 gedit 时不会发生这种情况。但是,在已安装的服务器文件系统之外时,code
可以调用该命令,也可以使用完整路径访问已安装的文件系统。也许是因为在跟踪 Code.exe 文件时发生了一些事情。基于 Linux 的软件(如 gedit)不受影响,但也许刚刚被接口的基于 Windows 的软件(如 Code.exe)会受到影响?
答案1
我能够很轻松地重现这一点。
解决方案:
卸下现有的保险丝座:
fusermount -u /home/k/smith_server
以 root身份编辑
/etc/fuse.conf
:sudo -e /etc/fuse.conf
取消注释该
user_allow_other
选项使用以下
allow_root
选项重新挂载:sshfs -o allow_root [user@]<remote_server>:/path /home/k/smith_server
更多细节:
请注意,这不仅仅是 的问题sshfs
。在 VSCode 内部启动时,你也会遇到这个问题任何 fuse
- 基于挂载点。
说实话,我不是相当确信这里的根本原因,但是......
您会注意到,如果没有上述解决方案,如果您尝试浏览\\wsl$\Ubuntu\home\k\smith_server\
,您将无法进入该目录。您可以访问您的主目录,但无法访问smith_server
。
这告诉我,即使 Windows/WSL 强制执行你的用户浏览时(默认情况下,除非您在中覆盖此功能),它似乎仍在后台/etc/wsl.conf
执行此操作。root
因此,一旦我们弄清楚了这一点,VSCode 无法处理从不存在的目录启动就不足为奇了。
这作品当您从启动它时$HOME
,因为 VSCode 会初始化,然后切换到“Remote - WSL”扩展,该扩展与安装在 WSL 实例中的 VSCode 服务器通信(在 中~/.vscode-server
)。一旦发生这种情况,它就会访问 fuse 挂载的文件系统,如下所示你的用户,一切都很愉快。
每man fuse
:
没有其他用户(包括 root)可以访问已挂载文件系统的内容。
但是,可以使用 或 来覆盖此功能-o allow_other
。-o allow_root
要启用其中任何一个,/etc/fuse.conf
需要适当设置上述选项。
然后,VSCode 在启动时就可以正确访问该目录。
您还将看到,现在可以通过 Windows 浏览\\wsl$\Ubuntu\home\k\smith_server\
。