记一次关于PVE小主机断电后系统崩溃的悲剧
以前强制关机甚至直接把电源插头都有过好多次,都是好好的,非常悲催的在一次更换空开的过程中导致了小主机断电,开机后web还是能正常登录,但是登录后发现所有虚拟机都打了问号,shell终端也点不开了,想修复都修复不了。

尝试过接上显示器,用物理机上直接手敲代码修复,但是发现他竟然会自动重启,还是不定时的,每次在我还没敲好代码的时候就重启了,后来学聪明了,想着先在外面做好.sh执行文件,再直接wget下载后./执行,但是在跑代码的过程又重启了。
没办法了,把硬盘拿下来,上到Debian和Ubuntu上备份数据吧,但是问题来了,我原来虚拟机磁盘全存在lvm里面的,Linux磁盘都需要挂载才能读取,而root这些都能挂载,但是lvm磁盘的文件只是单独是逻辑分区,无法挂载(也可能是我技术问题),到最后只能在/var/lib/vz/template/iso上备份出了一些镜像文件,其他因为无法挂载无法提取,所以直接放弃了,反正也没什么重要数据,重新刷机了。
如何避免
新安装了为最新版的PVE9.2系统,在安装的时候选择了EXT4格式磁盘,设置上要比之前好像要简单许多。
合并分区
PVE默认安装好的时候是分区的,在wbe中也可以看到,分为local和local-lvm,local分区是比较小的,local-lvm分区很大,默认上传的镜像和虚拟机配置是在local上的,而虚拟机磁盘这些却都保存到local-lvm上,这个在web端正常的时候都能看到。

如果把local-lvm磁盘(在PVE/date下)删除,且容量都合并到root里面,那么后面再出现系统崩溃严重的时候,就不会存在lvm无法挂载读取的情况了,因为所有的数据都会在local下了,而且local的容量也很大了,不会像没分区之前一样(我原来1t的硬盘分给local就100g,却分给local-lvm900g)出现local爆满的情况,下面放上相关步骤:
🔐 前提确认(再核对一遍)
建议在新安装好PVE的时候操作,如果不是请看下面注意事项
重要数据都备份好了,先将local-lvm下面的磁盘迁移到local或者备份,不然合并后local下的磁盘全都没了
1. 进入 PVE Shell
用 WebUI 右上角的「Shell」或者 SSH 登录到 PVE 主机,用 root 用户。
2. 确认当前分区结构
运行lvs 你会看到类似这样的输出:
plaintext
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root pve -wi-ao---- <xxxG
swap pve -wi-ao---- 4.00G
data pve twi-aotz-- 852.33G
这里的 pve/data 就是 local-lvm,我们要把它删掉,空间给 pve/root。
3. 删除 local-lvm 的 LVM 卷
运行
lvremove /dev/pve/data
提示 Do you really want to remove active logical volume pve/data?,输入 y 回车确认。
执行完再跑一遍 lvs,data 那一行就消失了。
4. 把所有空闲空间扩容给 pve/root
bash
运行
lvextend -rl +100%FREE /dev/pve/root
-l +100%FREE:把卷组里所有空闲空间都给 root 卷
-r:自动调整文件系统大小(不用再手动 resize2fs)
5. 验证扩容结果
运行
df -h /
看 / 这一行的容量,已经变成原来加上 local-lvm 的全部空间,就说明成功了。
6. WebUI 里删除 local-lvm 存储
数据中心 → 存储 → 选中 local-lvm → 点「移除」
编辑 local:
内容里勾选 磁盘映像、ISO、备份、容器、模板 等全部需要的类型
保存
7. 收尾(可选,清理配置文件)
bash
运行
vi /etc/pve/storage.cfg
删掉类似下面这段(如果还有的话):
plaintext
lvmthin: local-lvm
thinpool data
vgname pve
content rootdir,images
只保留 dir: local 那段即可。
合并完成后,以后所有虚拟机磁盘都会存在 /var/lib/vz/images/VMID/ 下,是标准的 qcow2 文件,可直接复制、备份。
或者直接制作一个hebin.sh文件,chmod +x hebin.sh 添加权限后,执行./hebin.sh
hebin.sh 代码
#!/bin/bash
set -euo pipefail
echo "====================================="
echo " PVE local-lvm 合并脚本(仅默认LVM)"
echo "====================================="
echo ""
# 检查是否为root
if [ "$(id -u)" -ne 0 ]; then
echo "❌ 必须用 root 运行此脚本"
exit 1
fi
# 1. 检查 local-lvm 是否还有虚拟机使用
echo "1. 检查 local-lvm 是否还有虚拟机配置..."
if grep -q "local-lvm" /etc/pve/qemu-server/*.conf /etc/pve/lxc/*.conf 2>/dev/null; then
echo "❌ 检测到还有虚拟机/容器使用 local-lvm,请先迁移磁盘再运行!"
exit 1
fi
echo "✅ 无虚拟机/容器使用 local-lvm"
# 2. 检查 pve/data 是否存在
echo ""
echo "2. 检查 pve/data 逻辑卷..."
if ! lvs /dev/pve/data &>/dev/null; then
echo "❌ /dev/pve/data 不存在,无需合并"
exit 0
fi
echo "✅ 检测到 /dev/pve/data,准备删除"
# 3. 删除 local-lvm 卷
echo ""
echo "3. 删除 pve/data 逻辑卷..."
read -p "⚠️ 确认删除 pve/data?(y/N): " confirm
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
echo "已取消操作"
exit 0
fi
lvremove -y /dev/pve/data
echo "✅ pve/data 已删除"
# 4. 扩容 pve/root
echo ""
echo "4. 扩容 pve/root 到所有空闲空间..."
lvextend -rl +100%FREE /dev/pve/root
echo "✅ 扩容完成"
# 5. 验证结果
echo ""
echo "5. 验证 / 分区大小..."
df -h /
echo ""
echo "====================================="
echo "✅ 合并完成!请在 WebUI 中删除 local-lvm 存储"
echo "====================================="







暂无评论内容