<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>BiancoCat Blog</title><description>Bianco 的猫窝</description><link>https://blog.bianco.cat/</link><language>zh_CN</language><item><title>测试网络框架构建：ROS + VLAN 折腾记（1）</title><link>https://blog.bianco.cat/posts/vlan-and-ros-1/rosvlan%E6%8A%98%E8%85%BE1/</link><guid isPermaLink="true">https://blog.bianco.cat/posts/vlan-and-ros-1/rosvlan%E6%8A%98%E8%85%BE1/</guid><pubDate>Thu, 25 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;前言&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;因为朋友的安利，一直想试试传说中的路由器系统 RouterOS（以下简称 ROS ），但是我之前用的是 ikuai 的系统，如果直接换 ROS ，怕是会影响现有网络环境的稳定性。于是我决定用 Pve虚拟机 + VLAN 在现有网络环境中搭建一个独立的 ROS 测试环境，本文记录了我在这个过程中遇到的问题和解决方案。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;我的设备&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;N100 小主机（pve 虚拟机宿主机,安装 ikuai 做主路由）&lt;/li&gt;
&lt;li&gt;水星SE109P Pro 2.5G 交换机（支持VLAN 802.1q）&lt;/li&gt;
&lt;li&gt;Pve服务器（作为测试环境中的访客机）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;完成后的网络拓扑&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;topology.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;设置交换机 VLAN&lt;/h3&gt;
&lt;p&gt;在设置 VLAN 之前，我们要先明确一个概念，在 VLAN 802.1q 中，有两种端口类型，分别是 Untagged 和 Tagged 。这两个端口类型的区别在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Untagged 端口：不带 VLAN 标签的数据包，Tag 里没有 VLAN ID，通常用于终端设备（打印机等）。&lt;/li&gt;
&lt;li&gt;Tagged 端口：带 VLAN 标签的数据包，Tag 里包含 VLAN ID（如 10、20），一个端口可以承载多个 VLAN 。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;理解了以上概念后，我们可以开始配置交换机的 VLAN 了。以下是我的配置步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录交换机管理界面，进入 VLAN 802.1q 设置页面。
&lt;img src=&quot;image.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;启用 VLAN 功能，创建一个 VLAN ID 为 10 的 VLAN ，端口全部选择 Tagged 。（我这里会默认创建一个 VLAN ID 为 1 的 VLAN ，所有没有 VLAN 标签的数据包会默认走这个 VLAN）
&lt;img src=&quot;image-1.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;保存设置。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样我们就完成了交换机的 VLAN 设置，接下来我们需要在 Pve 虚拟机中配置 VLAN 接口，以便让 ROS 能够识别和使用 VLAN 。&lt;/p&gt;
&lt;h3&gt;配置 Pve 虚拟机 VLAN 接口&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;登录 Pve 管理界面，进入网络设置页面，找到 Pve 的虚拟交换机，一般默认是 vmbr0。
&lt;img src=&quot;image-2.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;点击编辑，把 “VLAN 感知“ 选项勾选上，保存设置。
&lt;img src=&quot;Microsoft%20Edge%202025-12-25%2022.11.31.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;点击应用配置
&lt;img src=&quot;Microsoft%20Edge%202025-12-25%2022.12.59.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面的操作需要你家宽带可以多播 IP ，如果是单 IP 的话，可以跳过这一步！
4. 创建宽带入网虚拟交换机
&lt;img src=&quot;image-3.png&quot; alt=&quot;alt text&quot; /&gt;
5. 名称随意，桥接端口填插到你家光猫的那个网卡接口，我这里是 nic2。
&lt;img src=&quot;Microsoft%20Edge%202025-12-25%2022.31.33.png&quot; alt=&quot;alt text&quot; /&gt;
6. 创建并且点击应用配置。&lt;/p&gt;
&lt;p&gt;至此，我们的 Pve 虚拟机 VLAN 接口配置完成，接下来我们就可以创建 ROS 虚拟机了。&lt;/p&gt;
&lt;h3&gt;创建 ROS 虚拟机&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;下载 ROS 官方镜像，并上传到虚拟机，镜像下载地址：https://mikrotik.com/download?architecture=x86&lt;/li&gt;
&lt;li&gt;创建虚拟机，选择刚刚上传的 ROS 镜像作为安装介质，配置虚拟机的 CPU、内存等参数。（这里我放一张我的配置供参考）
&lt;img src=&quot;image-5.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;启动虚拟机，进入 ROS 安装界面，按照提示完成安装。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;完成安装后，关闭虚拟机，进行最重要的网络接口配置。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;修改默认创建的 net0 ，修改其中的 VLAN 标签为 10 。
&lt;img src=&quot;image-4.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;添加一个新的网络接口 net1，这个接口默认设置，不用修改。&lt;/li&gt;
&lt;li&gt;再添加一个网络接口 net2，桥接到刚刚创建的宽带入网虚拟交换机上，我这里是 wan 。（PS：这一步需要你家宽带可以多播 IP ，如果是单 IP 的话，可以跳过这一步！）
&lt;img src=&quot;image-6.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为什么我们在这里要设置三个网络接口呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;net0 接口：用于连接交换机的 VLAN 10 ，作为内网接口。&lt;/li&gt;
&lt;li&gt;net1 接口：用于内网设备与 ROS 之间的通信，没有这个接口当你配置玩 ROS 后，内网设备（VLAN 1 中的设备）将无法与 ROS 通信。当然如果你不支持宽带多播那这个接口也是 ROS 的入网接口。&lt;/li&gt;
&lt;li&gt;net2 接口：用于连接外网，获取公网 IP 。（需要宽带支持多播）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;结语&lt;/h3&gt;
&lt;p&gt;至此，我们就完成了 ROS + VLAN 测试环境的基础搭建，下一篇文章我将介绍如何配置 ROS ，实现 VLAN 10 设备的上网功能。如果你在搭建过程中遇到任何问题，欢迎在评论区留言讨论！&lt;/p&gt;
</content:encoded></item><item><title>批量生成博客icon的脚本</title><link>https://blog.bianco.cat/posts/%E6%89%B9%E9%87%8F%E7%94%9F%E6%88%90%E5%8D%9A%E5%AE%A2icon%E7%9A%84%E8%84%9A%E6%9C%AC/</link><guid isPermaLink="true">https://blog.bianco.cat/posts/%E6%89%B9%E9%87%8F%E7%94%9F%E6%88%90%E5%8D%9A%E5%AE%A2icon%E7%9A%84%E8%84%9A%E6%9C%AC/</guid><pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;因为要给博客换 icon ，写了这个一键生成所有大小 icon 的脚本，可以把正常大小的图源转换成32 / 128 / 180 / 192 大小的 icon ，支持单张图源同时生成 dark/light 两套 icon 。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;:::note[PS：]
仅在 macOS 端测试正常，不代表其他平台。
:::&lt;/p&gt;
&lt;h2&gt;脚本：make-favicons.sh&lt;/h2&gt;
&lt;p&gt;把下面内容保存成 make-favicons.sh：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
set -euo pipefail

OUT_DIR=&quot;./favicons&quot;
DARK_SRC=&quot;&quot;
LIGHT_SRC=&quot;&quot;
ONE_SRC=&quot;&quot;

SIZES=(32 128 180 192)

die() { echo &quot;Error: $*&quot; &amp;gt;&amp;amp;2; exit 1; }

# 参数解析
while [[ $# -gt 0 ]]; do
  case &quot;$1&quot; in
    -o|--out)
      OUT_DIR=&quot;${2:-}&quot;; shift 2;;
    --dark)
      DARK_SRC=&quot;${2:-}&quot;; shift 2;;
    --light)
      LIGHT_SRC=&quot;${2:-}&quot;; shift 2;;
    -h|--help)
      sed -n &apos;1,60p&apos; &quot;$0&quot;; exit 0;;
    *)
      if [[ -z &quot;$ONE_SRC&quot; ]]; then ONE_SRC=&quot;$1&quot;; shift
      else die &quot;多余参数：$1&quot;
      fi;;
  esac
done

# 校验输入
if [[ -n &quot;$ONE_SRC&quot; ]]; then
  [[ -f &quot;$ONE_SRC&quot; ]] || die &quot;找不到文件：$ONE_SRC&quot;
  DARK_SRC=&quot;$ONE_SRC&quot;
  LIGHT_SRC=&quot;$ONE_SRC&quot;
else
  [[ -n &quot;$DARK_SRC&quot; &amp;amp;&amp;amp; -n &quot;$LIGHT_SRC&quot; ]] || die &quot;请提供一张源图，或同时提供 --dark 和 --light&quot;
  [[ -f &quot;$DARK_SRC&quot; ]] || die &quot;找不到文件：$DARK_SRC&quot;
  [[ -f &quot;$LIGHT_SRC&quot; ]] || die &quot;找不到文件：$LIGHT_SRC&quot;
fi

mkdir -p &quot;$OUT_DIR&quot;

# 用 sips 生成 PNG，并强制缩放到指定尺寸（正方形）
gen_set() {
  local src=&quot;$1&quot;
  local theme=&quot;$2&quot;

  for size in &quot;${SIZES[@]}&quot;; do
    local out=&quot;$OUT_DIR/favicon-${theme}-${size}.png&quot;

    # 先转成 png 到临时文件，再缩放，避免源文件不是 png 时的坑
    local tmp
    tmp=&quot;$(mktemp &quot;/tmp/favicon_${theme}_XXXXXX.png&quot;)&quot;
    sips -s format png &quot;$src&quot; --out &quot;$tmp&quot; &amp;gt;/dev/null

    # 缩放到正方形 size x size
    sips -z &quot;$size&quot; &quot;$size&quot; &quot;$tmp&quot; --out &quot;$out&quot; &amp;gt;/dev/null
    rm -f &quot;$tmp&quot;

    echo &quot;✅ $out&quot;
  done
}

gen_set &quot;$DARK_SRC&quot; &quot;dark&quot;
gen_set &quot;$LIGHT_SRC&quot; &quot;light&quot;

echo &quot;Done. Output =&amp;gt; $OUT_DIR&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用方法&lt;/h2&gt;
&lt;h3&gt;（1）一张头像同时生成两套（最常见）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;chmod +x make-favicons.sh
./make-favicons.sh avatar.png
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;（2）分别用两张源图生成 dark/light&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;chmod +x make-favicons.sh
./make-favicons.sh --dark avatar-dark.png --light avatar-light.png
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;（3） 指定输出目录（默认 ./favicons）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;chmod +x make-favicons.sh
./make-favicons.sh avatar.png -o ./public
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Proxmox VE 定制 Debian Cloud 系统镜像与创建虚拟机模板</title><link>https://blog.bianco.cat/posts/proxmoxve%E5%AE%9A%E5%88%B6debiancloud%E7%B3%BB%E7%BB%9F%E9%95%9C%E5%83%8F%E4%B8%8E%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%A8%A1%E6%9D%BF/</link><guid isPermaLink="true">https://blog.bianco.cat/posts/proxmoxve%E5%AE%9A%E5%88%B6debiancloud%E7%B3%BB%E7%BB%9F%E9%95%9C%E5%83%8F%E4%B8%8E%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%A8%A1%E6%9D%BF/</guid><pubDate>Sat, 13 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;前言&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;因为经常折腾pve虚拟机，经常需要新的环境，之前一直使用 Debian 的标准镜像安装，安装完部署环境时真的让人头大,直到我关注到了 Debian 的云镜像。云镜像可以大大简化安装过程，节省时间，并且可高度自定义。本文档将详细介绍如何为 Proxmox VE 定制 DebianCloud 系统镜像，并创建虚拟机模板。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;选择合适的 DebianCloud 镜像&lt;/h3&gt;
&lt;p&gt;“云镜像”有这几种：azure、ec2、generic、genericcloud、nocloud。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先排除 azure 与 ec2（它们针对云平台）。&lt;/li&gt;
&lt;li&gt;nocloud 不支持 cloud‑init，也可排除。&lt;/li&gt;
&lt;li&gt;剩下 generic 和 genericcloud：
&lt;ul&gt;
&lt;li&gt;genericcloud 更精简，常被推荐用于虚拟机；&lt;/li&gt;
&lt;li&gt;但它可能不包含 USB 等内核模块，如果需要 USB 直通（打印机、移动硬盘等），建议用 generic，家庭用户更合适。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;定制镜像&lt;/h3&gt;
&lt;p&gt;准备一台 Debian 系统的虚拟机，要代理网络，避免网络原因造成定制失败，内存的话最好在 4G 以上。
安装必要的软件包：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt update
apt install libguestfs-tools
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下载官方原版的 qcow2 镜像&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -c https://cdimage.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面是我定制 Debian 的命令，可以根据需要修改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;virt-customize -a debian-13-generic-amd64.qcow2 \
  --smp 2 --verbose \
  --timezone &quot;Asia/Shanghai&quot; \
  --append-line &quot;/etc/default/grub:# disables OS prober to avoid loopback detection which breaks booting&quot; \
  --append-line &quot;/etc/default/grub:GRUB_DISABLE_OS_PROBER=true&quot; \
  --run-command &quot;update-grub&quot; \
  --run-command &quot;sed -i &apos;s|Types: deb deb-src|Types: deb|g&apos; /etc/apt/sources.list.d/debian.sources&quot; \
  --run-command &quot;sed -i &apos;s|generate_mirrorlists: true|generate_mirrorlists: false|g&apos; /etc/cloud/cloud.cfg.d/01_debian_cloud.cfg&quot; \
  --update --install &quot;zsh,wget,curl,nano,vim,sudo,git,unzip,mtr-tiny,iputils-ping,bind9-host,dnsutils,net-tools,lsb-release,ca-certificates,bash-completion,fail2ban,dialog,netbase,iproute2,whois,ssh,dbus,systemd,systemd-sysv,locales,apt-utils,gnupg2,apt-transport-https,rsyslog,logrotate,less,rsync,qemu-guest-agent,haveged,systemd-timesyncd&quot; \
  --run-command &quot;install -m 0755 -d /etc/apt/keyrings&quot; \
  --run-command &quot;curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg&quot; \
  --run-command &quot;chmod a+r /etc/apt/keyrings/docker.gpg&quot; \
  --run-command &quot;echo \&quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release &amp;amp;&amp;amp; echo $VERSION_CODENAME) stable\&quot; &amp;gt; /etc/apt/sources.list.d/docker.list&quot; \
  --run-command &quot;apt-get -y autoremove --purge &amp;amp;&amp;amp; apt-get -y clean&quot; \
  --run-command &quot;chsh -s /usr/bin/zsh root&quot; \
  --run-command &quot;git clone https://github.com/ohmyzsh/ohmyzsh.git /root/.oh-my-zsh&quot; \
  --run-command &quot;cp /root/.oh-my-zsh/templates/zshrc.zsh-template /root/.zshrc&quot; \
  --run-command &quot;mkdir -p /root/.oh-my-zsh/custom/themes&quot; \
  --run-command &quot;curl -fsSL -o /root/.oh-my-zsh/custom/themes/kongbai.zsh-theme &apos;https://alist.kbxx.cc/d/Bianco-nas/home/%E8%BD%AF%E4%BB%B6/Linux%E8%84%9A%E6%9C%AC/zsh%E4%B8%BB%E9%A2%98/kongbai.zsh-theme?sign=bpMr7CpBl2rxkQIrUQgE1fD_2QIPrzPiemd2lKjVmAg=:0&apos;&quot; \
  --run-command &quot;sed -i &apos;s/^ZSH_THEME=.*/ZSH_THEME=\&quot;kongbai\&quot;/&apos; /root/.zshrc&quot; \
  --run-command &quot;sed -i &apos;s/^#\?\s*PermitRootLogin.*/PermitRootLogin yes/&apos; /etc/ssh/sshd_config &amp;amp;&amp;amp; sed -i &apos;s/^#\?\s*PasswordAuthentication.*/PasswordAuthentication yes/&apos; /etc/ssh/sshd_config&quot; \
  --append-line &quot;/etc/systemd/timesyncd.conf:NTP=ntp.aliyun.com&quot; \
  --delete &quot;/var/log/*.log&quot; \
  --delete &quot;/var/lib/apt/lists/*&quot; \
  --delete &quot;/var/cache/apt/*&quot; \
  --truncate &quot;/etc/apt/mirrors/debian.list&quot; \
  --append-line &quot;/etc/apt/mirrors/debian.list:https://mirrors.tuna.tsinghua.edu.cn/debian&quot; \
  --truncate &quot;/etc/apt/mirrors/debian-security.list&quot; \
  --append-line &quot;/etc/apt/mirrors/debian-security.list:https://mirrors.tuna.tsinghua.edu.cn/debian-security&quot; \
  --truncate &quot;/etc/machine-id&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;具体做了这些操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设置时区为上海时间；&lt;/li&gt;
&lt;li&gt;禁用 GRUB 的 OS prober，避免引导问题；&lt;/li&gt;
&lt;li&gt;修改 APT 源为清华大学镜像源，加快软件包下载速度；&lt;/li&gt;
&lt;li&gt;添加最新版 Docker 官方源；&lt;/li&gt;
&lt;li&gt;安装常用软件包；&lt;/li&gt;
&lt;li&gt;设置 root 用户默认 shell 为 zsh，并安装 Oh My Zsh 及自定义主题；&lt;/li&gt;
&lt;li&gt;修改 SSH 配置，允许 root 登录和密码认证；&lt;/li&gt;
&lt;li&gt;配置系统时间同步使用阿里云 NTP 服务器；&lt;/li&gt;
&lt;li&gt;清理日志和缓存，减小镜像体积；&lt;/li&gt;
&lt;li&gt;清空 machine-id，确保每个实例启动时生成唯一的 ID。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后，压缩定制好的镜像：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;virt-sparsify --compress debian-13-generic-amd64.qcow2 debian-13-generic-amd64-bianco.qcow2
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;创建 Proxmox VE 虚拟机模板&lt;/h3&gt;
&lt;p&gt;创建虚拟机，VM ID 最好大一些，避免冲突，名称随意。
&lt;img src=&quot;https://picsur.kbxx.cc/i/733a6e96-3031-4866-a875-e299ea39d660.webp&quot; alt=&quot;创建虚拟机&quot; /&gt;
因为我们是使用云镜像所以这里选择 “不使用任何介质”。
&lt;img src=&quot;https://picsur.kbxx.cc/i/929d429b-9ed8-4103-807b-5b669b5b179c.webp&quot; alt=&quot;alt text&quot; /&gt;
机型可以选择 “q35”，BIOS 选择 “OVMF (UEFI)”，最重要的是勾选 “Qemu 代理”，可以和虚拟机内安装的 qemu-guest-agent 交互。
&lt;img src=&quot;https://picsur.kbxx.cc/i/6f084cc1-003b-4302-8145-5e5f2dff6f6d.webp&quot; alt=&quot;alt text&quot; /&gt;
磁盘这里可以直接删掉默认创建的磁盘，后面我们会把镜像转换成磁盘使用。
&lt;img src=&quot;https://picsur.kbxx.cc/i/778f8804-d8c1-40dc-803b-435299eeb7cc.webp&quot; alt=&quot;alt text&quot; /&gt;
CPU 和内存最小就行，后面可以根据需要调整。
&lt;img src=&quot;https://picsur.kbxx.cc/i/5f399cab-6da3-462a-ba87-aa24084a3d23.webp&quot; alt=&quot;alt text&quot; /&gt;
&lt;img src=&quot;https://picsur.kbxx.cc/i/1173ef72-58c0-4c23-b965-898b72f5085a.webp&quot; alt=&quot;alt text&quot; /&gt;
网络默认桥接，关闭防火墙。
&lt;img src=&quot;https://picsur.kbxx.cc/i/df666089-c1c6-40be-bf82-ce0caf8505bf.webp&quot; alt=&quot;alt text&quot; /&gt;
创建完成后，不要启动虚拟机，进入 shell，把定制好的镜像上传到 root 用户根目录，然后转换成虚拟机磁盘格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;qm importdisk 100000 debian-13-generic-amd64-bianco.qcow2 local-lvm --format=qcow2
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;100000 是刚才创建的虚拟机 VM ID&lt;/li&gt;
&lt;li&gt;debian-13-generic-amd64-bianco.qcow2 是上传的定制镜像路径&lt;/li&gt;
&lt;li&gt;local-lvm 是存储名称，根据实际情况修改&lt;/li&gt;
&lt;li&gt;--format=qcow2 指定镜像格式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后回到虚拟机把未使用的磁盘添加到虚拟机。
&lt;img src=&quot;https://picsur.kbxx.cc/i/d756ec82-ac67-4546-886c-315516a7027c.webp&quot; alt=&quot;alt text&quot; /&gt;
更改启动顺序，把新添加的磁盘设置为第一启动项。
&lt;img src=&quot;https://picsur.kbxx.cc/i/bc7c34c2-5c6f-4186-bab2-bfa73ae47ee5.webp&quot; alt=&quot;alt text&quot; /&gt;
添加 Cloud-Init 驱动器，类型选择 “CloudInit”，总线选择 “SCSI”。
&lt;img src=&quot;https://picsur.kbxx.cc/i/378e8671-bc8e-4714-81af-2160229c992c.webp&quot; alt=&quot;alt text&quot; /&gt;
&lt;img src=&quot;https://picsur.kbxx.cc/i/9efc8ba5-dbd6-4dca-84d5-b5d2e58a012d.webp&quot; alt=&quot;alt text&quot; /&gt;
最后配置一下 Cloud-Init 选项，设置好 IP ，用户，密码和 SSH 密钥等，保存后就可以右键虚拟机，选择 “转换为模板”，之后你就可以看到你的模板了。以后需要创建虚拟机时，直接右键模板克隆就行，非常方便。
&lt;img src=&quot;https://picsur.kbxx.cc/i/da02e58a-89c5-408f-9fb9-6c3534671e48.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;ps：&lt;/h3&gt;
&lt;p&gt;这里着重说一下如何扩容硬盘，点击你的硬盘，然后选择磁盘操作里的 “调整大小”，初始硬盘为 3G，输入的数字为增量，例如扩容到 10G，则需要在弹出的窗口中填写 7G。
&lt;img src=&quot;https://picsur.kbxx.cc/i/38704628-8b5c-41d4-be7c-814938e22060.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;扩容完成后，启动虚拟机，登录系统，使用以下命令查看当前磁盘情况：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lsblk
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;参考资料&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;https://blog.skk.moe/post/proxmox-ve-customize-debian-cloud-image/&lt;/li&gt;
&lt;li&gt;https://zhichao.org/posts/b7239f&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>如何本地激活 Synology Active Backup for Business 等套件</title><link>https://blog.bianco.cat/posts/%E5%A6%82%E4%BD%95%E6%9C%AC%E5%9C%B0%E6%BF%80%E6%B4%BBsynologyactivebackupforbusiness%E7%AD%89%E5%A5%97%E4%BB%B6/</link><guid isPermaLink="true">https://blog.bianco.cat/posts/%E5%A6%82%E4%BD%95%E6%9C%AC%E5%9C%B0%E6%BF%80%E6%B4%BBsynologyactivebackupforbusiness%E7%AD%89%E5%A5%97%E4%BB%B6/</guid><pubDate>Sat, 22 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;如何本地激活 Synology Active Backup for Business 等套件&lt;/h1&gt;
&lt;hr /&gt;
&lt;p&gt;Synology（群晖）DSM 的 Synology Active Backup for Business 套件是一个很不错的备份方案，但是首次安装或是重装该套件后，需要使用 Synology 账户激活才能使用。&lt;/p&gt;
&lt;p&gt;我并不喜欢这种需要联网激活才能使用的本地软件 —— 如果某天服务器故障或下线，亦或是本地网络发生了故障，我又正好重装了该软件，就会被这个激活界面阻挡，成为正版受害者。&lt;/p&gt;
&lt;p&gt;网上流传了不少本地激活这类套件的方法，但都比较复杂，因此花时间研究了下，写了一个简单且通用的激活方案，以备不时之需。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;请注意，使用本方法本地激活可能会影响您的产品支持和服务。尤其是在企业环境下，建议使用正常方式联网激活，以确保正常享受支持和服务。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;教程&lt;/h2&gt;
&lt;p&gt;本方法支持本地激活 Synology Active Backup for Business、Synology AI Console 等套件。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开套件，进入激活页面/弹窗&lt;/li&gt;
&lt;li&gt;打开浏览器的开发者工具（F12）-&amp;gt; Console，粘贴以下代码并回车应用&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;const oldWindowOpen = window.open
window.open = (...args) =&amp;gt; {
    const [url] = args
    if (url?.startsWith(&apos;https://activation.synology.com/package&apos;)) {
        const u = new URL(url)
        setTimeout(() =&amp;gt; {
            window.dispatchEvent(new MessageEvent(&apos;message&apos;, {
                data: {
                    source: u.searchParams.get(&apos;package_name&apos;),
                    package_name: u.searchParams.get(&apos;package_name&apos;),
                    request_id: u.searchParams.get(&apos;request_id&apos;)
                },
                origin: &quot;https://activation.synology.com&quot;
            }))
        }, 100)
        setTimeout(() =&amp;gt; {
            alert(&apos;Activation finished, please refresh the page.&apos;)
            window.open = oldWindowOpen
        }, 1000)
    } else {
        alert(&apos;Activation failed.&apos;)
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;点击激活按钮，激活完成。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;本文（https://dev.moe/3120）由 Coxxs 原创，转载请注明原文链接。&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>WireGuard 对端动态 IP 时主动更新地址</title><link>https://blog.bianco.cat/posts/wireguard%E5%AF%B9%E7%AB%AF%E5%8A%A8%E6%80%81ip%E6%97%B6%E4%B8%BB%E5%8A%A8%E6%9B%B4%E6%96%B0%E5%9C%B0%E5%9D%80/</link><guid isPermaLink="true">https://blog.bianco.cat/posts/wireguard%E5%AF%B9%E7%AB%AF%E5%8A%A8%E6%80%81ip%E6%97%B6%E4%B8%BB%E5%8A%A8%E6%9B%B4%E6%96%B0%E5%9C%B0%E5%9D%80/</guid><pubDate>Sat, 30 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果 WireGuard 对端的 &lt;code&gt;Endpoint&lt;/code&gt; 是一个域名，这个域名只会在启动的时候解析一次，后续不会更新；当这个域名发生变化时，WireGuard 连接就会断开&lt;/p&gt;
&lt;p&gt;wireguard-tools 的仓库中提供了检测 IP 变化并更新 &lt;code&gt;Endpoint&lt;/code&gt; 的脚本 &lt;a href=&quot;https://git.zx2c4.com/wireguard-tools/tree/contrib/reresolve-dns/reresolve-dns.sh&quot;&gt;https://git.zx2c4.com/wireguard-tools/tree/contrib/reresolve-dns/reresolve-dns.sh&lt;/a&gt;，因此可以使用该脚本，通过定时任务的方式可以实现域名 IP 变化后更新 WireGuard&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下载仓库&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;git clone https://git.zx2c4.com/wireguard-tools /usr/share/wireguard-tools

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;配置更新服务&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo cat &amp;lt;&amp;lt;EOL &amp;gt; /etc/systemd/system/wireguard-update-dns.service
[Unit]
Description=Update DNS of all WireGuard endpoints
Wants=network.target
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c &apos;for i in /etc/wireguard/*.conf; do /usr/share/wireguard-tools/contrib/reresolve-dns/reresolve-dns.sh &quot;\$i&quot;; done&apos;
EOL

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;配置定时任务服务&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo cat &amp;lt;&amp;lt;EOL &amp;gt; /etc/systemd/system/wireguard-update-dns.timer
[Unit]
Description=Update DNS of all WireGuard endpoints
[Timer]
OnCalendar=*:*:0/30
[Install]
WantedBy=timers.target
EOL

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;启动服务&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;systemctl enable wireguard-update-dns.service wireguard-update-dns.timer --now

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样，就会每隔 30s 检测并更新一次 Endpoint 的地址了&lt;/p&gt;
</content:encoded></item><item><title>配置steam下载直连</title><link>https://blog.bianco.cat/posts/%E9%85%8D%E7%BD%AEsteam%E4%B8%8B%E8%BD%BD%E7%9B%B4%E8%BF%9E/</link><guid isPermaLink="true">https://blog.bianco.cat/posts/%E9%85%8D%E7%BD%AEsteam%E4%B8%8B%E8%BD%BD%E7%9B%B4%E8%BF%9E/</guid><description>配置路由让steam客户端下载游戏时走直连，提升下载速度。</description><pubDate>Thu, 12 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;路由配置里添加 steam 下载走直连&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;配置路由以下直连即可：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;geosite:steam@cn
domain:steamserver.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解释：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;steam 客户端通过 &lt;code&gt;steamserver.net&lt;/code&gt; 最终判断下载位置，该域名在 &lt;code&gt;geosite:steam&lt;/code&gt; 中，且没有 &lt;code&gt;@cn&lt;/code&gt; 标记。&lt;/li&gt;
&lt;li&gt;若 &lt;code&gt;steamserver.net&lt;/code&gt; 经过代理，则 steam 会从 &lt;code&gt;steamcontent.com&lt;/code&gt; 域名下载游戏（例如 &lt;code&gt;cache1-hkg1.steamcontent.com&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;若 &lt;code&gt;steamserver.net&lt;/code&gt; 不经过代理，则 steam 会从 &lt;code&gt;xz.pphimalayanrt.com&lt;/code&gt; 域名（阿里云）下载游戏，该域名在 &lt;code&gt;geosite:steam@cn&lt;/code&gt; 中。&lt;/li&gt;
&lt;li&gt;该操作不影响 &lt;code&gt;steamcommunity.com&lt;/code&gt; 等没有 &lt;code&gt;@cn&lt;/code&gt; 标记的域名，这些域名依旧会被代理。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>OpenWrt系统打包</title><link>https://blog.bianco.cat/posts/openwrt%E7%B3%BB%E7%BB%9F%E6%89%93%E5%8C%85/</link><guid isPermaLink="true">https://blog.bianco.cat/posts/openwrt%E7%B3%BB%E7%BB%9F%E6%89%93%E5%8C%85/</guid><pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;今天终于把自己折腾炸了的旁路由修好了，但是为了防止自己手贱，完决定把部署好的 OpenWrt 打包成 img 镜像备份，下次炸了就可以一键还原。
废话少说我们开始吧！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;OpenWrt 系统打包&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;查看磁盘分区，使用 &lt;code&gt;lsblk&lt;/code&gt; 命令，可以看到 sda 就是我们 OpenWrt 系统使用的磁盘了，而 sdb 是我们新挂载的磁盘，挂载在 /newssd 目录下。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;[root@OpenWrt:02:11 AM ~] # lsblk

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0 956.6M  0 loop /overlay
sda      8:0    0     1G  0 disk 
├─sda1   8:1    0    16M  0 part /mnt/sda1
│                                /boot
│                                /boot
└─sda2   8:2    0  1004M  0 part /rom
sdb      8:16   0    10G  0 disk 
└─sdb1   8:17   0    10G  0 part /newssd
sr0     11:0    1  1024M  0 rom  
zram0  253:0    0   661M  0 disk [SWAP]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;使用 dd 命令把 sda 磁盘分区完整的打包并且放在 newssd 目录下&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;[root@OpenWrt:02:01 AM /newssd] # dd if=/dev/sda of=/newssd/openwrt.img count=4048 bs=1024k  conv=sync

1024+0 records in
1024+0 records out
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等待dd命令运行完成后，就得到了RAW格式的openwrt.img镜像&lt;/p&gt;
&lt;p&gt;dd命令参数的含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if=文件名：输入文件名，缺省为标准输入。即指定源文件。&amp;lt; if=/dev/sdb &amp;gt;&lt;/li&gt;
&lt;li&gt;of=文件名：输出文件名，缺省为标准输出。即指定目的文件。&amp;lt; of=./backup/backup.img, 这里的.img是镜像的格式，转成.img格式的文件后方便后续使用etcher烧录镜像 &amp;gt;&lt;/li&gt;
&lt;li&gt;bs = bytes：同时设置读入/输出的块大小为bytes个字节，此处填的是1024k，表示1M大小。&lt;/li&gt;
&lt;li&gt;count = blocks：仅拷贝blocks个块，块大小等于ibs指定的字节数，此处设置的是2048， 表示2048个bs，也就是2g。&lt;/li&gt;
&lt;li&gt;conv= sync：将每个输入块填充到ibs个字节，不足部分用空（NUL）字符补齐。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;注意&lt;/h2&gt;
&lt;p&gt;新磁盘的大小一定要大于 OpenWrt 系统磁盘的大小，不然会出错！&lt;/p&gt;
</content:encoded></item><item><title>Markdown语法</title><link>https://blog.bianco.cat/posts/markdown%E8%AF%AD%E6%B3%95/</link><guid isPermaLink="true">https://blog.bianco.cat/posts/markdown%E8%AF%AD%E6%B3%95/</guid><description>markdown是一种轻量级标记语言，广泛用于编写格式化文本。本文介绍了Markdown的基本语法和常用扩展。</description><pubDate>Sat, 29 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Markdown 基本要素&lt;/h1&gt;
&lt;p&gt;这篇文件意在简要介绍 &lt;a href=&quot;https://guides.github.com/features/mastering-markdown/&quot;&gt;GitHub Flavored Markdown 写作&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;什么是 Markdown?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Markdown&lt;/code&gt; 是一种文本格式。你可以用它来控制文档的显示。使用 markdown，你可以创建粗体的文字，斜体的文字，添加图片，并且创建列表 等等。基本上来讲，Markdown 就是普通的文字加上 &lt;code&gt;#&lt;/code&gt; 或者 &lt;code&gt;*&lt;/code&gt; 等符号。&lt;/p&gt;
&lt;h2&gt;语法说明&lt;/h2&gt;
&lt;h3&gt;标题&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 这是 &amp;lt;h1&amp;gt; 一级标题

## 这是 &amp;lt;h2&amp;gt; 二级标题

### 这是 &amp;lt;h3&amp;gt; 三级标题

#### 这是 &amp;lt;h4&amp;gt; 四级标题

##### 这是 &amp;lt;h5&amp;gt; 五级标题

###### 这是 &amp;lt;h6&amp;gt; 六级标题
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你想要给你的标题添加 &lt;code&gt;id&lt;/code&gt; 或者 &lt;code&gt;class&lt;/code&gt;，请在标题最后添加 &lt;code&gt;{#id .class1 .class2}&lt;/code&gt;。例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 这个标题拥有 1 个 id {#my_id}

# 这个标题有 2 个 classes {.class1 .class2}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;这是一个 MPE 扩展的特性。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;强调&lt;/h3&gt;
&lt;p&gt;&amp;lt;!-- prettier-ignore --&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*这会是 斜体 的文字*
_这会是 斜体 的文字_

**这会是 粗体 的文字**
__这会是 粗体 的文字__

_你也 **组合** 这些符号_

~~这个文字将会被横线删除~~
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;换行（特殊地方需要）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;这是第一行。&amp;lt;br&amp;gt;
这是第二行。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;列表&lt;/h3&gt;
&lt;h4&gt;无序列表&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;- Item 1
- Item 2
  - Item 2a
  - Item 2b
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;有序列表&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;1. Item 1
1. Item 2
1. Item 3
   1. Item 3a
   1. Item 3b
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;添加图片&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;![GitHub Logo](/images/logo.png)
Format: ![Alt Text](url)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;链接&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;https://github.com - 自动生成！
[GitHub](https://github.com)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;引用&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;正如 Kanye West 所说：

&amp;gt; We&apos;re living the future so
&amp;gt; the present is our past.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;分割线&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;如下，三个或者更多的

---

连字符

---

星号

---

下划线
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;行内代码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;我觉得你应该在这里使用
`&amp;lt;addr&amp;gt;` 才对。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;代码块&lt;/h3&gt;
&lt;p&gt;你可以在你的代码上面和下面添加 &amp;lt;code&amp;gt;```&amp;lt;/code&amp;gt; 来表示代码块。&lt;/p&gt;
&lt;h4&gt;语法高亮&lt;/h4&gt;
&lt;p&gt;你可以给你的代码块添加任何一种语言的语法高亮&lt;/p&gt;
&lt;p&gt;例如，给 ruby 代码添加语法高亮：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```ruby
require &apos;redcarpet&apos;
markdown = Redcarpet.new(&quot;Hello World!&quot;)
puts markdown.to_html
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会得到下面的效果：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;require &apos;redcarpet&apos;
markdown = Redcarpet.new(&quot;Hello World!&quot;)
puts markdown.to_html
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;代码块 class（MPE 扩展的特性）&lt;/h4&gt;
&lt;p&gt;你可以给你的代码块设置 &lt;code&gt;class&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;例如，添加 &lt;code&gt;class1 class2&lt;/code&gt; 到一个 代码块：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```javascript {.class1 .class}
function add(x, y) {
  return x + y
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;代码行数&lt;/h5&gt;
&lt;p&gt;如果你想要你的代码块显示代码行数，只要添加 &lt;code&gt;line-numbers&lt;/code&gt; class 就可以了。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```javascript {.line-numbers}
function add(x, y) {
  return x + y
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将会得到下面的显示效果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/1908863/28200587-a8582b0a-6832-11e7-83a7-6c3bb011322f.png&quot; alt=&quot;screen shot 2017-07-14 at 1 20 27 am&quot; /&gt;&lt;/p&gt;
&lt;h5&gt;高亮代码行数&lt;/h5&gt;
&lt;p&gt;你可以通过添加 &lt;code&gt;highlight&lt;/code&gt; 属性的方式来高亮代码行数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```javascript {highlight=10}
```

```javascript {highlight=10-20}
```

```javascript {highlight=[1-10,15,20-22]}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;任务列表&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;- [x] @mentions, #refs, [links](), **formatting**, and &amp;lt;del&amp;gt;tags&amp;lt;/del&amp;gt; supported
- [x] list syntax required (any unordered or ordered list supported)
- [x] this is a complete item
- [ ] this is an incomplete item
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;表格&lt;/h3&gt;
&lt;p&gt;&amp;lt;!-- prettier-ignore --&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;First Header | Second Header
------------ | -------------
Content from cell 1 | Content from cell 2
Content in the first column | Content in the second column
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;扩展的语法&lt;/h2&gt;
&lt;h3&gt;表格&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;需要在插件设置中打开 &lt;code&gt;enableExtendedTableSyntax&lt;/code&gt; 选项来使其工作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/1908863/28243710-945e3004-699a-11e7-9a5f-d74f6c944c3b.png&quot; alt=&quot;screen shot 2017-07-15 at 8 16 45 pm&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Emoji &amp;amp; Font-Awesome&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;只适用于 &lt;code&gt;markdown-it parser&lt;/code&gt; 而不适用于 &lt;code&gt;pandoc parser&lt;/code&gt;。&lt;br /&gt;
缺省下是启用的。你可以在插件设置里禁用此功能。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;:smile:
:fa-car:
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;上标&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;30^th^
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;下标&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;H~2~O
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;脚注&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Content [^1]

[^1]: Hi! This is a footnote
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;缩略&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;*[HTML]: Hyper Text Markup Language
*[W3C]: World Wide Web Consortium
The HTML specification
is maintained by the W3C.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;标记&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;==marked==
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;CriticMarkup&lt;/h3&gt;
&lt;p&gt;CriticMarkup 缺省是禁用的，你可以通过插件设置来启动它。&lt;br /&gt;
有关 CriticMarkup 的更多信息，请查看 &lt;a href=&quot;https://criticmarkup.com/users-guide.php&quot;&gt;CriticMarkup 用户指南&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;这里有 5 种基本语法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;添加 &lt;code&gt;{++ ++}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;{-- --}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;替换 &lt;code&gt;{~~ ~&amp;gt; ~~}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;注释 &lt;code&gt;{&amp;gt;&amp;gt; &amp;lt;&amp;lt;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;高亮 &lt;code&gt;{== ==}{&amp;gt;&amp;gt; &amp;lt;&amp;lt;}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;CriticMarkup 仅可用于 markdown-it parser，不与 pandoc parser 兼容。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Admonition&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;!!! note This is the admonition title
    This is the admonition body
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;请在 https://squidfunk.github.io/mkdocs-material/reference/admonitions/ 查看更多信息&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://guides.github.com/features/mastering-markdown/&quot;&gt;Mastering Markdown&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daringfireball.net/projects/markdown/basics&quot;&gt;Daring Fireball: Markdown Basics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Homebrew常用命令</title><link>https://blog.bianco.cat/posts/homebrew%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</link><guid isPermaLink="true">https://blog.bianco.cat/posts/homebrew%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</guid><pubDate>Thu, 27 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;1.切换 x86 或 arm 版本&lt;/h2&gt;
&lt;p&gt;使用&lt;code&gt;x86&lt;/code&gt;时需要设置&lt;code&gt;arch&lt;/code&gt;，请注意&lt;code&gt;arm&lt;/code&gt;版本的&lt;code&gt;Homebrew&lt;/code&gt;不需要额外设置，终端打开后就是了。&lt;/p&gt;
&lt;p&gt;想进入&lt;code&gt;x86&lt;/code&gt;模式，请执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 切换 x86_64
arch -x86_64 zsh

#查看 Homebrew 运行路径 “ opt 里的是 arm ｜ usr 里是 x86_64 ”
which brew
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.信息查询&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 查看 Homebrew 版本
➜  ~ brew -v

# 列出已安装的软件
➜  ~ brew list

# 使用浏览器打开 Homebrew 官网
➜  ~ brew home

# 查看包的详细信息
➜  ~ brew info 包名

# 检测系统中与Homebrew有关的潜在问题
➜  ~ brew doctor

# 查看包的所有版本
➜  ~ brew list --versions | grep 包名

# 以树形展示所有已安装包的依赖
➜  ~ brew deps --installed --tree
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.查找软件包&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;➜  ~ brew search git
➜  ~ brew search /^git$/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4.安装卸载安装包&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;➜  ~ brew install 包名
➜  ~ brew uninstall 包名
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5.更新自身&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;➜  ~ brew update
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;6.更新包&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 查看哪些包有新版本可更新
➜  ~ brew outdated

# 更新所有包
➜  ~ brew upgrade

# 更新指定包
➜  ~ brew upgrade 包名
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;7.清理旧的升级包&lt;/h2&gt;
&lt;p&gt;⚠️ 注意：如果一个包当前有可更新的版本没有更新，执行清理时候只会提示一个警告，而不会执行清理操作。需要先升级到最新版本，值执行清理。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看哪些包可清理
➜  ~ brew cleanup -n

# 清理所有
➜  ~ brew cleanup

# 清理指定包
➜  ~ brew cleanup 包名
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;8.锁定不想更新的包&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 锁定
➜  ~ brew pin 包名

# 解锁
➜  ~ brew unpin 包名
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;9.关联包&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 清理无效的关联，且清理与之相关的位于/Applications和~/Applications中的无用App链接
➜  ~ brew prune

# 将指定软件的安装文件symlink到Homebrew上
➜  ~ brew link 包名
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>acme.sh学习笔记</title><link>https://blog.bianco.cat/posts/acmesh%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link><guid isPermaLink="true">https://blog.bianco.cat/posts/acmesh%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid><pubDate>Wed, 26 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;最近证书有效期时间越来越短，自动化申请和续期SSL证书变得越来越重要，acme.sh是一个非常流行的轻量级工具，用于自动化管理证书的申请和续期。本文记录了acme.sh的安装、配置及使用方法。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h1&gt;acme.sh&lt;/h1&gt;
&lt;p&gt;acme.sh 实现了 acme 协议，可以从 ZeroSSL，Let&apos;s Encrypt 等 CA 生成免费的证书。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参考文档 https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;安装&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;wget -O -  https://get.acme.sh | sh 
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;通用证书申请&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;export CF_Token=&quot;fC4XOyTvYNUvxzsuSBNKn6uaEnqO1FOVSMN1vdL6&quot;
acme.sh --set-default-ca --server letsencrypt
acme.sh --issue --dns dns_cf -d bianco.cat -d &apos;*.bianco.cat&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;证书复制&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;acme.sh --install-cert -d bianco.cat -d &apos;*.bianco.cat&apos; \
--key-file       /etc/nginx/ssl/bianco.cat.key  \
--fullchain-file /etc/nginx/ssl/bianco.cat.cer \
--reloadcmd     &quot;service nginx reload&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果参数包含特殊字符（比如 * 或 &amp;amp;），使用引号可以防止它们被 Shell 解释。例如 *.bianco.cat 中的 * 是通配符，所以如果不加引号，Shell 会试图将其展开为匹配的文件名，而不是传递字面上的通配符。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;acme.sh --install-cert 命令中的 --reloadcmd 参数可以继续添加其他命令。--reloadcmd 用于在证书安装完成后执行某个自定义的命令，例如重新加载服务或执行其他脚本。&lt;/li&gt;
&lt;li&gt;你可以将多个命令通过 &amp;amp;&amp;amp; 或 ; 连接起来，这样它们就会在 --reloadcmd 后依次执行。例如：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;acme.sh --install-cert -d example.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd     &quot;service nginx reload &amp;amp;&amp;amp; systemctl restart some-other-service&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;在这个例子中，--reloadcmd 会先执行 service nginx reload，然后执行 systemctl restart some-other-service。&lt;/li&gt;
&lt;li&gt;另外，你还可以执行任何你需要的脚本或命令，只要它们在命令行中是合法的。例如：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;acme.sh --install-cert -d example.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd     &quot;/path/to/your/script.sh &amp;amp;&amp;amp; service nginx reload&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;这样，/path/to/your/script.sh 脚本会在 Nginx 重载之前执行。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>