在 Obsidian 中搜索标题

Obsidian

搜索插件 Search - Obsidian Help 有强大的功能,但默认搜索全文。
例如搜索关键字填 hello world ,会返回 包含 hello 和 world 的文章。而一般期望的是这两个以词组形式出现,这时候得用引号括起来 "hello world"

但如果想搜索标题包含特定文字的,得这样写 line:(/##+/ keyword),下面是一个在 Obsidian 中可见的实时预览:

line:(/##+/ "alpine docker")

更好的是,Universal Search Headings from Quick Switcher - Feature requests - Obsidian Forum 提到了早有插件实现了该功能,比如 Quick Switcher++

另外,修改标题最好使用右键 重命名当前小标题 功能,才能自动更新内部链接 Is there a way to Move/rename files and links en masse? : r/ObsidianMD

给 Docker 配置完整的 IPv6 macvlan 网络环境

Docker

Docker IPVLAN 设置 之后,我对 Docker 网络的要求又具体了些:

  1. 本地网络直接访问,IPv4 使用静态路由配置私网地址,IPv6 使用 SLAAC 获取公网地址
  2. 容器有自己的域名可通过 DNS 解析

从 ISP 下发的只有一个非公网的 IPv4 地址和一个 /64 的 IPv6 地址,所以在局域网 IPv4 中配置静态路由我能接受,但在 IPv6 环境中使用 SLAAC 自动配置地址以应对随时会变的前缀很重要。好在有人有过相似的需求:

首先排除会创建一层 NAT 的 bridge 协议,受 ISP 光猫限制,无法添加 IPv6 子网路由;
然后排除共用 MAC 地址的 ipvlan 协议,会影响 SLAAC 地址;
最后选择 MACVLAN 方案,使用 VLAN 在 IPv6 层横跨多个 IPv4 子网,非常满足需求。

On Docker Engine Host
docker network create -d macvlan --ipv6 \
  -o parent=ens19 \
  --subnet=192.168.2.0/24 --gateway=192.168.2.1 \
  --ip-range=192.168.2.128/25 pubnet

这个 192.168.2.0/24 网段是一个之前 在 PVE 用 LXC 安装 OpenWrt 安装的 OpenWrt。 Docker Host 有两张网卡,一张连接局域网当做管理端口,另一张放在 MACVLAN 下连接至 OpenWrt 路由器。

IPv4 地址是一段 /25 地址块,避免和 OpenWrt 下的其他网络设备冲突。IPv6 只要启用就行,会自动 SLAAC 到公网地址。

Transclude of 2025-11-16.excalidraw

接下来解决 Docker 主机无法访问 MACVLAN 网络上的容器,但外部却能访问 问题。
在主机上新建一张网卡并加入 docker 容器的网络。互联网有很多教程,我再整理一些。

最终但我不打算使用手动添加路由的方式,因为给会变的 IPv6 前缀加路由不容易;也打算尽量避免 Shell 脚本调用 iproute2 工具,有 systemd-networkd 这款更 现代化 的声明式工具。

2025-11-20 最终我选择方式一,用三个 00- 开头的文件足够了。

方式一,禁用原网卡,全流量流经 macvlan 网卡

核心操作是关闭原网卡 ens19 的功能,主机和虚拟机都走 macvlan 做流量出口。

# use to override the very same file netplan generated inside /run/systemd/network
[Match]
Name=ens18
 
[Network]
DHCP=yes
LinkLocalAddressing=ipv6
 
[DHCP]
RouteMetric=100
UseMTU=true
UseDomains=true

10-netplan-all-en.network 的作用,是覆盖 Debian 上默认由 netplan 创建的 /run/systemd/network/10-netplan-all-en.network 。netplan 采用了 Match 通配符给所有 en* 网卡配置了 DHCP,很好但我这里需要关掉。本着系统自带文件能不改就不改的原则,/etc/netplan 目录里先不动,如 systemd-networkd - Usage - ArchWiki 所说,同名文件会按目录所在优先级覆盖。所以可以用 /etc/systemd/network 来覆盖掉 netplan 在 /run/systemd/network 创建的 10-netplan-all-en.network 文件。
当前这个文件只把 DHCP 作用在主网卡 ens18 而不是容器子网 ens19。

UPDATE: 其实可以不用写这个文件,在 00-ens19.network 用新的内容覆盖即可,像这样:

[Match]
Name=ens19
 
[Link]
RequiredForOnline=carrier
 
[Network]
MACVLAN=docker-macvlan
DHCP=no
IPv6AcceptRA=false
LinkLocalAddressing=no
MulticastDNS=false
LLMNR=false

00-ens19.network 就是关闭 ens19 的 IP 功能,这里的 RequiredForOnline 是保证 link up 状态,只有这样才能创建 macvlan 接口。

[Match]
Name=docker-macvlan
 
[Network]
DHCP=yes
[NetDev]
Name=docker-macvlan
Kind=macvlan
 
[MACVLAN]
Mode=bridge

00-docker-macvlan.netdev 声明了一个名为 docker-macvlan 的虚拟网络接口。文件名的 00 是为了让 systemd 处理优先级提升。类型是必填,没特殊需要选 bridge 就好。

方式二,不动原网卡,提升容器网络链路优先级

但我更倾向连 netplan 也不要动,这样配置最简单,只需要三个文件。

[NetDev]
Name=docker-macvlan
Kind=macvlan
 
[MACVLAN]
Mode=bridge

和上面一样

[Match]
Name=docker-macvlan
 
[Network]
DHCP=yes
 
[IPv6AcceptRA]
RouteMetric=90

00-docker-macvlan.network 为这个接口配置网络信息,这里的重点是 RouteMetric 设置为一个比主网卡更低的值(ip -6 r 看 metric 值,一般是 IPv4 是 100 ,IPv6 是 1024),因为在架构图中我有两张网卡分别负责两个 IPv4 子网,但都在同一个 IPv6 网段中,所以得让虚拟出来的 macvlan 网卡具有更高优先级。

[Match]
Name=ens19
 
[Network]
MACVLAN=docker-macvlan

00-ens19.network 设置接口有个 macvlan 关联。这么做的效果是 ens19 不进行 DHCP,没有 IPv4 地址(但 IPv6 SLAAC 可以有)

最后重启网络服务 systemctl restart systemd-networkd ,再起个容器验证下。首次访问会有些延迟,在做地址发现呢。

最后还有小问题,新建容器后,需要从容器中以 IPv6 协议向外访问一次,才能通过 IPv6 地址从 WAN 侧访问进来。这是符合预期的表现,因为在 IPv6 Relay 模式下,OpenWrt 对局域网内设备的态度是 ” 默认不存在,除非你说话 ”。 NDP 没学习到容器 SLAAC IPv6 地址位于 LAN 侧,会按默认路由表转发到 WAN 侧,一去不复返。

2025-12-03 最终版本:

[Match]
Name=ens18
 
[Link]
RequiredForOnline=carrier
 
[Network]
Description=Main router facing NIC
DHCP=ipv4
IPv6AcceptRA=false
[Match]  
Name=ens19  
  
[Link]  
RequiredForOnline=carrier  
  
[Network]  
Description=Openwrt facing NIC  
MACVLAN=docker-macvlan  
DHCP=no  
IPv6AcceptRA=false
[NetDev]
Name=docker-macvlan
Kind=macvlan
 
[MACVLAN]
Mode=bridge
[Match]
Name=docker-macvlan
 
[Network]
DHCP=yes

PVE 目录又一次没了

PVE

pve 目录清空 之后,这次在调整网卡 VLAN 设置时,又一次搞丢了 /etc/pve 目录 😑

PVE 节点无法连接,其他虚拟机倒是正常,说明问题应该是节点的 IP 地址丢了。
通过 console 连入发现有 IPv6 地址没有 IPv4 地址。这个 IPv6 应该是 SLAAC 分配得到的,以后主机名失去联系可以尝试用网络前缀加 prefix:1e1b:dff:fe95:90d1 的方式计算,勉强能得到个 SSH。

看了下是 DHCP 客户端没有运行,看起来是在通过 GUI 界面修改配置后,自动把我之前在 使用 DHCP 获取 IP 地址和主机名 设置的 dhcp 改为了 manual。

iface vmbr0 inet dhcp
iface vmbr0 inet manual