*.home.marco)自动条件分流解析。本方案在设计上实现了全链路静态化与常驻心跳保活,即使家庭遭遇断电、路由器重启或运营商动态 IP 轮换,通电后均能全自动恢复秒级直连,永久有效。
家庭网络通常包含三层结构。配置的目标是让外网握手数据包一路绿灯直达 Ubuntu 的 41641 监听端口:
[外部移动设备: 手机 5G / 出差笔记本]
│
▼ 1. 发起 WireGuard 握手 (UDP 41641)
┌─────────────────────────────────────────────────────────────┐
│ 第一层:光猫 (192.168.1.1) [拥有公网 IP] │
│ └─ 虚拟主机:将外网 UDP 41641 静态映射至 192.168.1.6:41641 │
└──────────────────────────────┬──────────────────────────────┘
│ 2. 透传至二级路由 (全静态 IP,绝不漂移)
▼
┌─────────────────────────────────────────────────────────────┐
│ 第二层:OpenWrt 主路由 (WAN 静态: 192.168.1.6, LAN: 192.168.122.1)│
│ ├─ 防火墙转发:UDP 41641 -> 192.168.122.2:41641 │
│ ├─ 内网 DNS:Dnsmasq 解析 *.home.marco │
│ └─ 鉴权代理接口:192.168.122.1:10809 (保障国内重启秒连) │
└──────────────────────────────┬──────────────────────────────┘
│ 3. 精准到达子网路由器
▼
┌─────────────────────────────────────────────────────────────┐
│ 第三层:Ubuntu 服务器 (局域网静态 IP: 192.168.122.2) │
│ ├─ 角色: Tailscale 子网路由器 (Subnet Router) │
│ ├─ 广播网段: 192.168.122.0/24 与 192.168.1.0/24 │
│ ├─ 硬件加速: UDP GRO 网卡转发加速 │
│ └─ 守护进程: tailscale-keepalive (20s 心跳锁死 NAT 会话) │
└──────────────────────────────┬──────────────────────────────┘
│ 4. 自动内网转发 (SNAT)
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
局域网 NAS 局域网 PC 上级光猫后台
(192.168.122.5) (192.168.122.x) (192.168.1.1)未配置光猫映射与保活时:
外部设备 ──(UDP 41641)──> [ 光猫拦截/超时闭合 ] ──► 绕路海外 DERP 服务器中转 (延迟 280ms~600ms, 限速) ──► 家里
配置静态映射与 20s 常驻保活后(100% P2P 极速直连):
外部设备 ──(UDP 41641)──> [ 光猫 ] ──► [ OpenWrt ] ──► [ Ubuntu ]
└────────────────────── 建立端到端加密直连隧道 (5ms~35ms 极速秒开) ──────────────────────┘光猫是外部流量进入家庭的第一道门。我们需要锁定 41641 端口,避免光猫因为 NAT 会话超时导致连接降级为中继。
http://192.168.1.1;点击新建,按以下参数填写:
2_INTERNET_R_VID_10)UDP41641 / 4164141641 / 41641192.168.1.6)192.168.1.6);在 OpenWrt 路由器上需要完成 4 项设置:WAN 口静态化、端口转发、DNS 跨网段响应与鉴权域名分流。
为了防止家庭断电重启时光猫 DHCP 发生竞争导致 OpenWrt IP 漂移(从而使光猫的端口转发失效),通过 SSH 登录 OpenWrt 路由器(ssh root@192.168.122.1),执行以下命令将 WAN 口固化为静态 IP:
uci set network.wan.proto='static'
uci set network.wan.ipaddr='192.168.1.6'
uci set network.wan.netmask='255.255.255.0'
uci set network.wan.gateway='192.168.1.1'
uci set network.wan.dns='192.168.1.1 114.114.114.114'
uci commit network
/etc/init.d/network reload继续在 OpenWrt 终端中执行:
# 1. 添加 UDP 41641 转发至 Ubuntu 服务器
uci add firewall redirect
uci set firewall.@redirect[-1].name='Tailscale_Ubuntu'
uci set firewall.@redirect[-1].src='wan'
uci set firewall.@redirect[-1].proto='udp'
uci set firewall.@redirect[-1].src_dport='41641'
uci set firewall.@redirect[-1].dest='lan'
uci set firewall.@redirect[-1].dest_ip='192.168.122.2'
uci set firewall.@redirect[-1].dest_port='41641'
uci set firewall.@redirect[-1].target='DNAT'
# 2. 开启流量卸载加速(提升转发吞吐量、降低软路由 CPU 占用)
uci set firewall.@defaults[0].flow_offloading='1'
# 3. 提交并重载防火墙
uci commit firewall
/etc/init.d/firewall reload让 OpenWrt 的 Dnsmasq 允许响应来自 Tailscale 虚拟网段的查询,并允许返回内网私有 IP:
# 1. 允许响应非本地直连网段的 DNS 请求
uci set dhcp.@dnsmasq[0].localservice='0'
# 2. 将内网域名加入防 DNS 重绑白名单
uci add_list dhcp.@dnsmasq[0].rebind_domain='home.marco'
# 3. 提交并重启 Dnsmasq
uci commit dhcp
/etc/init.d/dnsmasq restart在国内网络环境下,Tailscale 的官方控制中心(controlplane.tailscale.com 及 *.tailscale.com、*.ts.net)的 HTTPS 443 端口经常遭受网络干扰或阻断。
根据您路由器上运行的代理工具不同,任选以下一种方式实现即可:
在 OpenWrt 的自定义代理域名列表 /etc/dnsmasq/proxy-added.conf 中追加规则:
nftset=/tailscale.com/4#ip#v2ray#gfwlist
nftset=/tailscale.io/4#ip#v2ray#gfwlist
nftset=/ts.net/4#ip#v2ray#gfwlist重启 Dnsmasq:/etc/init.d/dnsmasq restart
在 /etc/v2ray/config.json 的 inbounds 中开启局域网 HTTP 代理端口(供内网 Ubuntu 调用):
{
"tag": "http-proxy",
"port": "10809",
"listen": "0.0.0.0",
"protocol": "http"
}重启服务:/etc/init.d/v2ray restart
如果您的 OpenWrt 使用的是常见的图形化代理插件:
添加分流规则:在插件的「自定义分流规则」中添加以下规则走代理策略组:
DOMAIN-SUFFIX,tailscale.com,PROXYDOMAIN-SUFFIX,ts.net,PROXYDOMAIN-SUFFIX,tailscale.io,PROXY7890,后续在 Ubuntu 中将端口对应改为 7890 即可)。如果您的主路由器没有安装任何代理服务:
127.0.0.1:10809;/etc/default/tailscaled 中将代理地址写为 http://127.0.0.1:10809 同样可以完美生效。通过 SSH 登录 Ubuntu 服务器(ssh marco@192.168.122.2),进行系统与 Tailscale 核心配置。
# 写入持久化转发配置
sudo bash -c 'cat << EOF > /etc/sysctl.d/99-tailscale.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOF'
# 立即应用生效
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf# 导入软件源
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
# 安装并启动
sudo apt-get update
sudo apt-get install -y tailscale
sudo systemctl enable --now tailscaled创建 /etc/default/tailscaled,指定固定监听端口 41641,并将鉴权请求指向 OpenWrt 代理端口:
sudo bash -c 'cat << EOF > /etc/default/tailscaled
PORT="41641"
FLAGS=""
HTTP_PROXY="http://192.168.122.1:10809"
HTTPS_PROXY="http://192.168.122.1:10809"
EOF'
# 重启 tailscaled 使环境变量生效
sudo systemctl restart tailscaled原理说明:只有开机向云端进行 HTTPS 鉴权握手时会走代理,实际传输内网数据(WireGuard UDP 41641)依然是原生直连,不耗费代理流量。
执行以下命令启动 Tailscale:
sudo tailscale up --advertise-routes=192.168.122.0/24,192.168.1.0/24 --advertise-exit-node --accept-routes=true --resethttps://login.tailscale.com/a/xxxxxx 的链接;# 1. 安装 ethtool
sudo apt-get install -y ethtool
# 2. 针对主网卡 (如 ens160) 开启 UDP GRO 加速
sudo ethtool -K ens160 rx-udp-gro-forwarding on rx-gro-list off
# 3. 创建开机自启服务保证重启依然生效
sudo bash -c 'cat << EOF > /etc/systemd/system/tailscale-gro.service
[Unit]
Description=Tailscale UDP GRO optimization for ens160
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/ethtool -K ens160 rx-udp-gro-forwarding on rx-gro-list off
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF'
sudo systemctl daemon-reload
sudo systemctl enable --now tailscale-gro.service国内家庭宽带光猫通常在空闲 30~60 秒后自动超时关闭 UDP 临时会话表,导致长时间不使用的外部客户端发起连接时需要先走中继唤醒。部署常驻心跳服务,每 20 秒向外部节点和 STUN 发送微弱探测包,即可实现全天候 24 小时保持极速直连状态:
# 1. 创建保活脚本
sudo bash -c 'cat << "EOF" > /usr/local/bin/tailscale-keepalive.sh
#!/bin/bash
# Tailscale NAT Keepalive Daemon (20s interval)
while true; do
# 周期性向对端发送微量探测,锁死 NAT 通道
tailscale ping --c 1 --until-direct=false 100.70.12.55 >/dev/null 2>&1
sleep 20
done
EOF'
sudo chmod +x /usr/local/bin/tailscale-keepalive.sh
# 2. 配置 systemd 开机自启守护进程
sudo bash -c 'cat << EOF > /etc/systemd/system/tailscale-keepalive.service
[Unit]
Description=Tailscale UDP NAT Keepalive Service
After=network.target tailscaled.service
Requires=tailscaled.service
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/tailscale-keepalive.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF'
sudo systemctl daemon-reload
sudo systemctl enable --now tailscale-keepalive.serviceubuntu-home-marco,点击右侧菜单 ... ➜ Edit route settings...;192.168.122.0/24 与 192.168.1.0/24;ubuntu-home-marco 右侧菜单 ...;Expiry disabled,该服务器将终身永久在线。在 Nameservers 区域点击 Add nameserver ➜ 选择 Custom...:
192.168.122.1(OpenWrt 路由器 IP)Restrict to search domainhome.marcoUse with exit node为了解决移动端(特别是 iOS)在登录时因 VPN 槽位冲突导致无法完成网页认证的问题,推荐使用 Auth Key 登录:
tskey-auth-kxxxxxxxxxxxx)。... 图标;如果您需要使用外部 Windows 笔记本远程桌面控制家里的 Windows 电脑(如 windows.home.marco),强烈建议在外部笔记本上关闭客户端的 RDP-UDP 传输:
一键配置(以管理员身份运行 PowerShell):
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client" /v fClientDisableUDP /t REG_DWORD /d 1 /fWin + R 运行 gpedit.msc ➜ 计算机配置 ➜ 管理模板 ➜ Windows 组件 ➜ 远程桌面服务 ➜ 远程桌面连接客户端 ➜ 双击【在客户端上关闭 UDP】➜ 勾选【已启用】保存。在外部设备(如手机断开家庭 Wi-Fi 开启 5G,或笔记本连接外部热点)连接 Tailscale 后进行验证。
在客户端终端执行:
tailscale ping openwrt.home.marcopong from ubuntu-home-marco (100.98.71.30) via <公网IP>:<端口> in 10ms~35ms| 目标服务 | 推荐访问地址 | 说明 |
|---|---|---|
| OpenWrt 路由后台 | http://openwrt.home.marco | 对应内网 IP: 192.168.122.1 |
| 光猫管理后台 | http://192.168.1.1 | 对应内网 IP: 192.168.1.1 |
| ESXi 虚拟化后台 | https://esxi.home.marco | 必须使用 https 协议 (IP: 192.168.1.3) |
| NAS 存储管理 | http://nas.home.marco:5000 | 对应内网 IP: 192.168.122.5 |
| Ubuntu 服务器 | http://ubuntu.home.marco | 对应内网 IP: 192.168.122.2 |
*.home.marco 网页?原因:电脑上的代理软件劫持了所有网络请求,并尝试将 *.home.marco 送往海外代理节点,导致报错 503 Service Unavailable。
解决方法:在代理软件的路由分流中将 home.marco 加入直连白名单:
domain:home.marco;DOMAIN-SUFFIX,home.marco,DIRECT;*.home.marco。原因:这是运营商动态公网 IP 轮换或长时间无数据通信后,光猫 NAT 会话休眠造成的正常自愈过程。Tailscale 为了防止丢包会先调用官方 DERP 兜底送达,并在后台完成打洞升级。
彻底解决:部署本教程第四步的 tailscale-keepalive.service,让后台每 20 秒发送微量心跳包锁死光猫 NAT 通道,即可实现 24 小时随连随通、秒级直连。
是的,完全自动恢复。
整套网络已经完成全链路全静态化锁定:
UDP 41641)固化在硬件中,断电不丢失;192.168.1.6,绝不会因 DHCP 竞争而漂移;41641 固化;tailscaled 与 tailscale-keepalive 开机自启。 完全不需要。 Tailscale 子网路由默认自带 SNAT(源地址伪装)。内网所有设备收到的请求源 IP 都是 Ubuntu 服务器的 192.168.122.2,回包会自动返回 Ubuntu 并送回外部客户端。
在客户端的 Tailscale 菜单中开启 Exit Node ➜ 选择 ubuntu-home-marco。此时所有网络流量强制经由家庭 Ubuntu 发送,即可准确命中家里的光猫后台 192.168.1.1。
原因:这是微软 RDP 客户端启用 UDP 与 WireGuard/Tailscale 默认 MTU 1280 产生的丢包冲突所致。
解决方法:在外部 Windows 客户端上关闭 RDP 的 UDP 传输通道(强制走纯 TCP 模式):
以管理员身份运行 PowerShell 执行以下命令:
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client" /v fClientDisableUDP /t REG_DWORD /d 1 /f修改后彻底关闭远程桌面窗口并重新连接,传输协议会自动切换为稳定的 TCP/WebSocket,往返延迟瞬间从 400ms 骤降至 30ms~40ms 极速响应,可用带宽飙升至 10+ Mbps,彻底告别卡顿!
]]>GitHub 主页:https://github.com/AlDanial/cloc
统计文件夹中的代码构成:
cloc /path/to/folder
统计当前文件夹:
cloc .
排除文件夹中某些文件夹:
cloc --exclude-dir=.github,myenv,build,dist .
效果如下:
cloc --exclude-dir=.git,.idea,.vscode,.github,myenv,build,dist .
33 text files.
26 unique files.
23 files ignored.
github.com/AlDanial/cloc v 2.04 T=0.16 s (162.0 files/s, 67602.7 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Python 22 1609 1947 6254
Markdown 2 114 0 484
JSON 1 0 0 403
Text 1 0 0 37
-------------------------------------------------------------------------------
SUM: 26 1723 1947 7178
-------------------------------------------------------------------------------以上就是 cloc 的简单用法。
]]>TinyPNG 官网:https://tinypng.com/
tinifier 主页:https://github.com/tarampampam/tinifier
api 申请:https://tinypng.com/developers
首先申请一个自己的 api,每个账户每月有 500 次请求的免费额度。在上面的 api 申请网页中输入邮箱申请即可,打开邮件回复的链接进入个人主页,在 api 栏可以看到或新建 api:
github release 页面下载 tinifier 最新版,注意需要在 cli 命令行中使用。为了方便在 windows 下调用,可以将程序路径加入系统 path 中。linux 可以添加一个软链接到 /usr/local/bin 中。
可用命令:
, 隔开多个 key示例:
# 压缩一个图片
tinifier compress -k 'YOUR-API-KEY-GOES-HERE' ./img.png
#压缩一个目录中的所有 png 图片
tinifier compress -k 'YOUR-API-KEY-GOES-HERE' -e png ./images-directory
# 使用20线程压缩所有 png jpg 格式的图片并循环搜索所有子文件夹
tinifier compress -k 'YOUR-API-KEY-GOES-HERE' -e png -e jpg -e PNG -e JPG -t 20 -r ./some-dir以上就是通过 tinyPNG api 批量压缩本地图片的基本用法。实际使用中及大幅度的减小了本地图片磁盘占用量。建议使用时提前设置好 API 的系统环境变量,可以更加方便的使用压缩命令。
]]>ppt 导出的 webm 转 mp4:
ffmpeg -fflags +genpts -i in.webm -r 24 out.mp4
mpg 转 mp4:
ffmpeg -i in.mpg -c:v libx264 -c:a aac -crf 20 -preset:v veryslow out.mp4
参考链接:
webm to mp4 conversion using ffmpeg
FFMPEG convert .mpg video to .mp4 without lose quality
translate.googleapis.com,将 url 配置到我的代理列表中走 switchyomega 依然无法访问。经过查询发现 chrome 翻译的流量只能走系统代理,这就有点麻烦了。开始使用了修改 hosts 的方式指定到国内可用 ip 上,但是使用并不长久,没几天就又不可用了。
家里电脑可以在 openwrt 路由上配置好代理,比较简单,但是想要在本机上直接配置就不太方便了,需要设置系统为全局代理,但我又不想这样做。
今天发现 proxifier 居然可以指定 hosts 配置代理,测试了下居然可行:
如果之前在系统 hosts 文件添加过 translate.googleapis.com 的定向需要先将其删除,设置好后重启 chrome 发现网页翻译可以正常使用了。
RustDesk 提供了 3 个免费的转发服务器,会根据你的地理位置自动选择最快的,一般使用足够了,如果对安全性有担忧,它们也提供了 server 端应用,可以自建转发服务器。下面就对搭建 server 端做一些介绍。
RustDesk GitHub 主页:https://github.com/rustdesk/rustdesk
RustDesk Server GitHub 主页:https://github.com/rustdesk/rustdesk-server
服务器平台:ubuntu 20.04
我是通过 docker 安装的 server 端,这样最快速简单。
关于 docker 和 docker compose 的安装可以参考我之前的文章:https://blog.niekun.net/archives/2742.html#title-1
docker-compose.yml 文件内容如下:
version: '3'
networks:
rustdesk-net:
external: false
services:
hbbs:
container_name: hbbs
ports:
- 21115:21115
- 21116:21116
- 21116:21116/udp
- 21118:21118
image: rustdesk/rustdesk-server:latest
command: hbbs -r xxx.xxx.xxx.xxx:21117
volumes:
- ./data:/root
networks:
- rustdesk-net
depends_on:
- hbbr
restart: unless-stopped
hbbr:
container_name: hbbr
ports:
- 21117:21117
- 21119:21119
image: rustdesk/rustdesk-server:latest
command: hbbr
volumes:
- ./data:/root
networks:
- rustdesk-net
restart: unless-stopped这里配置 hbbs IP 地址需要设置为中继服务器的 IP 或域名,否则无法链接。默认监听的是 21117 端口,客户端默认也是链接服务器的这个端口。如果修改这里的默认端口,则在客户端设置的时候也需要指定此端口。
启动服务:
docker-compose up -d
此时在客户端设置 ID server:
在第一行填入服务器 IP 地址即可:
确认后,如果下方状态栏显示 ready 表示服务器链接正常:
如果想要使用域名作为 server id,需要在你的域名服务器里加上一条自定义的域名 NS 解析,如:rust.abc.com。
注意如果你使用的是 cloudflare 服务,由于它在启用 CDN 后只支持少数端口的转发,而我们需要使用的是 21115 - 21119 这些端口,所以需要在 dns 配置时取消这个自定义域名的小黄云,只使用其 dns 服务:
关于 cloudflare 的网络端口转发相关的信息参考官网内容:Network ports
自定义域名配置好后,修改 docker-compose.yml 配置文件中定义的地址为指定域名:
command: hbbs -r rust.abc.com:21117
重启容器后就可以在客户端的 ID server 中使用域名链接了。方法和上面介绍的用服务器 IP 设置的方法相同。
]]>VMware vSphere 是 VMware 的虚拟化平台,可将数据中心转换为包括 CPU、存储和网络资源的聚合计算基础架构。vSphere 将这些基础架构作为一个统一的运行环境进行管理,并为您提供工具来管理加入该环境的数据中心。

vSphere 的两个核心组件是 ESXi 和 vCenter Server。ESXi 是用于创建并运行虚拟机和虚拟设备的虚拟化平台。vCenter Server 是一项服务,用于管理网络中连接的多个主机,并将主机资源池化。
vSphere Hypervisor 虚拟领域管理程序是一种可将服务器虚拟化的裸机管理程序,依托 VMware vSphere ESXi 体系架构构建。
ESXi 是安装在物理机上的管理器。vSphere Client 安装在一个笔记本或者桌面PC上,用于访问 ESXi 服务器进行虚拟机的创建和管理。vCenter server 像一个虚拟机一样安装在 ESXi 上面。在拥有多个 ESXi 服务器和数十个虚拟机时,vCenter server的应用就比较频繁了。在小环境下的管理通常都会使用 vSphere client 来直连 ESXi 服务器。
简单来说 ESXi 是直接安装在物理机器上用来管理硬件设备,相当于一个操作系统,然后在 ESXi 中安装虚拟机。它可以方便的给不同的虚拟机分配硬件资源,以及管理。
类似 VMware workstation 等产品是需要安装在某个操作系统内部运行的。
我们需要下载 vSphere Hypervisor 的 iso 镜像。
最简单的是登陆账号后在下面网址搜索下载:
https://customerconnect.vmware.com/downloads/#my_products
也可以进入官网下载:https://www.vmware.com/products/vsphere-hypervisor.html
在右侧点击 download 会提示登录账号,然后需要注册下产品,点击 register:
然后找到 esxi ISO 镜像下载地址,点击下载:
当前最新版为 VMware vSphere 7.0 Update 2。
然后我们需要将制作一个启动盘来安装 esxi,推荐使用 ventoy 来加载镜像,非常方便:https://www.ventoy.net/en/index.html
开机进入 boot 设置,将对应的启动盘设置为第一项启动,然后就可以进入 ventoy 引导画面了。
选择 esxi 镜像文件 enter 进入,下面我们就进入 esxi 安装程序了。
这里有第一个需要注意的地方,esxi 在第一次全新安装中会默认划分 120G 的虚拟闪存,类似于 Windows 的虚拟内存,提供更大的交换空间,为虚拟机提供读缓存,提升虚拟机的存储性能。
但是对于家用设备来说,120G 的空间白白占用有点浪费,所以我们需要自定义设置这个虚拟闪存的大小。
在引导进入安装界面后,立刻按下 shift + o 键,会停留在如下画面:
在下方可以输入命令行的地方,我们在已有命令后添加一句:autoPartitionOSDataSize=4096:
表示设置虚拟闪存大小为 4 GB,可以按照需要调整,数字就是 1024 乘以需要的 GB 大小。
回车确认后继续引导安装程序,期间会自动识别设备硬件。根据提示点击 enter 继续:
点击 F11 继续:
选择安装到那个硬盘,enter 确认继续:
选择键盘布局,默认即可:
设置 root 密码:
最后点击 F11 开始安装:
安装完成后提示可以移除引导盘并重启了:
系统重启后,会自动识别第一个网口的网络地址,我们可以在同一局域网下通过 ESXi 的地址访问管理页面:
我们也可以通过网线将其他设备连接到第一个网口的方式进入管理页面,需要首先设置 esxi 的网络地址。点击 F2 进入配置界面,需要输入 root 密码:
进入 config management network:
默认选中的管理网络为第一个网口,可以自行修改:
我们需要配置 IPv4 configuration:
空格键选中 set static ipv4 address,并配置合适的 ip 地址,稍后需要将连接的设备也设置为同一网段才可以连接:
完成后点击 esc 退出配置,会弹出是否重启网络提示框,点击 Y 确认。
然后我们需要在通过网线连接的设备端配置网络到上面设置的同一网段内。这样就可以通过设置的静态地址来访问 esxi 管理页面了。
以上两种方式都可以进入 esxi 管理界面,这里我是通过局域网设备来实现的。
访问 esxi 的管理地址,这里我的 esxi 地址为 27.168.1.181。在局域网下其他设备浏览器打开这个地址:
登录 root 账户:
可以看到 esxi 7 自身占用了 1.3GB 内存和 2.5GB 硬盘空间。
hardware 栏里的 virtual flash 就是我们安装时候自定义的 4GB 虚拟闪存空间:
我们安装的是 esxi 评估版可以免费使用 60 天,如果想要一直使用则需要输入有效的序列号。可以通过 manage - licensing - actions - assign license 输入序列号:
安装 esxi 的时候会格式化系统对应的磁盘,如果安装了多个磁盘并且需要在 esxi 中作为存储设备,就需要单独配置它们了。
点击左侧导航栏的 storage,然后选择 devices:
可以看到我有两块硬盘和一个 cdrom。其中最下面的 10G 的硬盘是 esxi 安装盘,点击进入可以查看详细信息:
其中 VMFSL 就是虚拟闪存空间,剩下的 VMFS 分区就是可用的数据分区。
点击进入第二个硬盘查看:
我们看到这里什么都没有,这是因为这块硬盘没有分配 datastore。我们点击 new datastore,首先给这个数据区取一个名字:
在下面的页面,我们首先选择 use full disk,这样会见整块硬盘都作为这个 datastore,然后点击 next:
点击 finish 后,datastroe 就建立完成了,这时候可以看到这块磁盘的信息:
返回 datastore 选项卡可以看到新建立的 datastore2 在列表中:
在后续的虚拟机安装中,我们可以选择将虚拟机安装到哪一个 datastore 中。
点击 datastore browser 可以查看其中的数据文件:

可以看到左上角有一个 upload 选项,我们可以远程将文件复制到 datasotre 中:
后续安装虚拟机时,我会通过这种方法将系统镜像文件复制到 datastore 中。
下面我们来配置网卡,这也是 esxi 的核心之一。我们可以将主机上的物理网卡定义为虚拟交换机,然后分配给虚拟机使用。
这里的配置非常自由,需要根据实际需求来设置,我们可以将每个网卡单独配置一个虚拟交换机,也可以将多个网卡设置为一个虚拟交换机。
选择左侧导航栏的 networking,然后点击 physical NICs,就是主机上的所有物理网卡,这里有三个:
然后我们切换到 virtual switches,这里就是定义虚拟交换机,默认有一个 vSwitch0,我们点击进去看看它的配置:
可以看到它绑定了我们的第一个网卡。我们点击 edit settings 进入配置:
uplink 定义了绑定到那个物理网卡。注意我们将 security 里的三个选项都设置为 accept 来使网络功能完整支持。点击 save 保存配置。
如果需要将另一个网卡也绑定到这个虚拟交换机,可以点击左上角的 add uplink:
这里我们将每个网卡都配置单独的虚拟交换机。
返回 virtual switches 栏,点击 add standard virtual switch 添加新的交换机:
将第二个网卡配置给 vSwitch1,同样的设置 security 为 accept。然后通过相同的方法配置第三个网卡,最终我们配置好了所有的交换机:
最后我们配置 port group 端口组,可以定义一个虚拟交换机的集合。我们安装虚拟机为其分配网卡时就是分配给其某个 port group。同一个虚拟交换机可以定义到多个集合中。
默认有两个集合,可以看到它们都是对应 vSwtich0:
注意不要修改第二个 Management Network 的配置,否则可能无法访问 esxi 管理页面。
我们将另外两个刚才建立的虚拟交换机定义到 port group 中,以便虚拟机可以调用。点击 add port group:
这里注意 group 名称如果最后一个是数字,则不要再前面加空格,否则虚拟机无法识别到它。
将所有的虚拟交换机都配置对应的 port group:
这样我们就配置好了所有的网卡部分。
这里有个进阶教程,可以将某个网卡或其他物理设备设置为直通模式,可以供虚拟机直接调用。可以提高性能。这样就不需要配置虚拟交换机了。
通过 manage - hardware - PCI devices 查看所有的硬件:
如果又可以直通的硬件,前面的复选框就可为可选状态,然后点击 左上角的 toggle passthrough 就可以切换直通模式了,这里我由于是虚拟机中安装的 esxi 所有网卡不可以设置为直通模式。
下面我们就可以创建虚拟机了。
首先配置虚拟机,左侧导航栏选择 virtual machines,然后点击 create/register vm 进入引导页面:
如果时创建新虚拟机则选择第一项,如果是添加已有的虚拟机则选择第三项,这里我们创建新虚拟机,点击 next。
设置虚拟机名称和系统类型,这里我安装一个 openwrt 系统:
然后选择虚拟机安装位置,也就是选择一个 datastore:
然后是定义虚拟机硬件配置,可以根据需要设置,这里我通过顶部的菜单添加一个新的 network adapter:
然后我们配置网络适配器对应的 port group,点击后面的下拉菜单可以看到我们在 port group 中定义的所有集合:
我给两个网络适配器分别分配不同的集合,也就是对应不同的虚拟交换机:
如果需要通过系统镜像的方式安装虚拟机,则需要配置 cdrom 为 datastore ISO file,然后选择提前上传到 datastore 的镜像文件:
这里我是通过提前准备好的 vmdk 虚拟磁盘文件来直接启动虚拟机,所以我需要将虚拟磁盘添加进来。
首先将默认的 disk 删除,然后选择 add hard disk - existing hard disk:
然后选中对应的磁盘文件,这里我们直接将磁盘文件放在 openwrt 目录内,方便后期管理:
然后点击 finish 完成虚拟机的硬件配置:
现在可以看到我们刚添加的 openwrt:
点击 openwrt 进入监控界面:
然后点击 power on 就可以启动虚拟机了。
可以通过设置,让 esxi 启动后自动启动某个虚拟机,点击 manage - system - autostart,然后选中需要自动启动的虚拟机,点击 enable 即可:
如果有多个虚拟机需要自动启动,还可以设置它们的启动顺序。
经过测试可以通过 frp 经过 ssh 访问 exsi。但是由于 exsi web 管理页面默认会 http 重定向到 https 页面,所以如果你配置的是 http to https 的访问则会出现远程访问的时候进入无限循环的 redirect 从而报错。
解决方法就是 frp 配置 plugin_http2https 插件将 https 转为 http 转发给 frps,要么将 exsi web 页面关闭强制重定向 https。
可以参考:
How To: vSphere Client to vCenter Using HTTP
使用 frp 实现内网穿透/远程管理/文件服务器
从安全的角度考虑,还是不要轻易将 exsi 暴露在外网中吧。
以上就是 esxi 的简单安装和使用教程。
关于配置自己的 bot 参考之前的文章:https://blog.niekun.net/archives/428.html
我的应用于 telegram bot 的 YouTube 下载器源码地址:https://github.com/nie11kun/telegram-bot-youtube-downloader
最近想给我的 telegram bot 添加 Instagram 图片的下载功能,但是 youtube-dl 并不支持 Instagram。查询了下发现了 instaloader 这个开源软件可以完美实现我想要的功能。
instaloader 官网:https://instaloader.github.io/
GitHub:https://github.com/instaloader/instaloader
instaloader 需要 python 3.5 以上。推荐直接安装最新版 python。
使用 pip3 安装:
pip3 install instaloader --upgrade
注意必须通过 pip3 而不是 pip 安装,否则使用中会报错。
安装完成后就可以使用 instaloader 命令来下载了。注意如果 python 安装到了自定义目录,如 /opt 则需要手动链接 instaloader 可执行程序到 /usr/local/bin 目录。
如果要下载一个 post 中的图片,提取链接中的 shortcode 来下载,如下是一个 Instagram post 的链接:https://www.instagram.com/p/CMcMZycLpbS/?utm_source=ig_web_copy_link,其中的 CMcMZycLpbS 就是 shortcode 代码。
需要通过 -shortcode 参数来下载对应的图片,且需要通过 -- 告诉 instaloader 不要将 -shortcode 作为 option 对待,如:
instaloader -- -CMcMZycLpbS
关于命令中的特殊字符处理参考:https://blog.niekun.net/archives/2204.html
默认会下载到当前目录下,并新建文件夹 -shortcode,媒体文件及相关文本文件就在其中,注意到文件夹是以特殊字符 - 开头的,所以访问目录需要加上 --,如:
cd -- -CMcMZycLpbS
通过 --dirname-pattern 参数可以指定下载目录,如:
instaloader --dirname-pattern=/tmp/test -- -CMcMZycLpbS
就会将对应 post 的媒体下载到 /tmp/test 目录内。
instaloader 的功能很强大,可以下载一个用户的所有发布内容,可以下载一个 #hashtag 标签的所有内容等。具体可以参考官方文档:https://instaloader.github.io/basic-usage.html#download-pictures-from-instagram
我将 instaloader 加入了 telegram bot 中,可以很方便的下载一个 post 的媒体内容,有兴趣的可以查看:https://github.com/nie11kun/telegram-bot-youtube-downloader
]]>
经过查询发现时由于安装的 JS-CSS-HTML Formatter 插件默认会在保存文件时对文件格式进行处理。但是堆 React 代码的自动处理有问题导致无法正常进行开发。
只需要修改其配置文件将保存文件时自动处理关掉即可。
快捷键 cmd + shift + p 打开控制器,输入 formatter:
点击 formatter config 修改配置文件,将第一句 "onSave": true 改为 false 保存即可。
需要重启 vscode 才能生效。
]]>使用 GUI 添加的好处是比较直观,使用鼠标点击即可。
右键项目名称,点击 add library:
选中 external library 点击 next:
选择头文件所在目录路径:
如果有 lib 库文件的话需要链接进来,没有的话可以不设置:
其他保持默认然后点击 next 完成添加。
我们打开 pro 文件可以看到在文件最后添加了相关内容:
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../Library/boost_1_72_0/stage/lib/ -llibboost_filesystem-mgw81-mt-x32-1_72.dll
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../Library/boost_1_72_0/stage/lib/ -llibboost_filesystem-mgw81-mt-x32-1_72.dlld
else:unix: LIBS += -L$$PWD/../../../Library/boost_1_72_0/stage/lib/ -llibboost_filesystem-mgw81-mt-x32-1_72.dll
INCLUDEPATH += $$PWD/../../../Library/boost_1_72_0
DEPENDPATH += $$PWD/../../../Library/boost_1_72_0根据添加一个第三方库所增加的语句,我们可以手动直接编辑 pro 文件完成添加:
LIBS 指定 lib 库文件路径,没有的话不需要定义INCLUDEPATH 指头文件所在目录DEPENDPATH 定义和头文件相同目录即可例如我们添加一个 boost filesystem 库到项目:
LIBS += -L"/path/to/boost_1_72_0/stage/lib/" \
-llibboost_filesystem-mgw81-mt-x32-1_72 \
-llibboost_regex-mgw81-mt-x32-1_72
INCLUDEPATH += "/path/to/boost_1_72_0"
DEPENDPATH += "/path/to/boost_1_72_0"LIBS 中,使用 -L 添加 lib 库目录,使用 -l 添加具体某个库文件,可以不写文件后缀。
以上就是 QT 中添加第三方库的方法。
]]>