Skip to content

PVE安装及配置

1、安装PVE

PVE是Proxmox VE的简称,是一个基于KVM和LXC的虚拟化平台,可以用来创建、管理和部署虚拟机。

1.1、下载安装包

访问 https://www.proxmox.com/en/downloads 下载PVE安装包。

1.2、安装PVE

按照提示一步一步安装即可。

2、Debian 软件源修改

2.1、添加pve-no-subscription

echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list

2.2、修改Debian软件源

sed -i 's|^deb http://ftp.debian.org|deb https://mirrors.ustc.edu.cn|g' /etc/apt/sources.list
sed -i 's|^deb http://security.debian.org|deb https://mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list

2.3、修改Ceph 仓库源

if [ -f /etc/apt/sources.list.d/ceph.list ]; then
  CEPH_CODENAME=`ceph -v | grep ceph | awk '{print $(NF-1)}'`
  source /etc/os-release
  echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-$CEPH_CODENAME $VERSION_CODENAME no-subscription" > /etc/apt/sources.list.d/ceph.list
fi

2.4、修改CT模板软件源

APLInfo.pm 文件属于 pve-manager 软件包,该软件包升级后,需要重新替换 URL。

sed -i.bak 's|http://download.proxmox.com|https://mirrors.ustc.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm
sed -i.bak 's|https://releases.turnkeylinux.org|https://mirrors.ustc.edu.cn/turnkeylinux/metadata|g' /usr/share/perl5/PVE/APLInfo.pm
systemctl restart pvedaemon
# 更新模板列表
pveam update

然而,TurnKey Linux 提供的 aplinfo.dat 中的 URL 不是相对路径,因此还需要修改其内容。

mkdir -p /etc/systemd/system/pve-daily-update.service.d/
cat > /etc/systemd/system/pve-daily-update.service.d/update-turnkey-releases.conf <<EOF
[Service]
ExecStopPost=/bin/sed -i 's|http://mirror.turnkeylinux.org|https://mirrors.ustc.edu.cn|' /var/lib/pve-manager/apl-info/releases.turnkeylinux.org
EOF
systemctl daemon-reload
systemctl start pve-daily-update.service

2.5、移除登陆后提示:无有效订阅

cp /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js.back

# 编辑proxmoxlib.js文件,搜索/nodes/localhost/subscription,修改本方法内容
Proxmox.Utils.API2Request({
    url: '/nodes/localhost/subscription',
    method: 'GET',
    failure: function(response, opts) {
        Ext.Msg.alert(gettext('Error'), response.htmlStatus);
    },
    success: function(response, opts) {
        let res = response.result;
        res.data.status = 'active';
        if (res === null || res === undefined || !res || res.data.status.toLowerCase() !== 'active') {
            Ext.Msg.show({
                title: gettext('No valid subscription'),
                icon: Ext.Msg.WARNING,
                message: Proxmox.Utils.getNoSubKeyHtml(res.data.url),
                buttons: Ext.Msg.OK,
                callback: function(btn) {
                    if (btn !== 'ok') {
                        return;
                    }
                    orig_cmd();
                },
            });
        } else {
            orig_cmd();
        }
    }
});