Anye
Anye
发布于 2025-06-19 / 52 阅读
0
0

在线重装 Proxmox VE

前言

重装了一下服务器的系统,博客炸了三天,还被人发现了😓,真成事故了。还是提前实验实操过的,刷机需谨慎啊!😧

本文将详细讲述如何在无法连接服务器 IPMI 的情况下,仅通过 VNC 和 SSH 完成在线重装 Proxmox VE。

⚠️ 操作警告

重装过程中务必确保网络连接稳定,避免因断网导致系统损坏。

建议提前备份重要数据,以防意外丢失。

操作前请确认已掌握基本的 Linux 命令行操作技能。

正文开始

自托管 Netboot.xyz(境外服务器可跳过此步骤)

简介

https://github.com/netbootxyz/netboot.xyz

Netboot.xyz 是一个开源的网络引导工具,允许用户通过网络启动各种操作系统安装程序或实用工具。它整合了多个发行版的网络安装镜像,无需下载完整的ISO文件即可进行系统安装。主要特点包括:

  • 支持主流Linux发行版(如Ubuntu、Debian、CentOS等)

  • 可通过PXE或iPXE启动

  • 支持自定义启动菜单

但是由于 Netboot.xyz 官方是托管在 GitHub 上的,国内访问可能较慢或不稳定,所以本次重装选择了自托管 Netboot.xyz 用于加载镜像。

自托管

可以选择在自己别的服务器上部署,我这里选择使用 https://cnb.cool 的云开发环境。

直接在终端里运行 Docker Cli 启动:

docker run -d \
  --name=netbootxyz \
  -e NGINX_PORT=80          `# 托管资产的 NGINX 服务器端口` \
  -e WEB_APP_PORT=3000      `# Web 配置界面端口`\
  -p 3000:3000 \
  -p 80:80 \
  -v ./config:/config       `# 配置文件` \
  -v ./assets:/assets       `# 资产文件` \
  --restart unless-stopped \
  ghcr.io/netbootxyz/netbootxyz

启动后添加端口转发 803000

托管静态文件

进入管理面板(3000 端口映射的页面):

切换到 Local Assets 选项卡,搜索 proxmox-ve,点击 Select All,进行 Pull Selected

修改配置

切换到 Menus 选项卡,点击修改 boot.cfg 文件:

  • 第 8 行:set boot_domain boot.netboot.xyz/2.0.87 改为 aj5ceuh2p9-80.cnb.run/menus (前面的域名为映射 80 端口的域名)

  • 第 14 行:isset ${live_endpoint} || set live_endpoint https://github.com/netbootxyz 改为 isset ${live_endpoint} || set live_endpoint https://aj5ceuh2p9-80.cnb.run (域名为映射 80 端口的域名)

点击 Save Config

复制配置到托管文件

在终端中运行:rm -rf ./assets/menus/ && cp -r ./config/menus/ ./assets/ 使配置公开生效。

配置 IPXE 启动项

Legacy BIOS

登陆需要重装的服务器的 SSH,安装 ipxe:apt update && apt install -y ipxe

可以查看 ipxe 的启动项:

自定义 ipxe 启动脚本并放到 /boot/ipxe.ipxe (注意修改成你自己的网络配置和引导菜单链接)

cat >> /boot/ipxe.ipxe << EOF
#!ipxe

echo 正在设置静态 IP 地址...
set net0/ip 192.168.22.1
set net0/netmask 255.255.252.0
set net0/gateway 192.168.20.10
set dns 223.5.5.5

echo 激活网卡接口 net0...
ifopen net0 || goto net_failed

echo 加载远程引导菜单...
chain --autofree https://aj5ceuh2p9-80.cnb.run/menus/menu.ipxe || goto chain_failed

exit

:net_failed
echo 无法打开网卡接口!
sleep 3

:chain_failed
echo 加载远程菜单失败,请检查网络或URL
sleep 3
EOF

修改开机启动菜单配置:

# 设置默认启动项为 iPXE(对应 grub.cfg 中的 menuentry --id ipxe)
sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT="ipxe"/' /etc/default/grub

# 启用 GRUB 菜单显示(menu 模式,允许用户选择)
sed -i 's/^GRUB_TIMEOUT_STYLE=.*/GRUB_TIMEOUT_STYLE=menu/' /etc/default/grub

# 设置菜单等待时间为 20 秒
sed -i 's/^GRUB_TIMEOUT=.*/GRUB_TIMEOUT=20/' /etc/default/grub

# 更新 grub 配置文件(生成 /boot/grub/grub.cfg)
update-grub

⛔️ 警告:部分 ipxe 可能不支持 https,遇到无法启动的情况建议使用 ip+http 托管

⚠️ 注意:部分旧版 Legacy BIOS 在后续的安装过程中会报内存不足错误,切换到 UEFI 引导即可。

UEFI

从 UEFI 启动时无法外挂脚本,所以采用将脚步编译到 IPXE 中的方式

  • 保存脚本到文件 embed.ipxe

cat > embed.ipxe <<'EOF'
#!ipxe

echo 正在设置静态 IP 地址...
set net0/ip 192.168.22.1
set net0/netmask 255.255.252.0
set net0/gateway 192.168.20.10
set dns 223.5.5.5

echo 激活网卡接口 net0...
ifopen net0 || goto net_failed

echo 加载远程引导菜单...
chain --autofree https://aj5ceuh2p9-80.cnb.run/menus/menu.ipxe || goto chain_failed

exit

:net_failed
echo 无法打开网卡接口!
sleep 3

:chain_failed
echo 加载远程菜单失败,请检查网络或URL
sleep 3
EOF
  • 编译 ipxe UEFI 启动镜像

apt update
apt install git build-essential binutils gcc-multilib liblzma-dev

git clone https://github.com/ipxe/ipxe.git
cd ipxe/src
make bin-x86_64-efi/ipxe.efi EMBED=../../embed.ipxe
  • 部署启动镜像

mkdir -p /boot/efi/EFI/ipxe
cp bin-x86_64-efi/ipxe.efi /boot/efi/EFI/ipxe/bootx64.efi
  • 执行 lsblk -f 查看分区列表:

root@11:~# lsblk -f
NAME   FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda                                                                           
├─sda1                                                                        
├─sda2 ext4   1.0         edc913e8-760d-4406-b17c-a20f2d5b52a4  809.1M    10% /boot
├─sda3 vfat   FAT32       E22E-7291                             992.9M     1% /boot/efi
└─sda4 ext4   1.0         219f02c2-a9cd-42d1-a1fc-56117148e90d    3.1T     0% 

可知当前 EFI 分区在 /dev/sda3

  • 添加 EFI 启动项( EFI 分区为 /dev/sda3)

efibootmgr -c -d /dev/sda -p 3 -L "iPXE" -l '\EFI\ipxe\bootx64.efi'

# 输出结果:
root@pve:~# efibootmgr -c -d /dev/sda -p 3 -L "iPXE" -l '\EFI\ipxe\bootx64.efi'
BootCurrent: 0002
Timeout: 0 seconds
BootOrder: 0001,0002,2003,2001,2002,0003
Boot0000* EFI Network 0 for IPv4 (28-A6-DB-25-8F-45)    PciRoot(0x0)/Pci(0x2,0x0)/Pci(0x0,0x0)/MAC(28a6db258f45,1)/IPv4(0.0.0.00.0.0.0,0,0)RC
Boot0001* Ubuntu        HD(3,GPT,bfe393e6-c9a5-4549-bbfd-df5db074e6e7,0x201000,0x1f4000)/File(\EFI\ubuntu\grubx64.efi)
Boot0002* UEFI System   HD(3,GPT,bfe393e6-c9a5-4549-bbfd-df5db074e6e7,0x201000,0x1f4000)/File(\EFI\BOOT\Bootx64.efi)RC
Boot0003* iPXE  HD(3,GPT,bfe393e6-c9a5-4549-bbfd-df5db074e6e7,0x201000,0x1f4000)/File(\EFI\ipxe\bootx64.efi)
Boot2001* EFI USB Device        RC
Boot2002* EFI DVD/CDROM RC
Boot2003* EFI Network   RC
  • 调整启动顺序

由上述输出可见 0003 为新添加的 iPXE 启动项,使用 -o 选项将其调整到第一个

efibootmgr -o 0003,0001,0002,2003,2001,2002
  • 重启

安装

进入 Linux Network Installs (64-bit) ,翻页找到 Proxmox,选择 Proxmox VE 8.4-1 进行安装。

然后会进入下载,拉取 vmlinuxinitrdproxmox.iso 等文件,耐心等待即可。

拉取完成后会进入 Proxmox VE 的安装页面,正常安装即可。


评论