我该如何从Windows访问WSL Linux文件系统?

25

我发现从运行在 /home/pupeno/projectx 中的Rails应用程序提供的静态文件比从 /mnt/c/Users/pupeno/projectx 提供的静态文件快了大约一半的时间,这几乎是可以接受的。我尝试了webrick和puma(以及目前还不起作用的passenger和unicorn)。

那么,如果我要将源代码托管在 /home/pupeno 中,如何从Windows应用程序例如RubyMine访问呢?

记录一下,这是从Windows文件系统中提供的应用程序:

enter image description here

而这是Linux文件系统:

enter image description here


1
顺便提一下,除非你知道自己在做什么,否则不要编辑%localappdata%\lxss中的任何文件。Windows工具几乎总是会破坏这些文件。 - Harry Gindi
7个回答

18

Windows命令行的PM在此处:

迄今为止,从Windows访问Linux文件尚不支持。要了解原因,请阅读此文章:https://blogs.msdn.microsoft.com/commandline/2016/11/17/do-not-change-linux-files-using-windows-apps-and-tools/

但是,自 Windows 10版本1903(2019年3月)以来,我们(终于!)将您的发行版文件系统暴露给了Windows!

要了解更多信息,请阅读此文章:https://blogs.msdn.microsoft.com/commandline/2019/02/15/whats-new-for-wsl-in-windows-10-version-1903/

输入图像描述

期待听到您对此功能的使用情况。如果您发现任何问题,请在WSL GitHub repo上提交问题,网址为:https://github.com/microsoft/wsl


哈哈!谢谢Adrian。希望您喜欢WSL的文件系统集成。我们继续改进其性能,并将在未来几个月内看到改进的结果。 - Rich Turner

11

使用Windows 10 版本1903及以上,WSL文件系统可以通过 \\wsl$ 挂载在Windows上。您可以手动浏览到该位置,或从WSL路径启动 explorer.exe

$ cd /home/me
$ explorer.exe .

如果您已经安装了WSL并升级到Windows 1903,则可能会发现\\wsl$ 挂载不起作用。一些用户发现,禁用再启用WSL可以解决此问题
在PowerShell中:
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
# Reboot when prompted
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
# Reboot when prompted

禁用和重新启用WSL似乎没有损坏我的现有Ubuntu安装,但最好备份任何您想要保存的内容,以防万一。


11

WSL可以挂载Windows分区到/mnt目录下。例如,你可以通过引用/mnt/c/work的方式修改挂载的Windows文件系统中目录下的文件。

Windows应用程序(如cmd、文件管理器等)可以通过在文件路径前加上%LocalAppData%\lxss来以只读模式访问WSL中的文件。将文件从Windows文件系统复制到WSL目录会导致文件无法读取,出现一个晦涩的general I/O error错误。在%LocalAppData%\lxss创建的文件对于WSL不可见。在WSL中创建的文件可以在Windows中进行修改,修改后的文件随后可以由WSL访问。


3
从WSL创建的文件可以在Windows中修改,修改后的文件随后可以被WSL访问。<< 我会对此非常小心。根据您使用的程序,它可能会导致混乱 - 例如,如果您的编辑器不是直接写入文件而是创建了一份副本并重命名它,那么就有可能发生这种情况。通常,建议遵循此处以大红字书写的规则:https://blogs.msdn.microsoft.com/commandline/2016/11/17/do-not-change-linux-files-using-windows-apps-and-tools/ - 要从Windows访问WSL根目录,可以使用本地SSH和Win-SSHFS。 - CherryDT
自Windows 10版本1903以后,此内容已不再相关。请参见下面chris的答案:https://dev59.com/9lgR5IYBdhLWcg3wRbk1#59226195。 - Sethos II

10
在 Windows 10 创作者更新版中,我使用 SFTP NetDrive 将 WSL 文件系统挂载到 windows 中作为网络驱动器。
还有一些 Window sshFS 端口可以实现相同的功能。
您需要通过 sudo service ssh start 启动 ssh 守护进程。

太好了!我一直在寻找一种使用Windows应用程序(VS Code)编辑Linux文件的方法,ssh + SFTP NetDrive似乎可以解决我的问题。回家后我会尝试一下,谢谢! - shintaroid

6
在 Windows powershell/cmd 中执行 CLI 命令 explorer.exe \\wsl$

1

您可以通过简单地导航到文件位置,轻松访问、读取和写入WSL Linux文件系统和Windows之间的文件。

C:\Users\\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs

希望这对你有所帮助!

7
请忽略/删除此答案,因为它直接违反了WSL团队的指导方针,即不要通过Windows文件系统探索访问WSL发行版文件。这样做可能会导致数据/文件损坏或丢失。 - Rich Turner
2
是的,这些文件不应该从Windows访问。但是我有双重操作系统(Ubuntu和Windows),我正在寻找一种从WSL复制文件到Ubuntu的方法,而这个答案帮助了我。 - Mehmet Baker
1
@RichTurner 如果没有Windows,只有文件怎么办?当然,这是那种情况下的正确答案。但是格式已经从 "rootfs" 更改为 "ext4.vhdx",应该更安全且更难访问。 - piojo
1
@piojo - 我不明白你在说什么:虽然WSL2将其发行版的文件系统存储在VHDX中,以避免潜在的文件系统访问冲突,但强烈建议您通过内置的文件系统重定向器\wsl.localhost<distro>\来访问文件... - Rich Turner
1
@RichTurner 这不是一个适合从备用硬盘中获取文件的方法。这仅适用于正在运行的WSL安装。 - piojo
显示剩余4条评论

1

\wsl$ 挂载点对我来说效果不佳,它有多个问题,并且许多 Windows 应用程序会因为将其视为网络驱动器而失败。对于我的用例,Rclone 是帮助解决问题的工具,可以正确地挂载 Linux 文件系统,使其表现得与本地磁盘几乎相同,没有任何问题。

它是免费和开源的。它可以使用 sftp 远程文件系统(如 sshfs)工作,因此它可以在 Linux 和 Windows 上挂载网络驱动器(运行 sshd 服务)。

示例命令如何运行它,假设远程点“server”已经配置好,并且 rclone.exe 在 PATH 环境变量中:

rclone mount server:/ Z: --file-perms=0777 --track-renames --track-renames-strategy=modtime,leaf --metadata --vfs-cache-mode=full --sftp-disable-hashcheck --volname drive_name

首次使用时,您需要运行以下命令来配置新的远程连接点:

rclone config

要查找您刚创建的配置文件的位置,请运行:

rclone config file

此外,如果尚未安装WinFsp,则可能需要先安装它。最好的是,一切都像使用本地磁盘一样工作(假设您提供了--vfs-cache-mode=writes--vfs-cache-mode=full选项,因为没有这些选项,许多应用程序将无法正常工作,请阅读文档以了解原因)。选项--file-perms=0777是必要的,以允许运行.exe文件。即使--vfs-cache-mode=writes对于大多数应用程序来说已经足够了,但--vfs-cache-mode=full对于处理大文件时的良好性能非常重要。出于同样的原因,--track-renames-strategy仅限于modtimeleaf策略,因为如果使用哈希策略,处理大文件时会明显变慢,而--sftp-disable-hashcheck则是必要的,以防止rclone运行md5sum,否则即使尝试读取文件,它也会运行。

要将Rclone注册为系统服务,请编辑并运行以下命令(请勿按原样运行,请先查看下面的说明以了解您需要如何编辑它):

New-Service -Name Rclone -BinaryPathName 'C:\Program Files\Rclone\rclone.exe mount server:/ Z: --vfs-cache-mode=full --track-renames --track-renames-strategy=modtime,leaf --metadata --volname drive_name --config="C:\Program Files\Rclone\rclone.conf" --log-file="C:\Program Files\Rclone\rclone.txt" --file-perms=0777 --sftp-disable-hashcheck --no-console'

显然,您需要将“server:/”替换为实际的远程点名称和路径,还要将drive_name替换为任何您喜欢的名称,并且如果您在不同位置安装了它,则可能需要编辑rclone.conf、rclone.log和rclone.exe的路径。

注意:在我的情况下,作为系统服务运行会导致某些权限问题(例如,在尝试保存Excel文件时),我还没有弄清楚原因,所以最终我创建了启动.bat文件以用户身份运行Rclone,因为这种方式可以完美地工作。如果我找到了如何使作为服务运行与作为用户运行一样好的方法,我将更新此答案。

即使是不支持网络驱动器的Windows软件,也可以使用RClone驱动器。所需的全部就是在远程系统中设置sshd(在这种情况下,实际上并不是真正的远程系统,而是安装在同一台PC上的WSL发行版)。以下是如何在WSL发行版中设置sshd的方法:https://www.hanselman.com/blog/how-to-ssh-into-wsl2-on-windows-10-from-an-external-machine。这里是如何使WSL IP地址静态的方法:https://github.com/ocroz/wsl2-boot,这样您就可以始终在相同的IP地址上运行sshd。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接