今天修理一台坏掉的Proxmox VE。打开网页管理面板一看,本来是单节点工作的机子上显示了两个节点,但是corosync并没有在运行。更为诡异的是,其中一个节点显示了本机的存储池,另一个节点显示了本机的虚拟机,各种状态API则是有的好有的坏。检查后发现,这台机子的主机名被人改过,但是PVE的一些设置没有同步,导致API出现了各种问题。这里就体现出了PVE的缺点:有些地方过度设计(例如用DNS查询来寻找所有节点),有些地方欠缺考虑(例如主机名不和系统同步),有些地方文档几乎没有。
经过研究,单节点的PVE修改主机名还算简单,只需要将几个不同地方的配置文件同步上即可。至于集群的PVE主机,我的建议是能少折腾尽量少折腾,毕竟身体最重要。
准备工作
建议在开始之前关闭所有虚拟机并做好备份。
Linux标准配置
首先要修改/etc/hostname
,这是所有Linux系统的主机名设置位置。但是这个文件只会在开机时被读取;为了让修改在重启之前就生效,我们还需要调用一下hostnamectl
:
1 |
hostnamctl set-hostname new-hostname |
然后,PVE要求在本机解析自己的主机名能解析到除了127.0.0.1
和::1
以外的本机的网卡IP上。因此我们需要修改/etc/hosts
,删掉原来主机名的记录,添加一行新的记录:
1 |
192.0.2.2 new-hostname.example.org new-hostname |
Proxmox Cluster file system
PVE的配置文件存放于一个FUSE挂载的文件系统上,在多节点集群中,这个文件系统的内容会自动在各个节点间同步。更改了主机名以后,我们需要让PVE能够找到对应的配置。
千万记得在操作之前备份整个nodes文件夹——这个文件系统是在同步的(即使你的PVE是单节点),移动文件过程中如果出现访问冲突,文件就有可能丢失,需要手工再覆盖一次。
首先干掉文件同步服务,强制让本地数据作为权威:
1 2 |
systemctl stop pve-cluster pmxcfs --local |
然后看一下战况如何:
1 |
ls /etc/pve/nodes/ |
运气好的话,这里只有一个和老主机名同名的文件夹。那么就只需要简单地复制(不能移动)一下文件,再删掉源文件:
1 2 3 4 5 6 7 |
# make a backup! cp -r /etc/pve/nodes/old-hostname /tmp/old-hostname # we use cp here since pmcxfs doesn't allow moving non-empty folder cp -r /etc/pve/nodes/old-hostname /etc/pve/nodes/new-hostname # might fail; will deal with it later rm -rf /etc/pve/nodes/old-hostname |
运气不好的话,下面已经有两个分别以老主机名和新主机名命名的文件夹了,那么你就得手工merge一下文件了。我这边删掉新主机名为名的文件夹,用老主机名为名的文件夹直接覆盖了,好像也没有出什么事。
确定nodes下只有一个和新主机名同名的文件夹以后,我们需要更新一下这个文件系统里面的一些软链接。这些软链接是用户不可写的,在文件同步服务启动时自动配置。所以我们直接重启文件同步进程:
1 2 |
killall pmxcfs systemctl restart pve-cluster |
RRDcache
1 2 3 4 5 6 7 8 9 10 11 |
systemctl stop rrdcached cd /var/lib/rrdcached/db cd pve2-node # these are files rm new-hostname mv old-hostname new-hostname cd ../pve2-storage # these are directories rm -rf new-hostname mv old-hostname new-hostname systemctl start rrdcached |
重新启动服务的时候会有一些日志重放的错误,因为文件名变了,可以忽略。
API服务器
API和一些反向代理依赖主机名来找对应的主机(即使你的PVE是单节点),所以我们要重启它们,让它们重新载入正确的配置。
1 2 3 4 |
systemctl restart pvedaemon systemctl restart pvestatd systemctl restart pveproxy systemctl restart pvebanner |
完成以后清理一下残局:
1 |
rm -r /etc/pve/nodes/old-hostname |
善后工作
- pool配置可能会丢失
- 用户权限可能会丢失
- 似乎一些健康状态检查的daemon不会立即更新数据,可能需要等待五分钟左右