<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>WSL &#8211; 寂静花园</title>
	<atom:link href="https://www.addesp.com/archives/tag/wsl/feed" rel="self" type="application/rss+xml" />
	<link>https://www.addesp.com</link>
	<description>寂静中交织着热情</description>
	<lastBuildDate>Sat, 04 Sep 2021 03:04:33 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>
	<item>
		<title>在 WSL2 中使用 snapd</title>
		<link>https://www.addesp.com/archives/633</link>
					<comments>https://www.addesp.com/archives/633#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Mon, 07 Sep 2020 15:34:31 +0000</pubDate>
				<category><![CDATA[翻译]]></category>
		<category><![CDATA[WSL]]></category>
		<guid isPermaLink="false">https://www.addesp.com/?p=633</guid>

					<description><![CDATA[在 WSL2 上使用 snapd 和 snaps 像是小聪明（非贬义）一样的行为，你可能会遇到许多奇怪的事情，不建议在常规情况下使用。]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">版权声明</h2>



<p class="wp-block-paragraph">本文由 <a href="https://www.addesp.com" target="_blank" rel="noreferrer noopener">ADD-SP</a> 由英文翻译为简体中文。</p>



<ul class="wp-block-list"><li>原文作者：<a href="https://discourse.ubuntu.com/u/zyga">zyga</a></li><li>原文链接：<a href="https://discourse.ubuntu.com/t/using-snapd-in-wsl2/12113" target="_blank" rel="noreferrer noopener">https://discourse.ubuntu.com/t/using-snapd-in-wsl2/12113</a></li></ul>



<h2 class="wp-block-heading">译文</h2>



<h3 class="wp-block-heading">免责声明</h3>



<p class="wp-block-paragraph">在 WSL2 上使用 snapd 和 snaps 像是小聪明（非贬义）一样的行为，你可能会遇到许多奇怪的事情，不建议在常规情况下使用。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>这句话的意思应该是不推荐在类似生产环境这样的环境中使用。</p><cite>译者注</cite></blockquote>



<h3 class="wp-block-heading">先决条件</h3>



<p class="wp-block-paragraph">Windows10 家庭版或专业版，Windows Insider Fast ring 或 2019 秋季更新版本。你需要大约 10GB 的磁盘空间来安装 Ubuntu。</p>



<p class="wp-block-paragraph">请从 Windows 应用商店安装 Ubuntu18.04 ，并确保可以正常地使用 WSL1。网络上有许多教程可以帮助你完成这项工作，我不想重置我的系统去重复提供这些详细的说明。</p>



<p class="wp-block-paragraph">然后必须按照微软的文档启用 WSL2，<a href="https://docs.microsoft.com/zh-cn/windows/wsl/install-win10" target="_blank" rel="noreferrer noopener" title="https://docs.microsoft.com/zh-cn/windows/wsl/install-win10">点我查看文档</a>。文档中的关键内容是将 WSL1 切换为 WSL2。</p>



<p class="wp-block-paragraph">您可以通过查看 uname 的输出来检查是否正在运行 WSL2。如果您运行的是基于 4.19 内核的 microsoft standard，那就可以继续进行后续的步骤了。</p>



<h3 class="wp-block-heading">准备使用 snapd</h3>



<p class="wp-block-paragraph">WSL2 几乎可以运行 snapd 了。唯一缺少的东西就是作为 init system 的 systemd。微软正在使用一个定制的 init 为每个已安装的 WSL2 发行版设置一个有效的容器。init system 是一个最小系统，比起传统的发行版的 init system 的任务，它更多的是处理与 WSL 的集成。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>这段的最后一句话译者起初一直不能翻译通顺，后来询问群友之后发现了这篇文章：<a href="https://www.lbihua.cn/Share/DeepL.html">https://www.lbihua.cn/Share/DeepL.html</a>，文章内推荐了 DeepL 这款翻译工具，它让我可以通顺地翻译出最后一句话，感谢<a href="https://www.lbihua.cn/" target="_blank" rel="noreferrer noopener" title="https://www.lbihua.cn/">哔哗</a>的帮助。</p><cite>译者注</cite></blockquote>



<p class="wp-block-paragraph">systemd 是预装的，但不是活动的。你仍然可以手动运行 systemd，但它会拒绝启动，除非它以 pid 1 的身份被调用。有一个简单的方法，把它放在一个 &#8220;容器 &#8220;中，容器其实就是一个基于 unshare(1) 实用程序的山寨容器（poor man’s container）。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><code>poor man's container</code> 直译为“穷人容器”，但是这应该不是真实的意思，译者查询了一些资料后将其翻译为“山寨容器“，<a href="https://idioms.thefreedictionary.com/a+poor+man%27s+something" target="_blank" rel="noreferrer noopener" title="https://idioms.thefreedictionary.com/a+poor+man%27s+something">点我查看相关资料</a>。</p><cite>译者注</cite></blockquote>



<p class="wp-block-paragraph">运行下面这行神奇的命令：</p>



<pre class="wp-block-code language-shell"><code>sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target</code></pre>



<p class="wp-block-paragraph">这行命令使用 unshare(1) 来创建一个新的 PID 命名空间。PID 命名空间实际上是Linux 状态下看到进程的一部分，如果你观察你的系统，看到 pid 123，这就表示 123 存在于一个 PID 命名空间中。在另一个 PID 命名空间中，它可能是其他的东西，也可能根本不存在。创建一个 PID 命名空间可以让我们再次得到 PID 1。其余的参数告诉 unshared 再次挂载 /proc 和 fork(1)，技术上来说，这是 PID 命名空间工作所需要的。</p>



<p class="wp-block-paragraph">一旦 unshared 完成，我们要求它运行 systemd，目标是 reach basic.target。你可以在 systemd.target(5) 的手册页面上阅读更多的内容。在命令的开头你会看到 sudo daemonize，它的作用是以 root 身份运行整个命令，并将其从我们用来调用的 shell 中分离出来。</p>



<p class="wp-block-paragraph">注意，在这个阶段，如果你想管理发行版 host 上的部分服务，WSL 将会出现一些奇怪的现象。例如，如果你使用 apt-get 安装了apache2，你将无法启动它，因为服务管理脚本与 systemd 通信失败。</p>



<h3 class="wp-block-heading">使用 snpad 进入新的世界</h3>



<p class="wp-block-paragraph">现在 systemd 已经运行了，但在我们的山寨容器里如何使用它呢？技术上很简单，我们只需要在 systemd 住在我们使用的 PID 命名空间中，即运行在容器中。我们实现呢？使用 nsenter(1)。</p>



<pre class="wp-block-code language-shell"><code>exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME</code></pre>



<p class="wp-block-paragraph">这行命令会让 shell 执行sudo（并且会用这个进程替换掉当前 shell），运行 nsenter，它将我们移动到 systemd 进程的所有命名空间中。一旦进入容器， nsenter 将运行 su &#8211; $LOGNAME，使得我们在进入容器前后均使用同一个用户登录。</p>



<p class="wp-block-paragraph">接下来呢？</p>



<pre class="wp-block-code language-shell"><code>snap version</code></pre>



<p class="wp-block-paragraph">如果这条命令正常执行你就可以安装你喜欢的任何东西了。</p>



<p class="wp-block-paragraph">注意，你不能使用图形应用程序。我用 X server 和 putty 作为 X11 转发桥的实验结果相当糟糕，我不推荐这样做。</p>



<p class="wp-block-paragraph">如果你打开另一个 WSL shell，你必须重复 sudo nsenter 命令来 &#8220;切换 &#8220;到运行 systemd 的容器。</p>



<h3 class="wp-block-heading">这玩意弄坏了我的系统，救命啊！</h3>



<p class="wp-block-paragraph">Systemd 不是 ”持久性 &#8220;的。如果你重启 Windows，你将回到你开始的地方。WSL的数据将保持不变。你可以试着一次又一次地运行 systemd。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/633/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
