# 更改主机名

更改主机名的操作和 Debian 基本一致,但是 PVE 中会产生新的问题:

  • 配置文件需要手动迁移
  • 如果该节点已加入了集群,集群同步会出问题:
    • 集群配置文件需要手动更新
    • 节点之间 ssh 通信问题
  • Cepth 我在这次还没有配置 Cepth,所以情况未知

和 Debian 一样的操作:

bash
#!/bin/bash
# 获取旧主机名字
old_hostname=$(hostname)
# 输入新主机名
echo "请输入新的主机名:"
read new_hostname
sudo sed -i "s/$old_hostname/$new_hostname/g" /etc/hosts /etc/hostname /etc/postfix/main.cf

然后需要重启让新主机名生效。重启会可能会同时看到新节点和旧节点,新节点上看不到原来的虚拟机、容器,旧节点上看得到,因为虽然重启创建了 /etc/pve/nodes/$new_hostname/ 目录,但是旧节点的配置文件还在 /etc/pve/nodes/$old_hostname/ 中。

其中 /etc/pve/nodes/$old_hostname/qemu-server/ 比较特殊, mv 指令无法将它们直接移动,需要借助 “中转” 移动过去。

bash
#!/bin/bash
# 输入新主机名
read old_hostname
# 获取旧主机名
new_hostname=$(hostname)
cp -r /etc/pve/nodes/$old_hostname/* /etc/pve/nodes/$new_hostname/
# 中转
mkdir /root/temp
mv /etc/pve/nodes/$old_hostname/qemu-server/* /root/temp/
cp /root/temp/* /etc/pve/nodes/$new_hostname/qemu-server/
rm -rf /etc/pve/nodes/$old_hostname /root/temp /root/t.sh

每一个更改主机名的节点,都要单独对其执行如上操作。

# 集群同步

# 集群配置文件

按照官方文档,在每一个节点上编辑集群配置文件 /etc/pve/corosync.conf/etc/corosync/corosync.conf (一般重启 corosync 会自动和前者同步),可以修改不同节点主机名、IP、集群 id 等:

bash
cp /etc/pve/corosync.conf /etc/pve/corosync.conf.new
cp /etc/pve/corosync.conf /etc/pve/corosync.conf.bak
nano /etc/pve/corosync.conf.new
mv /etc/pve/corosync.conf.new /etc/pve/corosync.conf
systemctl restart corosync

如果修改节点 id,一定注意它是从 1 开始而不是 0 开始的!

这里因为权限问题不能直接编辑,而是创建新文件覆盖的方式编辑。原因如下:

shell
root@node3:~# ls -lah /etc/pve/corosync.conf
-rw-r----- 1 root www-data 638 Aug 13 14:36 /etc/pve/corosync.conf

还有另一种方式可以编辑这样的文件,通过切换文件系统的方式。如果上述方法操作失误或编辑出错了,可以通过如下方法挽救:

shell
systemctl stop pve-cluster
systemctl stop corosync
pmxcfs -l
# 现在可以编辑任意文件了
nano /etc/pve/corosync.conf
# 恢复
killall pmxcfs
systemctl start pve-cluster
systemctl start corosync

此外,若修改了节点的 id,还需要在重启 corosync 前受影响节点上删除旧的 id 信息:

shell
rm -rf /var/lib/corosync/*

编辑好配置文件之后,预期将在面板的 数据中心->概要; Datacenter(Cluster)->Summary 看到预期的节点情况。

这个过程由于我参考了官方文档 “从删除集群删除节点” 的内容,我曾误删过 /etc/corosync/authkey 和 ,导致了 systemctl start corosync 失败,查看日志看到 no such file or directory 这样的的报错,可以从其他节点 tcp 等方式拷贝过去解决。

# ssh 通信

修改主机名后还会导致节点之间的 ssh 通信出问题,登录某一节点 ip 的面板无法访问另一个节点的信息。

修改 /etc/hosts 增加这些节点和 ip,仍没有解决。

在每一个节点上对每一个其他节点 nodeX (x.x.x.x) 执行 /usr/bin/ssh -e none -o 'HostKeyAlias=nodeX' root@x.x.x.x /bin/true ,仍没有解决。

最终解决:

在每一个节点 nodeX (x.x.x.x) 上,查看 /etc/ssh/ssh_host_rsa_key.pub 得到该节点为 PVE 使用的 rsa 公钥 (pub)xxx... ,然后在集群共享文件 /etc/pve/priv/known_hosts 中编辑确保有且仅有如下信息,删去旧的不正确的信息:

known_hosts
x.x.x.x ssh-rsa (pub)xxx...
nodeX ssh-rsa (pub)xxx...
x.x.x.x ssh-rsa (pub)xxx...
nodeX ssh-rsa (pub)xxx...
......

在每一个节点上,建立软链接:

shell
ln -s /etc/pve/priv/known_hosts /etc/ssh/ssh_known_hosts

最后重启 pveproxy 服务:

shell
systemctl restart pveproxy