早いもので 2020 年もあと1週間となりました。
今年はコロナであまり外出しないことになりそうで、思いがけず時間に余裕ができました。
というわけでこういう心に余裕があるときに、重い腰を上げて FreeBSD をアップグレードしたいと思います。
12.1-RELEASE は間もなく EOLを迎えますしね。
しかし、重い腰を上げないとアップグレードのやる気が起きないというのがどうも・・・
freebsd-update
によって多少ラクになったとはいえ、Ubuntu のお手軽さに比べるとまだまだです。
そして今回も案の定(?)トラブルが発生しましたので、同じ内容でハマったみなさまのためにメモを残しておきたいと思います。
アップグレードの流れ
現状の構成はこうです。
環境 | バージョン |
ホスト | 12.1-RELEASE |
JAIL1 | 12.1-RELEASE |
JAIL2 | 12.1-RELEASE |
以前こちらでセットアップした環境です。
これらを全部 12.2-RELEASE へアップグレードしたい、ということになりますが、そういえばそもそも FreeBSD 本体と JAIL のバージョン関係をどうすべきか、というのをちゃんと習ったことがないので、改めて確認してみました。
14.5. Updating Multiple Jails によると、
1. The first step is to upgrade the host system. Then, create a new temporary read-only template in
FreeBSD Handbook - 14.5. Updating Multiple Jails - 14.5.3. Upgrading/home/j/mroot2
.
とのことで先にホスト側をアップグレードせよ、となっています。
まぁ、そうですよね。
また iocage のドキュメントでは
Note
It is recommended to keep the iocage host and jails RELEASE synchronized.
iocage 1.2 documentation - Upgrading Jails
と記載があります。
ホスト側のバージョンをアップグレードしたからと言って、JAIL 側も絶対にアップデートしなければならないということはなさそうです。
とはいえ現状 JAIL 側も 12.1-RELEASE で間もなく EOL となりますので、今回は JAIL 側もアップデートします。
というわけで、ホストのアップグレード→JAIL のアップグレードという流れとなります。
ホストのアップグレード
freebsd-update
でアップグレードを実行します。
今回は 12.2-RELEASE へのアップグレードなので、-r 12.2-RELEASE
を指定して実行します。
# freebsd-update -r 12.2-RELEASE upgrade
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching metadata signature for 12.1-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 1 metadata files... done.
Inspecting system... done.
The following components of FreeBSD seem to be installed:
kernel/generic kernel/generic-dbg src/src world/base world/doc
world/lib32
The following components of FreeBSD do not seem to be installed:
world/base-dbg world/lib32-dbg
Does this look reasonable (y/n)? y
内容に問題がないことを確認の上、y
を入力します。
ダウンロードが始まります。
かなり時間がかかるので、コーヒーでも淹れに行きましょう。
Fetching metadata signature for 12.2-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 1 metadata patches. done.
Applying metadata patches... done.
Fetching 1 metadata files... done.
Inspecting system... done.
Fetching files from 12.1-RELEASE for merging... done.
Preparing to download files... done.
Fetching 46009 patches.....10....20....(snip)....45990....46000.... done.
Applying patches...
Applying patches... done.
Fetching 12217 files... ....10....20....(snip)....12200....12210... done.
Attempting to automatically merge changes in files... done.
ダウンロードが完了すると、現在のシステムの設定ファイルとの差分が出てくるので、問題がないか1つ1つ確認していきます。
自分の環境では、tests
ユーザー・グループ(977:977)が追加される程度の差分しかありませんでした。
ユーザー・グループの変更ということで、それ関連のファイルの diff が4つほど出ました。
特に問題はなさそうなので順次 y
を入れていきます。
The following changes, which occurred between FreeBSD 12.1-RELEASE and
FreeBSD 12.2-RELEASE have been merged into /etc/group:
--- current version
+++ new version
@@ -1,6 +1,6 @@
-# $FreeBSD: releng/12.1/etc/group 336525 2018-07-19 23:55:29Z ian $
+# $FreeBSD: releng/12.2/etc/group 359447 2020-03-30 17:07:05Z brooks $
#
(snip)
Does this look reasonable (y/n)? y
The following changes, which occurred between FreeBSD 12.1-RELEASE and
FreeBSD 12.2-RELEASE have been merged into /etc/master.passwd:
--- current version
+++ new version
@@ -1,6 +1,6 @@
-# $FreeBSD: releng/12.1/etc/master.passwd 337882 2018-08-15 23:18:34Z brd $
+# $FreeBSD: releng/12.2/etc/master.passwd 359447 2020-03-30 17:07:05Z brooks $
#
(snip)
Does this look reasonable (y/n)? y
The following changes, which occurred between FreeBSD 12.1-RELEASE and
FreeBSD 12.2-RELEASE have been merged into /etc/passwd:
--- current version
+++ new version
@@ -1,6 +1,6 @@
-# $FreeBSD: releng/12.1/etc/master.passwd 337882 2018-08-15 23:18:34Z brd $
+# $FreeBSD: releng/12.2/etc/master.passwd 359447 2020-03-30 17:07:05Z brooks $
#
(snip)
Does this look reasonable (y/n)? y
The following changes, which occurred between FreeBSD 12.1-RELEASE and
FreeBSD 12.2-RELEASE have been merged into /etc/ssh/sshd_config:
--- current version
+++ new version
@@ -1,7 +1,7 @@
# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
-# $FreeBSD: releng/12.1/crypto/openssh/sshd_config 338561 2018-09-10 16:20:12Z des $
+# $FreeBSD: releng/12.2/crypto/openssh/sshd_config 360313 2020-04-25 15:38:48Z emaste $
(snip)
Does this look reasonable (y/n)? y
The following files are affected by updates. No changes have
been downloaded, however, because the files have been modified
locally:
(snip)
The following files will be removed as part of updating to
12.2-RELEASE-p2:
(snip)
The following files will be added as part of updating to
12.2-RELEASE-p2:
(snip)
To install the downloaded upgrades, run "/usr/sbin/freebsd-update install".
# freebsd-update install
Installing updates...
Kernel updates have been installed. Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.
# reboot
言われた通り、再起動してから再度 freebsd-update
を実行します。
# freebsd-update install
Installing updates...
#
2~3分かかりましたが、特に何事もなく終了しました。
JAIL のアップグレード
まずは iocage fetch
で最新の FreeBSD を取得します。
# iocage fetch
[0] 11.2-RELEASE (EOL)
[1] 11.3-RELEASE (EOL)
[2] 11.4-RELEASE
[3] 12.0-RELEASE (EOL)
[4] 12.1-RELEASE
[5] 12.2-RELEASE
Type the number of the desired RELEASE
Press [Enter] to fetch the default selection: (12.2-RELEASE)
Type EXIT to quit: 5
Fetching: 12.2-RELEASE
Downloading: MANIFEST [####################] 100%
Downloading: base.txz [####################] 100%
Downloading: lib32.txz [####################] 100%
Downloading: src.txz [####################] 100%
Extracting: base.txz...
Extracting: lib32.txz...
Extracting: src.txz...
* Updating 12.2-RELEASE to the latest patch level...
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching public key from update1.freebsd.org... done.
Fetching metadata signature for 12.2-RELEASE from update1.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 64 patches.....10....20....30....40....50....60.. done.
Applying patches... done.
The following files will be updated as part of updating to
12.2-RELEASE-p2:
:
(snip)
:
done.
iocage upgrade で 404 エラー
それからアップグレードを実行するのですが、ここで問題発生。
# iocage upgrade -r 12.2-RELEASE ALL
Traceback (most recent call last):
File "/usr/local/bin/iocage", line 10, in <module>
sys.exit(cli())
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 764, in __call__
return self.main(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 717, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/iocage_cli/upgrade.py", line 40, in cli
ioc.IOCage(jail=jail, skip_jails=skip_jails).upgrade(release)
File "/usr/local/lib/python3.7/site-packages/iocage_lib/iocage.py", line 2168, in upgrade
callback=self.callback
File "/usr/local/lib/python3.7/site-packages/iocage_lib/ioc_upgrade.py", line 120, in upgrade_jail
with urllib.request.urlopen(f) as fbsd_update:
File "/usr/local/lib/python3.7/urllib/request.py", line 222, in urlopen
return opener.open(url, data, timeout)
File "/usr/local/lib/python3.7/urllib/request.py", line 531, in open
response = meth(req, response)
File "/usr/local/lib/python3.7/urllib/request.py", line 641, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/local/lib/python3.7/urllib/request.py", line 569, in error
return self._call_chain(*args)
File "/usr/local/lib/python3.7/urllib/request.py", line 503, in _call_chain
result = func(*args)
File "/usr/local/lib/python3.7/urllib/request.py", line 649, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found
調べてみると・・・ありました。
というかこれ今日じゃん。
クリスマスだというのに今まさにリアルタイムで同じ問題にあっている人がいらっしゃるようです。
これも回答してるのは一昨日とかですね・・・
というわけで以下のように修正します(py37-iocage をインストールしなおしてみても変わらないようなので、手動で変更)。
--- /usr/local/lib/python3.7/site-packages/iocage_lib/ioc_upgrade.py.orig 2020-12-25 12:43:43.310559000 +0900
+++ /usr/local/lib/python3.7/site-packages/iocage_lib/ioc_upgrade.py 2020-12-25 12:44:29.521618000 +0900
@@ -110,9 +110,9 @@ class IOCUpgrade(iocage_lib.ioc_json.IOCZFS):
self.__upgrade_check_conf__()
- f_rel = f'{self.new_release.rsplit("-RELEASE")[0]}.0'
+ f_rel = f'{self.new_release.rsplit("-RELEASE")[0].split(".")[0]}'
f = 'https://raw.githubusercontent.com/freebsd/freebsd' \
- f'/release/{f_rel}/usr.sbin/freebsd-update/freebsd-update.sh'
+ f'/stable/{f_rel}/usr.sbin/freebsd-update/freebsd-update.sh'
tmp = None
try:
というわけで再度実行。今度は通ったようです。
# iocage upgrade -r 12.2-RELEASE ALL
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching metadata signature for 12.1-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 1 metadata files... done.
Inspecting system... done.
The following components of FreeBSD seem to be installed:
src/src world/base world/doc world/lib32
The following components of FreeBSD do not seem to be installed:
world/base-dbg world/lib32-dbg
Does this look reasonable (y/n)?
Fetching metadata signature for 12.2-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 1 metadata patches. done.
Applying metadata patches... done.
Fetching 1 metadata files... done.
Inspecting system... done.
Fetching files from 12.1-RELEASE for merging... done.
Preparing to download files... done.
Fetching 44247 patches.....10....20........44240... done.
Applying patches...
Fetching 12183 files... ....10....20........12180. done.
Attempting to automatically merge changes in files... done.
ここからホスト環境で実行した場合と同様に、差分確認が入ります。これは同じなので省略。
差分の確認・マージが行われると、その後のインストール(freebsd-update install
)は勝手に行われます。
To install the downloaded upgrades, run "/tmp/tmpzypfmn7s install".
Installing updates...
Kernel updates have been installed. Please reboot and run
"/tmp/tmpzypfmn7s install" again to finish installing updates.
Installing updates...
(snip)
done.
JAIL1 successfully upgraded from 12.1-RELEASE-p12 to 12.2-RELEASE-p2!
すると間髪入れずに次の JAIL の更新が始まります。
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching metadata signature for 12.1-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Inspecting system... done.
The following components of FreeBSD seem to be installed:
src/src world/base world/doc world/lib32
The following components of FreeBSD do not seem to be installed:
world/base-dbg world/lib32-dbg
Does this look reasonable (y/n)? y
またダウンロードから始まるようです・・・iocage って JAIL 間で共通化されていないのかな?
Fetching metadata signature for 12.2-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 1 metadata patches. done.
Applying metadata patches... done.
Fetching 1 metadata files... done.
Inspecting system... done.
Fetching files from 12.1-RELEASE for merging... done.
Preparing to download files...
done.
Fetching 44282 patches.....10....20....
ここから先は同じなので省略しますが、1つ1つの実行にそれなりに時間がかかるので、iocage upgrade -r 12.2-RELEASE ALL
のように ALL 指定ではなく、個々の JAIL を指定して実行するようにした方がいいかもしれません。
まとめ
というわけで freebsd-update upgrade
と iocage upgrade
を使った FreeBSD のバージョンアップグレード方法でした。
以前よりだいぶラクになったとは言え、なかなかこなれてこないですね・・・
今回更新したのは自前の WordPress 環境だったのですが、そろそろ別サーバーに移すことも考えておこうと思います。
コメント