int*_*ris 18 mount diff rsync windows-subsystem-for-linux
我在 Windows 10 系统上安装了多个 Unbuntu WSL 2,我希望能够在它们之间运行 rsync 和 diff 等工具。是否可以挂载/查找这些其他副本的文件所在位置并对其运行 Linux 命令。我不想复制到该区域,只是能够“复制出来”。
为了使这一点更加具体,我有:
X:\WSL\U18.04_1 和 X:\WSL\U18.04_2
而且,我可以通过说以下内容进入第二个:
wsl -d X:\WSL\U18.04_2 -u myname
Run Code Online (Sandbox Code Playgroud)
这将在我的 U18.04_2 映像中的 home 方向上调出一个 bash shell。现在,我想有效地做到:
diff -rbitw /mnt/x/WSL/U18.04_1/home/myname /home/myname
Run Code Online (Sandbox Code Playgroud)
但当然,这不起作用,因为 /mnt/x/WSL/U18.04 实际上并不是一个文件系统(据我所知)。
Not*_*1ds 23
有几种方法可以实现这一点。
/etc/fstab每个发行版中的条目更新了,用我个人用过一段时间的方法来回答。
在每个发行版中,一次性运行以下命令:
echo "/ /mnt/wsl/instances/$WSL_DISTRO_NAME none defaults,bind,X-mount.mkdir 0 0" | sudo tee -a /etc/fstab
Run Code Online (Sandbox Code Playgroud)
1(感谢 @mtraceur 的评论/建议和随后编辑的命令。简化的引用始终是一个受欢迎的变化!)
终止 WSL 发行版并重新启动(以处理 )后,您的发行版将可在所有其他 WSL2 发行版/etc/fstab中使用。/mnt/wsl/instances/<distroname>
2如果这不起作用,请参见选项 1.5
有关其工作原理的详细信息,请参阅我在 Ask Ubuntu 上的相关答案。
/etc/fstab最新 WSL 版本的解决方法在最近的 WSL 版本(我相信是 0.47.1 及更高版本)下,计时问题/更改意味着在安装(tmpfs 文件系统)fstab之前处理和安装。/mnt/wsl如果您使用的是最新的 WSL 版本,并且发现它/mnt/wsl/不包含instances子目录,则:
sudo -e /etc/wsl.conf
Run Code Online (Sandbox Code Playgroud)
并添加以下内容:
[automount]
mountFsTab = false
[boot]
command = sleep 5; mount -a
Run Code Online (Sandbox Code Playgroud)
这应该在处理之前等待足够长的时间,/etc/fstab以便/mnt/wsl首先由 WSL 挂载。
如果您使用 Systemd,您还可以创建一个.mount文件来解决该问题。有关详细信息,请参阅@SteveMeierhofer 的答案。
wsl.exestdin/stdout(奖励#1:此方法也适用于 WSL1)
(奖励#2:不需要预先配置)
(奖励#3:即使第二个发行版尚未运行,它也可以工作。选项 1 要求发行版是提前运行以使其可用/mnt/wsl。)
对于某些用例,您可以通过wsl.exe命令使用正常的输入/输出重定向来访问给定文件。例如:
wsl.exe -d otherinstance cat ~/myfile | diff myfile -
Run Code Online (Sandbox Code Playgroud)
或者
diff myfile <(wsl.exe -d otherinstance cat ~/myfile) # bash (probably all posix)
diff myfile (wsl.exe -d otherinstance cat ~/myfile | psub) # fish
Run Code Online (Sandbox Code Playgroud)
这类似于您通过在远程主机上执行相同操作的方式ssh。您甚至可以使用(或其他方式)通过管道发送整个目录tar。
这也不需要提前运行第二个发行版
对于极少数情况,您甚至可以在每个实例中设置 ssh 服务器。我遇到的唯一需要这样做的情况是Ansible,尽管rsync也有可能。
请注意,在 WSL 实例上进行设置ssh并不是那么简单,但如果您仅通过本地主机访问它,可能会更容易。至少,每个实例都需要一个单独的端口号。我建议为 Windows 主机本身保留 22 个(可能使用 Windows OpenSSH Server)。
/mnt/wsl选项 1 的旧版本,留在这里供后代使用。
改编自此GitHub 评论,您应该能够执行以下操作:
mkdir /mnt/wsl/otherinstance
wsl.exe -d otherinstance -u root mount --bind / /mnt/wsl/otherinstance/
Run Code Online (Sandbox Code Playgroud)
老实说,这个让我有点害怕,因为“其他实例”在命令运行后很快就会关闭(除非它已经在其他地方运行)。然而,挂载似乎很稳定,可能是因为(正如 GitHub 问题中后来的评论提到的)所有“驱动器”无论如何都可以从 WSL2/Hyper-V 子系统获得;它们不一定依赖于实例本身。
mount --bind无论如何,通过简单地手动运行“其他实例”并从该实例本身执行,可以很容易地减轻我的(可能没有根据的)恐惧。
小智 5
如果您从Microsoft Store获得了最新的 WSL 版本,则可以使用 Systemd。WSL 实例运行 Systemd 后,创建一个挂载文件,例如:
/etc/systemd/system/mnt-wsl-instances-${WSL_DISTRO_NAME}
[Unit]
Description=WSL Instances
[Mount]
What=/
Where=/mnt/wsl/instances/${WSL_DISTRO_NAME}
Type=none
Options=defaults,bind,X-mount.mkdir
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
然后启用挂载:
sudo systemctl daemon-reload
sudo systemctl enable mnt-wsl-instances-${WSL_DISTRO_NAME}.mount --now
所有 WSL 文件均可在/mnt/wsl/instances.
| 归档时间: |
|
| 查看次数: |
9981 次 |
| 最近记录: |