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にハードウェア構成の変更を認識させます。
# dracut -f --regenerate-all
これを実行することでinitramfs(初期RAMディスク)を強制上書き、かつ/bootディレクトリ内の全てのカーネルバージョンに対してイメージを再作成するとのことです。
dracutコマンドが正常に終了したので、次にLet’sEncryptのSSL証明書更新を手動で実行してみます。
# certbot renew --force-renewal
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/sa-sa-ki.jp.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Renewing an existing certificate for sa-sa-ki.jp and *.sa-sa-ki.jp
Waiting 60 seconds for DNS changes to propagate
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all renewals succeeded:
/etc/letsencrypt/live/sa-sa-ki.jp/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
無事SSL証明書が更新されました。
# cd /etc/letsencrypt/live/sa-sa-ki.jp
# ls -la
drwxr-xr-x 2 root root 93 3月 6 16:28 .
drwx------ 3 root root 39 1月 30 15:50 ..
-rw-r--r-- 1 root root 692 1月 30 15:50 README
lrwxrwxrwx 1 root root 35 3月 6 16:28 cert.pem -> ../../archive/sa-sa-ki.jp/cert2.pem
lrwxrwxrwx 1 root root 36 3月 6 16:28 chain.pem -> ../../archive/sa-sa-ki.jp/chain2.pem
lrwxrwxrwx 1 root root 40 3月 6 16:28 fullchain.pem -> ../../archive/sa-sa-ki.jp/fullchain2.pem
lrwxrwxrwx 1 root root 38 3月 6 16:28 privkey.pem -> ../../archive/sa-sa-ki.jp/privkey2.pem
元々1.pemだったファイルが2.pemに切り替わっていますので、無事証明書も更新できました。
あとはWebサーバーとメールサーバーに証明書ファイルをコピーして、それぞれサービスを再起動して証明書更新の反映も終わりました。
次回こそcrontabで設定したcertbot renewがうまくいくといいなと思います。