准备工作
需要虚拟化出服务器,你需要:- 一台可以连接公网的服务器( VPS 或 Dedicated Server),最好能完美访问 Github 的 RAW 页面,部分项目部分组件可能未使用 CDN 加速
TIP
如果您位于中国大陆,访问 Github 有困难,请注意配套脚本和项目是否有说明已使用 CDN 加速- 本地可以稳定连接SSH,如果不能稳定连接,请使用
screen
命令创建窗口后,在窗口内执行命令
TIP
不会用screen命令的,自行查找相关教程学习- 确保服务器的系统和硬件满足对应项目的要求,详见对应项目说明
WARNING
PVE项目可能造成宿主机出现问题,如果你不会看Bug和修复系统,那么不建议你在生产环境中使用,使用PVE相关脚本请确保宿主机随时可重装系统各种要求
建议debian在使用前尽量使用最新的稳定版本的系统 非debian11可使用 debian一键升级 来升级系统 本项目只适配Debian系统(非Debian无法通过APT源安装,官方只给了Debian的镜像,其他系统只能使用ISO安装)- 系统要求:Debian 8+
TIP
建议debian11而不是debian12,因为后者是beta版本,debian11安装的才是稳定版- 硬件要求:2核2G内存
x86_64
或arm
架构服务器硬盘至少20G - 可开KVM的硬件要求:VM-X或AMD-V支持 (部分VPS和全部独服支持)
- 如果硬件或系统需求不满足,可使用LXD批量开LXC容器跳转
WARNING
内存开点swap免得机器炸了开SWAP点我跳转curl -L https://raw.githubusercontent.com/spiritLHLS/addswap/main/addswap.sh -o addswap.sh && chmod +x addswap.sh && bash addswap.sh
shell
遇到选项不会选的可无脑回车安装,本项目所有脚本内置国内外IP自动判断,使用的是不同的安装源与配置文件,有使用CDN加速镜像下载
curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/addswap/main/addswap.sh -o addswap.sh && chmod +x addswap.sh && bash addswap.sh
检测环境
- 本项目相关脚本执行前务必执行本脚本检测环境,如果不符合安装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_hostname
是false
,则改为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]
部分注意事项
执行本项目的第一个检测环境的命令,展示如下


开设KVM虚拟机可使用的镜像
- 已预安装开启cloudinit
- 开启SSH登陆
- 预设置SSH监听V4和V6的22端口
- 开启允许密码验证登陆
- 开启允许root登陆
- 部分预安装Qemu-guest-agent
单独开设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
使用方法
- 系统支持:
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纯净且宿主机未进行过任何端口映射,否则设置冲突可能出现BUGTIP
开设前请使用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
上述命令意义为开设一个带独立IPV4地址的虚拟机,VMID是152,用户名是./buildvm_extraip.sh 152 test1 1234567 1 1024 10 ubuntu20 local
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
上述命令意义为开设一个带独立IPV4地址的虚拟机,VMID是152,用户名是./buildvm_manual_ip.sh 152 test1 1234567 1 1024 10 ubuntu20 local a.b.c.d/24
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
此时dd后的系统用户名为
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
然后将重启失联的机器报给 @spiritlhl_bot 待更新脚本自动修复
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
安装PVE失败
如果有什么机器安装不了,着急的可以尝试使用以下仓库的脚本先重装为debian11先bash <(curl -sSL https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh) -debian 11 -pwd 'oneclickvirt139'
root
,密码为oneclickvirt139
评论