<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>WSL2 on aiken&#39;s blog</title>
    <link>https://aikenh.cn/tags/wsl2/</link>
    <description>Recent content in WSL2 on aiken&#39;s blog</description>
    <generator>Hugo -- 0.137.0</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 09 Jul 2024 15:52:46 +0000</lastBuildDate>
    <follow_challenge>
      <feedId>90080597450814464</feedId>
      <userId>72439538841050112</userId>
    </follow_challenge>
    <atom:link href="https://aikenh.cn/tags/wsl2/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Docker Troubleshoot</title>
      <link>https://aikenh.cn/posts/docker_troubleshoot/</link>
      <pubDate>Tue, 09 Jul 2024 15:52:46 +0000</pubDate>
      <guid>https://aikenh.cn/posts/docker_troubleshoot/</guid>
      <description>&lt;h2 id=&#34;troubleshooting-故障排查&#34;&gt;TroubleShooting 故障排查&lt;/h2&gt;
&lt;h3 id=&#34;credential-related&#34;&gt;Credential Related&lt;/h3&gt;



  
  

&lt;blockquote class=&#34;alert-blockquote alert-error&#34;&gt;
  &lt;p class=&#34;alert-heading&#34;&gt;
    &lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34; height=&#34;16&#34;&gt;
      &lt;path d=&#34;M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&#34;&gt;&lt;/path&gt;
    &lt;/svg&gt;
    &lt;span&gt;Error&lt;/span&gt;
  &lt;/p&gt;
  &lt;p&gt;error getting credentials - err: exec: &amp;ldquo;docker-credential-desktop.exe&amp;rdquo;: executable file not found in $PATH, out: ``&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="troubleshooting-故障排查">TroubleShooting 故障排查</h2>
<h3 id="credential-related">Credential Related</h3>



  
  

<blockquote class="alert-blockquote alert-error">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Error</span>
  </p>
  <p>error getting credentials - err: exec: &ldquo;docker-credential-desktop.exe&rdquo;: executable file not found in $PATH, out: ``</p>

</blockquote>
<p>解决方法根据情况可能是以下的两种：<a href="https://forums.docker.com/t/docker-credential-desktop-exe-executable-file-not-found-in-path-using-wsl2/100225/3" target="_blank" rel="noopener">参考资料1</a>
 | <a href="https://peterbillzhang.medium.com/fix-wsl2-docker-error-f4e6502c38a4" target="_blank" rel="noopener">参考资料2 WSL2</a>
 | <a href="https://stackoverflow.com/questions/65896681/exec-docker-credential-desktop-exe-executable-file-not-found-in-path" target="_blank" rel="noopener">参考资料3</a>
</p>
<p>WSL2 相关的情况下可能需要执行以下的挂载：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 执行挂载</span>
</span></span><span class="line"><span class="cl">sudo ln -s /mnt/c/Program<span class="se">\ </span>Files/Docker/Docker/resources/bin/docker-credential-desktop.exe /usr/bin/docker-credential-desktop.exe</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>也可能是需要修改 <code>~/.docker/config.json</code> 或者 <code>/root/.docker</code> 中的 <code>credsStore</code> 改为 <code>credStore</code></p>
<h3 id="docker-desktop-更新后-container-消失">Docker Desktop 更新后 Container 消失</h3>



  
  

<blockquote class="alert-blockquote alert-error">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Error</span>
  </p>
  <p>Docker-Desktop-Data 没有正确启动，导致 Docker Desktop 在版本更新/电脑重启后，所有的 Container 消失了</p>

</blockquote>
<p>前一阵，<strong>更新 Docker Desktop 版本/重启电脑</strong>后所有的 container 消失了，重启 Docker, WSL2, Windows，均无法将 Container 找回，怀疑是 Docker 更新后没有正确识别迁移的 Docker-Desktop-Data 和 Docker-Desktop 地址导致找不回数据。</p>
<p>此时，首先<strong>不要删除</strong> docker-desktop 版本去做一些版本回退或者其他删除 Docker-Desktop 的行为，这样做会连带将整个 docker-desktop-data 的 <strong>vhdx 挂载盘</strong>也删除，这样会导致部分未 Mount 到 WSL2 的数据无法找回，彻底无法恢复原本 Container 的部分信息。</p>
<p>因此，无论在回退或者重装 docker-desktop 之前，建议做以下的验证：</p>
<ol>
<li>使用 <code>wsl -l -v </code> 查看 Dokcer-Desktop-Data 是否正常启动(状态为 RUNNING)</li>
<li>查找当前 Docker-Desktop 和 Docker-Desktop-Data 当前的挂载位置，是否是安装时迁移出来的位置，可以参考 <a href="https://learn.microsoft.com/zh-cn/windows/wsl/disk-space#how-to-locate-the-vhdx-file-and-disk-path-for-your-linux-distribution" target="_blank" rel="noopener">管理WSL2磁盘空间</a>
 的最后一小节找到 vhdx 的位置；</li>
<li>如果还是原本的位置，参考自己部署服务的 compose file 查看对应位置的文件是否还存在，如果不存在了，可能是被覆盖了，那可能也是没救了；</li>
<li>如果位置和迁移出来的位置不一致，说明是 Docker-Desktop 对应的数据内容位置不对的问题，可以直接按照 WSL2 的步骤重新导入 Docker-Desktop-Data 尝试能不能找回数据；</li>
</ol>
<p>如果数据已经无法恢复，也就只能重新部署服务，需要注意的是，如果是 docker-desktop-data 没有启动的问题，且发现对应的 volume 信息已经没有了，这就说明之前的 container 和 volume 等信息可能是存在临时目录已经找不回了，接下来就是如何正确避免再次发生这种情况。</p>
<p>查阅后发现，这是由于将 Docker-Desktop-Data 的挂载到了别的目录，但是 Docker-Desktop 无法正确识别迁移后的地址，他还会在原本的地址找 Vhdx 文件，如果没找到就会导致 Docker-Desktop-Data 无法和 Docker-Desktop 关联起来，相关的服务也就不会启动。</p>
<p>这里通过 CMD 来建立软连接（<code>mklink {target_path} {file_real_path}</code>）：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>powershell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="c"># 建立软连接（需要再cmd中执行，powershell中可能识别不了mklink命令）</span>
</span></span><span class="line"><span class="cl"><span class="c"># 否则可能会导致 docker-desktop-data 无法正确启动，导致重启后掉盘</span>
</span></span><span class="line"><span class="cl"><span class="n">mklink</span> <span class="s2">&#34;C:\Users\{user-name}\AppData\Local\Docker\wsl\data\ext4.vhdx&#34;</span> <span class="s2">&#34;D:\docker\docker-desktop-data\ext4.vhdx&#34;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>重启 docker-desktop 后再重新部署服务即可，可以简单的部署个别文件后重启检查，部署的时候需要注意</p>
<ul>
<li>如果部署所需的<strong>文件&amp;数据库</strong>都已经 <strong>mount</strong> 到对应的 WSL2 上了，整个重新部署的流程会相对简单一些，而且也不会有信息丢失</li>
<li>部分无法 Mount 的服务建议查看官方文档是否有备份方法，例如 Immich 的用户数据库，需要手动使用脚本进行备份和后续导入，否则虽然照片不会丢失，但是无法和原始账号关联，只能使用曲线救国的方式去重新将旧照片导入新账号。</li>
</ul>
<p>因此对于存储重要用户数据的 Docker 服务，建议是在将数据都 <strong>mount</strong> 出来的同时，做好对应服务器的<strong>容灾备份</strong>，我这里是使用了 kopia 将服务器里重要的数据都做了额外备份，但是还是对 Immich 的数据备份缺失了用户设置的部分。</p>



  
  

<blockquote class="alert-blockquote alert-summary">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Summary</span>
  </p>
  <p>在部署一个服务的时候，要调查好做服务迁移的时候需要备份和导出的内容, 尽量将数据 mount 到主机上，同时结合 <code>Crontab</code> 和 kopia 等工具去做一个定时的容灾备份，确保自己的重要数据万无一失。</p>

</blockquote>
<h3 id="vmmem-内存和-cpu-占用过高">Vmmem 内存和 CPU 占用过高</h3>
<p>大概率是由于 WSL2 没有限制 docker-desktop 的内存和 CPU 用量导致的，这种时候<strong>重启一下 docker-desktop</strong> 使用率应该就会回到正常值，一劳永逸的话参考一下下面的 [CPU 设置]( #Cpu &amp; Memory Usage Too High) 章节。</p>
<h2 id="basic-information--setting-基础信息和设置">Basic Information &amp; Setting 基础信息和设置</h2>
<h3 id="where-the-volumes-of-container-storage">Where The Volumes of Container Storage</h3>
<p><a href="https://stackoverflow.com/questions/43181654/locating-data-volumes-in-docker-desktop-windows" target="_blank" rel="noopener">Locating data volumes in Docker Desktop (Windows)</a>
: 除了指定了目录的 volume，其他 docker-desktop(WSL2) 的 volume 将会存放在 <code>\\wsl.localhost\docker-desktop-data\data\docker\volumes</code> 中</p>
<h3 id="cpu--memory-usage-too-high">Cpu &amp; Memory Usage Too High</h3>
<p>修改 windows 上 WSL2 的配置文件，限制 docker 对应的 WSL 服务的内存和内核上限，官方的设置文档如下：<a href="https://learn.microsoft.com/zh-tw/windows/wsl/wsl-config#wslconfig" target="_blank" rel="noopener">wslconfig</a>
，其他参考资料 <a href="https://blog.csdn.net/qq_31745863/article/details/129852886" target="_blank" rel="noopener">CSDN</a>
</p>
<p>配置文件的地址为：<code>c:\user\{your name}\.wslconfig</code> ，如果没有该文件就手动创建一个，可以仅仅简单的配置如下项目即可，具体的数值参考自己电脑的配置，更多配置项可以参考官方文档：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>.config</span>
    </div>
    <div class="code-content">
        
        <pre tabindex="0"><code class="language-.config" data-lang=".config">[wsl2]
# 核心数配置
processors=8
memory=8GB</code></pre>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>保存后用如下命令关闭 WSL 并重启docker即可</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>powershell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-shutdown</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script>]]></content:encoded>
    </item>
    <item>
      <title>Windows Configuration05 CUDA &amp; Cudnn</title>
      <link>https://aikenh.cn/posts/windowscudacudnn/</link>
      <pubDate>Mon, 24 Apr 2023 09:50:01 +0000</pubDate>
      <guid>https://aikenh.cn/posts/windowscudacudnn/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;在 Windows 和 WSL2 中安装 Cuda 和 Cudnn ，是配置 GPU 开发环境中重要的一步，其支撑了 AI 模型进行 Training 和 Interface 。本篇介绍安装 CUDA 和 Cudnn 的步骤和一些踩过的坑。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;参考资料如下：&lt;a href=&#34;https://blog.csdn.net/halou10200912/article/details/106048719&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;版本查看&lt;/a&gt;
 | &lt;a href=&#34;https://zhuanlan.zhihu.com/p/99880204&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Win 安装 Cuda 和cuDNN&lt;/a&gt;
 | &lt;a href=&#34;https://blog.csdn.net/Apple_Coco/article/details/129293019&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;WSL 2 安装 CUDA 和cuDNN&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id=&#34;win-11-安装-cuda-和-cudnn&#34;&gt;Win 11 安装 CUDA 和 cuDNN&lt;/h2&gt;
&lt;h3 id=&#34;cuda&#34;&gt;CUDA&lt;/h3&gt;
&lt;p&gt;首先在 Nvidia 的控制面板：&lt;strong&gt;帮助-系统信息&lt;/strong&gt;的如下位置，查看 GPU 最大支持的 CUDA 版本：&lt;/p&gt;
&lt;p&gt;
&lt;div class=&#34;post-img-view&#34;&gt;
  &lt;a data-fancybox=&#34;gallery&#34; href=&#34;https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424130608.png&#34;&gt;
    &lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424130608.png&#34;class=&#34;responsive-image&#34; src=&#34;https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424130608.png&#34; style=&#34;display: block; margin: 0 auto;&#34;
      alt=&#34;image.png&#34;  /&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;script&gt;
  document.addEventListener(&#34;DOMContentLoaded&#34;, function() {
      var images = document.querySelectorAll(&#34;.responsive-image&#34;);
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + &#34;px&#34;;
      });
  });
&lt;/script&gt;
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>在 Windows 和 WSL2 中安装 Cuda 和 Cudnn ，是配置 GPU 开发环境中重要的一步，其支撑了 AI 模型进行 Training 和 Interface 。本篇介绍安装 CUDA 和 Cudnn 的步骤和一些踩过的坑。</p>
</blockquote>
<p>参考资料如下：<a href="https://blog.csdn.net/halou10200912/article/details/106048719" target="_blank" rel="noopener">版本查看</a>
 | <a href="https://zhuanlan.zhihu.com/p/99880204" target="_blank" rel="noopener">Win 安装 Cuda 和cuDNN</a>
 | <a href="https://blog.csdn.net/Apple_Coco/article/details/129293019" target="_blank" rel="noopener">WSL 2 安装 CUDA 和cuDNN</a>
</p>
<h2 id="win-11-安装-cuda-和-cudnn">Win 11 安装 CUDA 和 cuDNN</h2>
<h3 id="cuda">CUDA</h3>
<p>首先在 Nvidia 的控制面板：<strong>帮助-系统信息</strong>的如下位置，查看 GPU 最大支持的 CUDA 版本：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424130608.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424130608.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424130608.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>也可以使用 Nvidia-smi 命令在 Powershell 或者 CMD 中查看:</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424130700.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424130700.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424130700.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>确定了版本之后到 <a href="https://developer.nvidia.com/cuda-downloads" target="_blank" rel="noopener">Nvidia CUDA下载页面</a>
 下载指定版本的 CUDA 进行安装（根据安装指引进行）即可，安装位置等默认即可，其中有一些安装选项即是 Nvidia GeForce Experience 安装的内容。</p>
<p>安装完成后在 CMD 或者 PowerShell 确认是否安装完成（需要重启终端）：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>powershell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">nvcc</span> <span class="n">-V</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424131341.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424131341.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424131341.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>显示如上信息可看到指定的版本已经安装成功，然后我们可以在 CMD 中执行如下命令来获取安装地址/设置环境变量：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>powershell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">set </span><span class="n">cuda</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424131612.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424131612.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424131612.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>完成这些后我们就可以开始安装 CuDNN 了，CuDNN 的安装需要我们记住 Cuda 的安装地址。</p>
<h3 id="cudnn">cuDNN</h3>
<p>在 Nvidia 官网注册账号，并在 <a href="https://developer.nvidia.com/rdp/cudnn-download" target="_blank" rel="noopener">cuDNN 下载界面</a>
下载对应版本的 Package 后，讲 Package 中各个目录下的内容放到 CUDA 文件夹的对应目录下即可。</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424132305.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424132305.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424132305.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>即 <code>mv cuDNN/lib/* CUDA/lib/*</code> &hellip;；拷贝完成后可以执行 CUDA 中自带的校验工具查看安装情况：</p>
<ul>
<li>/cuda/extras/demo_suite/deviceQuery.exe</li>
<li>/cuda/extras/demo_suite/bandwidthTest.exe</li>
</ul>
<p>可以看到验证详细结果和是否通过。</p>
<h2 id="wsl-2-配置-cuda-和-cudnn">WSL 2 配置 CUDA 和 cuDNN</h2>
<p>建议可以先看看： <a href="https://docs.nvidia.com/cuda/wsl-user-guide/index.html#cuda-support-for-wsl-2" target="_blank" rel="noopener">NVIDIA GPU Accelerated Computing on WSL 2</a>
</p>
<p>新版的 WSL 2 对于 GPU 的支持已经相当的友善，能够直接调用 Windows 的 GPU，但是在使用过程前还是需要对环境进行一定的配置。具体分为以下的两步：</p>
<ol>
<li>安装 cuda-toolkit：注意不能重复安装 CUDA 驱动，避免和 Windows 系统的 CUDA 驱动产生冲突</li>
<li>安装 cuDNN</li>
<li>（非必须）设置环境变量</li>
</ol>
<p>以下以 Ubuntu WSL 2 为例，介绍以下具体的安装过程。</p>
<h3 id="cuda-toolkit-on-wsl-2">CUDA-toolkit on WSL 2</h3>
<p>通过 <a href="https://developer.nvidia.com/cuda-downloads?target_os=Linux&amp;target_arch=x86_64&amp;Distribution=WSL-Ubuntu&amp;target_version=2.0" target="_blank" rel="noopener">Nvidia 的官方下载页面</a>
选择 WSL-Ubuntu 即可找到对应的安装工具，我们这里选择 runfile 的方式进行，按照官方给出的安装指令进行，即：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424133107.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424133107.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230424133107.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo sh cuda_12.1.1_530.30.02_linux.run</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>下载对应的 run 包后执行安装即可。</p>
<h3 id="cudnn-on-wsl-2">cuDNN on WSL 2</h3>
<p>在 Ubuntu 上安装 cuDNN 实际上除了网上资料很多的下载包进行安装，直接用以下的方式进行安装即可。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install nvidia-cudnn</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>安装后执行 nvcc &ndash;version 验证版本。</p>
<h3 id="env">Env</h3>
<blockquote>
<p>这一块的设置好像目前已经是不需要的，首先可以尝试不配置这一块内容。以下我会给出我这边的配置</p>
</blockquote>
<p>环境配置这块好像并不需要执行，如果还是报错的话，可以按照以下的方式来配置 zshrc 或者 bashrc。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CPATH</span><span class="o">=</span>/usr/local/cuda/include:<span class="nv">$CPATH</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">LD_LIBRARY_PATH</span><span class="o">=</span>/usr/local/cuda/lib64/:<span class="nv">$LD_LIBRARY_PATH</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">PATH</span><span class="o">=</span>/usr/local/cuda/bin:<span class="nv">$PATH</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CUDA_ROOT</span><span class="o">=</span>/usr/local/cuda</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>or</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">LD_LIBRARY_PATH</span><span class="o">=</span>/usr/local/cuda-12.1/lib64/<span class="o">{</span>LD_LIBRARY_PATH:+:<span class="o">{</span>LD_LIBRARY_PATH<span class="o">}}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>这里顺便给出一个路径 /usr/lib/wsl/lib 中会有相关的 so 文件的路径，应该是和主机互通的地方。</p>
<h2 id="报错分析">报错分析</h2>
<p>Could not load library libcudnn_cnn_infer.so.8. Error: libcuda.so: cannot open shared object file: N</p>
<blockquote>
<p>没有安装或者配置 cudnn</p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Docker Configuration00 Install on WSL2</title>
      <link>https://aikenh.cn/posts/%E5%9C%A8windows%E4%B8%8A%E5%AE%89%E8%A3%85docker/</link>
      <pubDate>Tue, 28 Sep 2021 05:34:21 +0000</pubDate>
      <guid>https://aikenh.cn/posts/%E5%9C%A8windows%E4%B8%8A%E5%AE%89%E8%A3%85docker/</guid>
      <description>install docker on wsl2 with portainer</description>
      <content:encoded><![CDATA[<p>基于 WSL2 对于 Docker 的适配，本文介绍 Windows 下利用 WSL2 对 Docker 的安装和部署，对于 WSL2 的安装可以参考上篇文章： <a href="https://aikenh.cn/cn/WSL2/" target="_blank" rel="noopener">Windows Configuration01 WSL2 - AikenH Blogps</a>
</p>
<h2 id="install-docker-on-windows">Install Docker on Windows</h2>
<p>该部分主要介绍以下几内容：安装，存储盘迁移，连接 WSL2 发行版，完成了这几步之后就可以畅游 Docker 世界了。</p>
<blockquote>
<p>前置：先安装好一个 WSL2 的发行版，win11 自带 WSL2</p>
</blockquote>
<p>首先，官网 <a href="https://www.docker.com/" target="_blank" rel="noopener">Docker:</a>
 下载 Docker Desktop for windows，安装基于 WSL2 的 docker，安装完成后 Docker 的发行版和存储目录会默认存放在，该地址可以用来确认后续的迁移状态。</p>
<ul>
<li>Docker-Desktop/data：<code>%LOCALAPPDATA%/Docker/wsl</code></li>
<li>WSL2：<code>%LOCALAPPDATA%/packages/c......./local_state</code></li>
</ul>
<p>安装完后首先打开 docker 确认没有其他异常问题报警，然后就可以对存储空间和 Desktop 进行迁移（option），迁移的方式可以参考上文中对 WSL2 的迁移。下面给出脚本便于使用：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>powershell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-shutdown</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 系统导出</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-export</span> <span class="nb">docker-desktop</span><span class="n">-data</span> <span class="s2">&#34;D:\docker\docker-desktop-data.tar&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-export</span> <span class="nb">docker-desktop</span> <span class="s2">&#34;D:\docker\docker-desktop.tar&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 删除原系统</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-unregister</span> <span class="nb">docker-desktop</span><span class="n">-data</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-unregister</span> <span class="nb">docker-desktop</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 挂载新目录</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-import</span> <span class="nb">docker-desktop</span> <span class="n">D:</span><span class="p">\</span><span class="n">docker</span><span class="p">\</span><span class="nb">docker-desktop</span> <span class="n">D:</span><span class="p">\</span><span class="n">docker</span><span class="p">\</span><span class="nb">docker-desktop</span><span class="p">.</span><span class="py">tar</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-import</span> <span class="nb">docker-desktop</span><span class="n">-data</span> <span class="n">D:</span><span class="p">\</span><span class="n">docker</span><span class="p">\</span><span class="nb">docker-desktop</span><span class="n">-data</span> <span class="n">D:</span><span class="p">\</span><span class="n">docker</span><span class="p">\</span><span class="nb">docker-desktop</span><span class="n">-data</span><span class="p">.</span><span class="py">tar</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 建立软连接（需要再cmd中执行，powershell中可能识别不了mklink命令）</span>
</span></span><span class="line"><span class="cl"><span class="c"># 否则可能会导致 docker-desktop-data 无法正确启动，导致重启后掉盘</span>
</span></span><span class="line"><span class="cl"><span class="n">mklink</span> <span class="s2">&#34;C:\Users\{user-name}\AppData\Local\Docker\wsl\data\ext4.vhdx&#34;</span> <span class="s2">&#34;D:\docker\docker-desktop-data\ext4.vhdx&#34;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>迁移完成后重启 docker 即可，至此，安装就算完成了。</p>
<h2 id="basic-setting">Basic Setting</h2>
<p>为了发挥完整的性能，以及更容易执行 volume 参数进行 data 的挂载，这边强烈建议在 wsl2 中使用 docker！为此，在 docker-desktop 中需要设置如下的几个地方：</p>
<blockquote>
<p>例如 alist 镜像，在 wsl2 中设置好了 volume 参数，把 data 准确的挂载出来后，数据就不会再 docker 重启的时候丢失了。</p>
</blockquote>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230330085804.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230330085804.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230330085804.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>设置完成后，在 WSL2 中就可以识别和执行 Docker 命令了，后续对 docker、docker-compose 的操作都在 WSL2 中完成即可，接下来就可以在 docker 的应用市场中愉快的淘金了。</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230330090709.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230330090709.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230330090709.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<h2 id="docker-apps-personal-recommand-">Docker Apps( personal recommand )</h2>
<p>后续会对其中的一些来做简单的部署和讲解，其实很多都挺适合在 NAS 上部署的，结合内网穿透技术能有一个更好的体验，后面也可以简单介绍以下内网穿透。</p>
<ol>
<li>Alist 个人云管理中心，统一管理，访问，在线观看等，强力推荐</li>
<li>Immich 局域网图片备份和管理中心，有移动端 APP，自动备份，权限隔离，</li>
<li>Kavita 图书、PDF 管理中心（还在找更好的 pdf 中心）</li>
<li>wikijs 个人 wikipage</li>
<li>foamzou/melody：音乐资源搜索和自动上传网易云云盘</li>
<li>memos：个人备忘录中心</li>
</ol>
<p>想要一个能够同时管理书籍和论文的 PDF 管理中心，最好能够集成一个比较好的 PDF 阅读和标记工具（比如直接用 Edge 把），不知道有没有类似的。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Windows Configuration01 WSL2</title>
      <link>https://aikenh.cn/posts/wsl2/</link>
      <pubDate>Tue, 28 Sep 2021 02:17:39 +0000</pubDate>
      <guid>https://aikenh.cn/posts/wsl2/</guid>
      <description>init and set up WSL2</description>
      <content:encoded><![CDATA[<p>WSL（Windows Subsystem Linux） 将 Linux 环境部署在 Windows 中，Linux 环境在补全了 Windows 开发上的不足之外（Bash 等），还有以下的几个特性极大的便利开发和日常使用，因此强烈推荐启用并安装。</p>
<ul>
<li>win11 中 wsl2 已经支持相应主机的 cuda，便利了机器学习的开发；</li>
<li>子系统中通过/mnt 挂载了 windows 的磁盘，可以通过子系统访问和管理 windows 环境；</li>
<li>windows 资源管理器可访问和管理子系统中的文件</li>
<li>支持 windows 打开子系统中的 GUI 应用</li>
</ul>
<p>无论是将 windows 和 linux 分别作为日常和开发的环境来隔离，还是两个协同去做开发和日常，都是一个比较不错的选择，下面就介绍一下如何安装和使用 WSL2。</p>
<ul>
<li>开始之前可以参考 <a href="">windows terminal</a>
 安装一下这个官方的终端模拟器，在 windows 上的表现是比较优秀的</li>
<li>如果是考虑在 windows 环境开发的话，也可以参考这个[windows]，里面有我个人推荐的一些应用。</li>
</ul>
<h2 id="启用并安装-wsl2">启用并安装 WSL2</h2>
<p>安装和启用 WSL2 需要在 windows 的服务中勾选 Hyper-V 和 Windows Subsystem Linux 支持两个选项，具体操作如下：</p>
<ol>
<li>Win + S 搜索 &ldquo;功能&rdquo;，打开启用或关闭 windows 功能</li>
<li>启用对应功能，功能安装完毕后即可

<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230305091044.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230305091044.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230305091044.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>


<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230305091150.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230305091150.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/3070PC/20230305091150.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</li>
<li>安装 linux 发行版可以在 windows store 安装，也可以通过如下的命令进行安装：</li>
</ol>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>powershell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="c"># 列出对应的发行版</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="n">-l</span> <span class="n">-o</span>
</span></span><span class="line"><span class="cl"><span class="c"># 选择相应的发行版进行安装</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-install</span> <span class="n">-d</span> <span class="p">&lt;</span><span class="n">Distribution</span> <span class="n">Name</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c"># 如果当前的WSL是1版本，更新到2</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="n">-l</span> <span class="n">-v</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-set-default-version</span> <span class="mf">2</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>安装完发行版之后，WindowsTerminal 中应该会自动出现其配置文件，如果没有出现也不要紧，可以先迁移其存储位置后再添加配置文件。</p>
<h2 id="mount-and-move">Mount And Move</h2>
<p><strong>WSL 的默认存储路径</strong>：<code>%LOCALAPPDATA%/packages/c......./local_state</code> 搜索 Ubuntu 文件夹</p>
<p>而通常 windows 都会有分区，如果是 C 盘较小的（建议是可以不用分区），可以修改 WSL 的默认存储路径，将磁盘挂载在别的地方，操作如下：</p>
<p>首先关闭对应的 wsl 服务，并查看关闭的状态：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>powershell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-shutdown</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="n">-l</span> <span class="n">-v</span> <span class="c"># 查看状态</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>确认已经关闭后我们可以将该子系统文件导出，并将原有的系统注销删除</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>powershell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="c"># 导出wsl2 system； docker-desktop &amp; docker-desktop-data</span>
</span></span><span class="line"><span class="cl"><span class="c"># 导出系统 wsl --export &lt;DistroName&gt; &lt;PathToTarArchive&gt;</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-export</span> <span class="n">Ubuntu</span><span class="p">-</span><span class="mf">20.04</span> <span class="n">E:</span><span class="p">\</span><span class="n">WSLWorkspace</span><span class="p">\</span><span class="n">ubuntu</span><span class="p">.</span><span class="py">tar</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 删除（注销）系统</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-unregister</span> <span class="n">Ubuntu</span><span class="p">-</span><span class="mf">20.04</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>最后在我们希望的地方重新注册该系统：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>powershell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="c"># 导入系统到指定的新位置(使用新路径导入新系统)</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-import</span> <span class="n">Ubuntu</span><span class="p">-</span><span class="mf">20.04</span> <span class="n">E:</span><span class="p">\</span><span class="n">WSLWorkspace</span> <span class="n">E:</span><span class="p">\</span><span class="n">WSLWorkspace</span><span class="p">\</span><span class="n">ubuntu</span><span class="p">.</span><span class="n">tar</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>通常来说，wsl 会自动为系统生成配置文件，这里在 terminal 中可能会出现两个 ubuntu 的 unid，那么我们就把第一个配置文件删掉，然后修改新的配置文件为（主要是在后面添加-u user_name）在指定启动的用户：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>txt</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">&lt;...wsl.exe&gt; -d ubuntu -u &lt;user_name&gt;</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>or 修改注册表，可以参考以下的方法： <a href="https://www.vrunion.work/wsl-2-%E7%B3%BB%E7%BB%9F%E8%BF%81%E7%A7%BB%E5%88%B0%E9%9D%9E%E7%B3%BB%E7%BB%9F%E7%9B%98" target="_blank" rel="noopener">wsl2系统迁移到非系统盘</a>
</p>
<p>or 尝试，但是注意这种方式就不急着注销系统，因为他可能会重新安装在 C 盘，所以最后在注销。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>shell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ubuntu2204 config --default-user &lt;user_name&gt;</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>删除多余的所有 tar，over</p>
<h3 id="dockerbased-on-wsl2">Docker（based on wsl2）</h3>
<p>基于 WSL2 安装的 Docker 也能用这种方式迁移相应的存储地点。就仅给出大概的操作流程，不在赘述。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>powershell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="c"># export</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-export</span> <span class="nb">docker-desktop</span><span class="n">-data</span> <span class="s2">&#34;D:\docker\docker-desktop-data.tar&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-export</span> <span class="nb">docker-desktop</span> <span class="s2">&#34;D:\docker\docker-desktop.tar&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># unresiester</span>
</span></span><span class="line"><span class="cl"><span class="c"># import </span>
</span></span><span class="line"><span class="cl"><span class="c"># restart</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="ssh">SSH</h2>
<p><a href="https://www.jianshu.com/p/3e2b7252b4b8" target="_blank" rel="noopener">wsl2启用SSH</a>
，ssh功能应该默认是启用的，如果ssh没有启用的话</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>sh</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">vim /etc/ssh/sshd_config</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>修改如下的几个配置</p>
<blockquote>
<p>Port = 22 去掉这行的 <code>#</code>，代表启用端口号 22
ListenAddress 0.0.0.0 去掉这行的#，代表监听所有地址
PasswordAuthentication yes，将这行的no改成yes，代表支持账号密码形式的登录</p>
</blockquote>
<p>重启服务</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>shell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo service ssh restart</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>此时还不能支持root用户密码登录,默认情况下，root用户只支持用RSA登录，但是可以修改配置的,切换到root用户打开SSH的配置文件</p>
<p>找到行<code>PermitRootLogin prohibit-password</code>保留这行的#，这意味着：允许root登录，但是禁止root用密码登录，所以这行要注释掉。
需要添加一行:</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>powershell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">PermitRootLogin</span> <span class="n">yes</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>剩下的其余配置按照<code>Linux</code>文档进行文件的配置</p>
<h2 id="proxy">PROXY</h2>
<h3 id="update">Update</h3>
<p>由于 WSL 2 中许多 CLI 工具都需要额外的进行代理设置，还有一些代码中也需要指定代理，令人不厌其烦，因此这里更新对于诸多 CLI 的额外设置。</p>
<p>参考资料（从前到后）：</p>
<ul>
<li><a href="https://blog.skk.moe/post/enable-proxy-on-ubuntu/" target="_blank" rel="noopener">Ubuntu「一键」设置代理 | Sukka&rsquo;s Blog (skk.moe)</a>
</li>
<li><a href="https://cat.ms/posts/wsl2-network-tricks/" target="_blank" rel="noopener">WSL2 的一些网络访问问题 | Artin&rsquo;s Blog (cat.ms)</a>
</li>
<li><a href="https://docs.cfw.lbyczf.com/contents/tun.html#windows" target="_blank" rel="noopener">TUN 模式 | Clash for Windows</a>
</li>
<li><a href="https://www.sulinehk.com/post/wsl-development-environment-proxy-settings/" target="_blank" rel="noopener">WSL 开发环境代理设置 - sulinehk&rsquo;s blog </a>
</li>
<li><a href="https://www.kiritoghy.cn/archives/wsl2pei-zhi-dai-li" target="_blank" rel="noopener">WSL2 配置代理 (kiritoghy.cn)</a>
</li>
</ul>
<p>推荐）<strong>通用方案</strong>：使用 Clash 的 TUN 模式，该方案会设置一个虚拟网卡，自动接管该方案设置完毕后无需配置 WSL 中任意 CLI 的代理。</p>
<blockquote>
<p>首先基于 server 旁边的地球按钮安装需要的依赖，安装完后就可以打开 tun 模式。</p>
</blockquote>
<p>备选）<strong>基础方案</strong>：使用脚本设置各个常用 CLI 的代理，需要设置代理的主要有以下这些：npm, yarn 等专用软件。</p>
<blockquote>
<p>wget 和 curl 这种使用的是全局的代理，所以不需要额外的设置，
但是像 npm 之类的专有软件一般有命令或者对应的配置文件；</p>
</blockquote>
<p>基于参考资料，个人基于需求进行修改，提供脚本如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>除了上述文章提到的这些，还有一个很容易遇到的问题就是 pip 的安装问题，设置 pip 的代理的方式有以下几种：</p>
<ul>
<li>使用 pip 的 <code>--proxy</code> 选项设置代理：<code>pip install libname --proxy http://127.0.0.1:7890</code></li>
<li>直接编辑pip的配置文件<code>pip.ini</code>，在其中的<code>[global]</code>下面添上一行<code>proxy = http://127.0.0.1:7890</code></li>
<li>使用 pip 的 <code>config</code> 命令来写配置文件：<code>pip config set global.proxy http://127.0.0.1:7890</code></li>
</ul>
<p>参考文献：<a href="https://codeantenna.com/a/pAOz55u5Px" target="_blank" rel="noopener">pip：ProxyError(‘Cannot connect to proxy. - CodeAntenna</a>
</p>
<h3 id="basic">Basic</h3>
<p>set the proxy for the WSL from windows, so we can update the packages ez.</p>
<ol>
<li>首先获取windows IP:</li>
</ol>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>shell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cat /etc/resolv.conf<span class="p">|</span>grep nameserver<span class="p">|</span>awk <span class="s1">&#39;{print $2}&#39;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 假设获取的windows ip 为170.20.0.1</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><ol start="2">
<li>查看代理软件的端口设置，开启局域网 LAN 链接，开启<a href="https://blog.csdn.net/nick_young_qu/article/details/113709768" target="_blank" rel="noopener">防火墙</a>
</li>
</ol>
<ul>
<li>添加入站规则 -&gt; 新建规则</li>
<li>类型：自定义</li>
<li>程序：所有程序</li>
<li>协议和端口：默认</li>
<li>作用域：
<ul>
<li>本地为任何 ip</li>
<li>远程为下列 IP，把 WSL2 获取到的 ip 添加进去（比如上面就是 172.20.0.0/20）（掩码一般是 20 位）</li>
</ul>
</li>
<li>操作：允许链接</li>
<li>配置文件：三个全选</li>
<li>名称：自定义</li>
</ul>
<ol start="3">
<li>Clash 开启 LAN 和端口,</li>
<li>WSL2 中设置代理</li>
</ol>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>shell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">https_proxy</span><span class="o">=</span>172.20.0.1:8890
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">http_proxy</span><span class="o">=</span>172.20.0.1:8890</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p><strong>Reference</strong>： <a href="https://gray-ice.com/2021/10/04/WSL2%E4%BD%BF%E7%94%A8Windows%E4%B8%8A%E7%9A%84%E4%BB%A3%E7%90%86%E8%BD%AF%E4%BB%B6/" target="_blank" rel="noopener">proxy配置参考</a>
</p>
<p>这里提供一下 WSL 的代理设置脚本</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># show and set proxy for WSL</span>
</span></span><span class="line"><span class="cl"><span class="k">function</span> GetHostIp<span class="o">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nv">ip</span><span class="o">=</span><span class="k">$(</span>cat /etc/resolv.conf<span class="p">|</span>grep nameserver<span class="p">|</span>awk <span class="s1">&#39;{print $2}&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;the host ip is: </span><span class="nv">$ip</span><span class="s2">, then we ping it to test fireware&#34;</span>
</span></span><span class="line"><span class="cl">  ping <span class="nv">$ip</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">function</span> SetProxy<span class="o">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nv">ip</span><span class="o">=</span><span class="k">$(</span>cat /etc/resolv.conf<span class="p">|</span>grep nameserver<span class="p">|</span>awk <span class="s1">&#39;{print $2}&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">  <span class="nb">export</span> <span class="nv">http_proxy</span><span class="o">=</span>http://<span class="nv">$ip</span>:8890
</span></span><span class="line"><span class="cl">  <span class="nb">export</span> <span class="nv">https_proxy</span><span class="o">=</span>https://<span class="nv">$ip</span>:8890
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">function</span> unsetProxy<span class="o">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nb">unset</span> http_proxy
</span></span><span class="line"><span class="cl">  <span class="nb">unset</span> https_proxy
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">getip</span><span class="o">=</span>GetHostIp
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">proxyon</span><span class="o">=</span>SetProxy
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">proxyoff</span><span class="o">=</span>unsetProxy</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="setting">SETTING</h2>
<p>WSL在Windows Terminal的启动目录设置</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>json</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="err">//wsl$/Ubuntu</span><span class="mf">-20.04</span><span class="err">/home/aikenhong</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="vmmem-内存占用问题">Vmmem 内存占用问题</h3>
<blockquote>
<p>Windows 使用 Wsl2 &amp; 基于 Wsl2 的 Docker 时会发现 Vmmem 占用了系统大量的内存（15g/32g），且同时 Docker Dashboard 和 Linux 中的 Top 命令都显示占用并不高。</p>
</blockquote>
<p>Vmmem 进程是 Windows 系统为 WSL2 系统预留的虚拟进程，为 WSL2 向系统申请内存和 CPU 资源，即使在 WSL2 并不需要的时候也会保留大量的内存，其默认消耗总内存的50% (20175之前的版本则是80%) 或者 8G，选择其中较小的一个执行。</p>
<ul>
<li>如果需要使用内存且无需 WSL2 时可以使用 <code>wsl --shutdown</code> 命令关闭 WSL2；</li>
</ul>
<p>进入用户文件夹后，新建 or 打开 <code>.wslconfig</code> 文件</p>
<ul>
<li>powershell <code>cd ~</code></li>
<li>WIN+R <code>%UserProfile%</code></li>
<li>资源管理器 %UserProfile%</li>
</ul>
<p>在其中可以编辑 wsl2 的 memory 选项，手动其内存使用的上限：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>txt</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl"># Settings apply across all Linux distros running on WSL 2 
</span></span><span class="line"><span class="cl">[wsl2] 
</span></span><span class="line"><span class="cl">memory=8GB </span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>重启 WSL 或者直接重启电脑即可。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
