あるシステムでOpen Source MANO(OSM)をインストールし使っていたのですが、しばらくの間停止状態だった後にシステムを起動させた時に、各ノードが正常に起動せず、OSMが使えない状態になりました。
多少強引ですが復旧させる方法が分かったので、残しておきます。
エラーの原因#
使っているOSMのバージョンは少し古く、内部でDocker Swarmを使用して、OSMを構成する各ノードを起動していました。
エラーに関する情報を得るため、docker infoコマンドを実行したところ、以下のようなメッセージが出力されました。
$ docker info | sed -n '/Swarm:/,/^$/p'
Swarm: error
WARNING: No swap limit support
NodeID:
Error: error while loading TLS certificate in /var/lib/docker/swarm/certificates/swarm-node.crt: certificate (1 - bzd4md0zzphu0scmdv4qse1kl) not valid after Sun, 21 Dec 2025 21:40:00 UTC, and it is currently Fri, 26 Dec 2025 01:17:30 UTC: x509: certificate has expired or is not yet valid:
Is Manager: false
Node Address: 192.168.1.xxx
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 3dce8eb055cbb6872793272b4f20ed16117344f8
runc version: v1.1.7-0-g860f061
init version: de40ad0
Security Options:
apparmor
seccomp
Profile: builtin
Kernel Version: 4.15.0-213-generic
Operating System: Ubuntu 18.04.6 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 15.66GiB
Name: plainosm-tef
ID: 80214696-f268-475f-bc53-4a2bca6078af
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false上記メッセージのうち、エラーの原因を示しているのは以下の部分です。
Error: error while loading TLS certificate in /var/lib/docker/swarm/certificates/swarm-node.crt: certificate (1 - bzd4md0zzphu0scmdv4qse1kl) not valid after Sun, 21 Dec 2025 21:40:00 UTC, and it is currently Fri, 26 Dec 2025 01:17:30 UTC: x509: certificate has expired or is not yet valid:エラーが発生した理由は、Docker Swarmのノード証明書(/var/lib/docker/swarm/certificates/swarm-node.crt)が期限切れになっており、正常に読み込めていないことが原因でした。
この状態を解消するには、システム時間を証明書が有効だった時刻に戻し、Swarmを起動、証明書を更新してからシステム時刻を同期させるという手順が必要です。 システム時刻に手を入れるという強引な手法であるため、自己責任で行ってください。
復旧手順#
今の失効期限を確認
先述したとおり、ログメッセージの「not valid after Sun, 21 Dec 2025 21:40:00 UTC」の部分です。 この時刻より前の時刻に変更します。
システム時刻の変更
NTPを一旦止めて、時刻を変更し、dockerサービスを再起動します。
$ sudo timedatectl set-ntp false $ sudo date -s '2025-12-20 12:00:00' $ sudo systemctl restart dockerSwarmが操作できるか確認
$ docker info | sed -n '/Swarm:/,/^$/p' Swarm: active NodeID: jix3ff38iv6ultm3wcc2a1tjo Is Manager: true ClusterID: rmm5fpkxxtujxnhj0tagkr3yi Managers: 1 Nodes: 1 (省略) $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION jix3ff38iv6ultm3wcc2a1tjo * foobar Ready Active Leader 24.0.2証明書を更新
$ docker swarm ca --rotateシステム時刻の同期
システム時刻を同期させるためNTPを再開し、dockerサービスを再起動します。
$ sudo timedatectl set-ntp true $ timedatectl Local time: Thu 2026-01-23 06:11:28 UTC Universal time: Thu 2026-01-23 06:11:28 UTC RTC time: Thu 2026-01-23 06:11:29 Time zone: Etc/UTC (UTC, +0000) System clock synchronized: yes systemd-timesyncd.service active: yes RTC in local TZ: no $ sudo systemctl restart docker
上記復旧手順を行うことで、起動に失敗していたOSMの各ノードが正常に起動するようになり、OSMが再度使えるようになりました。OSMだけでなく、Docker Swarmを採用しているシステムに共通して使用できる方法だと思うので、困っている方がいたら試してみてください。