<?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>Linux on Linkzz&#39;s Blog</title>
    <link>https://linkzz.org/categories/linux/</link>
    <description>Recent content in Linux on Linkzz&#39;s Blog</description>
    <image>
      <title>Linkzz&#39;s Blog</title>
      <url>https://linkzz.org/logo.png</url>
      <link>https://linkzz.org/logo.png</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Wed, 10 Apr 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://linkzz.org/categories/linux/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>简单记录一下 Docker 容器中信任一个自签名证书的案例</title>
      <link>https://linkzz.org/posts/docker-trust-ca/</link>
      <pubDate>Wed, 10 Apr 2024 00:00:00 +0000</pubDate>
      
      <guid>https://linkzz.org/posts/docker-trust-ca/</guid>
      <description>&lt;h2 id=&#34;1-背景&#34;&gt;1. 背景&lt;/h2&gt;
&lt;p&gt;起因是我的 &lt;a href=&#34;https://tt-rss.org/&#34;&gt;ttrss&lt;/a&gt; 容器需要订阅一个自部署的微信公众号订阅服务 &lt;a href=&#34;https://github.com/cooderl/wewe-rss&#34;&gt;wewe-rss&lt;/a&gt; ，在 web 页面添加订阅一个订阅源 &lt;code&gt;http://192.168.5.128:8109/feeds/MP_WXS_3925660753.atom&lt;/code&gt;，添加之后 ttrss 报错&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;无法从指定的网址下载:cURL error 7: Failed to connect to 192.168.5.128 port 80 after 0 ms: Couldn&amp;#39;t connect to server (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for http://192.168.5.128/feeds/MP_WXS_3925660753.atom
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是仔细看报错日志，我的服务端口明明是 &lt;code&gt;8109&lt;/code&gt; 但是 ttrss 却访问了 80，暂时不知是不是 ttrss 的 BUG，所以我便换了一个 nginx 代理的本地服务来反代 wewe-rss 的服务，由于我 nginx 配置了一个自签名的证书，客户端信任这个证书之后可以开启一些自部署服务只能 &lt;code&gt;https&lt;/code&gt; 才能开启的功能，比如密码管理器 &lt;code&gt;vaultwarden&lt;/code&gt; 。扯远了，回到正题，现在我已经配置好了反代的服务，新的订阅服务链接为：&lt;code&gt;https://wewe.linkzz.hm/feeds/MP_WXS_3925660753.atom&lt;/code&gt;，但是直接在 &lt;code&gt;ttrss&lt;/code&gt; 中配置还是会报错证书无法信任，所以这就来解决这个问题。&lt;/p&gt;
&lt;h2 id=&#34;2-信任证书&#34;&gt;2. 信任证书&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;以下的操作是基于 &lt;code&gt;Ubuntu 2204&lt;/code&gt; 版本，其他发行版没测试过。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;21-确认证书类型&#34;&gt;2.1 确认证书类型&lt;/h3&gt;
&lt;p&gt;我是使用的 &lt;a href=&#34;https://github.com/FiloSottile/mkcert&#34;&gt;mkcert&lt;/a&gt; 生成的 CA 证书，证书包含 &lt;code&gt;rootCA.crt&lt;/code&gt; 和 &lt;code&gt;rootCA.pem&lt;/code&gt; 文件，crt 是二进制文件，只包含证书内容，在 windows 环境下可以直接安装，而 pem 是 base64 编码的文本文件，它包含了证书内容、证书链等信息，在 Ubuntu 中信任证书需要 pem 文件。&lt;/p&gt;
&lt;h3 id=&#34;22-宿主机信任证书&#34;&gt;2.2 宿主机信任证书&lt;/h3&gt;
&lt;p&gt;因为可能不止一个容器需要信任证书，所以选择先在宿主机信任证书，然后映射宿主机的证书文件夹到容器，这样宿主机和容器都能达到信任证书的效果。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拷贝证书文件&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-shel&#34; data-lang=&#34;shel&#34;&gt;cp your_pem.pem /usr/local/share/ca-certificates/rootCA.crt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注意后缀名需要重命名为 crt&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;更新证书&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 如果没安装 ca-certificates 需要先安装 ca-certificates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# apt install ca-certificates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;update-ca-certificates
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果提示 &lt;code&gt;command not found&lt;/code&gt; 安装 &lt;code&gt;ca-certificates&lt;/code&gt; 软件包即可&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Updating certificates in /etc/ssl/certs…
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rehash: warning: skipping ca-certificates.crt,it does not contain exactly one certificate or CRL
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1 added, 0 removed; done.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Running hooks in /etc/ca-certificates/update.d…
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;done.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面日志没有报错提示添加了1个证书，表示添加信任证书成功。&lt;/p&gt;
&lt;p&gt;运行 curl 验证一下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -v https://wewe.linkzz.hm/feeds/MP_WXS_3925660753.atom
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*   Trying 192.168.5.120:443…
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TCP_NODELAY set
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Connected to wewe.linkzz.hm (192.168.5.120) port 443 (#0)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* ALPN, offering h2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* ALPN, offering http/1.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* successfully set certificate verify locations:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*   CAfile: /etc/ssl/certs/ca-certificates.crt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  CApath: /etc/ssl/certs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.3 (OUT), TLS handshake, Client hello (1):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.3 (IN), TLS handshake, Server hello (2):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.2 (IN), TLS handshake, Certificate (11):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.2 (IN), TLS handshake, Server finished (14):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.2 (OUT), TLS handshake, Finished (20):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.2 (IN), TLS handshake, Finished (20):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* ALPN, server accepted to use http/1.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Server certificate:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*  subject: O=mkcert development certificate; OU=LINKZZ-LAPTOP\linkzz@linkzz-laptop (linkzz)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*  start date: Dec 18 01:59:08 2023 GMT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*  expire date: Mar 18 01:59:08 2026 GMT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*  subjectAltName: host &amp;#34;wewe.linkzz.hm&amp;#34; matched cert&amp;#39;s &amp;#34;*.linkzz.hm&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*  issuer: O=mkcert development CA; OU=LINKZZ-LAPTOP\linkzz@linkzz-laptop (linkzz); CN=mkcert LINKZZ-LAPTOP\linkzz@linkzz-laptop (linkzz)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*  SSL certificate verify ok.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; GET /feeds/MP_WXS_3925660753.atom HTTP/1.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; Host: wewe.linkzz.hm
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; User-Agent: curl/7.68.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; Accept: */*
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Mark bundle as not supporting multiuse
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; HTTP/1.1 200 OK
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; Server: nginx/1.18.0 (Ubuntu)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; Date: Wed, 10 Apr 2024 09:14:46 GMT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; Content-Type: application/atom+xml; charset=utf-8
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; Content-Length: 3944
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; Connection: keep-alive
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; X-Powered-By: Express
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; Access-Control-Allow-Origin: *
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; Access-Control-Expose-Headers: authorization
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; ETag: W/&amp;#34;f68-vmfb7ZvVPKMACdW27xekYBF0xLA&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到已经正常响应了。&lt;/p&gt;
&lt;h3 id=&#34;23-映射到容器证书目录&#34;&gt;2.3 映射到容器证书目录&lt;/h3&gt;
&lt;p&gt;下面更新 ttrss 的容器映射，将宿主机的 &lt;code&gt;/etc/ssl/certs&lt;/code&gt; 文件夹映射到容器相同目录 &lt;code&gt;/etc/ssl/certs&lt;/code&gt; 即可，我的是 compose 运行的，更新 docker compsoe 文件：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service.rss&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;wangqiru/ttrss:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ttrss&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;m&#34;&gt;181&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;80&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;SELF_URL_PATH=https://ttrss.linkzz.hm:443/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# please change to your own domain&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;DB_PASS=ttrss_bac&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# use the same password defined in `database.postgres`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=1000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=1000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;feed-icons:/var/www/feed-icons/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/etc/ssl/certs:/etc/ssl/certs&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;public_access&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;service_only&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;database_only&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;stdin_open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;always&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service.mercury&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# set Mercury Parser API endpoint to `service.mercury:3000` on TTRSS plugin setting page&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;wangqiru/mercury-parser-api:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mercury&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;public_access&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;service_only&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;always&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service.opencc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# set OpenCC API endpoint to `service.opencc:3000` on TTRSS plugin setting page&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;wangqiru/opencc-api-server:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;opencc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;NODE_ENV=production&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;service_only&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;always&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;database.postgres&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;postgres:13-alpine&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;postgres&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;POSTGRES_PASSWORD=ttrss_bac&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# feel free to change the password&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;~/postgres/data/:/var/lib/postgresql/data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# persist postgres data to ~/postgres/data/ on the host&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;database_only&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;always&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# utility.watchtower:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#   container_name: watchtower&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#   image: containrrr/watchtower:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#   volumes:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#     - /var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#   environment:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#     - WATCHTOWER_CLEANUP=true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#     - WATCHTOWER_POLL_INTERVAL=86400&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#   restart: always&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;feed-icons&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;public_access&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Provide the access for ttrss UI&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service_only&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Provide the communication network between services only&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;internal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;database_only&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Provide the communication between ttrss and database only&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;internal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重启容器即可生效。&lt;/p&gt;
&lt;p&gt;正常订阅的截图：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2024/04/534db7c24d693353bd904d5fdc9baabc.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;h2 id=&#34;3-总结&#34;&gt;3. 总结&lt;/h2&gt;
&lt;p&gt;自签名证书对于有很多自部署在 nas 或者内部服务器，不方便公用服务申请证书的服务是很方便的，今天更新了容器中添加自信任证书的方法，总结就是先宿主机信任自签名证书，然后将 &lt;code&gt;curl&lt;/code&gt; 等命令需要用到的证书文件夹 &lt;code&gt;/etc/ssl/certs/&lt;/code&gt; 文件夹直接映射到容器中国即可。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Docker 环境下的 qBittorrent 容器迁移至 lxc 保留配置</title>
      <link>https://linkzz.org/posts/qbittorrent-migration/</link>
      <pubDate>Tue, 09 Apr 2024 00:00:00 +0000</pubDate>
      
      <guid>https://linkzz.org/posts/qbittorrent-migration/</guid>
      <description>&lt;h2 id=&#34;1-背景&#34;&gt;1. 背景&lt;/h2&gt;
&lt;p&gt;我的 &lt;code&gt;qBittorrent&lt;/code&gt; 下载器是部署在 &lt;code&gt;Docker&lt;/code&gt; 容器中的，而这个 Docker 的宿主机是一个 pve 的容器，他有一个独立的 IP,这个 IP 的网关指向了一个透明网关以实现大陆网络优化（国内特色），关于我的网络拓扑可以查看我以前的这篇 &lt;a href=&#34;openwrt-wireguard&#34;&gt;文章&lt;/a&gt; 但是下载器的流量经过 &lt;code&gt;clash&lt;/code&gt; 之后需要单独对 &lt;code&gt;BT&lt;/code&gt; 流量命中规则，我用的是 clash-meta 的核心，支持逻辑规则，于是我是这样写的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# bt下载全直连&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;AND,((SRC-IP-CIDR,192.168.5.128/32),(NOT,((DST-PORT,443)))),DIRECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上规则解释就是：来自 &lt;code&gt;192.168.5.128&lt;/code&gt;IP 的目标端口非 &lt;code&gt;443&lt;/code&gt; 的连接全直连，比较简单粗暴一刀切，但是这个规则还是会误杀一部分的流量，但至少可以避免大部分的 &lt;code&gt;BT&lt;/code&gt; 流量了。&lt;/p&gt;
&lt;p&gt;虽然问题是暂时解决了，但这个方案并不是最优，存在以下坑：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果 &lt;code&gt;Docker&lt;/code&gt; 的宿主机 &lt;code&gt;IP&lt;/code&gt; 换了规则得更新&lt;/li&gt;
&lt;li&gt;目标端口 80 的流量也应该继续下面的规则匹配 (当然这是因为懒没加到规则里面)&lt;/li&gt;
&lt;li&gt;会误杀掉一部分的流量&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;2-迁移&#34;&gt;2. 迁移&lt;/h2&gt;
&lt;p&gt;为了解决上面提到的问题，也为了把 &lt;code&gt;qbittorrent&lt;/code&gt; 版本升级一下，我决定单独给他一个创建一个 &lt;code&gt;lxd&lt;/code&gt; 容器，这样可以将网络直接指向上级网关，不必走透明网关。&lt;/p&gt;
&lt;h3 id=&#34;21-创建容器&#34;&gt;2.1 创建容器&lt;/h3&gt;
&lt;p&gt;通过 pve 的内置 pct 命令创建容器：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct create &lt;span class=&#34;m&#34;&gt;117&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	ugreen:vztmpl/archlinux-base_20230608-1_amd64.tar.zst &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	--cores &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	--memory &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	--hostname qbit &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	--net0 &lt;span class=&#34;nv&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;eth0,bridge&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;vmbr0 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	--features &lt;span class=&#34;nv&#34;&gt;mount&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;nfs;cifs&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	--swap &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	--rootfs &lt;span class=&#34;nv&#34;&gt;volume&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;local-lvm:8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;22-设置容器&#34;&gt;2.2 设置容器&lt;/h3&gt;
&lt;p&gt;这样就创建好了一个基于 &lt;code&gt;archlinux&lt;/code&gt; 的 ct 容器，接下来启动进入容器简单设置一下：&lt;/p&gt;
&lt;p&gt;启动容器：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct start &lt;span class=&#34;m&#34;&gt;117&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;进入容器：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct enter &lt;span class=&#34;m&#34;&gt;117&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改网络开启 dhcp 自动获取 IP&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vi /etc/systemd/network/eth0.network
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Match]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Name = eth0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Network]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Description = Interface eth0 autoconfigured by PVE
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DHCP = yes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;IPv6AcceptRA = false
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将 DHCP 改为 yes, 重启网络服务&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl restart systemd-networkd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上内容均可以通过 pve 的 webui 界面完成。&lt;/p&gt;
&lt;h3 id=&#34;23-迁移配置-qbittorrent-nox&#34;&gt;2.3 迁移配置 qbittorrent-nox&lt;/h3&gt;
&lt;p&gt;在 headless 无头环境下运行 qbittorrent 我们需要下载 qbittorrent-nox，&lt;code&gt;nox -&amp;gt; no X server&lt;/code&gt;，没有 X 服务，外国人还是会起名。&lt;/p&gt;
&lt;p&gt;archlinux 下直接通过包管理器安装即可，版本也是当下最新的 &lt;code&gt;4.6.4&lt;/code&gt; 版本&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pacman -S qbittorrent-nox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动 qbittorrent-nox&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; qbittorrent-nox &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; systemctl start qbittorrent-nox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将 Docker 容器中的 qbittorrent 配置文件迁移到 &lt;code&gt;~/.config/qBittorrent/qBittorrent.conf&lt;/code&gt; 中，我的是 &lt;code&gt;v4.4.3.1&lt;/code&gt; 迁移到 &lt;code&gt;v4.6.4&lt;/code&gt;，迁移比较平滑，我所有的配置都继承了下来，如果是更低版本就不好说了，可以选择性的迁移。&lt;/p&gt;
&lt;h3 id=&#34;24-下载数据迁移&#34;&gt;2.4 下载数据迁移&lt;/h3&gt;
&lt;p&gt;原来的下载数据种子文件保留在 BT_backup 文件夹中，在 Docker 容器和新的配置文件下载路径一致的情况下可以平滑迁移，qbittorrent 不会报文件丢失，当然如果不需要迁移的话直接忽略掉就好了。&lt;/p&gt;
&lt;p&gt;将 BT_backup 文件夹内容复制到新的 qbittorrent 数据文件夹下相应的位置即可。&lt;/p&gt;
&lt;h2 id=&#34;3-结语&#34;&gt;3. 结语&lt;/h2&gt;
&lt;p&gt;此次迁移过程还是很顺利的，毕竟版本的变化也没那么大，由此我们可以学习下优质开源项目的向下兼容，破坏性的变化引入应该是很谨慎的。&lt;/p&gt;
&lt;p&gt;看下迁移后的截图，新的 UI 界面图标太丑了🤣&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2024/04/aad38a0e6e4c9cdcf7956938c5f520cb.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>pve 宿主机挂载虚拟机磁盘镜像</title>
      <link>https://linkzz.org/posts/pve-mount-guest-disk/</link>
      <pubDate>Tue, 16 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://linkzz.org/posts/pve-mount-guest-disk/</guid>
      <description>&lt;h2 id=&#34;1-背景&#34;&gt;1. 背景&lt;/h2&gt;
&lt;p&gt;有的时候我们需要修改虚拟机的文件，但是此时虚拟机却因为某些原因无法启动了，比如说虚拟机黑苹果修改了 &lt;code&gt;EFI&lt;/code&gt; 导致启动不了，这时我们有什么办法呢，有人说我们添加一个可以启动的 &lt;code&gt;EFI&lt;/code&gt; 启动设备再来修改原来 &lt;code&gt;ESP&lt;/code&gt; 分区 (即原 &lt;code&gt;EFI&lt;/code&gt; 文件系统) 不就好了，诚然，这是一个办法，但我们今天要介绍的是另一个办法，直接在宿主机挂载虚拟机的磁盘分区，就拿黑苹果 &lt;code&gt;EFI&lt;/code&gt; 分区为例。&lt;/p&gt;
&lt;h2 id=&#34;2-raw&#34;&gt;2. Raw&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;raw&lt;/code&gt; 格式的磁盘镜像文件可以使用 &lt;code&gt;losetup&lt;/code&gt; 虚拟成一个块设备。再使用 &lt;code&gt;kpartx&lt;/code&gt; 读取分区表英创建设备映射，从而可以从设备挂载到宿主机：&lt;/p&gt;
&lt;h3 id=&#34;21-挂载&#34;&gt;2.1 挂载&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;安装 kpartx&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install kpartx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下面以虚拟机编号为 108 的 disk1 为例子&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;虚拟块设备&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;losetup /dev/loop0 /dev/mapper/pve-vm--108--disk--1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;读取设备的分区表并创建设备分区映射&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kpartx -av /dev/loop0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;查看分区映射&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;➜  ~ lsblk
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;loop0                          7:0    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;     1G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; loop
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└─loop0p1                    253:23   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  1024M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sda                            8:0    &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;  14.6G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; disk
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda1                         8:1    &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;  11.8G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda2                         8:2    &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;    16M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda3                         8:3    &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;   2.7G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda4                         8:4    &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;    16M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda5                         8:5    &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;     2M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda6                         8:6    &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;   512B  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda7                         8:7    &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;   512B  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda8                         8:8    &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;    16M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda9                         8:9    &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;   512B  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda10                        8:10   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;   512B  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda11                        8:11   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;     8M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└─sda12                        8:12   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;    32M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nvme1n1                      259:0    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; 238.5G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; disk
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─nvme1n1p1                  259:1    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; 238.5G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└─nvme1n1p9                  259:2    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;     8M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到 &lt;code&gt;loop0&lt;/code&gt; 下有一个分区&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;挂载分区&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir pve-efi
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mount /dev/mapper/loop0p1 pve-efi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;查看分区文件&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;➜  ~ ls -al pve-efi
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;total &lt;span class=&#34;m&#34;&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x  &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; root root  &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; Jan  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;1970&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwx------ &lt;span class=&#34;m&#34;&gt;18&lt;/span&gt; root root &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;16&lt;/span&gt; 14:09 ..
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxr-xr-x  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; root root &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Dec &lt;span class=&#34;m&#34;&gt;29&lt;/span&gt; 07:12 ._EFI
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x  &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; root root  &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; Dec &lt;span class=&#34;m&#34;&gt;29&lt;/span&gt; 07:12 EFI
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x  &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; root root  &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;13&lt;/span&gt; 09:48 .fseventsd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x  &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; root root  &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; Dec &lt;span class=&#34;m&#34;&gt;29&lt;/span&gt; 07:12 .Spotlight-V100
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x  &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; root root  &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; Dec &lt;span class=&#34;m&#34;&gt;29&lt;/span&gt; 07:12 .Trashes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;22-卸载&#34;&gt;2.2 卸载&lt;/h3&gt;
&lt;p&gt;按照挂载的顺序反向卸载&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 文件系统&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;umount pve-efi
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 设备分区&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kpartx -d /dev/loop0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 块设备虚拟&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;losetup -d /dev/loop0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;3-qcow2&#34;&gt;3. Qcow2&lt;/h2&gt;
&lt;h3 id=&#34;31-挂载&#34;&gt;3.1 挂载&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Qcow2&lt;/code&gt; 镜像需要通过 nbd 模块挂载&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查 nbd 模块是否加载&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lsmod &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep nbd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;若没有输出结果则加载 nbd&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;modprobe nbd &lt;span class=&#34;nv&#34;&gt;max_part&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;挂载镜像，下面以编号 103 的虚拟机磁盘 2 文件为例&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qemu-nbd --connect&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/dev/nbd0 /var/lib/vz-b/images/113/vm-113-disk-1.qcow2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;查看分区&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;➜  ~ fdisk -l /dev/nbd0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Disk /dev/nbd0: &lt;span class=&#34;m&#34;&gt;32&lt;/span&gt; GiB, &lt;span class=&#34;m&#34;&gt;34359738368&lt;/span&gt; bytes, &lt;span class=&#34;m&#34;&gt;67108864&lt;/span&gt; sectors
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Units: sectors of &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; * &lt;span class=&#34;nv&#34;&gt;512&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; bytes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Sector size &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;logical/physical&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;: &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; bytes / &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; bytes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;I/O size &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;minimum/optimal&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;: &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; bytes / &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; bytes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Disklabel type: gpt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Disk identifier: DACC591B-A767-EA4F-8028-9757172F0505
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Device          Start      End  Sectors  Size Type
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/nbd0p1  &lt;span class=&#34;m&#34;&gt;11472896&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;67108815&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;55635920&lt;/span&gt; 26.5G Linux filesystem
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/nbd0p2     &lt;span class=&#34;m&#34;&gt;20480&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;53247&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;32768&lt;/span&gt;   16M ChromeOS kernel
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/nbd0p3   &lt;span class=&#34;m&#34;&gt;5894144&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;11472895&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;5578752&lt;/span&gt;  2.7G ChromeOS root fs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/nbd0p4     &lt;span class=&#34;m&#34;&gt;53248&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;86015&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;32768&lt;/span&gt;   16M ChromeOS kernel
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/nbd0p5    &lt;span class=&#34;m&#34;&gt;315392&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;5894143&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;5578752&lt;/span&gt;  2.7G ChromeOS root fs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/nbd0p6     &lt;span class=&#34;m&#34;&gt;16448&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;16448&lt;/span&gt;        &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;  512B ChromeOS kernel
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/nbd0p7     &lt;span class=&#34;m&#34;&gt;16449&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;16449&lt;/span&gt;        &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;  512B ChromeOS root fs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/nbd0p8     &lt;span class=&#34;m&#34;&gt;86016&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;118783&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;32768&lt;/span&gt;   16M Linux filesystem
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/nbd0p9     &lt;span class=&#34;m&#34;&gt;16450&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;16450&lt;/span&gt;        &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;  512B ChromeOS reserved
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/nbd0p10    &lt;span class=&#34;m&#34;&gt;16451&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;16451&lt;/span&gt;        &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;  512B ChromeOS reserved
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/nbd0p11       &lt;span class=&#34;m&#34;&gt;64&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;16447&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;16384&lt;/span&gt;    8M unknown
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/nbd0p12   &lt;span class=&#34;m&#34;&gt;249856&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;315391&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;65536&lt;/span&gt;   32M EFI System
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到我挂载的是一个 &lt;code&gt;FydeOS&lt;/code&gt; 虚拟机的镜像文件，是基于 &lt;code&gt;Chromium OS&lt;/code&gt; 的操作系统，所以看到了文件系统有 &lt;code&gt;ChromeOS kernel&lt;/code&gt; 等，下面挂载下 &lt;code&gt;linux filesystem&lt;/code&gt; 分区。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;挂载分区&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir chromeos-file
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mount /dev/nbd0p1 chromeos-file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;查看分区文件&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;➜  ~ &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; chromeos-file
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;➜  chromeos-file ll
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;total &lt;span class=&#34;m&#34;&gt;275992&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x   &lt;span class=&#34;m&#34;&gt;9&lt;/span&gt; root root       &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;26&lt;/span&gt; 15:04 .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwx------  &lt;span class=&#34;m&#34;&gt;18&lt;/span&gt; root root       &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;16&lt;/span&gt; 16:19 ..
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x. &lt;span class=&#34;m&#34;&gt;17&lt;/span&gt; root root       &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;14&lt;/span&gt; 10:59 dev_image
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxrwxr-x.  &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; root root       &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;26&lt;/span&gt; 15:04 encrypted
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-------.  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; root root &lt;span class=&#34;m&#34;&gt;8357232640&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;26&lt;/span&gt; 16:26 encrypted.block
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-------.  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; root root         &lt;span class=&#34;m&#34;&gt;48&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;26&lt;/span&gt; 15:04 encrypted.key
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x.  &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; root root       &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;26&lt;/span&gt; 15:04 etc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x.  &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; root root       &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;26&lt;/span&gt; 15:04 home
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwx------   &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; root root      &lt;span class=&#34;m&#34;&gt;16384&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;26&lt;/span&gt; 14:55 lost+found
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x. &lt;span class=&#34;m&#34;&gt;13&lt;/span&gt; root root       &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;26&lt;/span&gt; 15:04 unencrypted
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwx--x--x.  &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; root root       &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;26&lt;/span&gt; 15:04 var_overlay
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样就挂载好了一个分区，可以进行编辑了，编辑好了之后卸载回到客户机即可看到改动了。&lt;/p&gt;
&lt;h3 id=&#34;32-卸载&#34;&gt;3.2 卸载&lt;/h3&gt;
&lt;p&gt;卸载还是反向操作&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;umount chromeos-file
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qemu-nbd --disconnect /dev/nbd0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;卸载 nbd 模块 (可选)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;modprobe -r nbd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;4-结语&#34;&gt;4. 结语&lt;/h2&gt;
&lt;p&gt;至此就完成了 pve 常用的 2 种格式的镜像文件的挂载操作，该用法的需求是我在折腾黑苹果 &lt;code&gt;EFI&lt;/code&gt; 开不了机的时候爬帖子学到的，其他格式的文件挂载可以查看 &lt;code&gt;foxi&lt;/code&gt; 的 &lt;a href=&#34;https://foxi.buduanwang.vip/linux/552.html/&#34;&gt;这篇文章&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>记一次 Moonlight 10054 错误的解决经历</title>
      <link>https://linkzz.org/posts/moonlight-10054-fix/</link>
      <pubDate>Fri, 29 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://linkzz.org/posts/moonlight-10054-fix/</guid>
      <description>&lt;h2 id=&#34;1-起因&#34;&gt;1. 起因&lt;/h2&gt;
&lt;p&gt;最近看到很多 Linux 平铺窗口管理器的视频，总觉得很炫酷，体内的折腾之心在沸腾，于是就打起了体验（&lt;del&gt;折腾&lt;/del&gt;）平铺窗口的想法，看到这里各位看官肯定要说：这和 &lt;code&gt;Moonlight&lt;/code&gt; 串流有啥关系，标题党！辣鸡！&lt;/p&gt;
&lt;p&gt;&lt;em&gt;哈哈，各位别急，且听我慢慢道来&lt;/em&gt;。&lt;/p&gt;
&lt;p&gt;首先，我主力的生产系统是 Windows ，我不想在 Windows 下开发，所以 Windows 平铺窗口就 pass 掉了，只能转向 Linux，正好公司一台 &lt;code&gt;Exsi&lt;/code&gt; 主机还剩很多资源，并且还有一块 &lt;code&gt;GTX 1060&lt;/code&gt; 的显卡可以用来直通加速，那不正好创建一个带显卡的虚拟机，运行 Linux 桌面，然后我再远程串流这台虚拟机不就行了吗，那串流体验最好的自然是 Moonlight 了， 诶，你看，这不就关联大了吗！&lt;/p&gt;
&lt;h2 id=&#34;2-环境&#34;&gt;2. 环境&lt;/h2&gt;
&lt;p&gt;好吧，废话少说，我描述一下我的环境，我要远程串流的是一台 &lt;code&gt;Exsi&lt;/code&gt; 创建的虚拟机，参数如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;系统&lt;/td&gt;
&lt;td&gt;Arch Linux&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;8 vCPU&lt;/td&gt;
&lt;td&gt;宿主机 CPU 为 AMD Ryzen Threadripper 1950X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;8GB&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;NVIDIA GeForce GTX 1060 6GB&lt;/td&gt;
&lt;td&gt;显卡直通&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;显示器&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;远程串流服务&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/LizardByte/Sunshine&#34;&gt;Sunshine v0.21.0&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;显示服务&lt;/td&gt;
&lt;td&gt;X11&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;窗口管理器&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://awesomewm.org/download/&#34;&gt;awesome&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows 客户端&lt;/td&gt;
&lt;td&gt;Moonlight-qt&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;21-串流设置&#34;&gt;2.1 串流设置&lt;/h3&gt;
&lt;p&gt;按照 &lt;a href=&#34;https://docs.lizardbyte.dev/projects/sunshine/en/latest/about/guides/linux/headless_ssh.html&#34;&gt;官网headless系统设置&lt;/a&gt; 的指引，我安装好了 &lt;code&gt;nvidia&lt;/code&gt; 的专有驱动，驱动能成功识别显卡，设置好了一个虚拟显示器并且成功运行了 &lt;code&gt;Xorg&lt;/code&gt; ，&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/6a94fb1e495e0fc2ed5d7f4ca50a6953.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;h2 id=&#34;3-排查&#34;&gt;3. 排查&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;x11vnc&lt;/code&gt; 可以访问桌面，并且 &lt;code&gt;awesome&lt;/code&gt; 工作正常，&lt;code&gt;rustdesk&lt;/code&gt; 可以访问并且能开启硬件编码。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/dacb17272df216d17a54faba327fc616.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;唯独 &lt;code&gt;sunshine&lt;/code&gt; 连接不上，启动日志显示硬件编码工作正常&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/89cbdf1362de2e5a05ece963169e603c.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Moonlight客户端可以正常添加和配对串流主机，但在启动【Desktop】串流之后总会报错：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;启动 RTSP handshake 失败: 错误 10054
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;检查防火墙和端口转发规则: TCP 48010，UDP 48000，UDP 48010
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;按照以上提示检测端口连通性，因为我和串流主机都在内网环境，我的客户端是 Windows 系统，防火墙已经关掉了，而串流的 Archlinux 是没有装防火墙服务的，所以不存在防火墙挡掉端口的问题，果然，使用 &lt;code&gt;nc&lt;/code&gt; 测试端口连通：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;➜  ~ nc -v 10.1.1.63 &lt;span class=&#34;m&#34;&gt;48010&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Connection to 10.1.1.63 &lt;span class=&#34;m&#34;&gt;48010&lt;/span&gt; port &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;tcp/*&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UDP 的端口只有在串流的过程中才会打开监听，所以没法直接测试，但是通过手动端口监听测试也证明 UDP 端口也是没有被防火墙挡掉的。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 服务端监听 udp 48010&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; ~ nc -lu -p &lt;span class=&#34;m&#34;&gt;48010&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 客户端连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;➜  ~ nc -uv 10.1.1.63 &lt;span class=&#34;m&#34;&gt;48010&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Connection to 10.1.1.63 &lt;span class=&#34;m&#34;&gt;48010&lt;/span&gt; port &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;udp/*&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看 sunshine 的详细连接日志发现执行 desktop 之后 sunshine 接收到了一个 rtsp 的 Request，sequence 是1，之后就客户端就退出报错了。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-log&#34; data-lang=&#34;log&#34;&gt;[2023:12:29:17:03:29]: Debug: ------  h264 ------
[2023:12:29:17:03:29]: Debug: PASSED: supported
[2023:12:29:17:03:29]: Debug: REF_FRAMES_RESTRICT: unsupported
[2023:12:29:17:03:29]: Debug: CBR: supported
[2023:12:29:17:03:29]: Debug: DYNAMIC_RANGE: unsupported
[2023:12:29:17:03:29]: Debug: VUI_PARAMETERS: supported
[2023:12:29:17:03:29]: Debug: -------------------
[2023:12:29:17:03:29]: Info: Found H.264 encoder: h264_nvenc [nvenc]
[2023:12:29:17:03:29]: Debug: ------  hevc ------
[2023:12:29:17:03:29]: Debug: PASSED: supported
[2023:12:29:17:03:29]: Debug: REF_FRAMES_RESTRICT: unsupported
[2023:12:29:17:03:29]: Debug: CBR: supported
[2023:12:29:17:03:29]: Debug: DYNAMIC_RANGE: unsupported
[2023:12:29:17:03:29]: Debug: VUI_PARAMETERS: supported
[2023:12:29:17:03:29]: Debug: -------------------
[2023:12:29:17:03:29]: Info: Found HEVC encoder: hevc_nvenc [nvenc]
[2023:12:29:17:03:29]: Debug: /CN=NVIDIA GameStream Client -- verified
[2023:12:29:17:03:29]: Debug: TUNNEL :: HTTPS
[2023:12:29:17:03:29]: Debug: METHOD :: GET
[2023:12:29:17:03:29]: Debug: DESTINATION :: /serverinfo
[2023:12:29:17:03:29]: Debug: User-Agent -- Mozilla/5.0
[2023:12:29:17:03:29]: Debug: Accept-Language -- zh-CN,en,*
[2023:12:29:17:03:29]: Debug: Accept-Encoding -- gzip, deflate
[2023:12:29:17:03:29]: Debug: Connection -- Keep-Alive
[2023:12:29:17:03:29]: Debug: Host -- 10.1.1.63:47984
[2023:12:29:17:03:29]: Debug:  [--]
[2023:12:29:17:03:29]: Debug: uuid -- d63f79a098fb43e199209d93b001b333
[2023:12:29:17:03:29]: Debug: uniqueid -- 0123456789ABCDEF
[2023:12:29:17:03:29]: Debug:  [--]
[2023:12:29:17:03:29]: Debug: handle_read(): Handle read of size: 93 bytes
[2023:12:29:17:03:29]: Debug: handle_payload(): Handle read of size: 0 bytes
[2023:12:29:17:03:29]: Debug: type [REQUEST]
[2023:12:29:17:03:29]: Debug: sequence number [1]
[2023:12:29:17:03:29]: Debug: protocol :: RTSP/1.0
[2023:12:29:17:03:29]: Debug: payload ::
[2023:12:29:17:03:29]: Debug: command :: OPTIONS
[2023:12:29:17:03:29]: Debug: target :: rtsp://10.1.1.63:48010
[2023:12:29:17:03:29]: Debug: CSeq :: 1
[2023:12:29:17:03:29]: Debug: X-GS-ClientVersion :: 14
[2023:12:29:17:03:29]: Debug: Host :: 10.1.1.63
[2023:12:29:17:03:29]: Debug: ---Begin MessageBuffer---
OPTIONS
---End MessageBuffer---
[2023:12:29:17:03:29]: Debug: ---Begin Response---
RTSP/1.0 200 OK
CSeq: 1



---End Response---
[2023:12:29:17:03:32]: Debug: TUNNEL :: NONE
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这就是问题的所在，说明客户端很可能没收到这个Sequence为1的应答，导致双方连接不上，并不是因为硬件编码的问题，也不是防火墙的问题，更不是 &lt;code&gt;X11&lt;/code&gt; 显示系统的问题。&lt;/p&gt;
&lt;p&gt;那是什么问题呢，我看着 &lt;code&gt;RTSP&lt;/code&gt; 陷入了沉思，联想到各大网络直播多是使用的 &lt;code&gt;RTSP&lt;/code&gt; 协议推流，该不会是 IT 禁用了该协议吧，&lt;strong&gt;果然，公司上班时间是无法观看直播网站的，直播推流的流也是拉取不到的！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;事已至此，一切都真相大白了，&lt;strong&gt;公司用的是深信服的网络行为管理，老板为了省钱IT是外包的，一周来一次，平时接触不到，没想到这个策略的设置如此简单粗暴，内网的RTSP协议都给禁掉了，那开发如果用到该协议推流，我估计光是排查问题就得浪费半天时间吧，哎，结合到最近各大互联网公司频发的运维事故我只想说：降本增效害死人！&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;4-解决问题&#34;&gt;4. 解决问题&lt;/h2&gt;
&lt;p&gt;既然知道问题发生的原因了，解决就好办了，既然直连的 &lt;code&gt;RTSP&lt;/code&gt; 协议不行，我通过 VPN 开个隧道总可以了吧。果然，通过 wireguard 建立隧道之后一切问题解决，串流成功，不得不感叹 Moolight 和 Sunshine 项目做的真是完美，低延迟，高性能，画质还不差，体验秒杀前面的 VNC 和 rustdesk，接下来继续我的平铺窗口管理器之旅了，Awesome !&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/f3eddc820e2eb71018cff4b5991799db.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tesla P4 - Nvidia 专业卡 vGPU 解决方案体验</title>
      <link>https://linkzz.org/posts/tesla-p4-vgpu/</link>
      <pubDate>Wed, 13 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://linkzz.org/posts/tesla-p4-vgpu/</guid>
      <description>&lt;h2 id=&#34;1-前言&#34;&gt;1. 前言&lt;/h2&gt;
&lt;p&gt;之前体验过 &lt;code&gt;intel&lt;/code&gt; 的 &lt;code&gt;vGPU&lt;/code&gt; 解决方案 &lt;a href=&#34;https://wiki.archlinux.org/title/Intel_GVT-g&#34;&gt;Intel GVT-g&lt;/a&gt; ，我的古早处理器 &lt;code&gt;i5-10400&lt;/code&gt; 还是 &lt;code&gt;intel&lt;/code&gt; 很老的gpu架构的 &lt;code&gt;UHD630&lt;/code&gt; 分配到一个 Win10 虚拟机使用，哪怕是只分配一个 vm 的情况下性能依然不够看，使用 parsec &lt;code&gt;1080P H264&lt;/code&gt; 串流的情况下帧数无法保证60，这时视频播放就更不用说了，直接GPU占用100%，更不用谈 &lt;code&gt;2k&lt;/code&gt;、&lt;code&gt;4k&lt;/code&gt; 等高分辨率串流了。早就了解到 Nvidia 的 vGPU方案支持 &lt;code&gt;kvm&lt;/code&gt; 平台，而且支持 &lt;code&gt;Windows&lt;/code&gt; 和 &lt;code&gt;Linux&lt;/code&gt; 客户操作系统，性能较 intel 核显好得多，于是我弄来了这块小小的 Tesla P4。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/cd216f0fffbeead1be892e87941efe0a.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;h2 id=&#34;2-硬件&#34;&gt;2. 硬件&lt;/h2&gt;
&lt;p&gt;这块 &lt;code&gt;Tesla P4&lt;/code&gt; 是个单槽半高卡，刚好我的 pve 宿主机剩下一个 x16 的 PCIE 插槽，虽然只有 X4 的速度，但咋对性能没有极致的追求，所以损失一点性能还能接受（主要是穷换不起主板），而且这块显卡最高功耗仅为 &lt;code&gt;75W&lt;/code&gt; 无需外接供电，实测无负载的时候功耗仅十几瓦，最惊讶的还是他的价格，仅仅只需300块，这简直就是“年轻人的第一台特斯拉”呀，哈哈。缺点就是其是为了数据中心设计的，没有主动散热，所以我们需要外接一个小小的风扇为其降温，就是图中这个，我多花了50从PDD购入。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/46954635d0224200d5df3aca5de0adad.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;拆机安装&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/e77fc46c451ca08cd876167cabfa4304.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;内部紧凑的空间，一番折腾终于装上了，这台主机的配置可以在&lt;a href=&#34;../pve-igd-passthrough/&#34;&gt;这篇文章&lt;/a&gt;中找到。&lt;/p&gt;
&lt;p&gt;安装的过程中还有2的小插曲：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;我的手在拆机的时候碰到散热器挂彩了（所以一定是要祭点什么吗）。&lt;/li&gt;
&lt;li&gt;安装之后开机系统识别不了我的 2 块 PCIE 的 M.2 固态，还以为是这块主板的接口有屏蔽关系，最后发现是因为我打开了 GSM，需要关闭 GSM 才能正确识别 M.2 硬盘。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;3-软件&#34;&gt;3. 软件&lt;/h2&gt;
&lt;p&gt;一番折腾终于正确安装好了，现在试下他有什么魔力吧。&lt;/p&gt;
&lt;h3 id=&#34;31-宿主机设置&#34;&gt;3.1 宿主机设置&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;我的pve版本还是7.x，并没有升级到8.x，所以下面的操作均是在7.x的环境下进行，8.x内核升级到了6.x，按照我的操作不一定能成功！看官自行分辨。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nvidia官网下载专业卡驱动需要注册申请啥的，比较麻烦，好在有热心大佬维护了一个仓库更新官方驱动，我们使用这个版本，找到最新的&lt;a href=&#34;https://github.com/justin-himself/NVIDIA-VGPU-Driver-Archive/releases/&#34;&gt;Release&lt;/a&gt; 包，我这里下载了 &lt;code&gt;535.129.03-537.7&lt;/code&gt; 的版本，下载到宿主机安装:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget https://github.com/justin-himself/NVIDIA-VGPU-Driver-Archive/releases/download/16.2/NVIDIA-GRID-Linux-KVM-535.129.03-537.70.zip
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 解压&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;unzip NVIDIA-GRID-Linux-KVM-535.129.03-537.70.zip
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装dkms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install dkms
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装驱动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Host_Drivers/NVIDIA-Linux-x86_64-535.129.03-vgpu-kvm.run --dkms
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 重启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如没问题重启之后运行 &lt;code&gt;nvidia-smi&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/a9cd0c7ff1f7eb2bae886275b118fa60.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;识别到 &lt;code&gt;Tesla P4&lt;/code&gt; 就安装好了宿主机驱动。&lt;/p&gt;
&lt;p&gt;运行 &lt;code&gt;mdevctl types&lt;/code&gt; 可列出支持的vGPU类型。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/88f17794c397aed7dc72056df7eae95b.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;h3 id=&#34;32-系列解读&#34;&gt;3.2 系列解读&lt;/h3&gt;
&lt;p&gt;接下来我们看看这些vGPU的系列有什么区别，看到图中的类型 &lt;code&gt;nvidia-65&lt;/code&gt; 即 &lt;code&gt;GRID P4-4Q&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/add06a4dbd2ec36387f0e8e74c80ac69.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;简单说下类别类目里的一些区别，&lt;code&gt;GRID&lt;/code&gt; 是 Nvidia 早期 vGPU 技术的名词，&lt;code&gt;P4&lt;/code&gt; 是显卡型号，后缀的大写字母 &lt;code&gt;A&lt;/code&gt; 、 &lt;code&gt;B&lt;/code&gt;、 &lt;code&gt;Q&lt;/code&gt; 代表不同的侧重点系列，首先，不同的系列需要的授权不同，当然我们使用的是特殊授权，所以这点不重要，对我们来说重要的在以下方面：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;系列&lt;/th&gt;
&lt;th&gt;侧重&lt;/th&gt;
&lt;th&gt;最大分辨率&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A系列&lt;/td&gt;
&lt;td&gt;面向虚拟应用程序用户的应用程序流或基于会话的解决方案&lt;/td&gt;
&lt;td&gt;1280 x 1024 60Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B系列&lt;/td&gt;
&lt;td&gt;面向商务专业人士和知识工作者的虚拟桌面&lt;/td&gt;
&lt;td&gt;5120 x 2880 45Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q系列&lt;/td&gt;
&lt;td&gt;适合需要 Quadro 技术性能和功能的创意和技术专业人员的虚拟工作站&lt;/td&gt;
&lt;td&gt;7680 x 4320 60Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如图，如果你的vm侧重计算，不在意显示，那选 &lt;code&gt;A&lt;/code&gt; 系列，如果运行的是 &lt;code&gt;VDI&lt;/code&gt; 应用，那选 &lt;code&gt;B&lt;/code&gt; 系列，而我这种注重显示的就选&lt;code&gt;Q&lt;/code&gt; 系列啦。&lt;/p&gt;
&lt;p&gt;而系列字母前的数字则是分配的专有显存的大小，如 &lt;code&gt;GRID P4-4Q&lt;/code&gt; 代表该vGPU将具有&lt;code&gt;4GB&lt;/code&gt; 的专有显存。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;可用&lt;/code&gt; 则是可同时启动的实例数目，比如上面的 &lt;code&gt;GRID P4-4Q&lt;/code&gt; 每台实例具有 &lt;code&gt;4GB&lt;/code&gt; 的显存，而 &lt;code&gt;P4&lt;/code&gt; 总共具有 &lt;code&gt;8GB&lt;/code&gt; 显存，那显然能同时启用的实例即是 &lt;code&gt;2台&lt;/code&gt; （截图中因为我这台虚拟机已经开机了，所以显示还有1台可用）&lt;/p&gt;
&lt;h3 id=&#34;33-windows客户机&#34;&gt;3.3 Windows客户机&lt;/h3&gt;
&lt;p&gt;下面我们来看下 Windows 客户机 vGPU 是如何使用的，首先创建虚拟机：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建6C4G的windows虚拟机&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qm create &lt;span class=&#34;m&#34;&gt;116&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--cores &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--cpu host &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--bios ovmf &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--machine q35 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--memory &lt;span class=&#34;k&#34;&gt;$((&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--net0 virtio,bridge&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;vmbr0,firewall&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--name Win-P4-4Q &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--scsihw virtio-scsi-single &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--efidisk0 &lt;span class=&#34;nv&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;local-vzb:0,format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;qcow2 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--scsi0 &lt;span class=&#34;nv&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;local-vzb:32,format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;qcow2 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--tpmstate0 &lt;span class=&#34;nv&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;local-vzb:0 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--ide2 &lt;span class=&#34;nv&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ugreen:iso/Win11_22H2_Chinese_Simplified_x64v2.iso,media&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;cdrom &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--ide0 &lt;span class=&#34;nv&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ugreen:iso/virtio-win-0.1.240.iso,media&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;cdrom &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--boot &lt;span class=&#34;nv&#34;&gt;order&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;scsi0;ide2&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--hostpci0 0000:05:00.0,mdev&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;nvidia-65,pcie&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--audio0 &lt;span class=&#34;nv&#34;&gt;device&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ich9-intel-hda,driver&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;none
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;331-widnows-vgpu-驱动&#34;&gt;3.3.1 Widnows vGPU 驱动&lt;/h4&gt;
&lt;p&gt;正常安装之后Windows设备管理器中没有正确识别到GPU，显示为“Microsoft基本显示适配器”&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/eb0f153c31686c458c3dd2d78f50e84c.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Windows 所用的驱动在刚才我们下载的文件下，我们安装 &lt;code&gt;Guest_Drivers/537.70_grid_win10_win11_server2019_server2022_dch_64bit_international.exe&lt;/code&gt; ，安装完之后即可正常驱动vGPU了。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/a7deb9cfc4c78e618f346abf9b305eda.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;任务管理器也可以看到 GPU 具有了负载。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/a42334144f6042c566ea93a002f98277.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;安装完成之后可以打开 &lt;code&gt;RDP&lt;/code&gt; ，关机将显示设置为“无”，将vGPU设置为主GPU，这样便于程序识别正确的 GPU 。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/7073e1661ae497ec3ecf231da89aef99.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;h4 id=&#34;332-vgpu-授权&#34;&gt;3.3.2 vGPU 授权&lt;/h4&gt;
&lt;p&gt;上文提到过，我们需要对 vGPU 进行授权，获得相关的许可证才能完全的使用 vGPU，否则使用受限，无法完整使用。&lt;/p&gt;
&lt;p&gt;我们使用 &lt;a href=&#34;https://github.com/GreenDamTan/fastapi-dls&#34;&gt;fastapi-dls&lt;/a&gt; 搭建一个授权服务器获取授权，具体做法这里不赘述，想了解详情可以查看项目文档，然后通过授权服务器获取授权，推荐使用 &lt;code&gt;Powershell&lt;/code&gt; 脚本，方便快捷。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Powershell&#34; data-lang=&#34;Powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;curl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;exe&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-insecure&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-L&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-X&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GET&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;//&amp;lt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;dls-hostname&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-or&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-ip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;/-/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;client-token&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-o&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken\client_configuration_token_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;vm&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Get-Date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;tostring&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;dd-MM-yy-hh-mm-ss&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.tok&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装完重启，查询授权情况：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Powershell&#34; data-lang=&#34;Powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;nvidia-smi&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-q&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Select-String&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;License&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/50d63590427aaf647868521881a39939.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;授权成功。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这里获取授权之前一定要先 ntp 同步一下系统时钟，我因为没有同步时钟导致和服务器的时间不一致授权一直失败，找了一番原因才找到原因所在。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;333-远程方案&#34;&gt;3.3.3 远程方案&lt;/h4&gt;
&lt;p&gt;vGPU 是没有物理输出的，但得益于今天各种串流技术的发展，我们的远程连接可以做到和实机相差无几的体验，除了微软自带的RDP方案之外也有不少选择，RDP 虽好，但毕竟不是专门为了 Gaming 串流而生，在视频播放，游戏串流等方面体验较专门为了 Gaming 串流优化的软件如 &lt;code&gt;Parsec&lt;/code&gt; 、&lt;code&gt;Sunshine&lt;/code&gt; 等体验还有差距，所以我们就试下后面这两者的串流。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://parsec.app/downloads&#34;&gt;Parsec&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Parsec&lt;/code&gt; 的安装我们默认即可，可以不安装 Parsec 的 VDD，因为 vGPU 驱动自带了虚拟显示适配器，我们就用他的就好了，安装好了之后登录账号。在客户端也登录对应的账号就可以看到远程机器了。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/9c1d374788128c9cceb2bb41411f7606.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/99e59b9203e3a4363247a899504c14f0.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;看到这是我在公司连接的效果，场景为浏览器 &lt;a href=&#34;https://www.testufo.com/&#34;&gt;ufo test&lt;/a&gt; 使用的是 2k 分辨率的串流，网络开销 &lt;code&gt;7.65Mbps&lt;/code&gt; 换算下来 &lt;code&gt;1.06Mb/s&lt;/code&gt;， 网络延迟 &lt;code&gt;18ms&lt;/code&gt;， 宿主机编码延迟 &lt;code&gt;7.34ms&lt;/code&gt;， 解码延迟 &lt;code&gt;14.51ms&lt;/code&gt; 左右，整体在 &lt;code&gt;40ms&lt;/code&gt; 左右的延迟，在公司的使用情况是完全可以当作主力机使用了。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/e6bd3120e7b7cae2b93282fc898fd134.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;可以看到对应任务的 &lt;code&gt;GPU&lt;/code&gt; 负载，主要是编码器，可以看到性能开销很小，还有余力进行其他大型的 3D 运算。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/LizardByte/Sunshine&#34;&gt;Sunshine&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Sunshine&lt;/code&gt; 是一个开源的 &lt;code&gt;moonlight&lt;/code&gt; 协议的服务端实现，在 Nvidia 宣布将不再其驱动中集成 Shield 串流之后 Sunshine 的是使用变得广泛了起来，社区也很活跃，支持 Intel 、Amd 、 Nvidia 三大主流 GPU，具有 &lt;code&gt;webui&lt;/code&gt; 配置也比较方便。&lt;/p&gt;
&lt;p&gt;正常安装好了之后访问 &lt;code&gt;webui&lt;/code&gt; ，第一次访问需要设置管理密码，好了之后安装打开客户端 &lt;a href=&#34;https://github.com/moonlight-stream&#34;&gt;moonlight&lt;/a&gt; ，内网环境应该自动发现了设备，我在公司需要主动添加， 输入主机 IP 即可添加。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/9898ddd7b7ae8151c4b0fe8076351d4f.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;点击图标连接会得到一个 &lt;code&gt;pin&lt;/code&gt; 码，在 &lt;code&gt;webui&lt;/code&gt; 中 &lt;code&gt;Pin&lt;/code&gt; 选项卡下输入该 &lt;code&gt;pin&lt;/code&gt; 码即可配对成功。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/80cd8968c1eb581be32d1a0eabab040b.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;接下来点击默认配置的 &lt;code&gt;Desktop&lt;/code&gt; 程序即可连接桌面&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/af13b0a1636c11e23dc0a189ec77cb74.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;接下来我们看下串流表现&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/343089360d9819af7a9df17f08ae0b21.jpg&#34; alt=&#34;Dingtalk_20231212165936.jpg&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;同样场景 &lt;code&gt;2k&lt;/code&gt; 分辨率的串流，网络延迟 &lt;code&gt;8ms&lt;/code&gt; 左右，平均编码时间 &lt;code&gt;0.13ms&lt;/code&gt; ，渲染时间 &lt;code&gt;0.13ms&lt;/code&gt; ，和 &lt;code&gt;Parsec&lt;/code&gt; 的指标不同，所以单纯比较数据也是没有意义的，以我实际体验的感觉来看，两者之间是没有很大的差别的，完全可以应付日常使用。&lt;/p&gt;
&lt;h3 id=&#34;34-linux-客户机&#34;&gt;3.4 Linux 客户机&lt;/h3&gt;
&lt;p&gt;接下来体验一下 Linux 客户机，发行版选择 &lt;code&gt;Arch Linux&lt;/code&gt; ，创建虚拟机：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qm create &lt;span class=&#34;m&#34;&gt;117&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--cores &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--cpu host &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--bios ovmf &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--machine q35 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--memory &lt;span class=&#34;k&#34;&gt;$((&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--net0 virtio,bridge&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;vmbr0,firewall&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--name Arch-P4-4Q &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--scsihw virtio-scsi-single &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--efidisk0 &lt;span class=&#34;nv&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;local-vzb:0,format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;qcow2 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--scsi0 &lt;span class=&#34;nv&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;local-vzb:32,format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;qcow2 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--ide2 &lt;span class=&#34;nv&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ugreen:iso/archlinux-2023.10.14-x86_64.iso,media&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;cdrom &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--boot &lt;span class=&#34;nv&#34;&gt;order&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;scsi0;ide2&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--hostpci0 0000:05:00.0,mdev&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;nvidia-65,pcie&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;--audio0 &lt;span class=&#34;nv&#34;&gt;device&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ich9-intel-hda,driver&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;none
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;341-linux-驱动&#34;&gt;3.4.1 Linux 驱动&lt;/h4&gt;
&lt;p&gt;正常安装完之后就可以安装显卡驱动了&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装dkms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo pacman -S dkms
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 拷贝驱动至虚拟机之后安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./Guest_Drivers/NVIDIA-Linux-x86_64-535.129.03-grid.run --dkms
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装完重启可以查看 &lt;code&gt;nvidia-smi&lt;/code&gt; 是否正常识别显卡。&lt;/p&gt;
&lt;h4 id=&#34;342-linux-授权&#34;&gt;3.4.2 Linux 授权&lt;/h4&gt;
&lt;p&gt;利用刚才我们搭建的授权服务同样可以授权 Linux 的驱动&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 下载授权文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo curl --insecure -L -X GET https://&amp;lt;dls-hostname-or-ip&amp;gt;/-/client-token -o /etc/nvidia/ClientConfigToken/client_configuration_token_&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;date &lt;span class=&#34;s1&#34;&gt;&amp;#39;+%d-%m-%Y-%H-%M-%S&amp;#39;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;.tok
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 重启服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart nvidia-gridd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看授权信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nvidia-smi -q &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep &lt;span class=&#34;s2&#34;&gt;&amp;#34;License&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;授权正常将看到一下信息：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/69eea3c965a869046f405dc54682e214.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;h4 id=&#34;343-cuda-toolkit&#34;&gt;3.4.3 CUDA Toolkit&lt;/h4&gt;
&lt;p&gt;vGPU 支持 CUDA，正常安装 &lt;a href=&#34;https://developer.nvidia.com/cuda-downloads&#34;&gt;CUDA Toolkit&lt;/a&gt; 即可，我这里安装了 &lt;code&gt;12.2&lt;/code&gt; 版本的。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/6a2d0e2238306a4d9ffd2bb1e5070010.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;h4 id=&#34;344-桌面环境&#34;&gt;3.4.4 桌面环境&lt;/h4&gt;
&lt;p&gt;Linux 桌面我使用不多，在我看来 Linux server 模式很稳定，但是 Linux GUI 却常有问题，用处真的不大，尤其 &lt;code&gt;vGPU&lt;/code&gt; 没有物理输出，一旦 GUI 奔溃难以远程将很难调试，这里我只是安装了驱动支持较好的 &lt;code&gt;x11-vnc&lt;/code&gt; 和 &lt;code&gt;rustdesk&lt;/code&gt; 用来简单测试一下，桌面环境则是使用的 &lt;code&gt;KDE&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;X11-VNC&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/b3fb2e8ab9b54d653154f7b3999b108b.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;VNC 的客户端我选择了 &lt;code&gt;TigerVNC&lt;/code&gt; ，可以看到分辨率可以设置为 &lt;code&gt;2k&lt;/code&gt; ，但奇怪的是这个客户端无法设置缩放，所以我只能拖动高度条使用，要么就是全屏之后鼠标靠近边缘可以自动滑动画面。或者像下面设置为 &lt;code&gt;1080P&lt;/code&gt; 使用。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/ad117e2670743000628b1e30106ab448.gif&#34; alt=&#34;x11-vnc-p4.gif&#34;  /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;rustdesk&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/rustdesk/rustdesk&#34;&gt;rustdesk&lt;/a&gt; 是一个由 &lt;code&gt;rust&lt;/code&gt; 编写的开源的远程桌面工具，其目标是做 &lt;code&gt;TeamViewer&lt;/code&gt; 的替代品，支持 &lt;code&gt;X&lt;/code&gt; 和 &lt;code&gt;Wayland&lt;/code&gt; ，支持自建中心服务，&lt;code&gt;rustdesk&lt;/code&gt; 有维护 &lt;code&gt;Arch Linux&lt;/code&gt; 的包，直接安装即可。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo pacman -S rustdesk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下面是客户端连接的效果：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/9e92520c2b5115716b267ecc5f6fd974.gif&#34; alt=&#34;rustdesk-p4.gif&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;两个工具的远程都还算流畅，但是有个问题暂时没有眉目，就是无法调用显卡硬件编码，所以你看到的 &lt;code&gt;rustdesk&lt;/code&gt; 的远程是由 &lt;code&gt;CPU&lt;/code&gt; 进行编码的串流，所以看起来有一丝不流畅，但是显卡的 &lt;code&gt;3D&lt;/code&gt; 加速是正常的，这个问题待日后再解决吧。&lt;/p&gt;
&lt;h2 id=&#34;4-总结&#34;&gt;4. 总结&lt;/h2&gt;
&lt;p&gt;这张 &lt;code&gt;Tesla P4&lt;/code&gt; 的表现可以说是远超我的预期，功耗不高的同时可以解锁到几个 &lt;code&gt;VM&lt;/code&gt; 同时调用显卡加速，以后还可以用来部署一些 &lt;code&gt;AI&lt;/code&gt; 模型，仅 300 左右的价格能做到这么多事，可以说物超所值，兴许以后出二手还不会太掉价！哈哈，理财产品。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>甲骨文免费Arm主机新玩法-云安卓手机</title>
      <link>https://linkzz.org/posts/oracle-arm-redroid/</link>
      <pubDate>Wed, 06 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://linkzz.org/posts/oracle-arm-redroid/</guid>
      <description>&lt;h2 id=&#34;1-前言&#34;&gt;1. 前言&lt;/h2&gt;
&lt;p&gt;我的一篇 &lt;a href=&#34;../android-x86-pve/&#34;&gt;文章&lt;/a&gt; 中有提到过云安卓手机的项目-redroid，该 &lt;a href=&#34;https://github.com/remote-android/redroid-doc&#34;&gt;项目&lt;/a&gt; 基于容器技术，构建一个安卓的运行时，同时通过Linux的内核模块，支持调用宿主机的硬件资源，同时其可运行于 &lt;code&gt;x86&lt;/code&gt; 架构之上，通过转译来运行仅支持 &lt;code&gt;arm&lt;/code&gt; 架构的安卓应用，用来跑app测试可以一试，正好甲骨文的arm主机资源没有好好利用，今天就来折腾一下这个玩法。&lt;/p&gt;
&lt;h2 id=&#34;2-加载内核模块-ashmem_linuxbinder_linux&#34;&gt;2. 加载内核模块 ashmem_linux、binder_linux&lt;/h2&gt;
&lt;h3 id=&#34;21-基于-ubuntu-2004-以上发行版&#34;&gt;2.1 基于 &lt;code&gt;Ubuntu 20.04&lt;/code&gt; 以上发行版&lt;/h3&gt;
&lt;p&gt;这两个模块是容器运行必须的内核模块，按照官方文档，在 &lt;code&gt;Ubuntu 20.04&lt;/code&gt; 以上版本中，这两个模块已经编译到内核里了，可以直接 &lt;code&gt;modprobe&lt;/code&gt; 命令加载，所以如果你的 &lt;code&gt;arm服务器&lt;/code&gt; 正好是&lt;code&gt;Ubuntu 20.04&lt;/code&gt; 以上版本，按照一下命令即可运行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装额外内核模块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install linux-modules-extra-&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;uname -r&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 加载内核模块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;modprobe binder_linux &lt;span class=&#34;nv&#34;&gt;devices&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;binder,hwbinder,vndbinder&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;modprobe ashmem_linux
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 运行容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -itd --rm --privileged &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    --pull always &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    -v ~/data:/data &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    -p 5555:5555 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    redroid/redroid:11.0.0-latest &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    androidboot.redroid_gpu_mode&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;guest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;22-oracle-linux-8&#34;&gt;2.2 Oracle Linux 8&lt;/h3&gt;
&lt;p&gt;否则如果你像我一样开主机的时候选了 &lt;code&gt;Oracle Linux 8&lt;/code&gt; 的话，很遗憾，官方没有该系统的运行文档，以上两个内核模块也并没有编译，奈何我对该发行版不熟，升级了官方内核到 &lt;code&gt;5.10&lt;/code&gt; 版本来编译redroid提供的两个内核模块的 &lt;a href=&#34;https://github.com/remote-android/redroid-modules&#34;&gt;源码&lt;/a&gt; ，最终用 &lt;code&gt;amazonlinux2&lt;/code&gt; 的分支可已正常编译&lt;code&gt;ashmem&lt;/code&gt;模块，然而另一个 &lt;code&gt;binder&lt;/code&gt; 模块始终无法编译成功。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Amadevel-uname-r == `uname -r`&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo make &lt;span class=&#34;c1&#34;&gt;# build kernel modules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo make install &lt;span class=&#34;c1&#34;&gt;# build and install *unsigned* kernel modules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;23-debian-10&#34;&gt;2.3 Debian 10&lt;/h3&gt;
&lt;p&gt;于是我又想到了，&lt;code&gt;Ubuntu&lt;/code&gt; 起源于 &lt;code&gt;Debian&lt;/code&gt;，那倘若我将系统dd成Debian是否就可以正常加载这些内核模块了呢，于是我找到了一个手动 &lt;a href=&#34;https://lala.im/7905.html&#34;&gt;重装的教程&lt;/a&gt; 该教程基于网络安装，是走的官方渠道获取的系统镜像，不用担心被植入后门，这也是为什么不选择那些 &lt;code&gt;一键dd脚本&lt;/code&gt; 的原因，缺点是只能安装 &lt;code&gt;Debian 10&lt;/code&gt; ，较新的 &lt;code&gt;Debian 11&lt;/code&gt; 只能装完之后再寻求升级方法了。&lt;/p&gt;
&lt;p&gt;比较顺利系统安装成功之后顺利登录系统，看了一下系统内核版本是 &lt;code&gt;4.19&lt;/code&gt; 版本，还是有点老，于是从官方库升级了一下最新的稳定版内核 &lt;code&gt;5.10&lt;/code&gt; ，&lt;del&gt;开始编译以上两个模块，这次很顺利编译成功了（虽然报了几个警告）&lt;/del&gt;，看了官方内核已经编译了两个内核模块，果然和 &lt;code&gt;Ubuntu 20.04&lt;/code&gt; 以上版本一样，2个内核模块都可以加载。按照官方的教程开始运行容器：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 加载内核模块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;modprobe ashmem_linux
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;modprobe binder_linux &lt;span class=&#34;nv&#34;&gt;devices&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;binder1,binder2,binder3,binder4,binder5,binder6
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 修改权限&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;666&lt;/span&gt; /dev/binder*
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;666&lt;/span&gt; /dev/ashmem
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 运行容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -itd --rm --privileged &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    --pull always &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    -v /dev/binder1:/dev/binder &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    -v /dev/binder2:/dev/hwbinder &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    -v /dev/binder3:/dev/vndbinder &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    -v ~/data11:/data &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    -p 5555:5555 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    --name redroid11 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    redroid/redroid:11.0.0-latest &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    androidboot.redroid_gpu_mode&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;guest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# adb 连接容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;adb connect arm-2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# scrcpy 连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scrcpy -e
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然而在 &lt;code&gt;scrcpy&lt;/code&gt; 连接容器的时候却报了个错：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-log&#34; data-lang=&#34;log&#34;&gt;[server] ERROR: Could not create default video encoder for h264
List of video encoders:
    (none)
[server] ERROR: Exception on thread Thread[video,5,main]
java.lang.IllegalArgumentException: Failed to initialize video/avc, error 0xfffffffe (NAME_NOT_FOUND)
	at android.media.MediaCodec.native_setup(Native Method)
	at android.media.MediaCodec.&amp;lt;init&amp;gt;(MediaCodec.java:2000)
	at android.media.MediaCodec.&amp;lt;init&amp;gt;(MediaCodec.java:1978)
	at android.media.MediaCodec.createEncoderByType(MediaCodec.java:1933)
	at com.genymobile.scrcpy.ScreenEncoder.createMediaCodec(ScreenEncoder.java:229)
	at com.genymobile.scrcpy.ScreenEncoder.streamScreen(ScreenEncoder.java:73)
	at com.genymobile.scrcpy.ScreenEncoder.lambda$start$0$com-genymobile-scrcpy-ScreenEncoder(ScreenEncoder.java:294)
	at com.genymobile.scrcpy.ScreenEncoder$$ExternalSyntheticLambda0.run(Unknown Source:4)
	at java.lang.Thread.run(Thread.java:1012)
INFO: Renderer: opengl
INFO: OpenGL version: 4.6 (Compatibility Profile) Mesa 22.3.3
INFO: Trilinear filtering enabled
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;scrcpy报告找不到有效的视频编码器，然而虽然甲骨文的arm主机没有给gpu资源，但是看了用cpu 编码也是可行的呀，为啥运行不了，最终在这个 &lt;a href=&#34;https://github.com/remote-android/redroid-doc/issues/407&#34;&gt;Issue&lt;/a&gt; 下面找到了答案，那即是在编译的内核中需要启用内核 &lt;code&gt;codec2&lt;/code&gt; 的支持，于是最终还是走到了自己编译内核这步。&lt;/p&gt;
&lt;h3 id=&#34;24-自编译debian的内核&#34;&gt;2.4 自编译Debian的内核&lt;/h3&gt;
&lt;p&gt;Debian的内核源码以软件包的方式提供，我们搜索一下最新的源码包：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;➜  ~ apt search ^linux-source
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Sorting... Done
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Full Text Search... Done
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;linux-source/oldstable 5.10.197-1 all
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  Linux kernel &lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;meta-package&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;linux-source-5.10/oldstable,now 5.10.197-1 all
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  Linux kernel &lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; version 5.10 with Debian patches
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到最新的 &lt;code&gt;5.10&lt;/code&gt; 的源码， 安装:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install linux-source-5.10
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在用户目录中编译：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir ~/kernel&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ~/kernel
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 解压内核源码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -xaf /usr/src/linux-source-5.10.tar.xz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;至于为什么不在 &lt;code&gt;/usr/src&lt;/code&gt; 目录中用 root 编译，官方是这么说的, 我认为非常合理：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;传统上，Linux内核源代码放置于 &lt;code&gt;/usr/src/linux/&lt;/code&gt;，需要root权限才能编译。但是，在不需要时应避免使用管理员权限。&lt;code&gt;src&lt;/code&gt; 群组的成员也可以使用该文件夹，但是应避免使用 &lt;code&gt;/usr/src/&lt;/code&gt;。把核心源代码置于个人文件夹时，应把安全放在第一位：在 &lt;code&gt;/usr/&lt;/code&gt; 内的文件都应明确其在软件包系统内的作用，试图收集内核使用的信息时，不能在读取 &lt;code&gt;/usr/src/linux&lt;/code&gt; 时误导程序。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;配置内核:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 先将原本的内核配置保留，在原基础上修改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp /boot/config-5.10.0-26-arm64 ~/kernel/linux-source-5.10/.config
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vim ~/kernel/linux-source-5.10/.config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改一下内容：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-config&#34; data-lang=&#34;config&#34;&gt;CONFIG_DMABUF_HEAPS=y
CONFIG_DMABUF_HEAPS_SYSTEM=y
CONFIG_ANDROID_BINDERFS=y
CONFIG_ANDROID_BINDER_DEVICES=&amp;#34;binder,hwbinder,vndbinder&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;开始编译：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make deb-pkg &lt;span class=&#34;nv&#34;&gt;LOCALVERSION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;-falcot &lt;span class=&#34;nv&#34;&gt;KDEB_PKGVERSION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;make kernelversion&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;-1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;开始漫长的等待，期间有可能提示缺少某个包之类的，按照提示处理一下即可，处理编译建议单线程，然后经过2天试错之后终于编译完成。安装内核：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dpkg -i ../linux-image*.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 重启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重启之后重复 &lt;code&gt;2.3&lt;/code&gt; 的运行步骤即可成功运行, 运行后的一下截图：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/b23ada35a18404e8952cd3b68216a328.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/1cf8250b034f8c58c311a9ac5ce3d6ff.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;运行效果：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/b3ac2d75502895045eda2e20d9da7c45.gif&#34; alt=&#34;redroid-oracle-arm.gif&#34;  /&gt;
&lt;/p&gt;
&lt;h2 id=&#34;3-结语&#34;&gt;3. 结语&lt;/h2&gt;
&lt;p&gt;从上一张的GIF运行效果图相比大家也不难看出，这个云安卓的效率也不是很强，虽然能运行安卓应用，但是帧数很低，这是因为以下几个原因：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;网络问题&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;我的主机位置在韩国春川，家宽为联通，最近两边的网络延迟已经飙升到200了，还时常伴随丢包，所以操作有很大延迟，对延迟很敏感的应用肯定不适合运行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配置问题&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;我开了2台Arm，所以这台的配置为 &lt;code&gt;2C12G&lt;/code&gt; 没有硬件加速的情况下cpu压力太大，下面是运 行抖音播放视频时的资源占用截图：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/12/66086810e53e4df2454132feeeb66fb8.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;容器问题&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;容器在用纯CPU下仅有15Hz的刷新率，使得在源头上就不可能流畅。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;：适合用来做一些静态应用的测试，或者一些挂机的应用，日常使用还是算了。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Oracle Linux 8 升级内核</title>
      <link>https://linkzz.org/posts/oracle-linux-update-kernel/</link>
      <pubDate>Fri, 24 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://linkzz.org/posts/oracle-linux-update-kernel/</guid>
      <description>&lt;p&gt;甲骨文的免费Arm主机开始申请的时候没注意选了 &lt;code&gt;Oracle Linux 8&lt;/code&gt; 系统而没选自己更熟悉的&lt;code&gt;Ubuntu&lt;/code&gt; ，导致各种折腾的时候发现资料有点少，今天折腾一个云安卓 redroid 系统的时候发现需要编译一些内核模块，而默认的 &lt;code&gt;5.4&lt;/code&gt; 内核一直编译失败，于是想到升级内核试试，一路搜索找不到很符合的文章，于是自己摸索了一下，记录于此。&lt;/p&gt;
&lt;h2 id=&#34;1-查看已经安装的内核包&#34;&gt;1. 查看已经安装的内核包&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;➜  client yum list installed &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep kernel
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kernel-headers.aarch64                    4.18.0-477.13.1.el8_8                         @ol8_baseos_latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kernel-tools.aarch64                      4.18.0-477.13.1.el8_8                         @ol8_baseos_latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kernel-tools-libs.aarch64                 4.18.0-477.13.1.el8_8                         @ol8_baseos_latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kernel-uek.aarch64                        5.4.17-2136.307.3.1.el8uek                    @ol8_baseos_latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kernel-uek.aarch64                        5.4.17-2136.309.4.el8uek                      @ol8_baseos_latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kernel-uek.aarch64                        5.4.17-2136.320.7.1.el8uek                    @ol8_baseos_latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kernel-uek-devel.aarch64                  5.4.17-2136.307.3.1.el8uek                    @ol8_baseos_latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kernel-uek-devel.aarch64                  5.4.17-2136.309.4.el8uek                      @ol8_baseos_latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kernel-uek-devel.aarch64                  5.4.17-2136.320.7.1.el8uek                    @ol8_baseos_latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到我们的内核都是baseos仓库安装的内核，该仓库内核版本比较老，查看 &lt;a href=&#34;https://yum.oracle.com/oracle-linux-8.html&#34;&gt;官网仓库&lt;/a&gt; 列表，内核仓库有了更新的包。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/11/65b914750a8e4af2223222846ec0bc9e.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;内核版本为 &lt;code&gt;5.15.0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/11/0f874fa31fde2c31254bded5b203d3d1.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;h2 id=&#34;2-安装内核&#34;&gt;2. 安装内核&lt;/h2&gt;
&lt;p&gt;先看下已有的 yum 库&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;➜  sudo yum repolist
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;repo id                                        repo name
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker-ce-nightly                              Docker CE Nightly - aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker-ce-stable                               Docker CE Stable - aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker-ce-test                                 Docker CE Test - aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;epel                                           Extra Packages &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; Enterprise Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; - aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nginx-stable                                   nginx stable repo
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_MySQL80                                    MySQL 8.0 &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_MySQL80_connectors_community               MySQL 8.0 Connectors Community &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_MySQL80_tools_community                    MySQL 8.0 Tools Community &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_addons                                     Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; Addons &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_appstream                                  Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; Application Stream &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_baseos_latest                              Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; BaseOS Latest &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_developer_EPEL                             Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; EPEL Packages &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; Development &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_ksplice                                    Ksplice &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_oci_included                               Oracle Software &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; OCI users on Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;没有包含Release 7的这个内核仓库，现在添加一下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo yum-config-manager --add-repo http://yum.oracle.com/repo/OracleLinux/OL8/UEKR7/aarch64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;检查一下是否添加成功&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;➜  ~ sudo yum repolist
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;repo id                                           repo name
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker-ce-nightly                                 Docker CE Nightly - aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker-ce-stable                                  Docker CE Stable - aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker-ce-test                                    Docker CE Test - aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;epel                                              Extra Packages &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; Enterprise Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; - aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nginx-stable                                      nginx stable repo
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_MySQL80                                       MySQL 8.0 &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_MySQL80_connectors_community                  MySQL 8.0 Connectors Community &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_MySQL80_tools_community                       MySQL 8.0 Tools Community &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_addons                                        Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; Addons &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_appstream                                     Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; Application Stream &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_baseos_latest                                 Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; BaseOS Latest &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_developer_EPEL                                Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; EPEL Packages &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; Development &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_ksplice                                       Ksplice &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ol8_oci_included                                  Oracle Software &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; OCI users on Oracle Linux &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;aarch64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yum.oracle.com_repo_OracleLinux_OL8_UEKR7_aarch64 created by dnf config-manager from http://yum.oracle.com/repo/OracleLinux/OL8/UEKR7/aarch64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后再更新一下:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo yum update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可已查看到将要更新的包了，同时 yum 会自动移除旧的内核，这里是同时升级仓库中所有已安装的包版本，如果只想升级内核可以使用 &lt;code&gt;sudo yum update kernel\*&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;最后重启一下&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;reboot
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;3-验证内核安装&#34;&gt;3. 验证内核安装&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;➜  ~ uname -r
5.15.0-200.131.27.el8uek.aarch64
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;新的内核已经安装成功！&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>一次防火墙纠错，让我更了解防火墙机制</title>
      <link>https://linkzz.org/posts/firewall-checkout/</link>
      <pubDate>Tue, 07 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://linkzz.org/posts/firewall-checkout/</guid>
      <description>&lt;h2 id=&#34;1-起因&#34;&gt;1. 起因&lt;/h2&gt;
&lt;p&gt;工作中我一直使用wireguard搭建公司 -&amp;gt; 家的桥梁，用于随时随地访问家中内网的各种服务，如gogs代码仓库、nextcloud同步工作文件，抑或是远程连接windows虚拟机用来摸鱼，然而尽管拥有公网ip，家里和公司之间只有区区10ms的网络时延，却还是因为运营商对UDPl的QOS而影响远程服务的传输体验。于是我就搭建了一套phantun服务用来将UDP流量转换为TCP流量而避过运营商的QOS，建好之后确实体验提升明显，远程的moonlight能稳定跑满30M上传带宽，然而当时搭建的时候的iptables规则未保存，今天的一次重启让我的phantun死活连不上，于是就有了今天的文章。&lt;/p&gt;
&lt;h2 id=&#34;2-排查&#34;&gt;2. 排查&lt;/h2&gt;
&lt;h3 id=&#34;21-报错日志&#34;&gt;2.1 报错日志&lt;/h3&gt;
&lt;p&gt;由于是客户端重启之后连不上的，排除服务端错误的情况，从客户端查起，查看phantun报错：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status phantun.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Nov  8 10:22:11 new-business-dev-001 phantun_client[5517]:  ERROR client &amp;gt; Unable to connect to remote {my-home-ip}:25379
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Nov  8 10:22:14 new-business-dev-001 phantun_client[5517]:  ERROR client &amp;gt; Unable to connect to remote {my-home-ip}:25379
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;客户端一直报错连不上服务端，25379端口是&lt;code&gt;phantun_server&lt;/code&gt;的监听端口，之前连接是好的，不可能有问题。&lt;/p&gt;
&lt;h3 id=&#34;22-抓包分析&#34;&gt;2.2 抓包分析&lt;/h3&gt;
&lt;p&gt;遇到网络相关的问题，抓包分析是最为直观的解决方案，我们查看往来服务端的流量信息:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tcpdump -i any host &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;my-home-ip&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;10:28:48.652090 IP 192.168.200.2.61048 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;10:28:49.653239 IP 192.168.200.2.61048 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;10:28:50.654392 IP 192.168.200.2.61048 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;10:28:51.655551 IP 192.168.200.2.61048 &amp;gt; {my-home-ip}.25379: Flags [R], seq 0, win 65535, length 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;IP &lt;code&gt;192.168.200.2&lt;/code&gt; 一直在向服务端发送 SYN 握手包，而服务端是没有响应任何内容的，这明显可以看出这个包是没办法送达的，因为 &lt;code&gt;192.168.200.2&lt;/code&gt; 这个地址属于 phantun_client 创建的tun设备的地址，是没有互联网访问能力的，所以我们需要将该接口的包转发至具有互联网访问能力的接口，通俗的讲就是 lan 口，首先确认内核开启了 IP 转发：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo sysctl -a &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep ip.forward
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;net.ipv4.ip_forward = 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;net.ipv4.ip_forward_update_priority = 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;net.ipv4.ip_forward_use_pmtu = 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;看到 &lt;code&gt;net.ipv4.ip_forward = 1&lt;/code&gt; 的值为1已经开启了IP转发，如若不是需开启ip转发，开启ipv4的IP转发即可：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo sysctl -w net.ipv4.ip_forward&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启用源地址转换：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo iptables -t nat -A POSTROUTING -o ens160 -j MASQUERADE
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里 &lt;code&gt;ens160&lt;/code&gt; 是我可以访问互联网的接口，这里指的是对 &lt;code&gt;nat&lt;/code&gt; 表的 &lt;code&gt;POSTROUTING&lt;/code&gt; 链添加一条规则，对出口接口为 &lt;code&gt;ens160&lt;/code&gt; 的所有流量执行 &lt;code&gt;MASQUERADE&lt;/code&gt; 操作，&lt;code&gt;MASQUERADE&lt;/code&gt; 是源地址转换（SNAT）的一种实现，通过这样的操作即可实现局域网内的地址可转换为ens160的地址进行互联网访问，从而使得 &lt;code&gt;phantun_client&lt;/code&gt; 的流量包能成功发出。&lt;/p&gt;
&lt;h3 id=&#34;23-还是不行&#34;&gt;2.3 还是不行？&lt;/h3&gt;
&lt;p&gt;再看看看日志：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;11:09:26.356501 IP 192.168.200.2.5320 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;11:09:27.357822 IP 192.168.200.2.5320 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;11:09:28.358988 IP 192.168.200.2.5320 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;11:09:29.360160 IP 192.168.200.2.5320 &amp;gt; {my-home-ip}.25379: Flags [R], seq 0, win 65535, length 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;额。。。看样子我们并没有成功，日志还是和之前没有区别，这难道是分析有误？我不禁开始怀疑自己的水平，还是那么菜。然而消沉并没有用，问题还要解决，是时候祭出天书了，翻遍了我的书籍找到了下面这张图(鸟哥的Linux私房菜)： &lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/11/25f7a3eeb14f137bcfebef078dda4a30.png&#34; alt=&#34;image.png&#34;  /&gt;
 可以看到 &lt;code&gt;wireguard&lt;/code&gt; 的握手包是需要发出之前是需要经过 &lt;code&gt;FORWARD&lt;/code&gt; 链的，那会不会是被这条路阻了呢，查看 &lt;code&gt;iptables&lt;/code&gt; 详情：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo iptables -L -v -n
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/11/a880600760263e299c833553e857b63e.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;果然，&lt;code&gt;FORWARD&lt;/code&gt; 链默认策略是 &lt;code&gt;DROP&lt;/code&gt;，正是这个地方阻止了流量包，调整 &lt;code&gt;FORWARD&lt;/code&gt; 链默认策略：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo iptables -P FORWARD ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再来看抓包日志：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;13:52:54.939793 IP 192.168.200.2.11968 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;13:52:54.939857 IP 10.1.1.137.11968 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;13:52:54.949558 IP{my-home-ip}.25379 &amp;gt; 10.1.1.137.11968: Flags [S.], seq 0, ack 1, win 65535, options [mss 536,nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;13:52:54.949585 IP {my-home-ip}.25379 &amp;gt; 192.168.200.2.11968: Flags [S.], seq 0, ack 1, win 65535, options [mss 536,nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;13:52:54.949644 IP 192.168.200.2.11968 &amp;gt; {my-home-ip}.25379: Flags [.], ack 1, win 65535, length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;13:52:54.949658 IP 10.1.1.137.11968 &amp;gt; {my-home-ip}.25379: Flags [.], ack 1, win 65535, length 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到握手包正常发出和接收了，再看 &lt;code&gt;wireguard&lt;/code&gt; 状态：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/11/25551621cab65e23ef6dd0aeaf590be4.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;通过 &lt;code&gt;phantun&lt;/code&gt; 伪装的 &lt;code&gt;wireguard&lt;/code&gt; 也连接成功，至此问题解决。&lt;/p&gt;
&lt;h3 id=&#34;24-保存规则&#34;&gt;2.4 保存规则&lt;/h3&gt;
&lt;p&gt;至此就完结了吗，并没有，我们以上设置的 &lt;code&gt;iptables&lt;/code&gt; 规则并不是永久的，重启之后之前设置的规则都会重置，事实上之所有有此次问题正是因为我之前设置好的 &lt;code&gt;iptables&lt;/code&gt; 规则没有保存，无法开机自动应用规则导致的此次事件，下面我们就来保存规则：&lt;/p&gt;
&lt;p&gt;安装 &lt;code&gt;iptables-persistent&lt;/code&gt; 包&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install iptables-persistent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;保存规则：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo iptables-save &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/iptables/rules.v4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样重启之后规则自会自动应用了&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>拯救你的idea,解决ubuntu下idea字体发虚</title>
      <link>https://linkzz.org/posts/ubuntu-idea-font/</link>
      <pubDate>Fri, 03 May 2019 22:36:15 +0000</pubDate>
      
      <guid>https://linkzz.org/posts/ubuntu-idea-font/</guid>
      <description>&lt;h3 id=&#34;idea在ubuntu下的字体表现&#34;&gt;idea在ubuntu下的字体表现&lt;/h3&gt;
&lt;p&gt;idea这么强大的ide相信大家都有目共睹，但是最近在ubuntu下安装idea之后却发现字体表现还不如windows，要知道windows的字体渲染可是不如linux的，在高分屏下window的字体会出现明显锯齿，而linux就很平滑，虽然这个和idea没关系，因为idea是用java开发的，字体渲染不是用的系统的字体渲染引擎。查阅资料也发现对于idea的字体渲染问题，intelliJ是有优化过的，然而我ubuntu下的idea看起来却是这样的：&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://i.imgur.com/YkDKWyj.jpg&#34; alt=&#34;字体发虚&#34;  /&gt;
&lt;/p&gt;
&lt;h3 id=&#34;idea环境&#34;&gt;idea环境&lt;/h3&gt;
&lt;p&gt;我的ubuntu是18.04LTS，屏幕是23寸1920*1080，idea设置如下： &lt;img loading=&#34;lazy&#34; src=&#34;https://i.imgur.com/EzED46g.png&#34; alt=&#34;主题设置&#34;  /&gt;
 主题方面选择了idea内部提供的暗色主题Darcula编辑界面主题是在&lt;a href=&#34;https://www.riaway.com/&#34;&gt;idea主题样式网站&lt;/a&gt;下载的： &lt;img loading=&#34;lazy&#34; src=&#34;https://i.imgur.com/3yHaDWq.png&#34; alt=&#34;编辑界面主题&#34;  /&gt;
 英文字体是Adobe开源的source code pro,在&lt;a href=&#34;https://github.com/adobe-fonts/source-code-pro&#34;&gt;github仓库&lt;/a&gt;中提供下载。中文字体是开源字体&lt;a href=&#34;http://wenq.org/wqy2/index.cgi?MicroHei&#34;&gt;文泉驿微米黑&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;更换系统主题&#34;&gt;更换系统主题&lt;/h3&gt;
&lt;p&gt;字体看起来发虚只是在暗色主题中才会发生，所以我们采取曲线救国策略，换用itelliJ亮色主题，然后结合一张暗色背景图来实现暗色主题的效果。 &lt;img loading=&#34;lazy&#34; src=&#34;https://i.imgur.com/kOYK47F.png&#34; alt=&#34;主题&#34;  /&gt;
 主题选择intellJ &lt;img loading=&#34;lazy&#34; src=&#34;https://i.imgur.com/C72WEg4.png&#34; alt=&#34;背景图&#34;  /&gt;
 选择一张背景图设置透明度 &lt;img loading=&#34;lazy&#34; src=&#34;https://i.imgur.com/eEdwc6X.png&#34; alt=&#34;编辑界面主题&#34;  /&gt;
 编辑界面主题选择一张亮色的主题，字体不变&lt;/p&gt;
&lt;h3 id=&#34;成果&#34;&gt;成果&lt;/h3&gt;
&lt;p&gt;完成以上设置之后来看看成果 &lt;img loading=&#34;lazy&#34; src=&#34;https://i.imgur.com/FA32hdy.jpg&#34; alt=&#34;成果&#34;  /&gt;
 字体看起来平滑多了，好了，安心编码吧 :)&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>

