系统 Ubuntu 20.04.3 LTS

安装cockpit后, 软件列表刷新一直报错, 提示cannot refresh cache whilst offline.

解决方法: 在netplan中调整渲染器(renderer)为NetworkManager, ubuntu默认的渲染器为networkd. 配置类似如下:

1
2
3
4
5
6
network:
ethernets:
ens18:
dhcp4: true
version: 2
renderer: NetworkManager

参考

Cockpit – “cannot refresh cache whilst offline”

ubuntu:latest镜像终端无法显示中文字符, 有以下两种方法可以尝试:

  1. 直接修改LANG环境变量为C.UTF-8
  2. 若第一种方法无效, 需要安装中文字符包并生成中文字符缓存后再设置LANG.
1
2
apt update && apt install -y language-pack-zh-hans
locale-gen zh_CN.UTF-8

再设置LANGzh_CN.UTF-8即可.

参考

docker 学习 - 解决ubuntu镜像中文乱码问题

解决docker容器中文乱码,修改docker容器编码格式

参考的文章已经讲的特别清晰了, 本篇主要是把原文里简述的部分稍微展开描述.

Easier Setup

本文中提到的Chain功能, 可通过wg-ops工具更简单的实现. 使用该工具可避免一些常见的容易犯错的点.

Step-by-Step Setup

1. 搭建Client

peer为NodeA, allowed-ips设为0.0.0.0/0, 即全部流量. 假设网卡名称为wg0. 如果不想转发本地流量, 请设置allowed-ips为0.0.0.0/1, 128.0.0.0/1

注意当allowed-ips设为全部流量转发的时候, 可能需要添加DNS选项才能正确解析. DNS解析请求会走隧道.

2. 搭建Node A

先与client建立连接, allowed-ips设为client的ip即可 (按需设置). 假设网卡名称为wg1

再与NodeB建立连接, allowed-ips设为NodeA的ip + Client的ip. (按需设置). 假设网卡名称为wg2

3. 搭建Node B

与NodeA建立连接, allowed-ips设为NodeA的ip. (按需设置). 假设网卡名称为wg3

4. 在NodeA上配置转发

1
2
3
echo "1 middleman" >> /etc/iproute2/rt_tables
ip route add 0.0.0.0/0 dev wg2 table middleman
ip rule add from <NodeA对Client的allowed-ips> lookup middleman

注意此处ip rulefrom要配置为NodeA原本对Client的allowed-ips, 从而让Client来的流量可以按照middleman表来进行路由.

1
wg set wg2 peer <NodeB的公钥> allowed-ips 0.0.0.0/0

这句话主要是将面向NodeB的wg2接口的WireGuard路由调整为0.0.0.0/0. 注意, 此处并没有调整系统路由表. 所以如果用ip route命令查看的时候, 当前系统里原本面向NodeB的路由还是原来的路由, 因此NodeA上的其他流量不会被全部转发到NodeB.

1
sysctl net.ipv4.ip_forward=1

启动IP转发.

5. 在NodeB上配置转发

1
sysctl net.ipv4.ip_forward=1

启动IP转发.

1
2
iptables -A FORWARD -i wg3 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

调整iptables规则, 允许来自wg3的流量转发. 第二句指定系统将eth0网卡作为转发流量的出口. 如果物理网卡名字不同需要调整为目标网卡名称. (否则不会报错, 但是没有效果)

完成以上配置后即可达到流量转发的效果!

可以通过traceroute命令来验证.

选择性转发配置

如果想让来自Client的流量只经过NodeA转发, 但是某些想经过NodeB转发, 那么在step-by-step里第4步, ip route命令改为:

1
ip route add <想经过NodeB路由的IP> dev wg2 table middleman

除此之外还要在NodeA上调整iptables从而允许流量转发至互联网:

1
2
iptables -A FORWARD -i wg2 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

更多/更少节点时如何配置

更多节点: 在靠近Client端的节点按照NodeA配置, 在靠近互联网的节点按照NodeB配置, 中间的节点只需要按照NodeA配置即可.

更少节点: 如果Client只经过一跳就到达互联网, 则不需要NodeA的ip ruleip route配置, 只需要在NodeA上配置允许转发到互联网的iptables规则即可.

配置样例

Client

1
2
3
4
5
6
7
8
9
[Interface]
PrivateKey = ...
Address = 10.100.0.2/32

[Peer]
PublicKey = ...
AllowedIPs = 0.0.0.0/1, 128.0.0.0/1
Endpoint = ...
PersistentKeepalive = 30

NodeA

wg0 (面向客户端)

1
2
3
4
5
6
7
8
[Interface]
PrivateKey = ...
Address = 10.100.0.1
ListenPort = 51820

[Peer]
PublicKey = ...
AllowedIPs = 10.100.0.2

wg1 (面向下一个节点)

1
2
3
4
5
6
7
8
9
10
[Interface]
PrivateKey = ...
Address = 10.200.0.2
ListenPort = 51821

[Peer]
PublicKey = ...
AllowedIPs = 10.200.0.1
Endpoint = ...
PersistentKeepalive = 30

NodeB

1
2
3
4
5
6
7
8
[Interface]
PrivateKey = ...
Address = 10.200.0.1
ListenPort = 51820

[Peer]
PublicKey = ...
AllowedIPs = 10.200.0.0/24, 10.100.0.0/24

这里要注意, 因为我们没有在NodeA上配置iptables规则让来自10.100.0.0/24网段的IP包以10.200.0.2为源地址发出, 所以我们要在NodeB上配置允许IP来自10.100.0.0/24网段, 尽管在NodeB与NodeA之间使用的是100.200.0.0/24网段.

参考

Wireguard VPN: Chained Setup - The poetry of (in)security ——这篇写的真的太棒了

Wireguard VPN: Typical Setup - The poetry of (in)security

iamckn/chained-wireguard-ansible - GitHub

nealfennimore/wireguard.conf - GitHubGist

traceroute(8) — Linux manual page

ip-route(8) — Linux manual page

ip-rule(8) — Linux manual page

Proxmox版本: pve-manager/7.0-8/b1dbf562 (running kernel: 5.11.22-1-pve)

web控制台上的 关机/重启/停止/重置 都是没用的, 最简单的关机办法是在pve主机上运行 qm stop <VMID>, 相当于拔电源. 还有一种比较邪门的方法是直接ps -ef | grep kvm 然后看kvm -id后对应的VMID, 再直接kill -9

其他可能的命令:

qm shutdown <VMID> 走正常流程关机

qm reboot <VMID> 走正常流程重启, 如果有准备中的改动会应用上去. 注意, VM内自行的重启不会导致改动被应用.

qm reset <VMID> 相当于按下reset键的重启

参考

qm(1) - pve

How to: Fix Proxmox (PVE) “can’t lock file ‘/var/lock/qemu-server/lock-xxx.conf’ – got timeout” (Proxmox can’t shutdown/stop virtual machine) (Proxmox kill/force stop virtual machine)

trying to aquire lock…TASK ERROR: can’t lock file ‘/var/lock/qemu-server/…

Force kill a VM?

Proxmox can’t stop VM – How we fix it!

VMWare Workstation版本: VMware® Workstation 16 Pro 16.1.2 build-17966106

Proxmox版本: pve-manager/7.0-8/b1dbf562 (running kernel: 5.11.22-1-pve)

迁移步骤

  1. 在workstation里启动一下目标vm, 然后走正常流程关机, 在workstation面板里关闭这个vm.

  2. 打开这个vm所在的文件夹, 找到vmdk文件, 将其复制到PVE机器上.

  3. 在PVE机器上走正常流程新建一个虚拟机, 拿到vm号码 (以104举例)

  4. 运行 qm importdisk 104 <vmdk文件路径> <本地存储名称>. 一般来说本地存储名称叫 local-lvm, 可以在Proxmox存储面板上看到

  5. 等待导入完成后, 在PVE面板上找到VM104, 可以看到一个没有挂载的硬盘, 将其挂载, 并将刚刚创建的空磁盘分离并删除.

  6. 【关键】在VM104面板上, 点击<选项>, 编辑<引导顺序>, 勾选新加入的磁盘, 取消对net0的勾选.

  7. 开机测试迁移效果.

注意事项

  1. Ubuntu Server 20.04 LTS 迁移后可能会因为网卡名称发生变化而没有网, 需要编辑 /etc/netplan下的文件调整原网卡名到新的网卡名, 再运行 sudo netplan apply

  2. 如果出现CPU单核打满, 屏幕显示Booting from Hard Disk...且持续很长时间, 则考虑磁盘的控制器是否选错了. 一般来说从vmware迁移过来的磁盘都是基于SATA的. 有帖子称跟UEFI BIOS有关, 但实际测试中没有解决问题.

参考

qm(1) - pve

importdisk可能是新出的命令, 之前的很多帖子都要先convert再挂载, 对pve7参考价值不大.

vmware 迁移 虚拟机proxmox - CSDN

How to migrate a VMWare vmdk to Proxmox 4.4 with local-lvm storage

ProxmoxVE 之 V2V迁移(vmware->PVE)

Proxmox VE导入OVA、VMDK虚拟机文件,可以“随心所欲”的迁移到PVE平台

Proxmox VE磁盘/目录详解,并且安装第二个硬盘,修改ISO/虚拟机存放位置

Proxmox to Vmware: How to migrate a Proxmox VM to Vmware

Location of Disk Images in Local-LVM

Migration of servers to Proxmox VE

import virtual box VM?

Importing VMWare and VirtualBox VMs to Proxmox

Migrating VM Disk from HyperV to Proxmox (qm importdisk) BOOT FAILED

help,”Booting from Hard Disk …” the problem

Debian Guest Stuck On “Booting From Hard Disk”

请支持正版, 在日常使用机器上购买正版并激活Windows操作系统

某些场景下(例如VM环境), windows实例存活时间较短, 激活不是很划算. 此时想要调整任务栏样式, 例如不合并按钮等, 则需要调整注册表:

Dir: 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced (英文操作系统请将计算机替换为Computer)

Key Type Value Notice
TaskbarGlomLevel REG_DWORD 2 主屏任务栏按钮不合并
MMTaskbarGlomLevel REG_DWORD 2 多显示器其他任务栏按钮不合并
MMTaskbarMode REG_DWORD 2 多显示器其他任务栏只显示打开的程序

调整后, 在任务管理器-进程-应用中, 选中Windows资源管理器, 右键重新启动即可.

创建 win10_customize_taskbar.reg

1
2
3
4
5
6
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"TaskbarGlomLevel"=dword:2
"MMTaskbarGlomLevel"=dword:2
"MMTaskbarMode"=dword:2

参考

Task Bar Settings Not Editable with deactivated windows 10

Disable Windows 10 Taskbar Grouping and Small Icons about Registry?

How-to: Windows 10 registry - user interface settings

Hide Taskbar on Multiple Displays in Windows 10

Why Does Linus Pirate Windows??

问题现象

Surface Book 2 13寸, USB-TypeC接hub, 鼠标键盘接在hub上. 大约30秒-1分钟间隔键盘鼠标会停止响应. 尝试切换鼠标直接接usb也没有改善.

解决方案

据传因固件问题导致CPU过度超频影响USB设备. 通过以下命令调整DC/AC模式下CPU的最大频率, 防止过度超频. 调整后需要重启才能生效.

1
2
powercfg -SETDCVALUEINDEX SCHEME_BALANCED SUB_PROCESSOR PROCFREQMAX 3800
powercfg -SETACVALUEINDEX SCHEME_BALANCED SUB_PROCESSOR PROCFREQMAX 3800

参考

修复Surface Book 2 15英寸的鼠标卡顿/USB卡顿问题

Nginx版本: nginx/1.14.0 (Ubuntu)

Let’s Encrypt证书使用acme.sh客户端获取, 由Let’s Encrypt颁发.

问题现象: nginx配置https网站后, 浏览器(Edge/Chrome等)访问正常, curl访问报错提示curl: (60) SSL certificate problem: unable to get local issuer certificate. 从Java中通过HttpClient访问也提示证书校验失败.

分析: 根据 SSL Server Test 系统测试提示 This server's certificate chain is incomplete. Grade capped to B. 多处搜索无果, 于是查看通过acme.sh获取到的几个证书, 可以看到chain.cer中包含两个证书, *开头的cer文件中包含一个证书, fullchain.cer中包含以上两个证书, 考虑是否因证书链不完整导致报错.

解决方案: nginx对应server配置中:

ssl_certificate 改用 fullchain.cer

ssl_trusted_certificate 改用 chain.cer.

改动后需重新加载服务器: systemctl reload nginx

比较疑惑的是为什么非泛解析域名就不存在这个问题, 还没太想明白.

呐呐呐(x) 爆爆爆(√)

【鏡音リン・初音ミク】呐呐呐。【ピノキオピー】

《曾经的你》曾梦想仗剑走天涯 看一看世界的繁华 【突然听懂系列】

“假如我年少有为 不自卑”

《后来》刘若英 MV 1080P 50帧(CD音轨)

Audio Paradyne - Lost In Space

K-391 - Everybody

The Bass & The Melody - S3RL

Predictable Rave Song (Roski Veair Remix) - S3RL ft Tamika

【M A R i A】马口铁之舞

八目鳗穴

沙丁鱼从地面钻了出来

我在八目鳗穴飙着车

【音源配布】全部国产素材的沙丁鱼

【UTAU7人】沙丁鱼从地里钻了出来

!

【中文翻唱】!

【ころんば4号· デフォ子】八目鳗穴

毫无干劲的 八目鳗穴【イシル】

用一首先进国带你认识2009年NICO全明星

唱了一下”马口铁之舞”【MiraiAkari】

往期优秀作品推荐

2021年7月

主板: 微星MSI 迫击炮 B550

网卡: Intel Corporation Ethernet Connection (7) I219-V (rev 10)

内核版本: Linux 5.11.22-1-pve #1 SMP PVE 5.11.22-2

PVE版本: pve-manager/7.0-8/b1dbf562

问题现象: 每隔1-3分钟, 网卡会掉线15-30秒, 期间ping丢包100%, ip丢包100%. 系统日志提示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Aug 15 18:48:46 proxmox kernel: e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang:
TDH <39>
TDT <7b>
next_to_use <7b>
next_to_clean <38>
buffer_info[next_to_clean]:
time_stamp <1015769ac>
next_to_watch <39>
jiffies <101576ae0>
next_to_watch.status <0>
MAC Status <40080083>
PHY Status <796d>
PHY 1000BASE-T Status <3800>
PHY Extended Status <3000>
PCI Status <10>
Aug 15 18:48:48 proxmox kernel: e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang:
TDH <39>
TDT <7b>
next_to_use <7b>
next_to_clean <38>
buffer_info[next_to_clean]:
time_stamp <1015769ac>
next_to_watch <39>
jiffies <101576cd0>
next_to_watch.status <0>
MAC Status <40080083>
PHY Status <796d>
PHY 1000BASE-T Status <3800>
PHY Extended Status <3000>
PCI Status <10>
Aug 15 18:48:50 proxmox kernel: e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang:
TDH <39>
TDT <7b>
next_to_use <7b>
next_to_clean <38>
buffer_info[next_to_clean]:
time_stamp <1015769ac>
next_to_watch <39>
jiffies <101576ec8>
next_to_watch.status <0>
MAC Status <40080083>
PHY Status <796d>
PHY 1000BASE-T Status <3800>
PHY Extended Status <3000>
PCI Status <10>
Aug 15 18:48:52 proxmox kernel: e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang:
TDH <39>
TDT <7b>
next_to_use <7b>
next_to_clean <38>
buffer_info[next_to_clean]:
time_stamp <1015769ac>
next_to_watch <39>
jiffies <1015770b8>
next_to_watch.status <0>
MAC Status <40080083>
PHY Status <796d>
PHY 1000BASE-T Status <3800>
PHY Extended Status <3000>
PCI Status <10>
Aug 15 18:48:54 proxmox kernel: e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang:
TDH <39>
TDT <7b>
next_to_use <7b>
next_to_clean <38>
buffer_info[next_to_clean]:
time_stamp <1015769ac>
next_to_watch <39>
jiffies <1015772b0>
next_to_watch.status <0>
MAC Status <40080083>
PHY Status <796d>
PHY 1000BASE-T Status <3800>
PHY Extended Status <3000>
PCI Status <10>
Aug 15 18:48:54 proxmox kernel: e1000e 0000:00:1f.6 eno1: Reset adapter unexpectedly

解决方法: 驱动问题, 需要关闭网卡的一些属性.

1
ethtool -K eno1 gso off gro off tso off tx off rx off rxvlan off txvlan off sg off

使用apt install -y ethtool以安装以太网工具.

此改动仅限本次开机期间, 重启后会失效. 持久化保存需要修改 /etc/network/interfaces

在对应的网卡配置下, 与address同级添加配置:

1
2
3
4
5
6
7
8
9
10
offload-gso off
offload-gro off
offload-tso off
offload-rx off
offload-tx off
offload-rxvlan off
offload-txvlan off
offload-sg off
offload-ufo off
offload-lro off

不修改interfaces也可以使用另一种方式, 即开机运行一次ethtool命令, 创建一个ethfix.service

1
2
3
4
5
6
7
8
9
[Unit]
Description=Fix network card on boot

[Service]
Type=simple
ExecStart=/usr/sbin/ethtool -K eno1 gso off gro off tso off tx off rx off rxvlan off txvlan off sg off

[Install]
WantedBy=multi-user.target

运行systemctl enable ethfix, 即可在今后开机时自动应用改动.

参考

e1000 driver hang | Proxmox Support Forum

e1000 driver hang | Page 8 | Proxmox Support Forum

e1000e eno1: Detected Hardware Unit Hang: | Proxmox Support Forum

ethtool(8) — Linux manual page

TSO、UFO、GSO、LRO、GRO和RSS介绍(ethtool命令)