准备工作

需要虚拟化出服务器,你需要:
  1. 一台可以连接公网的服务器( VPS 或 Dedicated Server),最好能完美访问 Github 的 RAW 页面,部分项目部分组件可能未使用 CDN 加速

TIP

如果您位于中国大陆,访问 Github 有困难,请注意配套脚本和项目是否有说明已使用 CDN 加速
  1. 本地可以稳定连接SSH,如果不能稳定连接,请使用screen命令创建窗口后,在窗口内执行命令

TIP

不会用screen命令的,自行查找相关教程学习
  1. 确保服务器的系统和硬件满足对应项目的要求,详见对应项目说明
本文档将以VPS作为范例,且该VPS纯净,无原生环境问题,如有必要请重装系统保证初始环境的纯净

WARNING

PVE项目可能造成宿主机出现问题,如果你不会看Bug和修复系统,那么不建议你在生产环境中使用,使用PVE相关脚本请确保宿主机随时可重装系统

各种要求

建议debian在使用前尽量使用最新的稳定版本的系统 非debian11可使用 debian一键升级 来升级系统 本项目只适配Debian系统(非Debian无法通过APT源安装,官方只给了Debian的镜像,其他系统只能使用ISO安装)
  • 系统要求:Debian 8+

TIP

建议debian11而不是debian12,因为后者是beta版本,debian11安装的才是稳定版
  • 硬件要求:2核2G内存x86_64arm架构服务器硬盘至少20G
  • 可开KVM的硬件要求:VM-X或AMD-V支持 (部分VPS和全部独服支持)
  • 如果硬件或系统需求不满足,可使用LXD批量开LXC容器跳转

WARNING

内存开点swap免得机器炸了开SWAP点我跳转
开设虚拟内存(SWAP) 国际
curl -L https://raw.githubusercontent.com/spiritLHLS/addswap/main/addswap.sh -o addswap.sh && chmod +x addswap.sh && bash addswap.sh
国内
shell
curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/addswap/main/addswap.sh -o addswap.sh && chmod +x addswap.sh && bash addswap.sh
遇到选项不会选的可无脑回车安装,本项目所有脚本内置国内外IP自动判断,使用的是不同的安装源与配置文件,有使用CDN加速镜像下载

检测环境

  • 本项目相关脚本执行前务必执行本脚本检测环境,如果不符合安装PVE的要求则无法使用后续的脚本
  • 检测硬件配置是否满足最低要求
  • 检测硬件环境是否可嵌套虚拟化KVM类型的服务器
  • 检测系统环境是否可嵌套虚拟化KVM类型的服务器
  • 不可嵌套虚拟化KVM类型的服务器也可以开LXC虚拟化的服务器,但不推荐安装PVE,不如使用LXD
国际
 
bash <(wget -qO- --no-check-certificate https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/check_kernal.sh)
国内
 
bash <(wget -qO- --no-check-certificate https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/check_kernal.sh)

PVE主体安装

一键安装PVE

TIP

建议debian11而不是debian12,因为后者虽然是stable版本但不知道是否有未发现的BUG,debian11安装的目前稳定点
  • 安装的是当下apt源最新的PVE
  • 比如debian10则是pve6.4,debian11则是pve7.x,debian12则是pve8.x
  • /etc/hosts文件修改(修正商家hostname设置错误以及新增PVE所需的内容)
  • 已设置/etc/hosts为只读模式,避免重启后文件被覆写,如需修改请使用chattr -i /etc/hosts取消只读锁定,修改完毕请执行chattr +i /etc/hosts只读锁定
  • 检测/etc/cloud/cloud.cfg如果发现preserve_hostnamefalse,则改为true,同上,也用chattr命令进行了文件锁定避免重启覆盖设置
  • 检测是否为中国IP,如果为中国IP使用清华镜像源,否则使用官方源,同时处理apt的源和对应的nameserver,避免断网
  • 安装PVE开虚拟机需要的必备工具包
  • x86_64的替换apt源中的企业订阅为社区源,arm的使用第三方修复的补丁构建的源
  • 打印查询Linux系统内核和PVE内核是否已安装
  • 检测/etc/resolv.conf是否为空,为空则设置检测8.8.8.8的开机自启添加DNS的systemd服务
  • 新增PVE的APT源链接后,下载PVE并打印输出登陆信息
国际
shell
curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/install_pve.sh -o install_pve.sh && chmod +x install_pve.sh && bash install_pve.sh
国内
shell
curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/install_pve.sh -o install_pve.sh && chmod +x install_pve.sh && bash install_pve.sh
shell
bash install_pve.sh

TIP

安装成功后打开网页可能提示不安全,点击高级或更多选项,坚持访问即可

预配置环境

  • 创建资源池mypool
  • 移除订阅弹窗
  • 尝试开启硬件直通
  • 对AppArmor模块检测和自动安装
  • 重启系统前推荐挂上nezha探针方便在后台不通过SSH使用命令行,避免SSH可能因为商家奇葩的预设导致重启后root密码丢失
  • 执行完毕建议等待一分钟后再重启服务器
  • 执行reboot前需要等待后台任务执行完毕,一些宿主机的系统apt命令执行很慢,得等一会才能执行完毕,当然大部分的机器没这么烂
国际
shell
bash <(wget -qO- --no-check-certificate https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/build_backend.sh)
国内
shell
bash <(wget -qO- --no-check-certificate https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/build_backend.sh)

自动配置宿主机的网关

WARNING

使用前请保证重启过服务器且此时PVE能正常使用WEB端再执行,重启机器后不要立即执行此命令,待WEB端启动成功后至少等5分钟再执行本命令

TIP

这一步是最容易造成SSH断开的,原因是未等待PVE内核启动就修改网络会造成设置冲突,所以至少等几分钟待内核启动也就是WEB端启动成功后再执行
  • 创建vmbr0(独立IP网关),宿主机允许addr和gateway为内网IP或外网IP,已自动识别
  • vmbr0创建支持纯IPV4或双栈服务器,自动识别IPV4地址和IPV6地址,自动识别对应的IP区间
  • 开独立IPV4的虚拟机时使用vmbr0,使用同宿主机一致的gateway,使用宿主机未绑定的IPV4地址做IPV4/CIDR,当然如果后续使用本套脚本无需关注这点细枝末节的东西
  • 创建vmbr1(NAT网关),暂不支持开设带独立IPV6地址的NAT的IPV4虚拟机
  • 开NAT虚拟机时使用vmbr1,gateway使用172.16.1.1,IPV4/CIDR使用172.16.1.x/24,这里的x不能是1,当然如果后续使用本套脚本无需关注这点细枝末节的东西
  • 想查看完整设置可以执行cat /etc/network/interfaces查看,如需修改网关需要修改该文件,web端已经无法修改
  • 加载iptables并设置回源且允许NAT端口转发
国际
shell
bash <(wget -qO- --no-check-certificate https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/build_nat_network.sh)
国内
shell
bash <(wget -qO- --no-check-certificate https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/build_nat_network.sh)

TIP

这一步是可能需要你执行成功几分钟后重启系统,详见脚本最后执行完毕的提示

KVM虚拟化

SSH登录说明

KVM虚拟化开设出的虚拟机,默认生成的用户名不是root,你需要执行sudo -i切换为root用户 当然部分模板实际支持用户名root登录,默认的root密码是password,你也可以先试试 登录SSH切换为root权限后,一定要修改root密码,可以使用以下命令修改 国际
bash
bash <(curl -sSL https://raw.githubusercontent.com/fscarmen/tools/main/root.sh) [PASSWORD]
国内
bash
bash <(curl -sSL https://ghproxy.com/https://raw.githubusercontent.com/fscarmen/tools/main/root.sh) [PASSWORD]

部分注意事项

执行本项目的第一个检测环境的命令,展示如下 图片 查询如上的只需使用下面的一键脚本自动创建虚拟机即可,无需手动再修改WEB端设置 图片 查询如上的在使用后续脚本创建了虚拟机后,可能需要手动修改WEB端设置,需要关闭对应每个虚拟机的硬件嵌套虚拟化,如下图 图片 先停止虚拟机再修改,修改完后再开机才能使用NOVNC,不关闭可能导致这个虚拟机有BUG无法使用 如果强行安装PVE开KVM,启动不了的也可以关闭这个选项试试能不能启动虚拟机

开设KVM虚拟机可使用的镜像

  • 已预安装开启cloudinit
  • 开启SSH登陆
  • 预设置SSH监听V4和V6的22端口
  • 开启允许密码验证登陆
  • 开启允许root登陆
  • 部分预安装Qemu-guest-agent
目前可使用的镜像名字的列表为 https://github.com/oneclickvirt/kvm_images/blob/main/list.text

单独开设NAT的KVM虚拟化的VM

  • 自动开设NAT服务器,默认使用Debian10镜像,因为该镜像占用最小
  • 可在命令中自定义需要使用的镜像,这里有给出配置好的镜像,镜像自带空间设置是2~10G硬盘,日常使用至少10G以上即可,除非某些镜像开不起来再增加硬盘大小
  • 可在命令中指定存储盘位置,默认不指定时为local盘即系统盘,可指定为PVE中显示的挂载盘
  • 自定义内存大小推荐512MB内存
  • 自动进行内外网端口映射,含22,80,443端口以及其他25个内外网端口号一样的端口
  • 生成后需要等待一段时间虚拟机内部的cloud-init配置好网络以及登陆信息,大概需要5分钟
  • 虚拟机的相关信息将会存储到WEB端对应VM的NOTES中,可在WEB端查看
国际
shell
curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm.sh -o buildvm.sh && chmod +x buildvm.sh
国内
shell
curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm.sh -o buildvm.sh && chmod +x buildvm.sh

使用方法

  • 系统支持:
    • x86_64架构的详见 跳转 中列出的系统,使用时只需写文件名字,不需要.qcow2尾缀
    • arm架构的详见 跳转 中列出的系统,使用时只需要写系统名字+系统版本号,如ubuntu20、ubutnu22这种

TIP

注意这里的用户名不能是纯数字,会造成cloudinit出问题,最好是纯英文或英文开头
shell
./buildvm.sh VMID 用户名 密码 CPU核数 内存 硬盘 SSH端口 80端口 443端口 外网端口起 外网端口止 系统 存储盘

测试示例

shell
./buildvm.sh 102 test1 1234567 1 512 10 40001 40002 40003 50000 50025 debian11 local
开设完毕可执行cat vm102查看信息,或到WEB端对应VM的NOTES中查看
  • 以下为开设的示例VM的信息:
 
`VMID` - 102
`SSH登录的用户名` - test1
`SSH登录的密码` - 1234567
`CPU核数` - 1   
`内存大小` - 512MB
`磁盘大小` - 10G   
`SSH端口` - 40001
`80端口` - 40002
`443端口` - 40003
`内外网映射端口一致的区间` - 50000到50025
`系统` - debian11
`宿主机的存储盘` - local

删除示例

  • 停止VM
  • 删除VM
  • 删除端口映射
  • 重启网络
  • 删除log文件
shell
qm stop 102
qm destroy 102
iptables -t nat -F
iptables -t filter -F
service networking restart
systemctl restart networking.service
rm -rf vm102

批量开设NAT的KVM虚拟化的VM

WARNING

初次使用前需要保证当前PVE纯净且宿主机未进行过任何端口映射,否则设置冲突可能出现BUG

TIP

开设前请使用screen挂起执行,避免批量开设时间过长,SSH不稳定导致中间执行中断
  • 可多次运行批量生成VM
  • 自动开设NAT服务器,选项留空默认使用debian11镜像,可自定义使用镜像名字,支持的系统名字详见上文支持的镜像列表
  • 自动进行内外网端口映射,含22,80,443端口以及其他25个内外网端口号一样的端口
  • 生成后需要等待一段时间虚拟机内部的cloudinit配置好网络以及登陆信息,大概需要5分钟,每个虚拟机创建之间有间隔等待60秒避免突发性能不足
  • 默认批量开设的虚拟机网络配置为:22,80,443端口及一个25个端口区间的内外网映射
  • 可自定义批量开设的核心数,内存大小,硬盘大小,使用宿主机哪个存储盘,记得自己计算好空闲资源开设
  • 虚拟机的相关信息将会存储到WEB端对应VM的NOTES中,可在WEB端查看
国际
shell
curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/create_vm.sh -o create_vm.sh && chmod +x create_vm.sh && bash create_vm.sh
国内
shell
curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/create_vm.sh -o create_vm.sh && chmod +x create_vm.sh && bash create_vm.sh
开设完毕可执行cat vmlog查看信息,或到WEB端对应VM的NOTES中查看

删除所有VM

  • 删除所有VM
  • 删除所有nat的端口映射
  • 重启网络
  • 删除log文件
shell
for vmid in $(qm list | awk '{if(NR>1) print $1}'); do qm stop $vmid; qm destroy $vmid; rm -rf /var/lib/vz/images/$vmid*; done
iptables -t nat -F
iptables -t filter -F
service networking restart
systemctl restart networking.service
rm -rf vmlog

TIP

PVE修改VM配置前都得停机先,再修改配置,修改完再启动,免得出现配置重载错误

开设独立IPV4地址的VM

两个版本,各取所需

自动选择IPV4地址无需手动指定的版本

WARNING

使用前需要保证当前宿主机的IP段带了至少2个IP,且有空余的IP未配置,该空余的IP未绑定宿主机

TIP

开设前请使用screen挂起执行,避免开设时间过长,SSH不稳定导致中间执行中断
  • 自动检测可用的IP区间,通过ping检测空余可使用的IP,选取其中之一绑定到虚拟机上
  • 系统的相关信息将会存储到对应的虚拟机的NOTE中,可在WEB端查看
国际
shell
curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm_extraip.sh -o buildvm_extraip.sh && chmod +x buildvm_extraip.sh
国内
shell
curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm_extraip.sh -o buildvm_extraip.sh && chmod +x buildvm_extraip.sh

创建示例

shell
./buildvm_extraip.sh VMID 用户名 密码 CPU核数 内存大小以MB计算 硬盘大小以GB计算 系统 存储盘
shell
./buildvm_extraip.sh 152 test1 1234567 1 1024 10 ubuntu20 local
上述命令意义为开设一个带独立IPV4地址的虚拟机,VMID是152,用户名是test1,密码是1234567,CPU是1核,内存是1024MB,硬盘是10G,系统是Ubuntu20,存储盘是local盘也就是系统盘

需要手动指定IPV4地址的版本

TIP

开设前请使用screen挂起执行,避免开设时间过长,SSH不稳定导致中间执行中断
  • 需要手动在命令中指定IPV4地址,且带上子网长度
  • 如果商家有给IPV4地址和子网长度,请仔细比对,按照下面示例的命令写参数
  • 系统的相关信息将会存储到对应的虚拟机的NOTE中,可在WEB端查看
国际
shell
curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm_manual_ip.sh -o buildvm_manual_ip.sh && chmod +x buildvm_manual_ip.sh
国内
shell
curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm_manual_ip.sh -o buildvm_manual_ip.sh && chmod +x buildvm_manual_ip.sh

创建示例

shell
./buildvm_manual_ip.sh VMID 用户名 密码 CPU核数 内存大小以MB计算 硬盘大小以GB计算 系统 存储盘 IPV4地址
shell
./buildvm_manual_ip.sh 152 test1 1234567 1 1024 10 ubuntu20 local a.b.c.d/24
上述命令意义为开设一个带独立IPV4地址的虚拟机,VMID是152,用户名是test1,密码是1234567,CPU是1核,内存是1024MB,硬盘是10G,系统是Ubuntu20,存储盘是local盘也就是系统盘,IPV4地址为a.b.c.d,子网为/24子网

删除示例

shell
qm stop 152
qm destroy 152
rm -rf vm152

LXC虚拟化

单独开设LXC虚拟化的CT

WARNING

初次使用前需要保证当前PVE纯净且宿主机未进行过任何端口映射,否则设置冲突可能出现BUG

TIP

开设前请使用screen挂起执行,避免批量开设时间过长,SSH不稳定导致中间执行中断
  • 自动开设NAT服务器,默认使用Debian11镜像,也可自定义系统
  • 自动进行内外网端口映射,含22,80,443端口以及其他25个内外网端口号一样的端口
  • 生成后需要等待一段时间虚拟机内部配置好网络以及登陆信息,大概需要3分钟
  • 默认开设的网络配置为:22,80,443端口及一个25个端口区间的内外网映射
  • 可自定义开设的核心数,内存大小,硬盘大小,使用宿主机哪个存储盘,记得自己计算好空闲资源开设
  • 可在命令中指定存储盘位置,默认不指定时为local盘即系统盘,可指定为PVE中显示的挂载盘
  • 开设的CT默认已启用SSH且允许root登陆,且已设置支持使用docker的嵌套虚拟化
  • 容器的相关信息将会存储到对应的容器的NOTE中,可在WEB端查看
国际
shell
curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildct.sh -o buildct.sh && chmod +x buildct.sh
国内
shell
curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildct.sh -o buildct.sh && chmod +x buildct.sh

使用方法

  • 系统支持:
  • debian10,debian11
  • ubuntu18,ubuntu20,ubuntu22
  • centos8,almalinux9
  • 其他系统可能支持可能不支持,自行测试

TIP

系统参数一律是小写的系统名字拼接版本号,x86_64的具体可执行pveam available --section system查看可用的系统名字和版本号,arm的可在https://mirror.tuna.tsinghua.edu.cn/lxc-images/images/中查看支持的系统,版本号类同执行pveam available --section system查看到的版本号。 (注意脚本使用的参数只有小写的英文系统名字拼接版本号)
所有系统的CT默认用户名是root
shell
./buildct.sh CTID 密码 CPU核数 内存 硬盘 SSH端口 80端口 443端口 外网端口起 外网端口止 系统 存储盘

测试示例

shell
./buildct.sh 102 1234567 1 512 5 20001 20002 20003 30000 30025 debian11 local
开设完毕可执行cat ct102查看信息,或在web端的NOTES查看
  • 以下为开设的示例CT的信息:
 
`VMID` - 102
`SSH登录的用户名` - root
`SSH登录的密码` - 1234567
`CPU核数` - 1   
`内存大小` - 512MB
`磁盘大小` - 5G   
`SSH端口` - 20001
`80端口` - 20002
`443端口` - 20003
`内外网映射端口一致的区间` - 30000到30025
`系统` - debian11
`宿主机的存储盘` - local

删除示例

  • 停止CT
  • 删除CT
  • 删除端口映射
  • 重启网络
  • 删除log文件
shell
pct stop 102
pct destroy 102
rm -rf ct102
iptables -t nat -F
iptables -t filter -F
service networking restart
systemctl restart networking.service

批量开设NAT的LXC虚拟化的CT

WARNING

初次使用前需要保证当前PVE纯净且宿主机未进行过任何端口映射,否则设置冲突可能出现BUG

TIP

开设前请使用screen挂起执行,避免批量开设时间过长,SSH不稳定导致中间执行中断
  • 可多次运行批量生成CT容器,但需要注意的是母鸡内存记得开点swap免得机器炸了开SWAP点我跳转
  • 每个容器创建之间有间隔等待60秒避免突发性能不足
  • 可自定义批量开设的核心数,内存大小,硬盘大小,使用宿主机哪个存储盘,记得自己计算好空闲资源开设
  • 开设的CT默认已启用SSH且允许root登陆,且已设置支持使用docker的嵌套虚拟化
  • 容器的相关信息将会存储到对应的容器的NOTE中,可在WEB端查看
国际
shell
curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/create_ct.sh -o create_ct.sh && chmod +x create_ct.sh && bash create_ct.sh
国内
shell
curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/create_ct.sh -o create_ct.sh && chmod +x create_ct.sh && bash create_ct.sh
开设完毕可执行cat ctlog查看信息,或在web端的NOTES查看

删除所有CT

  • 删除所有CT
  • 删除所有nat的端口映射
  • 重启网络
  • 删除log文件
shell
pct list | awk 'NR>1{print $1}' | xargs -I {} sh -c 'pct stop {}; pct destroy {}'
rm -rf ct*
iptables -t nat -F
iptables -t filter -F
service networking restart
systemctl restart networking.service

常见问题解决

安装PVE成功但重启后失联

如果什么机器安装PVE成功后WEB可用,但重启失联,请安装成功PVE后,重启前执行以下命令再重启
bash
auto_interface=$(grep '^auto ' /etc/network/interfaces | grep -v '^auto lo' | awk '{print $2}' | head -n 1)
if ! grep -q "^post-up /sbin/ethtool" /etc/network/interfaces; then
    chattr -i /etc/network/interfaces
    echo "post-up /sbin/ethtool -K $auto_interface tx off rx off" >> /etc/network/interfaces
    chattr +i /etc/network/interfaces
fi
然后将重启失联的机器报给 @spiritlhl_bot 待更新脚本自动修复

安装PVE失败

如果有什么机器安装不了,着急的可以尝试使用以下仓库的脚本先重装为debian11先
bash <(curl -sSL https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh) -debian 11 -pwd 'oneclickvirt139'
此时dd后的系统用户名为root,密码为oneclickvirt139