PVE 8.2.4 ISO安装, 由于同一台机器上其他的磁盘上原来已经安装了 PVE 7.4 所以安装过程中提示是否要rename到pve-OLD 而且不能跳过.
安装之后原来磁盘上的PVE会被保留, 但这也造成了我们没法把原来的磁盘用作其他用途 (Disk Manage会报错占用了, 没法Wipe Disk)
参考以下步骤删除掉 pve-OLD
删除lv
1 | lvdisplay |
删除vg
1 | vgdisplay |
删除pv
1 | pvdisplay |
这样原来的磁盘就可以用作其他用途了.
PVE 8.2.4 ISO安装, 由于同一台机器上其他的磁盘上原来已经安装了 PVE 7.4 所以安装过程中提示是否要rename到pve-OLD 而且不能跳过.
安装之后原来磁盘上的PVE会被保留, 但这也造成了我们没法把原来的磁盘用作其他用途 (Disk Manage会报错占用了, 没法Wipe Disk)
参考以下步骤删除掉 pve-OLD
删除lv
1 | lvdisplay |
删除vg
1 | vgdisplay |
删除pv
1 | pvdisplay |
这样原来的磁盘就可以用作其他用途了.
PVE 8.2.4 版本iso安装之后 syslog里一直报错:
1 | ... |
如果直接操作 ipset, iptables -vnL 命令会提示:
1 | ipset v7.10: Cannot open session to kernel. |
看起来是因为新版本启用了ebtables但是某些地方还是有问题, 没找到特别好的解决方案, 目前的解决办法是 Datacenter -> Firewall -> Options, 设置 ebtables 为 No. 重启后错误日志就消失了.
另外还有个奇怪的问题, 默认安装启用 ebtables 的情况下, CIFS mount会失败, 但是 dmesg 和 journalctl 里看不到错误. 目前也没有找到比较可靠的解决方案, 关闭 ebtables 之后正常了.
WebUI 上只有添加 Storage 的地方, 没有删除的方式, 需要手动进入Node Shell 进行删除
这里假设要删除的存储是 localssd
1 | systemctl status mnt-pve-localssd.mount |
1 | ls -al /mnt/pve/localssd |
1 | rm /etc/systemd/system/mnt-pve-localssd.mount |
1 | nano /etc/pve/storage.cfg |
找到localssd这一段并删除
1 | dir: localssd |
[SOLVED] Removing old Storage from GUI
Proper way to remove old kernels from PVE 8.0.4 & which are safe to remove
制作一个Ubuntu Desktop启动盘, 使用这个U盘启动系统
备份全盘内容
1 | dd if=/dev/nvme1n1 of=/mnt/download/diskbackup/diskc.raw bs=4M |
其中 of 参数指定的输出文件位置可以在网络上, 例如SMB共享. 需要提前通过类似这样的命令 mount
1 | sudo mkdir /mnt/download |
如果中间不小心中断了的话, 也可以重新引导进入Ubuntu Desktop, 使用如下命令继续备份
1 | dd if=/dev/nvme1n1 of=/mnt/download/diskbackup/diskc.raw bs=4M seek=123456789 skip=123456789 iflag=skip_bytes oflag=seek_bytes |
其中 123456789 是已经备份生成出来的文件的长度, 建议稍微减小一些数值, 比如已经备份了157GiB (168577466368), 那就可以选择 150GiB作为继续点 (161061273600)
skip_bytes, seek_bytes 表示skip和seek的数值是字节, 而不是bs的数量. 否则实际上跳过的字节会变成 123456789 * 4M. iflag, oflag不要写反了
1 | qemu-img convert -O qcow2 diskc.raw diskc.qcow2 |
因为源物理机是Windows系统, 此处按照Windows系统创建.
不挂载ISO, BIOS选择OVMF (UEFI), EFI Disk 正常创建即可.
把文件放到Proxmox指定路径下. 如果该路径在SMB上则需要保证磁盘文件的owner正确, 而且权限正确, 否则vm无法启动报错Permission denied (此处跟stackexchange上遇到的情况不太一样, 我只需要chown+chmod 644就可以让vm正常启动了)
虽然不知道是什么原因导致的, 但是可以通过在Grub下输入这些来引导windows. 其中 (hd0,gpt1) 是通过grub下 ls 命令得到的.
1 | insmod part_gpt |
Translating bash to python; “dd” command “iflag=skip_bytes” how can be converted?
Determine the size of a block device
Resuming a DD of an entire disk
How to output file from the specified offset, but not “dd bs=1 skip=N”?
2.4. Converting Between RAW and QCOW2
How to use QEMU/KVM virtual machine disk image on SMB/CIFS network share: Permission denied
只讨论Linux VM
在PVE界面上操作Clone之后, 检查一下网卡MAC是不是不一样. 老版本PVE似乎有bug, clone VM的时候会把mac也复制. IP一样没问题, 只要都是DHCP等下重启就可以了.
sudo vim /etc/hostname
sudo vim /etc/hosts
1 | echo -n | sudo tee /etc/machine-id |
1 | sudo rm -rf /etc/ssh/ssh_host* |
sudo reboot


此时还不能配置BGP对话, 需要先建立起连接才可以
安装 Strongswan (IPSec VPN)
1 | sudo apt install strongswan strongswan-pki |
配置ipsec, 配置文件路径 /etc/ipsec.conf
1 | config setup |
其中vti脚本内容如下, 路径 /var/lib/strongswan/ipsec-vti.sh (源自网络,见参考)
1 | #!/bin/bash |
注: 此处VTI也适用于Route-based/Policy-based IPSec, 对应的vti local ip 写自己的eth0网卡ip, remote ip写GCP的公网IP, 跟right=那个参数保持一致即可, 不使用脚本也可以通过命令手动操作:
1 | sudo ip tunnel add ipsec0 local <eth0 IP> remote <GCP IP> mode vti key 1 # 这里的key需要跟ipsec status里面提到的key一样. 也可以在配置ipsec隧道的时候加上key参数来指定. |
调整 charon 配置, 不要安装路由 (下一步由bird2配置具体的路由, 否则会像WireGuard一样安装一个0.0.0.0/0的路由) /etc/strongswan.d/vti.conf 这里其实有点像wg的Table=off
1 | charon { |
配置PSK, 编辑 /etc/ipsec.secrets. PSK最长可以有63个字符 (strongswan的限制, RFC标准比这个长)
1 | # This file holds shared secrets or RSA private keys for authentication. |
配置防火墙/端口转发(如有需要), ipsec使用: 500/udp,4500/udp,4510/udp,4511/udp
通过命令启动/关闭/查看ipsec隧道
启动: sudo ipsec start
关闭: sudo ipsec stop
查看状态 sudo ipsec statusall (也可以使用 sudo ipsec status)
看到ESTABLISHED字样就表明已经建立连接了 (这里只能看到一个因为写文章的时候已经开始回收测试环境了)
1 | Status of IKE charon daemon (strongSwan 5.9.5, Linux 5.15.0-107-generic, x86_64): |
创建高可用VPN, 本质是一个隧道组,要实现HA,最少需要 2 中的两个网卡每个网卡配置一条隧道到1,最多可以配置 n*m 个隧道


安装BIRD2 sudo apt install bird2
编写bird2配置 /etc/bird/bird.conf
1 | log syslog all; |
重加载bird配置 sudo birdc configure
查看bird协议状态 sudo birdc show protocol all
1 | BIRD 2.0.8 ready. |
没问题的话就能看到GCP推送过来的路由了 ip route
1 | ... |
How to set up a VPN between strongSwan and Cloud VPN
Using Strongswan to setup site to site IPsec VPN between GCP and Digital Ocean
Configuring Site-to-Site IPSec VPN on Ubuntu using Strongswan
Route-based VPN - strongswan Documentation
Figuring out how ipsec transforms work in Linux
Establish VPN tunnel for in-house machine to access GCP network
KB: Connecting OpenWRT/LEDE router to Azure Virtual Network Gateway (IKEv2)
Secure site-to-site connection with Linux IPsec VPN
Google Cloud HA VPN interoperability guide for AWS
How does IPsec VPN really work?
Google史一样的文档: Create two fully configured HA VPN gateways that connect to each other | Establish BGP sessions
GCP Networking: Part 2 Cloud Router
howto/Bird2 - dn42 虽然是dn42的教程但是非常管用
Multiple connections with longer than 64 byte PSK keys fail with “MAC mismatched”
不知道为啥缺氧没做这个功能, 创意工坊里也没有做这个的人, 只好自己写个脚本来做了. 特别感谢 @RoboPhred 提供的 oni-save-parser
1 | const { readFileSync, writeFileSync } = require("fs"); |
经手的一部分项目使用了rate.Limiter作为限流器, 但是使用了atomic.Value包裹. 猜测本意可能是为了多协程安全, 但实际上rate.Limiter本身就支持多协程访问. 最终导致了线上限流器行为与预期不符(大约超过限流2倍左右). 在更新限流器限流的时候, 应该使用 SetLimit 或 SetLimitAt 来更新限流配置.
1 | func main() { |
现象: Ctrl+Alt+M / 多显示器菜单切换无效, 选择新布局模式后屏闪并且仍然只使用一块显示器.
修复方式: 客户机打开服务: 停止 vm3dservice (VMware SVGA Helper Service) 将启动设置改为禁用即可.
VMware workstation pro 17 验证有效.
补充: 全屏模式下 Ctrl+Alt, Alt+Space, N 即可最小化当前正在运行的VM
Multi-monitor still broken, does anybody have a solution / workaround ?