<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://www.ikrazel.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.ikrazel.com/" rel="alternate" type="text/html" hreflang="zh-CN" /><updated>2026-10-15T10:05:30+08:00</updated><id>https://www.ikrazel.com/feed.xml</id><title type="html">米斯特周</title><subtitle>A minimal, responsive and feature-rich Jekyll theme for technical writing.</subtitle><entry><title type="html">老周推荐:Typora 能做的，它全能做</title><link href="https://www.ikrazel.com/posts/solomd-free-typora/" rel="alternate" type="text/html" title="老周推荐:Typora 能做的，它全能做" /><published>2026-10-15T09:13:32+08:00</published><updated>2026-10-15T09:13:32+08:00</updated><id>https://www.ikrazel.com/posts/solomd-free-typora</id><content type="html" xml:base="https://www.ikrazel.com/posts/solomd-free-typora/"><![CDATA[<p>AI时代，人人都可以做开发，也是重复造轮子的时代，今天我想介绍一个markdown编辑器<code class="language-plaintext highlighter-rouge">SoloMD</code>，1.3K star，截止目前下载量超过81k，<code class="language-plaintext highlighter-rouge">SoloMD</code>既是markdown编辑器，又内置了<code class="language-plaintext highlighter-rouge">Agent</code>面板，一些活可以交给AI处理。
<!--more--></p>

<h2 id="卖点typora-能做的它全能做免费">卖点：Typora 能做的，它全能做。免费。</h2>

<p>所见即所得实时预览、多标签、主题、PDF / Word 导出 。并且还有 AI 改写、文件夹同步、原生 iOS 与 Android 应用。MIT 开源，无账号、无订阅、无广告。</p>

<h2 id="卖点技术架构新macos--win--linux--ipadios安卓统统拿下">卖点：技术架构新，macOS · Win · Linux · iPad/iOS/安卓统统拿下</h2>

<p>技术架构：</p>

<ul>
  <li>Tauri2</li>
  <li>Vue3</li>
  <li>Codemirror6</li>
</ul>

<p>系统要求：
Windows 10+、macOS 10.15+、主流 Linux 发行版、iOS 15+、Android 7+(API 24)。</p>

<h2 id="卖点隐私与安全">卖点：隐私与安全</h2>

<p>纯客户端。你的<code class="language-plaintext highlighter-rouge">.md</code>文件留在你选的文件夹里。<code class="language-plaintext highlighter-rouge">API key</code>存在系统钥匙串(macOS Keychain / Windows Credential Manager / Linux libsecret),永远不进 localStorage 或配置文件。AI 请求从你的机器直连厂商 —— 不经 SoloMD 中转。RAG 嵌入索引和 AutoGit 仓库都是本地。MCP server 默认走 stdio;可选的 HTTP 传输默认只监听本机,并可要求 Bearer token。整个代码库 MIT 协议,可审计。</p>

<p>Agent 安全护栏(v4.0)。 每次 Recipe 运行都开自己的 AutoGit 分支 —— main 在你点 Accept 之前一动不动。单次 write-cap(默认 5,硬上限 50)防止失控循环。Recipe runner 在工作区脏时直接拒绝启动(agent commit 不会扫到你的 WIP)。所有接受用户传入路径的 Tauri / MCP / REST 端点都前置拒绝 .. 段和绝对路径。</p>

<p>E2EE 同步用 Argon2id(RFC9106 默认参数)→ XChaCha20-Poly1305,确定性 nonce + path-as-AAD。明文留在你的设备上;远端只看到密文。sync.json 解析失败会拒绝推送,绝不降级到明文(v3.0.x 审计修过的一条)。</p>

<p><img src="https://img.261540.xyz/piclist/2026_10_1792028293.png" alt="" /></p>

<p>目前最新版本：<a href="https://ghfast.top/https://github.com/zhitongblog/solomd/releases/download/v5.0.1/SoloMD_5.0.1_x64_en-US.msi">v5.0.1</a></p>

<p>官方网站：<a href="https://solomd.app">SoloMD</a></p>

<p>github仓库：<a href="https://github.com/solomd/solomd">SoloMD仓库</a></p>]]></content><author><name></name></author><category term="Windows" /><category term="markdown" /><summary type="html"><![CDATA[AI时代，人人都可以做开发，也是重复造轮子的时代，今天我想介绍一个markdown编辑器SoloMD，1.3K star，截止目前下载量超过81k，SoloMD既是markdown编辑器，又内置了Agent面板，一些活可以交给AI处理。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.261540.xyz/piclist/2026_10_1792026888.png" /><media:content medium="image" url="https://img.261540.xyz/piclist/2026_10_1792026888.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">关于静态博客引擎的比较</title><link href="https://www.ikrazel.com/posts/about-static-blog-engine/" rel="alternate" type="text/html" title="关于静态博客引擎的比较" /><published>2026-10-10T10:50:32+08:00</published><updated>2026-10-10T10:50:32+08:00</updated><id>https://www.ikrazel.com/posts/about-static-blog-engine</id><content type="html" xml:base="https://www.ikrazel.com/posts/about-static-blog-engine/"><![CDATA[<p>一直以来，我都在使用静态博客引擎来搭建我的个人博客。经过多年的使用和比较，我对几款主流的静态博客引擎有了一些自己的看法。</p>

<h2 id="jekyll">jekyll</h2>

<p>先来说jekyll吧，一直让我感觉很没有存在感的这个引擎，虽然它是GitHub Pages的官方支持引擎，但在国内的使用率并不高。jekyll的优点是简单易用，适合初学者入门，而且有大量的主题和插件可以选择。然而，它的缺点也很明显，构建速度较慢，尤其是在内容较多的时候，生成静态页面的时间会显著增加。此外，jekyll对Windows用户的支持不够友好，需要额外安装Ruby环境，这对于一些新手来说可能是一个门槛。</p>

<p>我一般都不安装ruby环境，就是直接使用GitHub Actions来构建jekyll博客，这样可以避免在本地环境中遇到的各种问题。不过，这也意味着每次更新博客内容时，都需要等待GitHub Actions的构建时间，这对于频繁更新的博客来说，可能会有些不便。目前我的博客文章大概在800多条数据，使用jekyll构建一次大概需要就几分钟搞定，没有任何错误。我这些博文都是从pjblog时代迁移到wordpress，然后又迁移到typecho，最后全部转为markdown了，文件本身也存在各种语法问题，前前后后折腾了很多次。</p>

<p>我想说的就是即便文档存在各种问题，jekyll都能顺利构建成功，这说明jekyll的容错能力还是很强的。对于我来说，jekyll的稳定性和可靠性是它最大的优势。</p>

<h2 id="hugo">hugo</h2>

<p>再来说说hugo吧，hugo曾经也是我最推荐的静态博客引擎，可是更新迭代多次后，虽然构建速度快，但是越来越难用了。这两天，我本来想把我的hugo博客升级一下，换换主题，使用了stack主题，托管在Netlify平台上进行构建，昨天一直构建失败，都是和post文件有关系，来来回回改动了好多次，最后我忍无可忍，把全量文件全部修了一遍，我以为这样就可以构建成功了，结果又失败了，而且netlify的credit也用完了，一气之下，从netlify删了项目全部搬家到cloudflare上了。按理说，使用golang开发的hugo，应该是效率很高的，但是，给我的感觉是构建速度没有以前那么快了，而且从昨天一天的折腾来看，我其实挺失望的。</p>

<h2 id="hexo">hexo</h2>

<p>以前挺火的hexo，不知道发生了什么事情，国内的使用率好像下降了，我在网上浏览了一些以前做hexo主题的个人博客，发现都转hugo了。我试用了一下hexo 8.1.2，构建我的博客速度还行，没有以前那么慢了，以前真的是特别慢，而且构建时经常报错，就是因为post文件被转了多次，文件中存在不合适的语法问题，或者特殊符号等等问题，所以才转了hugo。今天构建时，也报错了，虽然昨天把全量post文件改了一次，今天构建时仍然有五六个文件因为格式问题，构建出错，修复后，构建成功。然后就默默删除了静态部署。</p>

<p>所以呢，图省事，感觉还是jekyll确实是最稳定的静态博客引擎首选。如果是从零开始写博，根据自己的喜好，以及，喜欢的主题，选择合适的静态博客引擎。话说，现在估计也没多少人写了吧。</p>]]></content><author><name></name></author><category term="我的世界" /><category term="hugo" /><category term="hexo" /><category term="jekyll" /><summary type="html"><![CDATA[一直以来，我都在使用静态博客引擎来搭建我的个人博客。经过多年的使用和比较，我对几款主流的静态博客引擎有了一些自己的看法。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.261540.xyz/piclist/2026_10_20261010143509718.png" /><media:content medium="image" url="https://img.261540.xyz/piclist/2026_10_20261010143509718.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">CertBot申请证书</title><link href="https://www.ikrazel.com/posts/howto-use-certbot-with-cloudflare/" rel="alternate" type="text/html" title="CertBot申请证书" /><published>2026-04-13T10:50:32+08:00</published><updated>2026-04-13T10:50:32+08:00</updated><id>https://www.ikrazel.com/posts/howto-use-certbot-with-cloudflare</id><content type="html" xml:base="https://www.ikrazel.com/posts/howto-use-certbot-with-cloudflare/"><![CDATA[<p>1、安装certbot</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>apt install certbot python3-certbot-dns-cloudflare
</pre></td></tr></tbody></table></code></pre></div></div>
<!--more-->
<p>2、设置cloudflare Token</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre>vi .cerbot

# cloudflare token
dns_cloudflare_api_token = your_cloudflare_token

chmod 600 .cerbot
</pre></td></tr></tbody></table></code></pre></div></div>

<p>3、申请证书</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.certbot -d example.com
</pre></td></tr></tbody></table></code></pre></div></div>

<p>4、部署脚本</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="rouge-code"><pre>#!/bin/bash

# 定义目标域名和目标目录
DOMAIN="example.com"  # 替换为你的域名
DEST_DIR="/path/to/destination"  # 替换为目标目录

# 检查目标目录是否存在，不存在则创建
if [ ! -d "$DEST_DIR" ]; then
    mkdir -p "$DEST_DIR"
fi

# 从 Certbot 的默认目录复制证书文件到目标目录
cp "/etc/letsencrypt/live/$DOMAIN/privkey.pem" "$DEST_DIR/privkey.pem"
cp "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" "$DEST_DIR/fullchain.pem"

# 设置目标目录中的文件权限
chmod 600 "$DEST_DIR/privkey.pem" "$DEST_DIR/fullchain.pem"

echo "证书已成功复制到 $DEST_DIR"
</pre></td></tr></tbody></table></code></pre></div></div>

<p>6、调用脚本</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>certbot renew --deploy-hook "/path/to/your/script.sh"
</pre></td></tr></tbody></table></code></pre></div></div>]]></content><author><name></name></author><category term="Linux" /><category term="certbot" /><category term="Cloudflare" /><summary type="html"><![CDATA[1、安装certbot 1 apt install certbot python3-certbot-dns-cloudflare 2、设置cloudflare Token]]></summary></entry><entry><title type="html">Tailscale-自建Derp中继服务器</title><link href="https://www.ikrazel.com/posts/tailscale-setting-derp-relay-server/" rel="alternate" type="text/html" title="Tailscale-自建Derp中继服务器" /><published>2026-03-12T15:29:32+08:00</published><updated>2026-03-12T15:29:32+08:00</updated><id>https://www.ikrazel.com/posts/tailscale-setting-derp-relay-server</id><content type="html" xml:base="https://www.ikrazel.com/posts/tailscale-setting-derp-relay-server/"><![CDATA[<h1 id="1-tailscale-与-derp-简介">1. Tailscale 与 DERP 简介</h1>
<h2 id="tailscale-是什么">Tailscale 是什么？</h2>

<p>Tailscale 是一个基于 Wireguard 的带有多种网络工具的 P2P 组网工具。得益于其 P2P 的特性，Tailscale 还可以进行内网穿透，打破 NAT 的限制直达另一台主机。</p>

<h2 id="derp-是什么">DERP 是什么？</h2>

<p><code class="language-plaintext highlighter-rouge">DERP</code>是一个 Tailscale 自行开发的中继服务。当所处网络环境难以穿透（如校园网、移动大内网、4G、5G等）时，所有流量都会经由 DERP 中转至目标地址。
<!--more-->
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMiadyLT3V30EecRdb7XfoEQCsQDdEAAhwMaxvWRuhGoCoF6d_EjY0BAAMCAAN4AAM7BA.png" alt="" /></p>

<p>在默认情况下，Tailscale 官方已经提供了环大陆的官方 DERP 服务（见下方<code class="language-plaintext highlighter-rouge">图 1</code>），但是由于中国大陆的网络连通性等问题，官方并未提供大陆的 DERP 节点。为了确保大陆的打通成功率，我们需要自建一个 DERP 服务，来帮助我们“打洞”。</p>

<p><img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMjadyLm5x5gFVxjYxywD5oncBmt7oAAh0MaxvWRuhGXAABKQqYeC4IAQADAgADeAADOwQ.png" alt="" /></p>

<h1 id="2-安装-docker-与-docker-compose">2. 安装 Docker 与 Docker compose</h1>

<p>这段请自行参考 Docker 官方网站与其他作者写的部署教程，毕竟每个发行版都不尽相同。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>curl -fsSL https://get.docker.com | bash -s docker

或者

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
</pre></td></tr></tbody></table></code></pre></div></div>

<h1 id="3-在-derp-节点服务中部署-tailscale-客户端">3. 在 DERP 节点服务中部署 Tailscale 客户端</h1>
<p>先安装</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>curl -fsSL https://tailscale.com/install.sh | sh
</pre></td></tr></tbody></table></code></pre></div></div>
<p>登录</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>tailscale login
</pre></td></tr></tbody></table></code></pre></div></div>

<h1 id="4-启动-docker-镜像">4. 启动 Docker 镜像</h1>

<p>可用的docker-compose.yaml</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="rouge-code"><pre>services:  
  derper:
    image: fredliang/derper
    restart: always
    ports:
      - 13443:443
      - 3478:3478/udp
    environment:
      DERP_DOMAIN: "derp.example.com"
      DERP_CERT_MODE: "manual"
      DERP_ADDR: ":443"
      DERP_VERIFY_CLENTS: "true"
    volumes:
      - /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
      - /home/derp:/app/certs
</pre></td></tr></tbody></table></code></pre></div></div>

<p>注意：本地路径 /home/derp 保存与域名相同名称的ssl证书和私钥，例如<code class="language-plaintext highlighter-rouge">derp.example.com.cer</code>,<code class="language-plaintext highlighter-rouge">derp.example.com.key</code>。</p>

<h1 id="5-配置-tailscale-acl">5. 配置 tailscale ACL</h1>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="rouge-code"><pre>	"derpMap": {
		"OmitDefaultRegions": false,//这里改成true就是只用自己的derp互联，建议不改，如果要跨网可以改成true
		"Regions": {
			"900": {
				"RegionID":   900,
				"RegionCode": "85",
				"RegionName": "HK",
				"Nodes": [{
					"Name":     "myderp",
					"RegionID": 900,
					"HostName": "derp.example.com",
					"DERPPort": 13443,
					"STUNPort": 3478 //这里改成stun的端口
				}],
			},
		},
	},
</pre></td></tr></tbody></table></code></pre></div></div>
<h1 id="6-测试">6. 测试</h1>
<p>重新连接Tailscale，然后测试</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>tailscale netcheck
</pre></td></tr></tbody></table></code></pre></div></div>]]></content><author><name></name></author><category term="Linux" /><category term="Tailscale" /><summary type="html"><![CDATA[1. Tailscale 与 DERP 简介 Tailscale 是什么？]]></summary></entry><entry><title type="html">Github无法push代码报Connection closed</title><link href="https://www.ikrazel.com/posts/how-to-fix-github-cant-push/" rel="alternate" type="text/html" title="Github无法push代码报Connection closed" /><published>2024-11-28T10:50:32+08:00</published><updated>2024-11-28T10:50:32+08:00</updated><id>https://www.ikrazel.com/posts/how-to-fix-github-cant-push</id><content type="html" xml:base="https://www.ikrazel.com/posts/how-to-fix-github-cant-push/"><![CDATA[<p>今天在更新博客文章时，发现无法push代码，错误如下：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>Connection closed by 140.82.116.3 port 22
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
</pre></td></tr></tbody></table></code></pre></div></div>
<!--more-->
<p>Google了一下错误信息，反正肯定是和防火墙有关，禁止了我们访问GitHub的22端口，通过查看GitHub的文档，可以使用HTTPS端口进行push代码。</p>

<h2 id="测试https端口的ssh是否可行">测试HTTPS端口的SSH是否可行</h2>

<p>首先，要测试通过 HTTPS 端口的 SSH 是否可行，请运行以下 SSH 命令：：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>ssh -T -p 443 git@ssh.github.com
</pre></td></tr></tbody></table></code></pre></div></div>
<p>返回如下信息，表示你可以使用这个办法去规避22端口无法push的问题：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>Hi &lt;username&gt;! You've successfully authenticated, but GitHub does not provide shell access.
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="修改ssh配置文件">修改SSH配置文件</h2>

<p>打开<code class="language-plaintext highlighter-rouge">.ssh/config</code>文件，增加如下内容：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>Host github.com
    Hostname ssh.github.com
    Port 443
    User git
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="测试">测试</h2>

<h3 id="clone代码">Clone代码</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>git clone ssh://git@ssh.github.com:443/YOUR-USERNAME/YOUR-REPOSITORY.git
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="push代码">Push代码</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>git push
</pre></td></tr></tbody></table></code></pre></div></div>]]></content><author><name></name></author><category term="Windows" /><category term="GitHub" /><summary type="html"><![CDATA[今天在更新博客文章时，发现无法push代码，错误如下：]]></summary></entry><entry><title type="html">Cloudflare Tunnels无法建立隧道的解决办法</title><link href="https://www.ikrazel.com/posts/how-to-fix-cloudflare-tunnel-no-connection/" rel="alternate" type="text/html" title="Cloudflare Tunnels无法建立隧道的解决办法" /><published>2024-11-26T20:50:32+08:00</published><updated>2024-11-26T20:50:32+08:00</updated><id>https://www.ikrazel.com/posts/how-to-fix-cloudflare-tunnel-no-connection</id><content type="html" xml:base="https://www.ikrazel.com/posts/how-to-fix-cloudflare-tunnel-no-connection/"><![CDATA[<p>今天在使用CloudFlare的tunnel，给NAS搞一个公网访问，结果发现从NAS里面运行docker，Cloudflare客户端无法建立连接，错误如下：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre>2024-11-26T09:05:39Z ERR Failed to dial a quic connection error="failed to dial to edge with quic: timeout: no recent network activity" connIndex=0 event=0 ip=198.18.0.50
2024-11-26T09:05:39Z INF Retrying connection in up to 2s connIndex=0 event=0 ip=198.18.0.50
2024-11-26T09:05:45Z ERR Failed to dial a quic connection error="failed to dial to edge with quic: timeout: no recent network activity" connIndex=0 event=0 ip=198.18.0.49
2024-11-26T09:05:45Z INF Retrying connection in up to 4s connIndex=0 event=0 ip=198.18.0.49
2024-11-26T09:05:54Z ERR Failed to dial a quic connection error="failed to dial to edge with quic: timeout: no recent network activity" connIndex=0 event=0 ip=198.18.0.50
2024-11-26T09:05:54Z INF Retrying connection in up to 8s connIndex=0 event=0 ip=198.18.0.50
</pre></td></tr></tbody></table></code></pre></div></div>
<!--more-->
<p>网上查询了一下，大家的说法是NAT，防火墙，再就是客户端的协议方式，最后查了一下自己的网络，排除了NAT，防火墙问题，于是就按照下面的方式修改协议，在docker命令中增加<code class="language-plaintext highlighter-rouge">--protocol http2</code>即可，此时强制指定协议为http2，使用的是TCP，这样就不会被运营商阻断了。当然，也可以设置为–protocol auto ，开启自动切换，默认依然是quic，但是失败后可自动切换到http2。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>sudo docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --protocol http2 --token &lt;YOUR_TOKEN&gt;
</pre></td></tr></tbody></table></code></pre></div></div>

<p>心想这样应该就可以了吧，结果又报了下面的错误：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>2024-11-26T09:11:24Z ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: EOF" connIndex=0 event=0 ip=198.18.0.49
2024-11-26T09:11:24Z ERR Serve tunnel error error="TLS handshake with edge error: EOF" connIndex=0 event=0 ip=198.18.0.49
2024-11-26T09:11:24Z INF Retrying connection in up to 16s connIndex=0 event=0 ip=198.18.0.49
2024-11-26T09:11:32Z ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: EOF" connIndex=0 event=0 ip=198.18.0.50
2024-11-26T09:11:32Z ERR Serve tunnel error error="TLS handshake with edge error: EOF" connIndex=0 event=0 ip=198.18.0.50
2024-11-26T09:11:32Z INF Retrying connection in up to 32s connIndex=0 event=0 ip=198.18.0.50
2024-11-26T09:11:41Z ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: EOF" connIndex=0 event=0 ip=198.18.0.49
2024-11-26T09:11:41Z ERR Serve tunnel error error="TLS handshake with edge error: EOF" connIndex=0 event=0 ip=198.18.0.49
</pre></td></tr></tbody></table></code></pre></div></div>

<p>又是查网络发现这个<a href="https://github.com/cloudflare/cloudflared/issues/376">issue</a>说的靠谱，我家里是软路由透明代理，DNS应该是使用了旁路由的DNS，导致了这个问题，于是我把NAS的dns地址手动指定为我的主路由地址，再次运行docker，查看日志，it works!</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>2024-11-26T09:20:02Z INF Initial protocol http2
2024-11-26T09:20:02Z INF ICMP proxy will use A.A.A.A as source for IPv4
2024-11-26T09:20:02Z INF ICMP proxy will use 0000::0000:0000:0000:0000 in zone eth0 as source for IPv6
2024-11-26T09:20:07Z INF Starting metrics server on 127.0.0.1:45025/metrics
2024-11-26T09:20:08Z INF Registered tunnel connection connIndex=0 connection=xxxxxxxxx event=0 ip=198.41.200.193 location=sjc07 protocol=http2
</pre></td></tr></tbody></table></code></pre></div></div>]]></content><author><name></name></author><category term="Linux" /><category term="Cloudflare" /><summary type="html"><![CDATA[今天在使用CloudFlare的tunnel，给NAS搞一个公网访问，结果发现从NAS里面运行docker，Cloudflare客户端无法建立连接，错误如下：]]></summary></entry><entry><title type="html">Stay With Me - Miki Matsubara</title><link href="https://www.ikrazel.com/posts/stay-with-me-jp/" rel="alternate" type="text/html" title="Stay With Me - Miki Matsubara" /><published>2024-11-23T20:50:32+08:00</published><updated>2024-11-23T20:50:32+08:00</updated><id>https://www.ikrazel.com/posts/stay-with-me-jp</id><content type="html" xml:base="https://www.ikrazel.com/posts/stay-with-me-jp/"><![CDATA[<p>抖音流行了一个阶段，歌曲来自2008年发布的《Miki Matsubara Best Collection》 专辑。我特地查了一下这个歌星，很可惜的是在2004年10月7日，因宫颈癌去世，享年44岁。</p>

<!--more-->
<iframe style="border-radius:12px" src="https://open.spotify.com/embed/track/2BHj31ufdEqVK5CkYDp9mA?utm_source=generator" width="100%" height="352" frameborder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>

<p>歌词如下：</p>

<blockquote>
  <p>To you, yes, my love to you
Yes, my love to you, you, to you
私は私 貴方は貴方と
昨夜言ってた そんな気もするわ
グレイのジャケットに
見覚えがある コーヒーのしみ
相変らずなのね
ショーウィンドウに 二人映れば
Stay with me
真夜中のドアをたたき
帰らないでと泣いた
あの季節が 今 目の前
Stay with me
口ぐせを言いながら
二人の瞬間を抱いて
まだ忘れず 大事にしていた
恋と愛とは 違うものだよと
昨夜言われた そんな気もするわ
二度目の冬が来て
離れていった貴方の心
ふり返ればいつも
そこに 貴方を感じていたの
Stay with me
真夜中のドアをたたき
心に穴があいた
あの季節が 今 目の前
Stay with me
淋しさまぎらわして
置いたレコードの針
同じメロディ 繰り返していた
Stay with me
真夜中のドアをたたき
帰らないでと泣いた
あの季節が 今 目の前
Stay with me
口ぐせを言いながら
二人の瞬間を抱いて
まだ忘れず 暖めてた
Stay with me
真夜中のドアをたたき
帰らないでと泣いた
あの季節が 今 目の前
Stay with me
口ぐせを言いながら
二人の瞬間を抱いて
まだ忘れず 暖めてた
Stay with me
真夜中のドアをたたき
帰らないでと泣いた
あの季節が 今 目の前
Stay with me</p>
</blockquote>]]></content><author><name></name></author><category term="音乐" /><category term="Miki Matsubara" /><summary type="html"><![CDATA[抖音流行了一个阶段，歌曲来自2008年发布的《Miki Matsubara Best Collection》 专辑。我特地查了一下这个歌星，很可惜的是在2004年10月7日，因宫颈癌去世，享年44岁。]]></summary></entry><entry><title type="html">CloudFlare Tunnel 免费内网穿透的简明教程</title><link href="https://www.ikrazel.com/posts/howto-use-cloudflare-tunnel/" rel="alternate" type="text/html" title="CloudFlare Tunnel 免费内网穿透的简明教程" /><published>2024-11-23T20:28:35+08:00</published><updated>2024-11-23T20:28:35+08:00</updated><id>https://www.ikrazel.com/posts/howto-use-cloudflare-tunnel</id><content type="html" xml:base="https://www.ikrazel.com/posts/howto-use-cloudflare-tunnel/"><![CDATA[<h2 id="tunnel可以做什么1">Tunnel可以做什么[^1]</h2>

<ul>
  <li>将本地网络的服务暴露到公网，可以理解为内网穿透。 例如我们在本地服务器 192.168.1.1:3000 搭建了一个 Transmission 服务用于 BT 下载，我们只能在内网环境才能访问这个服务，但通过内网穿透技术，我们可以在任何广域网环境下访问该服务。相比 NPS 之类传统穿透服务，Tunnel 不需要公网云服务器，同时自带域名解析，无需 DDNS 和公网 IP。</li>
  <li>将非常规端口服务转发到 80/443 常规端口。 无论是使用公网 IP + DDNS 还是传统内网穿透服务，都免不了使用非常规端口进行访问，如果某些服务使用了复杂的重定向可能会导致 URL 中端口号丢失而引起不可控的问题，同时也不够优雅。</li>
  <li>自动为你的域名提供 HTTPS 认证。</li>
  <li>为你的服务提供额外保护认证。</li>
  <li>最重要的是——免费。
<!--more-->
    <h2 id="tunnel-工作原理">Tunnel 工作原理</h2>
  </li>
</ul>

<p>Tunnel 通过在本地网络运行的一个 Cloudflare 守护程序，与 Cloudflare 云端通信，将云端请求数据转发到本地网络的 IP + 端口。</p>

<h2 id="前置条件">前置条件</h2>
<ul>
  <li>持有一个域名</li>
  <li>将域名 DNS 解析托管到 CF</li>
  <li>内网有一台本地服务器，用于运行本地与 cloudflare 通信的 cloudflared 程序</li>
  <li>一张境内双币信用卡（仅用于添加付款方式，服务是免费的）</li>
</ul>

<h2 id="开始">开始</h2>

<ol>
  <li>打开 Cloudflare Zero Trust 工作台面板</li>
  <li>创建 Cloudflare Zero Trust ，选择免费计划。需要提供付款方式，使用境内的双币卡即可
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMGZ00VlYJ2XozF1YoY0mVouBsCDPgAAr2tMRuLQmlGQ8vnQYhUucoBAAMCAAN5AAM2BA.png" alt="" />
填写team name，随意填写
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMHZ00XqKgHXX2DTo8_k3_EWnuUD-EAAr6tMRuLQmlGJLof-WXvo0QBAAMCAAN5AAM2BA.png" alt="" />
选择免费计划
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMIZ00XwFZKrrqgfDmQJBKfNcDg-tQAAr-tMRuLQmlG0r1bmCxSmTABAAMCAAN5AAM2BA.png" alt="" />
添加付款方式
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMJZ00X3vWA2edPAZubWSSX4fktRXwAAsCtMRuLQmlGQe98_YTDnWYBAAMCAAN5AAM2BA.png" alt="" />
填写信用卡信息（仅验证，不会扣款），完成配置</li>
  <li>完成后，在 Access Tunnels 中，创建一个 Tunnel。
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMKZ00X-a_vYvbPIWP72YKcEKEDD90AAsGtMRuLQmlG_YZrgERx-wcBAAMCAAN5AAM2BA.png" alt="" />
创建 Tunnel</li>
  <li>选择 Cloudflared 部署方式。
Tunnel 需要通过 Cloudflared 来建立云端与本地网络的通道，这里推荐选择 Docker 部署Cloudflared 守护进程以使用 Tunnel 功能。
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMLZ00YGq7P59sjoCrvKB15M_Vp__0AAsKtMRuLQmlG51XY2lVPX9cBAAMCAAN5AAM2BA.png" alt="" />
获取 Cloudflared 启动命令及 Token
点击复制按钮复制指令，在本地网络主机上运行命令。我们还可以加上<code class="language-plaintext highlighter-rouge">--name cloudflared -d --restart unless-stop</code>为Docker容器增加名称和后台运行。你可以使用下方我修改好命令来创建 Docker，注意替换你为自己的 Token（就是网页中—<code class="language-plaintext highlighter-rouge">-token</code>之后的长串字符）
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>docker run --name cloudflared -d --restart unless-stop cloudflare/cloudflared:latest tunnel --no-autoupdate run --token &lt;YourToken&gt;
</pre></td></tr></tbody></table></code></pre></div>    </div>
  </li>
  <li>配置域名和转发URL
为你的域名配置一个子域名（Subdomain），Path 留空，URL 处填写内网服务的IP加端口号。注意 Type 处建议使用 HTTP，因为 Cloudflare 会自动为你提供 HTTPS，因此此处的转发目标可以是 HTTP 服务端口。
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMMZ00YMwn2TdLRY1X6zy1jFi9oOUIAAsOtMRuLQmlG-bkW-EihkuUBAAMCAAN5AAM2BA.png" alt="" />
配置内网目标 IP+端口</li>
</ol>

<h2 id="完成">完成</h2>

<p>接着访问刚刚配置的三级域名，例如 <code class="language-plaintext highlighter-rouge">https://app.yourdomain.com</code>（是的，你没看错，是 https，cloudflare 已经自动为域名提供了 https 证书）就可以访问到内网的非公端口号服务了。一个 Tunnel 中可以添加多条三级域名来跳转到不同的内网服务，在 Tunnel 页面的 Public Hostname 中新增即可。</p>

<h2 id="为你的服务添加额外验证">为你的服务添加额外验证</h2>
<p>如果你觉得这种直接暴露内网服务的方式有较高的安全风险，我们还可以使用 Application 功能为服务添加额外的安全验证。</p>

<ol>
  <li>点击 Application - Get started。
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMNZ00YTiMPS8dbBl1vAWtcsQ5sIEYAAsStMRuLQmlGLfzdRizExrIBAAMCAAN5AAM2BA.png" alt="" />
创建 Application</li>
  <li>选择 Self-hosted。
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMOZ00YZV--pfSKFqqGWgV0YSEyoAADxa0xG4tCaUac_R6HWYapvAEAAwIAA3kAAzYE.png" alt="" />
选择类型</li>
  <li>填写配置，注意 Subdomain 和 Domain 需要使用刚刚创建的 Tunnel 服务相同的 Domain 配置。
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMPZ00Ye6ngzL9E1DARAWYKbWtOajgAAsatMRuLQmlGMmXS6OYGAbkBAAMCAAN5AAM2BA.png" alt="" />
配置三级域名</li>
  <li>选择验证方式。填写 Policy name（任意）。在 Include 区域选择验证方式，示例图片中使用的是 Email 域名的方式，用户在访问该网络时需要使用指定的邮箱域名（如@gmail.com）验证，这种方式比较适合自定义域名的企业邮箱用户。另外你还可以指定特定完整邮箱地址、IP 地址范围等方式。
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMQZ00YlNRpMQqM8SDTDEy0On7TeegAAsetMRuLQmlGH3p6ioIGsJEBAAMCAAN5AAM2BA.png" alt="" />
选择验证方式</li>
  <li>完成添加
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMRZ00YsDtu8HYO0AL6rWu3awvWjNIAAsitMRuLQmlG1wONAAHAujurAQADAgADeQADNgQ.png" alt="" /></li>
</ol>

<p>此时，访问 https://app.yourdomain.com 可以看到网站多了一个验证页面，使用刚刚设置的域名邮箱，接收验证码来访问。
<img src="https://www.xiaobaby.eu.org/file/AgACAgEAAyEGAASQfha-AAMSZ00YxD7NPxLB28M2p_kjwh3WRyYAAsmtMRuLQmlGUWyiKRQ2_DsBAAMCAAN5AAM2BA.png" alt="" /></p>

<h2 id="评价">评价</h2>

<p>除了上述直接转发 http 服务之外，Tunnel 还支持 RDP、SSH 等协议的转发，玩法丰富，有待各位探索。作为一款免费的服务，简单的配置，低门槛使用条件，适合各位 Self-hosted 玩家尝试。不过要注意的是 Tunnel 在国内访问速度不快，并且有断流的情况，请酌情使用。</p>]]></content><author><name></name></author><category term="Linux" /><category term="Cloudflare" /><summary type="html"><![CDATA[Tunnel可以做什么[^1]]]></summary></entry><entry><title type="html">使用WinSCP连接OneDrive</title><link href="https://www.ikrazel.com/posts/winscp-webdav-onedrive/" rel="alternate" type="text/html" title="使用WinSCP连接OneDrive" /><published>2024-06-05T19:28:35+08:00</published><updated>2024-06-05T19:28:35+08:00</updated><id>https://www.ikrazel.com/posts/winscp-webdav-onedrive</id><content type="html" xml:base="https://www.ikrazel.com/posts/winscp-webdav-onedrive/"><![CDATA[<p>使用WinSCP，基于WebDAV协议可以轻松地上传、管理、备份文件到OneDrive。
<!--more--></p>
<h1 id="准备工作">准备工作</h1>
<h2 id="找到你的onedrive客户id">找到你的”OneDrive客户ID”</h2>

<p>打开浏览器，登录OneDrive，登录以后，地址栏的地址类似如下：
https://onedrive.live.com/?id=root&amp;cid=ABCDEFGHIJKLMNOP</p>

<p>这个<code class="language-plaintext highlighter-rouge">ABCDEFGHIJKLMNOP</code>就是你的客户ID，选中复制到粘贴板，我们一会要用。</p>

<p><img src="https://www.xiaobaby.eu.org/file/db9e4f9d84bd452be882d.png" alt="" /></p>

<h1 id="winscp-配置">WinSCP 配置</h1>

<p>启动WinSCP工具，在显示的登录对话框中，选择<code class="language-plaintext highlighter-rouge">WebDAV</code>，加密类型选择<code class="language-plaintext highlighter-rouge">TLS/SSL Implicit encryption</code>，主机名填写<code class="language-plaintext highlighter-rouge">d.docs.live.net</code>，用户名和密码填写你的OneDrive账号和密码。</p>

<p><em>注意：如果你的OneDrive账号启用了二次验证，需要去<a href="https://account.live.com/proofs/Manage/additional#AppPassword">创建app应用密码</a></em></p>

<p><img src="https://www.xiaobaby.eu.org/file/60a4d6b91155881f2c955.png" alt="" /></p>

<p>接下来，点击<code class="language-plaintext highlighter-rouge">Advanced</code>按钮，在<code class="language-plaintext highlighter-rouge">Environment</code> &gt; <code class="language-plaintext highlighter-rouge">Directories</code>下面的<code class="language-plaintext highlighter-rouge">Remote Directory</code>中填写 <code class="language-plaintext highlighter-rouge">/ABCDEFGHIJKLMNOP</code></p>

<p><img src="https://www.xiaobaby.eu.org/file/cf52963068a48cf0fc6d6.png" alt="" /></p>

<p>点击OK按钮确认，再次点击<code class="language-plaintext highlighter-rouge">Save</code>按钮保存设置。</p>

<p><img src="https://www.xiaobaby.eu.org/file/5e9e9ec360a2d9b33bfba.png" alt="" /></p>

<h1 id="开始使用">开始使用</h1>

<p>双击保存的会话名称，就可以连接了。</p>

<p><img src="https://www.xiaobaby.eu.org/file/147530184f0a90740c5d7.png" alt="" /></p>]]></content><author><name></name></author><category term="Windows" /><category term="OneDrive" /><summary type="html"><![CDATA[使用WinSCP，基于WebDAV协议可以轻松地上传、管理、备份文件到OneDrive。 准备工作 找到你的”OneDrive客户ID”]]></summary></entry><entry><title type="html">PVE硬件直通之网卡直通</title><link href="https://www.ikrazel.com/posts/pve-network-passthrough/" rel="alternate" type="text/html" title="PVE硬件直通之网卡直通" /><published>2024-05-20T09:28:35+08:00</published><updated>2024-05-20T09:28:35+08:00</updated><id>https://www.ikrazel.com/posts/pve-network-passthrough</id><content type="html" xml:base="https://www.ikrazel.com/posts/pve-network-passthrough/"><![CDATA[<p>硬件直通这块，因为设备不同，不能硬套如下步骤，具体要多查一下谷歌，不要人云亦云。因为我的网卡是由PCIE转接的四个I226-V网卡，按照PVE官方的步骤，打开IOMMU之后，分配了网卡，但是无法启动，后来终于从google上查到了结果。</p>

<p>以下硬件直通步骤仅针对PVE 8.0以上版本。</p>

<!--more-->
<h2 id="打开iommu">打开IOMMU</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>nano /etc/default/grub
</pre></td></tr></tbody></table></code></pre></div></div>

<p>英特尔CPU使用下面的引导参数:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nv">GRUB_CMDLINE_LINUX_DEFAULT</span><span class="o">=</span><span class="s2">"quiet intel_iommu=on"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>AMD CPU使用下面的引导参数:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nv">GRUB_CMDLINE_LINUX_DEFAULT</span><span class="o">=</span><span class="s2">"quiet amd_iommu=on"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>特别注意，如果你的网卡是PCIE转接的网卡，请多增加一个参数：
我的主机CPU是J4125,参数如下</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nv">GRUB_CMDLINE_LINUX_DEFAULT</span><span class="o">=</span><span class="s2">"quiet intel_iommu=on pcie_port_pm=off"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>之后，更新grub配置文件</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>update-grub
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="增加内核模块">增加内核模块</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>nano /etc/modules
</pre></td></tr></tbody></table></code></pre></div></div>

<p>在<code class="language-plaintext highlighter-rouge">modules</code>文件中增加如下内容:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>vfio
vfio_iommu_type1
vfio_pci
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>pve8.0以上版本不需要vfio_virqfd这个模块，因为模块目录压根就没有！！！</strong></p>

<h2 id="更新-initramfs-归档文件">更新 initramfs 归档文件</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>update-initramfs <span class="nt">-k</span> <span class="nt">-u</span> all
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="重启pve">重启pve</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>reboot
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="验证iommu是否开启">验证IOMMU是否开启</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>dmesg | <span class="nb">grep</span> <span class="nt">-e</span> DMAR <span class="nt">-e</span> IOMMU
</pre></td></tr></tbody></table></code></pre></div></div>

<p>会看到</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>DMAR: IOMMU ENABLED
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="可以新增虚拟机了分配pci设备开机">可以新增虚拟机了，分配PCI设备，开机！</h2>

<p>USB硬盘的直通，PVE确实很方便，直接qm disk set就可以了。</p>

<h2 id="如果你觉得local-lvm-和-lvm-两个分区容易造成空间浪费可以合并成一个">如果你觉得local-lvm 和 lvm 两个分区容易造成空间浪费，可以合并成一个</h2>

<ol>
  <li>备份虚拟机</li>
  <li>删除虚拟机</li>
  <li>删除local-lvm: <code class="language-plaintext highlighter-rouge">lvremove pve/data</code></li>
  <li>把local-lvm空间分配给Local:</li>
</ol>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>lvextend <span class="nt">-l</span> +100%FREE <span class="nt">-r</span> pve/root
resize2fs /dev/mapper/pve-root
</pre></td></tr></tbody></table></code></pre></div></div>

<ol>
  <li>删除local-lvm: <code class="language-plaintext highlighter-rouge">网页登陆，数据中心-存储-删除local-lvm</code></li>
  <li>编辑local，内容里添加 磁盘映像和容器，保存</li>
  <li>恢复虚拟机</li>
</ol>]]></content><author><name></name></author><category term="Linux" /><summary type="html"><![CDATA[硬件直通这块，因为设备不同，不能硬套如下步骤，具体要多查一下谷歌，不要人云亦云。因为我的网卡是由PCIE转接的四个I226-V网卡，按照PVE官方的步骤，打开IOMMU之后，分配了网卡，但是无法启动，后来终于从google上查到了结果。]]></summary></entry></feed>