Proxmox VE ノードを削除した時のメモの備忘録

おはこんばんにちは、ytknです。

昔から苦手だったProxmox VEのノードを無事削除する方法がわかったので、その時のメモを整理して残しておきます。

この記事では生きているノードを削除する方法を紹介しています。クラスタから死んだノード(他のOSを入れてしまった、物理的に壊した、など)を削除する際はこの記事は参考にならないので注意。

状況

  • 生きているノードが2つあった
  • 1つだけ削除したい

環境

Proxmox VE 8.4.1
2台でクラスタ構成

この記事ではノードのことを「PVE1」「PVE2」と表現します。
そして、「PVE2」を削除するとします。 (PVE1だけ残る)

本題

クラスタからノードを削除する

まず、削除するノードにVM、コンテナ、バックアップ等が残っていない状態にしてください。

削除しないノードからSSHかWebGUIのConsoleでアクセス

① pvecm nodesで削除するノードがあるか確認

root@PVE1:~# pvecm nodes

Membership information
----------------------
    Nodeid      Votes Name
         1          1 PVE1 (local)
         2          1 PVE2

② PVE2をクラスタから削除

root@PVE1:~# pvecm delnode PVE2
Killing node 2

delnodeエラー例 その1

以下のようなエラーが出た場合

root@PVE1:~# pvecm delnode PVE2
Killing node 2
unable to open file '/etc/pve/corosync.conf.new.tmp.703647' - Permission denied

このエラーは同期に問題がある時に表示されるエラーらしいです。
以下の手順で対処してください。

まず/etc/pveの状態を確認

root@PVE1:~# mount | grep /etc/pve
/dev/fuse on /etc/pve type fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)

/dev/fuse ….と表示されれば正常

もし何も表示されない場合

root@PVE1:~# systemctl restart pve-cluster
(10秒待つ)
(もう一度試す)
root@PVE1:~# mount | grep /etc/pve
/dev/fuse on /etc/pve type fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)

表示されればOKです。②に戻ってやり直してください。

delnodeエラー例 その2

以下のようなエラーが出た場合

root@PVE1:~# pvecm delnode PVE2
cluster not ready - no quorum?

これは、クラスタが「クォーラム」を失っている状態を意味します。
Proxmoxクラスタは「生きているノードが過半数以上いること」を前提にして構成ファイルの書き換えなどを許可しています。2台構成で1台が止まっている場合、この「過半数」に達せず、クラスタ操作がロックされる=クォーラムなし(no quorum)になります。

以下の手順で対処してください。
expectedの後の数字は、最終的に残すノードの数を入れてください。
(今回は1つ削除して1つ残すので、1を入力)

root@PVE1:~# pvecm expected 1

このコマンドは実行後、特に出力はありません。②に戻ってやり直してください。

delnodeエラー例 その3

以下のようなエラーが出た場合

root@PVE1:~# pvecm delnode PVE2
trying to acquire cfs lock 'file-corosync_conf' ...
trying to acquire cfs lock 'file-corosync_conf' ...
trying to acquire cfs lock 'file-corosync_conf' ...
trying to acquire cfs lock 'file-corosync_conf' ...
trying to acquire cfs lock 'file-corosync_conf' ...
trying to acquire cfs lock 'file-corosync_conf' ...
trying to acquire cfs lock 'file-corosync_conf' ...
trying to acquire cfs lock 'file-corosync_conf' ...
trying to acquire cfs lock 'file-corosync_conf' ...
cfs-lock 'file-corosync_conf' error: got lock request timeout

このエラーはcorosync.confのロック取得?に失敗した際に出るエラーとのこと。

以下の手順で対処してください。
まずクラスタ関連のサービスを再起動

root@PVE1:~# systemctl restart pve-cluster
(10秒程度待つ)
root@PVE1:~# systemctl restart corosync
(10秒程度待つ)

そして/etc/pveがマウントされていることを確認

root@PVE1:~# mount | grep /etc/pve
/dev/fuse on /etc/pve type fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)

クォーラムがあるか確認

root@PVE1:~# pvecm status
Cluster information
-------------------
Name:             ClusterName
Config Version:   7
Transport:        knet
Secure auth:      on

Quorum information
------------------
Date:             Wed Jul 16 09:06:38 2025
Quorum provider:  corosync_votequorum
Nodes:            1
Node ID:          0x00000001
Ring ID:          2.418
Quorate:          No

Votequorum information
----------------------
Expected votes:   2
Highest expected: 2
Total votes:      1
Quorum:           2 Activity blocked
Flags:            

Membership information
----------------------
    Nodeid      Votes Name
0x00000001          1 192.168.0.101 (local)

Quorate: NOになっている場合は、以下の手順

root@PVE1:~# pvecm expected 1

再度クォーラムを確認

root@PVE1:~# pvecm status
Cluster information
-------------------
Name:             ClusterName
Config Version:   7
Transport:        knet
Secure auth:      on

Quorum information
------------------
Date:             Wed Jul 16 09:07:00 2025
Quorum provider:  corosync_votequorum
Nodes:            1
Node ID:          0x00000001
Ring ID:          2.418
Quorate:          Yes

Votequorum information
----------------------
Expected votes:   1
Highest expected: 1
Total votes:      1
Quorum:           1  
Flags:            Quorate 

Membership information
----------------------
    Nodeid      Votes Name
0x00000001          1 192.168.0.101 (local)

Quorate: Yesになったら、再度②に戻ってやり直してください。

GUIに残るノード名を削除する

削除はできたっぽいがWebGUIにアイコンが残ってしまう場合

pvecm nodesで削除されているか確認

root@PVE1:~# pvecm nodes

Membership information
----------------------
    Nodeid      Votes Name
         1          1 PVE1 (local)

ノードディレクトリを確認

root@PVE1:~# ls -la /etc/pve/nodes/
total 0
drwxr-xr-x 2 root www-data 0 Mar 16 09:51 .
drwxr-xr-x 2 root www-data 0 Jan  1  1970 ..
drwxr-xr-x 2 root www-data 0 Mar 16 09:51 PVE1
drwxr-xr-x 2 root www-data 0 May 12 00:19 PVE2

残っているノードの中身を確認

root@PVE1:~# ls -la /etc/pve/nodes/PVE2
total 2
drwxr-xr-x 2 root www-data    0 Mar 16 09:51 .
drwxr-xr-x 2 root www-data    0 Mar 16 09:51 ..
-rw-r----- 1 root www-data   83 Jul 16 09:03 lrm_status
drwxr-xr-x 2 root www-data    0 Mar 16 09:51 lxc
drwxr-xr-x 2 root www-data    0 Mar 16 09:51 openvz
drwx------ 2 root www-data    0 Mar 16 09:51 priv
-rw-r----- 1 root www-data 1704 Mar 16 09:51 pve-ssl.key
-rw-r----- 1 root www-data 1801 Mar 16 09:51 pve-ssl.pem
drwxr-xr-x 2 root www-data    0 Mar 16 09:51 qemu-server
-rw-r----- 1 root www-data  564 May  8 18:27 ssh_known_hosts

問題ない (VM定義ファイルやLXC設定などが残っていない) ことを確認したら、削除実行します。
※クラスタ構成ファイルなので必ず確認してください。

root@PVE1:~# rm -r /etc/pve/nodes/PVE2

GUIをF5とかでリロードし、ノードが消えたことを確認します。

それでもGUIから消えない場合

しぶといヤツですねー

まれにpmxcfsの反映に時間がかかることがあるので、10分程度放置してみてください。

それでも消えない場合、クラスタメンバー情報の内部キャッシュをチェックしてみます。

root@PVE1:~# cat /etc/pve/.members
{
"nodename": "PVE1",
"version": 3,
"cluster": { "name": "ClusterName", "version": 7, "nodes": 2, "quorate": 1 },
"nodelist": {
  "PVE1": { "id": 1, "online": 1, "ip": "192.168.0.101"}
  "PVE2": { "id": 2, "online": 0},
  }
}

まだPVE2のエントリが残っている場合

corosync.confからPVE2を削除します。
※.membersは手動編集禁止ファイルです。必ずcorosync.confを編集してください。

root@PVE1:~# nano /etc/pve/corosync.conf 
logging {
  debug: off
  to_syslog: yes
}

nodelist {
  node {
    name: PVE1
    nodeid: 1
    quorum_votes: 1
    ring0_addr: 192.168.0.101
  }
  node {
    name: PVE2
    nodeid: 2
    quorum_votes: 1
    ring0_addr: 192.168.0.102
  }
}

quorum {
  provider: corosync_votequorum
}

totem {
  cluster_name: ClusterName
  config_version: 7
  interface {
    linknumber: 0
  }
  ip_version: ipv4-6
  link_mode: passive
  secauth: on
  version: 2
}

赤くハイライトした部分を削除して保存します。

クラスタサービスを再起動して反映させます。

root@PVE1:~# systemctl restart corosync
root@PVE1:~# systemctl restart pve-cluster
root@PVE1:~# cat /etc/pve/.members
{
"nodename": "PVE1",
"version": 4,
"cluster": { "name": "ClusterName", "version": 7, "nodes": 1, "quorate": 1 },
"nodelist": {
  "PVE1": { "id": 1, "online": 1, "ip": "192.168.0.101"}
  }
}

これで消えるはずです。

これでも消えない場合、ちょっと私にはわかりません。
Google先生やChatGPT先輩に聞いてみてください。

以上です。ありがとうございました。

コメント

タイトルとURLをコピーしました