Ubuntu 20.04 から 22.04.1 への Upgrade

bash

新しいLTSバージョンが発表になった時は、すぐに入れたくなるのだけど手元のデスクトップ用途でなければ、じっと我慢してポイントリリースが出るのを待つのが吉だと思っています。

予定より少し遅延したようですが、8月9日に Ubuntu 22.04 の Point-Release である 22.04.1 が公開されました。この blog が動いているサーバは 20.04 で稼働しているので 22.04.1 が公開されるのを首を長くして待っていたのです 🙂

まずは変更点の確認

サーバで何が動いているのかにも依りますが、言語やコアライブラリのバージョンが変更になると、既存のプログラムが動かなくなる可能性があります。ですから、たとえ面倒だとしてもChangelog には目を通すべきです。

Jammy Jellyfish Release Notes(22.04)

まずは 22.04 で何が変わったのか?を上記リリースノートで確認します。

Kernelバージョン変更、nfsdのUDP mountが無効、gccやLLのバージョンも微妙に変わっていて、利用している場合は要注意。

blog を動かしているサーバに影響がありそうなのは下記3項目。

  • OpenSSLが 1系 から 3.0系へ変更
    古い暗号形式が無効になってるそう。けど、古いのは使ってないので大丈夫かな・・・
  • ssh-rsa無効化
    昔に作成した鍵をずっと利用している場合は注意。リモートでアップグレードをする予定で鍵認証のみにしている場合は要確認。
  • デフォルトのPHPバージョンが 8.1系
    これは微妙に危険な気がする。wordpress 6.0 はphp 8系に対応しているようだけど更新されていないpluginとかで不具合が出そう。
  • Quagga 廃止
    このサーバでは動いてないけど、frr に変わるんですね。

ここまで見てきて、PHP 8.1 へのアップグレードに危険な臭いを感じます。

お仕事でやってる人なら検証環境で確認してからアップグレードを実施するかどうかの判断を行うところですが、趣味のサイトなら少し停まっても(そもそもほとんどアクセスが無い)問題ないので、エイッと上げてしまうことにします。

ポイントリリースでの変更点

Jammy Jellyfish Point-Release Changes (22.04 -> 22.04.1)
次はポイントリリースでの変更点に目を通していきます。主にセキュリティ問題修正とX、GNOME周りの変更でしょうか。blog を動かしているサーバではあまり関係無かったかな。22.04.1 リリース直前の状況見ていたら アップグレードプロセスにいくつかバグが出ていましたが、それらも修正されているようです。

れっつアップグレード

変更点を確認して PHP 8 周りに不安がありますがアップグレードを実施する事にします。
Ubuntuのアップグレード手順は以前実施した 18.04 -> 20.04 の時と変わりません。
  1. パッケージを最新の状態に更新
  2. 設定などをバックアップ
  3. リモートから作業する場合は、複数のsshセッションを張っておくこと。
    その際、安定したサーバから screen などを使って、突然の切断に備えられれば尚良し。

Ubuntu 20.04.4 LTS を最新の状態にする

kernelは無理に上げる必要はないと思うけど、一応全部あげて一度再起動しておきます。

upgradeの設定確認
LTSバージョン への アップグレードなら Prompt=lts でOK。

設定をバックアップ

etc.tar.gz は、別サーバや手元に転送しておくとより良いかも。

れっつアップグレード

sshdを別ポートで上げますか? と聞かれるので、もちろんハイと答えて、別ポートでも接続しておきます。

パッケージダウンロード、アップグレードプロセス が走り、時々設定ファイルの変更について聞かれるので内容を確認しつつ待っていると無事アップグレードが完了しました。

念のためサーバを再起動して、必要なプロセスが起動すること、エラーが出ないことを確認しておきます。

アップグレード完了。そして不具合修正

無事に起動してssh loginも問題なし。

systemd-resolved

ログを確認するとDNSの名前解決に失敗したというエラーがいろいろなところで発生していました。blog が稼働しているサーバではドメインの権威サーバ 及び 内側からのキャッシュリゾルバとして bind9 が稼働しています。

いろいろと確認していくと 権威サーバとして 外部からの問い合わせにはちゃんと答えているが、サーバ内部のプロセスのクエリーには失敗を返しています。

/etc/resolv.conf を調べると妙なところへsymlinkが貼られていて 127.0.0.53 というアドレスを見に行くようになっていました。これらは systemd-resolvedサービスで管理されていて内部的にキャッシュを持ち、名前解決を高速化する仕組みだそうです。NetworkManager を利用していると色々便利らしいのですが、こういうところは自分で管理したいのです。

それに、このサーバではbind9 を 内部キャッシュとして利用しているので、こんな仕組みは不要です。

systemd-resolvedサービスを無効にして、resolv.conf を手で書きました。

php-fpm の path 変更

今までの php7.4 から php8.1 へ変わったので当然pathが異なってエラーをはいていました。

nginx で 時々SSL通信が切断される

このサーバでは HTTP(s)の受けに nginx を利用しています。nginx の エラーログを見ているとSSL通信が切断されたというエラーが時々記録されていました。

毎回ではないのでググってみると、githubのopensslリポジトリで issue を発見しました。

SSL_read() failed (SSL: error:0A000126:SSL routines::unexpected eof while reading) #18866
https://github.com/openssl/openssl/issues/18866

今回のアップグレードでopensslのバージョンが1.1系から3.0系へ変更されていて、その影響のような雰囲気です。最後に nginx を新しくすれば直るよとコメントがあったので、nginx を 1.22 へ上げてみるとエラーは解消されました。

Ubuntu リポジトリから入れた場合と nginx オフィシャルリポジトリから入れた場合では nginx プロセスの ユーザ名が異なりますので、注意が必要です。

nginx オフィシャルリポジトリからのインストール方法はこちら http://nginx.org/en/linux_packages.html#Ubuntu

自作wordpress plugin

自作のwordpress plugin 内で create_function() を使っていました。PHP 8 では create_function() が廃止となった為、エラーが発生しました。

無名関数 function() で書き換えてエラーは消えたのですが、wordpress 5.8 で導入された widget pluginの仕様変更(ブロックエディタ仕様になった)に引っかかって登録できなくなってしまいました。かなり長い間仕様変更に追従せず放置していた為か、classic widgets plugin を導入してもNGでした。

この自作pluginは必須というわけでもないので、気が向いたら直すという感じで。

まとめ

Ubuntu 20.04 から 22.04 へのアップグレードで 当サーバでは openssl と PHP のメジャーバージョンアップが地味に影響を及ぼしていました。

systemd はいろいろな機能を取り込んでいって肥大化していきますね。それが良いのか悪いのかはわかりませんが、systemd 周りはぼくにとって相変わらず鬼門です。

今回アップグレード後の修正作業で2時間くらいサービスを止めてしまいました。お仕事でサーバー管理をされている方々は安易にOSバージョンを上げたりはしないと思いますが、やっぱり事前の検証はしっかりしないとダメということですね。

カテゴリー PC

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)