标签归档:PVE

ProxmoxVE (PVE) NAT 网络配置方法

伪装允许只有私有 IP 地址的访客使用主机 IP 地址来访问网络,以处理传出流量。每个传出数据包都会被重写 iptables ,使其看起来来自主机,响应也会相应地被重写以路由到原始发件人。

auto lo
iface lo inet loopback

auto eno1
#real IP address
iface eno1 inet static
        address  198.51.100.5/24
        gateway  198.51.100.1

auto vmbr1
#private sub network
iface vmbr0 inet static
        address  10.10.10.1/24
        bridge-ports none
        bridge-stp off
        bridge-fd 0

        post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up   iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE
        post-up   iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
        post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1

其中 vmbr1 为 NAT 网桥,网桥 IP 为 10.10.10.0/24 ,该网段流量会被转换为 eno1 网卡的 IP 发出,并在收到回复保温时转换为原始 IP,实现共享外部 IP 的目标。

重载网络配置使其生效:

ifreload -a

实测立刻可以生效,VM 中配置该段 IP 并将 10.10.10.1 作为网关即可,也可根据需要配置 dnsmasq 之类的实现 DHCP 自动分配 IP。

References

解决 PVE 报错 rbd error list images

针对下列报错:

    2021-05-26 11:06:11 ERROR: Failed to sync data - rbd error: rbd: listing images failed: (2) No such file or directory

解决方法

进入命令行,执行

# 查看 rbd 清单
rbd ls -l <cephpool-name>
# 例如:
rbd ls -l data

# 使用命令删除错误磁盘镜像
rbd rm <img-name> -p <cephpool-name>

# 例如
rbd rm vm-111-disk-0 -p data

References

#ProxmoxVE #Ceph

PVE 批量销毁虚拟机

可以使用以下命令一次性删除所有 QEMU 虚拟机:

串行

qm list | awk 'NR>1 {print $1}' | xargs -I {} qm destroy {}

解释:

  • qm list 命令获取所有虚拟机的列表。
  • awk 'NR>1 {print $1}' 命令跳过第一行(表头)并提取 VMID 列。
  • xargs -I {} qm destroy {} 命令将每个 VMID 作为参数传递给 qm destroy 命令,从而删除每个虚拟机。

注意:此命令会删除所有虚拟机,请确保在执行前已进行适当备份和确认。

并行

您可以使用以下命令并行地删除所有 QEMU 虚拟机:

qm list | awk 'NR>1 {print $1}' | xargs -P 0 -I {} sh -c 'qm destroy {} || true'

解释:

  • qm list 命令获取所有虚拟机的列表。
  • awk 'NR>1 {print $1}' 命令跳过第一行(表头)并提取 VMID 列。
  • xargs -P 0 -I {} sh -c 'qm destroy {} || true' 命令将每个 VMID 作为参数传递给 qm destroy 命令,从而删除每个虚拟机。 -P 0 选项告诉 xargs 并行运行尽可能多的进程。如果 qm destroy 命令失败, || true 确保退出状态为 ,因此其他删除操作仍然会继续。

注意:此命令会删除所有虚拟机,请确保在执行前已进行适当备份和确认。

PVE 删除/离开集群

删除节点

用于从集群中删除无效节点。

cd /etc/pve/nodes
rm -rf <YOUR DELETE NODE NAME>
pvecm delnode <YOUR DELETE NODE NAME>

离开集群

用户节点离开集群。


# 离线的节点操作
systemctl stop pve-cluster.service
systemctl stop corosync.service
pmxcfs -l
rm /etc/pve/corosync.conf
rm -rf /etc/corosync/*
killall pmxcfs
systemctl start pve-cluster.service
cd /etc/pve/nodes
ls
rm -rf /etc/pve/nodes/<YOUR DELETE NODE NAME>
pvecm delnode <YOUR DELETE NODE NAME>

正常的节点操作:

cd /etc/pve/nodes rm -rf pvecm delnode



## Reference

* [PVE Proxmox Virtual Environment 学习笔记(五)集群节点故障](https://www.cnblogs.com/jackadam/p/15763362.html)

PVE 批量创建、配置虚拟机 IP、网卡、启停及销毁

# 从模版批量派生,100 虚拟机仅需2 min
for i in {001..128}; do qm clone 336 11$i --name stl-ceph-bare-node$i --pool stl-ceph-cluster2; done

# 使用 cloud-init 批量配置 ip,需在模版提前装好 cloud-init 软件包并添加设备
for i in {1..128}; do num=`echo $i | awk '{printf("%03d",$0)}'`; qm set 10${num}  --ipconfig1 ip=10.24.88.$i/24,gw=10.24.88.254; done

# 批量断开网络接口
for i in {002..128}; do qm set 10$i --net0 virtio,link_down=1; done

# 批量开机
for i in {001..128}; do qm start 10$i; done

# 批量销毁
for i in {001..111}; do qm destroy 10$i; done

PVE 虚拟机导入 vmdk 磁盘

  1. 先把磁盘镜像上传到 pve 服务器中,若空间不足可挂载本地存储;
  2. vmdk 转为 qcow2
qemu-img convert -O qcow2 test.vmdk test.qcow2

注:-O 是大写的字母 O

  1. 使用 qm importdisk 命令导入
$ qm importdisk  
<vmid> <images-name> <storage pool>  --format=<disk-fs> 

# vmid:vm的id 例如102
# images-name:磁盘镜像的名字
# storage poll: 存储磁盘镜像的位置,一般写存储的名称,如pve01data
# disk-fs: 磁盘镜像格式  raw/vmdk/qcow2

参考文献

Proxmox VE (PVE) 销毁集群

当 pve 集群某节点出现问题时,可能导致所有主机均无法连接到 WEB 管理后台,此时可以尝试以下方法将正常节点的集群状态销毁,在需要时重建集群,从而保证仍在线节点可用:

systemctl stop pve-cluster corosync
pmxcfs -l
rm /etc/corosync/*
rm /etc/pve/corosync.conf
killall pmxcfs
systemctl start pve-cluster

参考文献

更换 PVE7 软件仓库源和 CT模板(LXC)源为国内源

PVE7 安装后默认配置的 apt 软件源和 CT(LXC)容器模板源均是官方默认的,国内使用性能不佳,建议替换为 清华 Tuna 提供的国内镜像源,速度将有一个较大的提升。

如果 pve 官网 iso 镜像下载较慢,也可在 tuna 提供的镜像站下载:https://mirrors.tuna.tsinghua.edu.cn/proxmox/iso/

注:本文以 pve 7.0.2 (debian 11 bulleye) 为例,其他版本请自行在镜像网站寻找对应地址。

替换 apt 软件源

替换前建议先更新下证书,否则可能由于证书不可用导致 https 无法使用,进而无法下载所有软件。

$ sudo apt install apt-transport-https ca-certificates

首先替换通用软件源, Debian 的软件源配置文件是 /etc/apt/sources.list,备份后将其中内容修改为以下即可。

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free

deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free

之后替换 pve 软件源,pve 镜像默认的 pve 软件源配置文件是 /etc/apt/sources.list.d/pve-enterprise.list ,备份后将其中内容替换为以下即可:

deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian bullseye pve-no-subscription

最后更新下,速度很快:

sudo apt-get update

修改 CT Templates (LXC容器)源

将 /usr/share/perl5/PVE/APLInfo.pm 文件中默认的源地址 http://download.proxmox.com 替换为 https://mirrors.tuna.tsinghua.edu.cn/proxmox 即可。

可以使用如下命令修改:

cp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm_back
sed -i 's|http://download.proxmox.com|https://mirrors.tuna.tsinghua.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm

针对 /usr/share/perl5/PVE/APLInfo.pm 文件的修改,重启后生效。

systemctl restart pvedaemon.service

之后在 pve 网页端下载 CT Templates 速度就很快了。

参考文献

perl ‘->’ 和 ‘::’ 的区别 | 方法和函数的区别

最近在看 PVE 源码时看到这样一段:

# old code uses PVE::RPCEnvironment::get(); 使用冒号表示调用函数
# new code should use PVE::RPCEnvironment->get(); 使用箭头表示法调用方法
sub get {
    return PVE::RESTEnvironment->get();
}

好奇两种调用方式是什么区别,经过研究,我在这篇文章1找到答案,两者差异在于:

  • 使用 冒号 表示 调用函数
  • 使用 箭头 表示 调用方法

以下是引用翻译:

我们知道在 Perl 中,Function 和 Subroutine 这两个名称是可以互换的。但是函数和方法的区别到底是什么呢?

表面上没有什么不同。它们都是使用 sub 关键字声明的。差异主要在于它们的使用方式。

总是使用箭头表示法调用方法。对象: $p->do_something($value) 或类: Class::Name->new

函数总是直接调用: 使用它的完全限定名: Module::Name::func_something($param) ,或者,如果函数是当前名称空间的一部分,则使用短名: func_something($param)

如果在调用它的对象的类中找不到方法, Perl 将转到父类并在那里寻找具有相同名称的方法。它将使用其内置的方法解析算法递归地执行它。如果根本找不到该方法,则它将放弃(或调用 AUTOLOAD )。另一方面, Perl 将只在单个位置查找函数(如果可用,则为 AUTOLOAD )。

方法总是将当前对象(或类名)作为其调用的第一个参数。函数永远不会得到对象。(除非您手动将其作为参数传递。)因此,方法通常作用于实例(对象) ,有时作用于整个类(然后我们称之为 class-method )。另一方面,函数从不作用于对象。尽管它可能会对班级产生影响。