Let’sEncryptのSSL証明書をDNS認証で発行して始めての更新処理でセグメンテーション違反エラーが発生

yasuです。

自宅のProxmox VEのVMで立てている外部DNSサーバーですが、1月下旬にLet’sEncryptのSSL証明書をDNS認証で発行して、本日始めての更新処理(certbot renew)が動いたのですが、セグメンテーション違反エラー(signal SIGSEGV: segmentation violation)が発生してSSL証明書が更新できませんでした。

Geminiに相談したところ

Proxmox上で動作させているVMのCPUタイプが「Default(kvm64)」になっていると、Go言語でコンパイルされたバイナリが「このCPUならこの命令(AVXや特定の最適化命令)が使えるはず」と判断して実行しようとし、仮想CPUがそれをサポートしていないために「不正なメモリアドレスへのアクセス」としてクラッシュします。
特にAlmaLinux 9(RHEL 9ベース)は、CPUのアーキテクチャ要求水準(x86-64-v2以上)が高くなっているため、この問題が顕著に出ます。

とのことで、解決方法として

VMのCPUタイプをDefault(kvm64)からhostに変更してみてください。

との事でしたので、言われるがままVMをシャットダウンして、CPUタイプを[x86-64-v3]から[host]に変更して起動したところ、VMに入ってるOS(AlmaLinux 9)がブートしなくなりました。
起動しないことにはどうにもならないので、CPUタイプを元の[x86-64-v3]に戻して起動してみても同じくOSがブートしません。
再度Geminiに相談したところ

GRUB画面(カーネル選択画面)が出たら、e キー を押してエディタを開きます。
linux または linux16 で始まる行の末尾に、スペースを空けて rd.break と入力します。
Ctrl + x を押して起動します。これで、ルートディレクトリがマウントされる直前の初期RAMディスク内で停止します。

とのことで、指示通りGRUB画面でエディタを開きlinuxから始まる行の最後に rd.break を追加してCtrl + xキーを押下して起動してみたものの、やっぱりOSが起動しません。
またまたGeminiに相談したところ

GRUB画面(カーネル選択画面)が出たら、e キー を押してエディタを開きます。
linuxで始まる行の最後にmitigations=off nokaslrを追記します。
Ctrl + x を押して起動します。

とのことで、こちらも指示通り試してみましたが、これまたOSが起動しません。
OSが起動しないというのは、具体的にはVMを起動した時にに表示されるProxmoxって表示されている黒い画面とGRUBのOSバージョン選択画面をループする状態でした。

どうにもならないと思い、毎日スナップショットで取っているバックアップから今日の2時のバックアップデータでVMを戻しましたが、今日バックアップしたVMをリストアして起動してもループしてOSが起動しません。
バックアップは3世代取ってあるので、一番古い2日前のバックアップから戻してみたところ、無事OSが起動しましたのでOSをシャットダウンし、CPU Typeを[x86-64-v3]から[host]に変更しても今度はOSが起動したので、OSにハードウェア構成の変更を認識させます。

これを実行することでinitramfs(初期RAMディスク)を強制上書き、かつ/bootディレクトリ内の全てのカーネルバージョンに対してイメージを再作成するとのことです。
dracutコマンドが正常に終了したので、次にLet’sEncryptのSSL証明書更新を手動で実行してみます。

無事SSL証明書が更新されました。

元々1.pemだったファイルが2.pemに切り替わっていますので、無事証明書も更新できました。
あとはWebサーバーとメールサーバーに証明書ファイルをコピーして、それぞれサービスを再起動して証明書更新の反映も終わりました。
次回こそcrontabで設定したcertbot renewがうまくいくといいなと思います。

コメントする