在Windows Subsystem for Linux中,Ubuntu文件系统的根目录位于哪里?反之亦然。

我在Windows 10上安装了Ubuntu子系统(在设置中启用了该功能),但是Ubuntu文件系统的根目录在哪个驱动器中?

43请注意我们(WSL团队)强烈建议您不要深入探索Linux发行版的数据文件夹。如果您这样做,很有可能会导致数据丢失和/或损坏。我们正在努力改进这种互操作场景,并将在我们的博客上公布任何进展:https://blogs.msdn.microsoft.com/commandline/ - Rich Turner
@RichTurner我发现有一个非常具体(而且令人讨厌)的原因 - 公司政策反复使用错误的权限标记.ssh文件夹,这意味着需要将该结构标记为“禁止访问”以防止公司脚本的干扰。但总的来说 - 我同意你的观点。 - Danny Staple
虽然看起来在更新较新的版本中可能会出现这种情况,但现在已经不再发生了。 - Danny Staple
4如果你需要在Windows上更改Linux发行版中文件/文件夹的权限,请使用wsl.exe,例如wsl chmod 600 ~/.ssh/id* - 不要通过Windows文件系统将文件复制到这些文件夹中。 - Rich Turner
@RichTurner:为什么你们不像已经隧道化NTFS元数据一样,也隧道化Linux元数据呢? - user541686
@mehrdad 我們使用1903年及之後的新P9伺服器來進行。 - Rich Turner
@RichTurner:谢谢回复!不过我有点困惑... 1903版本需要将其作为网络资源访问,对吗?如果你以与NTFS元数据相同的方式进行隧道传输属性,那么就可以在本地直接编辑文件了。这让我觉得你们做的可能并不完全是这样? - user541686
1@mehrdad WSL 实现了一个 P9 文件服务器,可以像任何其他 P9 文件服务器一样暴露/编排分发系统文件。这样就不需要传递 NTFS 元数据。请观看 Craig Loewen 和 Ben Hillis 在 Build 2019 的会议,以获取更多信息。 - Rich Turner
@RichTurner: “这样就没有需要传递的NTFS元数据。”是的...所以与你之前说的相反,NTFS隧道并不是你正在做的事情。那么我们回到我最初的问题:你们是不是通过隧道传递WSL元数据,而不是像NTFS已经对其他元数据做的那样使用文件服务器呢? - user541686
@mehrdad 我在哪里说过我们在整理NTFS元数据?P9整理的是文件元数据(例如时间戳、权限、文件名等),而不是NTFS数据。 - Rich Turner
@RichTurner:嗯,我问过:“为什么你们不像已经隧道化NTFS元数据那样隧道化Linux元数据呢?”你回答说:“我们在1903版本及以后的版本中已经这样做了。”我特别想知道的是,为什么你们不让NTFS文件系统驱动程序隧道化Linux元数据(例如LXATTRB...或者可能是所有的扩展属性),就像它已经隧道化其他所有元数据一样。这基本上是同样的问题和情况,即使用文件替换而不是截断的程序,所以我很困惑为什么你们不尝试过去十年或二十年里已经有的同样解决方案。 - user541686
@mehrdad: 我觉得你对WSL中文件系统集成的工作原理有些误解。简而言之:在WSL中,我们为每个文件和文件夹添加了Linux元数据,并放置在发行版文件系统的根目录下。Linux系统调用使用Linux和Windows文件系统的元数据来计算有效的元数据(包括权限等)。当访问/mnt/c/等路径时,WSL还会从Windows的文件/文件夹中合成Linux权限。在WSL >= 1903版本中,我们通过一个P9文件服务器实现了Windows对Linux文件的访问。该P9文件服务器将数据和元数据进行整合,与预期一致。 - Rich Turner
@mehrdad:如果你还有更多问题,请在GitHub仓库(https://github.com/microsoft/wsl)上发布一个issue,我们可以有更多空间来更详细地解答。 - Rich Turner
6个回答

对于从Windows商店安装的Ubuntu:

通过商店安装的每个发行版都会被安装到该应用程序的appdata目录中。例如: C:\Users\<username>\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState - benhillis

对于WSL2,您可以像这样从Windows访问主目录(适用于Windows 10版本18342):

\\wsl$

在Windows Subsystem for Linux的早期版本中,Ubuntu文件系统位于%localappdata%\Lxss(例如,C:\Users\Username\AppData\Local\Lxss - 将Username替换为您在Windows上的用户名)。请参阅WSL文件系统支持的博文
WSL使用的主要文件系统是VolFs。它用于存储Linux系统文件以及Linux家目录的内容。因此,VolFs支持Linux VFS提供的大多数功能,包括Linux权限、符号链接、FIFO、套接字和设备文件。
VolFs用于挂载VFS根目录,使用"%LocalAppData%\lxss\rootfs"作为后备存储。此外,还存在一些额外的VolFs挂载点,最重要的是"/root"和"/home",它们分别使用"%LocalAppData%\lxss\root"和"%LocalAppData%\lxss\home"进行挂载。之所以有这些单独的挂载点,是因为在卸载WSL时,默认情况下不会删除家目录,因此存储在那里的个人文件将被保留。
注意:

使用Windows应用程序和工具在Linux子系统中创建/修改任何文件可能会导致数据损坏和数据丢失!(感谢Rich Turner 提醒大家注意这些问题!)这是绝对不支持的。从同一篇博客文章中:

与Windows的互操作性

虽然VolFs文件存储在上述目录中的普通文件中,但不支持与Windows的互操作性。如果从Windows添加新文件到其中一个目录中,该文件缺少VolFs所需的扩展属性(EAs),因此VolFs不知道如何处理该文件,只会忽略它。许多编辑器在保存现有文件时也会删除扩展属性,再次使该文件在WSL中无法使用。


您的 Windows 文件系统位于 Bash shell 环境下的 /mnt/c

enter image description here

来源:Dustin Kirkland的博客},{link2:howtogeek

1非常感谢。还有一个问题,我使用“apt-get install git”安装了git,那么git的可执行文件在哪里?我是Ubuntu的新手。 - July
尝试输入 type git 查看 git 可执行文件的位置。 - sourav c.
@July:如果你有一个新的、无关的问题,请提出一个新问题,或者更好的办法是搜索一个已存在的问题来解决。评论通常不适合用于后续问题。 :-) - David Foerster
14Lxss被隐藏在我的文件系统中...让我烦恼了一两分钟。现在我创建了一个快捷方式,但似乎还是无法取消隐藏。 - Ogaday
3@Ogaday,你无法通过属性窗口取消隐藏它,因为它被标记为系统目录。你可以使用attrib -s -h lxss命令来取消隐藏,这也会将其标记为非系统目录。 - brettwhiteman
为什么我在主目录下看不到任何东西?从bash中我可以看到那里的文件。 - mpen
@mpen 我建议你提出一个新问题。 - sourav c.
4看起来位置要么改变了,要么在系统之间不同,因为我的位置是不同的。我已经在下面附上了我的位置。 - NicholasJohn16
在访问根目录之前,是否可以访问文件系统的其余部分?我已经在C:\Documents文件夹中安装了网站。是否可以从Windows Bash访问这些网站? - Trip
1@Trip 是的。你整个 C: 驱动器可以在 /mnt/c 访问。 - sourav c.
9@souravc 请你能否在你的答案顶部添加一个重要注释,强烈建议不要使用Windows应用程序和工具创建/修改LXSS中的任何文件:这样做很可能导致数据损坏和丢失! - Rich Turner
3我不明白。如果我不能安全地在Windows工具中修改文件,那么在Windows上运行它的意义是什么?Cygwin似乎仍然比那更优秀... - still_dreaming_1
1在Windows系统中,你需要打开"视图"->"选项"->"更改文件夹和搜索选项",然后取消勾选"隐藏受保护的操作系统文件",才能在Windows资源管理器中看到lxss文件夹。让我困惑了一段时间。 - Norbert Norbertson
@RichTurner 这个工作是双向的吗?换句话说,如果你在Ubuntu实例中使用Windows创建的文件,数据损坏的可能性也很大吗? - Bram Vanroy
9请阅读上面提到的帖子:https://blogs.msdn.microsoft.com/commandline/2016/11/17/do-not-change-linux-files-using-windows-apps-and-tools/。从WSL访问Windows文件系统是安全的,这就是为什么我们将您的驱动器挂载在`/mnt/<drive>/`下,但从Windows访问Linux文件系统目前还不安全,这就是为什么我们不提供对发行版文件系统的简单访问的原因。 - Rich Turner
1@still_dreaming_1 如果你想在Windows和Linux中访问文件,请将它们存储在Windows文件系统中,并像在Windows中一样正常访问,或者在Linux中通过/mnt/<drive>/<path>路径进行访问。 - Rich Turner
1@RichTurner 是的,我最终做到了,并创建了一个符号链接,以便更方便地访问Linux。 - still_dreaming_1
2好主意。我在我的主文件夹中创建了一个从 dev/mnt/c/dev 的符号链接,以便更方便地访问我的开发项目。 - Rich Turner
这回答了很多问题。谢谢你的帮助!!! - Christian Matthew
应该把它从例如(e.g.)改为即(i.e.)。 - Alexander
几年后,这还是真的吗? - wesm
我也遇到了这个问题,使用的是在WSL/Ubuntu 18目录下的Windows上的Apache。Web应用程序(即Apache)会创建各种缓存文件,后来无法通过Linux机器内的实用程序进行写入。作为一个想法,我建议文件系统默认为从外部创建的文件添加读写权限。 - Anse
谢谢,顺便一提:我也在使用Arch,并且它位于%localappdata%\Local\Packages\52569scottxu.ArchLinux_xhwh673y3hxf8下。 - user1708042

这似乎是自Bash最初引入以来发生了变化,并且不适用于来自Windows商店的发行版,或者可能对所有系统都不一致,因为我的主目录位于另一个位置。
%localappdata%\lxss\home\{username}

或者:

C:\Users\{user}\AppData\Local\lxss\{username}

其中{user}是您的Windows用户名,{username}是您在安装过程中设置的UNIX用户名。

因此,根目录将是:

%localappdata%\lxss

请注意,在Windows资源管理器中,根目录可能无法从%localappdata%目录中显示出来。不过,您仍然可以通过在资源管理器的“地址栏”中输入它来访问它。

1我的机器找不到:"C:\Users{user}\AppData\Local\Lxss{username}" 或 "%localappdata%\Lxss\home{username}",但是"C:\Users{user}\AppData\Local\lxss{username}"可以。也就是说,请使用"lxss"而不是"Lxss"。 - Joe Codeswell user601770
我的系统有一个名为rootfs的子目录,但是rootfs/home是空的,而./home下面有我的用户账户和文件。从安全角度来看,最好只需转到%localappdata%\lxss然后从那里浏览一下看看你所拥有的布局,直接浏览该地址可以避免lxss目录被隐藏引起的问题。 - jla
1@JoeCodeswelluser601770 这很奇怪。Windows文件系统通常是不区分大小写的。我可以输入%localappdata%\Lxss或%localappdata%\lxss,两者都会指向%HOMEPATH%\AppData\Local\lxss。 - jla
8请注意,这个文件夹(lxss)没有出现在我的Windows资源管理器中AppData\Local的文件夹列表中,即使启用了隐藏文件夹的视图。我不得不手动将文件夹lxss粘贴到资源管理器栏中才能访问这里的文件,例如编辑文件夹“url”到那里。 - Colin D
或者,您可以转到桌面,右键单击“新建->快捷方式”,然后粘贴一个路径,例如C:\Users\yourname\AppData\Local\lxss\home\yourname。 - Colin D
我遇到了类似的问题:1. 在本地文件夹中找不到lxss(即使显示隐藏文件)。2. 尝试第二次后,完整的C:\路径仍然无效,即使进行了拼写检查并使用了正确的Windows和Bash用户名。3. %localappdata%\lxss\home{username}每次都能正常工作,谢谢NicholasJohn16和Colin D。 - user453720
只是为了补充已经提到的许多不同的例子,我电脑上的所有文件都直接位于 %localappdata%\lxss 下面。没有一个子目录使用我的“UNIX”用户名;home 是一个子目录,而在 home 下面有一个子目录用于我的 UNIX 用户名。 - Kenny Evitt

如果你从微软市场安装Linux: 他们将发行版放置在:
$ cat /proc/registry/HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Lxss/\{861c29b4-ebe2-49a5-8a22-7e53a27934a0\}/BasePath
C:\Users\user\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState

默认发行版由以下内容定义:
bash# cat /proc/registry/HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Lxss/DefaultDistribution
{861c29b4-ebe2-49a5-8a22-7e53a27934a0}

Linux的根目录更深:
c:/Users/user/AppData/Local/Packages/46932SUSE.openSUSELeap42.2_022rs5jcyhyac/LocalState/rootfs

PS. 我使用Cygwin来查看注册表键。
如果使用PowerShell达到相同的目标,命令将是:
# obtain the value of the ID of the default Linux distribution (and store it in a variable to avoid escaping characters issues):
$DEFAULT_LXSS_ID = (Get-ItemPropertyValue -Path REGISTRY::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\ -name DefaultDistribution)

# which will have a value like:
echo  $DEFAULT_LXSS_ID
{bde539d6-0c87-4e12-9599-1dcd623fbf07}

# display the directory containing the rootfs Windows directory (mapped to the / Linux directory)
Get-ItemPropertyValue -Path REGISTRY::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\$DEFAULT_LXSS_ID -name BasePath | Format-List -property "BasePath"
%LocalAppData%\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState

PPS. https://blogs.msdn.microsoft.com/commandline/2016/11/17/do-not-change-linux-files-using-windows-apps-and-tools/

1很棒的是你通过指出“**[你]使用Cygwin来探索注册表项**”,使得这个更易用(适用于更多不同情况)。 - bballdave025
2这是对我帮助最大的答案。不知何故,在初始设置期间,我设置了一个自定义位置作为基本路径。通过手动在Windows注册表编辑器中查找,我能够读取到该位置。 - Zciurus
很棒!那个注册表值帮助我找到了我的发行版的位置。谢谢! - Henke


对我来说不起作用。它打开命令提示符并启动bash。 - blablatros
@blablatros 是的,但是在bash中的文件夹里,在你打开资源管理器时,当你在资源管理器地址栏中输入bash并按下回车键。试试在“我的文档”文件夹中打开Windows资源管理器文件夹,并在位置栏中输入bash,它将在该文件夹中打开Ubuntu bash :) - Kangarooo
1@Kangarooo:我想通过Windows 10图形用户界面访问文件,反之亦然。在我上面的回答中,我找到了如何通过Windows 10文件资源管理器找到Bash目录,于是我开始将一些文件从我的外部硬盘复制到该目录中。然而,当我打开Bash终端并按下ls -a时,它没有显示我添加的文件。Bash无法识别我通过Windows文件资源管理器放置的文件,这对我来说完全背离了在Windows上安装Bash的目的。 - user453720

对我来说,唯一有效的方法是使用%localappdata%\lxss\home\{username},其中的{username}是在安装过程中为BASH用户名设置的。出于某种原因,在显示隐藏文件夹后,lxss文件夹不会出现在C:\Users\WINDOWS-USER\AppData\Local\下,同时使用包含Windows和BASH用户名的完整C:\路径也无法生效。
请同时创建一个可用的桌面快捷方式。

对于那些正在寻找图片位置的人:
C:\Users\\[username]\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ext4.vhdx