Windows中相当于Linux命名空间(每个进程文件系统挂载)的功能是什么?

11

Linux有一个称为命名空间的功能,它让您为不同的进程提供不同的文件系统“视图”。在Windows术语中,如果你有一个遗留程序"floyd"总是从C:\floyd\floyd.ini加载配置,这将是有用的。如果Windows也有命名空间,你可以编写一个包装脚本,在其中创建一个命名空间来运行floyd,这样当Alice运行该脚本时,floyd将在一个环境中启动,其中C:\floyd存在但实际上指向C:\Users\Alice\Floyd

现在你可能会想,“好吧,只需使用软链接或硬链接,并使C:\floyd成为C:\Users\Alice的别名即可。”但使用命名空间,Bob还可以运行启动脚本,但他的floyd实例(在同一台计算机上并且同时运行)将看到C:\floyd的内容,例如C:\Users\Bob\Program Settings\Floyd Config(或任何其他我们喜欢的路径)。

在Linux上,您可以使用命名空间实现这一点。 Windows上是否有类似或类似的东西?如果需要编写C程序,则可以,如果它仅适用于较新版本的Windows也可以。


真正的混蛋当然是那些从类似于\floyd\floyd.ini这样的路径加载配置文件的程序——这是一个相对于驱动器的路径,只有在当前工作目录位于同一驱动器上时才有效。无法通过命名空间来解决这个问题。 - MSalters
1
这不是一个真正的编程问题,但它太有趣了不能关闭。 - Gabe
9个回答

5
NTFS硬链接实际上是重解析点的一个简单案例。重解析点有不同的类型,可以包含更高级的行为。例如,它们还用于“脱机存储”(将文件透明地迁移到和从辅助存储器中)。因此,您还可以使用重解析点来实现每个用户的符号链接,方法是创建新的重解析类型。
重解析点类型甚至具有明确的“名称代替”位,如果设置,则表示这些类型的重解析点是某种符号链接。
路径中甚至可以有多个重解析点。因此,您符号命名空间中的文件仍然可以迁移到辅助存储器 - 您只需在路径中添加两个重解析点即可。

1
有没有关于这个功能的工具,还是我基本上要为重新解析点数据类型定义自己的“应用程序”标记,并编写自己的文件系统过滤器来实现每个用户符号链接的行为?非常感谢您指出我可以使用的原始位,但乍一看,这似乎需要相当大的工作量——只是想确认我的估计与您的一致。 - John Zwinck
1
这是一个非常复杂的问题。我认为您不需要文件系统过滤器(因为您的重分析点仅执行简单的重定向),但您确实需要一个可以创建和解释您的类型的重分析点的低级组件。就工具而言,我期望在IFS SDK或DDK中有更多信息。 - MSalters

1

我认为虚拟存储会自动为那些试图写入非标准目录的旧程序执行此操作。因此,这些旧程序会将数据写入特定于用户和程序的目录,而不是 C:\floyd


1
我认为像 C:\floyd\ 这样的随机文件夹并未虚拟化。但是Windows目录和Program Files目录都已经被虚拟化了。 - MSalters
MSalter的观点与我自己(有限的)理解相符,这意味着我不能使用它来完成我需要做的事情。 - John Zwinck

1

这听起来像是Windows Vista的文件系统虚拟化。例如,它可以将c:\Program Files\Floyd静默重定向到c:\Users\<username>\AppData\Local\VirtualStore\Program Files\Floyd。然而,文件系统虚拟化不像Linux命名空间那样可配置。从我阅读的内容来看,文件系统虚拟化应该适用于任何32位交互式进程打开只有管理员才能写入的文件、文件夹或注册表键时(因此,您通常会在c:\Program Files下得到一些只读文件,在c:\Users\<username>\AppData\Local\VirtalStore下得到一些每个用户可写的文件)。

应用程序虚拟化产品也可能可以做到这一点,尽管这些产品通常更复杂、更昂贵。


0

Windows 每个登录会话肯定有一个虚拟的文件系统视图;远程驱动器映射通常对于同一台机器上的其他用户是不可访问的。 - MSalters
MSalters:对于单个用户,远程驱动器映射在不同的命令提示符实例中是否可以不同?或者它们只在用户的终端会话级别上有所不同?我实际上希望能够让一个已登录的用户在某些情况下在多个“名称空间”中启动该程序(即Alice和Bob可能正在使用相同的Windows登录会话,只是启动了两个不同的脚本)。 - John Zwinck
用户不能共享登录会话;Alice和Bob将至少有两个。毕竟,他们都至少登录了一次。但是如果Alice只登录了一次,那么她所有的命令提示符将共享相同的驱动器映射。 - MSalters
我的意思是,Alice和Bob可能都在以“家庭用户”或其他身份登录的情况下使用计算机。你可能会说这是不好的做法,但我真正想表达的是,Alice可能希望使用两个不同的配置(Alice1和Alice2)运行程序。所以我想这个想法对我来说并不适用,这也没关系。 - John Zwinck

0

最相关的可能是特殊环境文件夹,例如%temp%,%appdata%,%localappdata%。虽然它们不是等价的,但它们实现了相同的目的。

您可以定义自己的环境变量,然后使用“%myspecialplace%\myfile.txt”来访问它们。


0

作为一个可怕的补救措施(在这里我预订了通往编程地狱的通行证),你可以使用一个命名管道来映射IO操作到当前进程用户特定的文件,比如C:\Floyd。

我知道这不是很美观,而且我对Windows上的NamedPipes(其他方言中的FIFOs)了解不够,不知道这是否可行。

Dan


不是的;名称 C:\Floyd 被认为是一个复合名称,而 C:(考虑到设置)是内核命名空间中的符号链接,指向一个(NTFS 或 FAT)分区。因此,Floyd 部分是相对于该分区解析的。 - MSalters
在Windows上,所有命名管道都是在\\.\Pipe\目录中创建的,它们不能像普通文件那样被命名。 - Ben Voigt
谢谢大家提供的信息。最好不要采用这种方法。 - Dan Kendall

0

0

我想到了几件事情。

首先,您可以创建一个文件系统过滤驱动程序(或使用现成的驱动程序,例如我们的CallbackFilter产品),将来自应用程序的所有文件系统调用重定向到其他位置。这接近于您提到的虚拟化,但这不会改变驱动器字母列表。这种方法既强大又非平凡,因此请首先查看其他选项。

另一个选择是:存在几个产品(如果我没记错的话,有Thinstall、Molebox等)可以“包装”应用程序,将其文件I/O重定向到其他位置。还有一些SDK可以做到同样的事情,但我完全不记得它的名字了。


0

这方面好的解决方案很少。为了简单起见,我无法改进使用NTFS软链接(联接)-正如您正确指出的那样,如果您想要每个用户配置,则会创建问题。正如MSalters所说,所有NTFS软链接和硬链接都只是重分析点的特殊情况,因此,如果您不介意深入研究NTFS,可以通过实现新的重分析类型来做一些更通用的事情。

(当尝试使用NTFS软链接进行实验时,Junction是一个非常有用的工具:http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx

您可以采取直接的方法-为每个用户(或仅关心一个软件件的程序初始化)提供登录脚本,以将适当的联接设置到其用户目录中(并确保之后清理它)。但这很笨拙。

总的来说,正确的Windows方法是将东西放入%localappdata%(从Vista开始)和更一般的%userprofile%系统变量指向的文件夹中。Win文件系统虚拟化旨在确保在适用的情况下实现此目标。


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