新しいLTSバージョンが発表になった時は、すぐに入れたくなるのだけど手元のデスクトップ用途でなければ、じっと我慢してポイントリリースが出るのを待つのが吉だと思っています。
予定より少し遅延したようですが、8月9日に Ubuntu 22.04 の Point-Release である 22.04.1 が公開されました。この blog が動いているサーバは 20.04 で稼働しているので 22.04.1 が公開されるのを首を長くして待っていたのです 🙂
1 2 3 4 5 6 7 8 9 |
root@vps:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.4 LTS Release: 20.04 Codename: focal root@vps:~# uname -ar Linux vps 5.4.0-124-generic #140-Ubuntu SMP Thu Aug 4 02:23:37 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux |
まずは変更点の確認
サーバで何が動いているのかにも依りますが、言語やコアライブラリのバージョンが変更になると、既存のプログラムが動かなくなる可能性があります。ですから、たとえ面倒だとしてもChangelog には目を通すべきです。
まずは 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 へのアップグレードに危険な臭いを感じます。
お仕事でやってる人なら検証環境で確認してからアップグレードを実施するかどうかの判断を行うところですが、趣味のサイトなら少し停まっても(そもそもほとんどアクセスが無い)問題ないので、エイッと上げてしまうことにします。
ポイントリリースでの変更点
れっつアップグレード
- パッケージを最新の状態に更新
- 設定などをバックアップ
- リモートから作業する場合は、複数のsshセッションを張っておくこと。
その際、安定したサーバから screen などを使って、突然の切断に備えられれば尚良し。
Ubuntu 20.04.4 LTS を最新の状態にする
kernelは無理に上げる必要はないと思うけど、一応全部あげて一度再起動しておきます。
1 2 3 |
root@vps:~# apt-get update root@vps:~# apt-get upgrade root@vps:~# apt-get full-upgrade |
Prompt=lts
でOK。
1 2 |
root@vps:~# cat /etc/update-manager/release-upgrades|grep Prompt Prompt=lts |
設定をバックアップ
etc.tar.gz は、別サーバや手元に転送しておくとより良いかも。
1 2 3 4 5 6 7 8 9 10 11 |
root@vps:~# mkdir -p /root/upgrade-22.04 root@vps:~/upgrade-22.04# cd /root/upgrade-22.04/ root@vps:~/upgrade-22.04# tar zcpf ./etc.tar.gz /etc/ root@vps:~/upgrade-22.04# ifconfig -a >./ifconfig root@vps:~/upgrade-22.04# netstat -na > ./netstat-na root@vps:~/upgrade-22.04# netstat -nr > ./netstat-nr root@vps:~/upgrade-22.04# ip -6 route show > ./ip6-route-show root@vps:~/upgrade-22.04# ps auwwx > ./ps root@vps:~/upgrade-22.04# ip6tables-save > ./ip6tables-save root@vps:~/upgrade-22.04# iptables-save >./iptables-save root@vps:~/upgrade-22.04# dpkg -l > ./dpkg-l |
れっつアップグレード
1 2 3 4 5 6 7 8 9 10 11 |
root@vps:~/upgrade-22.04# do-release-upgrade : : Continue running under SSH? This session appears to be running under ssh. It is not recommended to perform a upgrade over ssh currently because in case of failure it is harder to recover. If you continue, an additional ssh daemon will be started at port '1022'. Do you want to continue? Continue [yN] |
sshdを別ポートで上げますか? と聞かれるので、もちろんハイと答えて、別ポートでも接続しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[pooh:0:6493:/home/ace]% ssh -p 1022 vps.xxx.xxx Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-124-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage New release '22.04.1 LTS' available. Run 'do-release-upgrade' to upgrade to it. _______ < Hello > ------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || Last login: Sat Aug 13 01:07:24 2022 from 2400:xxxx ace@vps:~$ |
パッケージダウンロード、アップグレードプロセス が走り、時々設定ファイルの変更について聞かれるので内容を確認しつつ待っていると無事アップグレードが完了しました。
念のためサーバを再起動して、必要なプロセスが起動すること、エラーが出ないことを確認しておきます。
アップグレード完了。そして不具合修正
1 2 3 4 5 6 7 8 9 |
root@vps:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.1 LTS Release: 22.04 Codename: jammy root@vps:~# uname -a Linux vps 5.15.0-46-generic #49-Ubuntu SMP Thu Aug 4 18:03:25 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux root@vps:~# |
無事に起動してssh loginも問題なし。
systemd-resolved
ログを確認するとDNSの名前解決に失敗したというエラーがいろいろなところで発生していました。blog が稼働しているサーバではドメインの権威サーバ 及び 内側からのキャッシュリゾルバとして bind9 が稼働しています。
いろいろと確認していくと 権威サーバとして 外部からの問い合わせにはちゃんと答えているが、サーバ内部のプロセスのクエリーには失敗を返しています。
/etc/resolv.conf
を調べると妙なところへsymlinkが貼られていて 127.0.0.53
というアドレスを見に行くようになっていました。これらは systemd-resolved
サービスで管理されていて内部的にキャッシュを持ち、名前解決を高速化する仕組みだそうです。NetworkManager を利用していると色々便利らしいのですが、こういうところは自分で管理したいのです。
それに、このサーバではbind9 を 内部キャッシュとして利用しているので、こんな仕組みは不要です。
systemd-resolved
サービスを無効にして、resolv.conf を手で書きました。
1 2 3 4 5 6 7 8 |
root@vps:/etc/resolvconf# systemctl |grep systemd-resolved systemd-resolved.service loaded active running Network Name Resolution root@vps:/etc/resolvconf# systemctl stop systemd-resolved root@vps:/etc/resolvconf# systemctl disable systemd-resolved Removed /etc/systemd/system/multi-user.target.wants/systemd-resolved.service. Removed /etc/systemd/system/dbus-org.freedesktop.resolve1.service. root@vps:/etc/resolvconf# rm /etc/resolv.conf root@vps:/etc/resolvconf# vi /etc/resolv.conf |
php-fpm の path 変更
今までの php7.4 から php8.1 へ変わったので当然pathが異なってエラーをはいていました。
nginx で 時々SSL通信が切断される
このサーバでは HTTP(s)の受けに nginx を利用しています。nginx の エラーログを見ているとSSL通信が切断されたというエラーが時々記録されていました。
1 2 3 |
2022/08/13 02:32:47 [crit] 2624#2624: *46 SSL_read() failed (SSL: error:0A000126:SSL routines::unexpected eof while reading) while waiting for request, client: xx.xx.xx.xx, server: 0.0.0.0:443 2022/08/13 02:33:38 [crit] 2624#2624: *77 SSL_read() failed (SSL: error:0A000126:SSL routines::unexpected eof while reading) while processing HTTP/2 connection, client: xx.xx.xx.xx, server: 0.0.0.0:443 2022/08/13 02:33:39 [crit] 2624#2624: *83 SSL_read() failed (SSL: error:0A000126:SSL routines::unexpected eof while reading) while keepalive, client: xx.xx.xx.xx, server: 0.0.0.0:443 |
毎回ではないのでググってみると、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 へ上げてみるとエラーは解消されました。
1 2 |
root@vps:~# nginx -version nginx version: nginx/1.22.0 |
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バージョンを上げたりはしないと思いますが、やっぱり事前の検証はしっかりしないとダメということですね。