iocage で FreeBSD jail 環境をアップグレードする

freebsd

早いもので 2020 年もあと1週間となりました。

今年はコロナであまり外出しないことになりそうで、思いがけず時間に余裕ができました。

というわけでこういう心に余裕があるときに、重い腰を上げて FreeBSD をアップグレードしたいと思います。

12.1-RELEASE は間もなく EOLを迎えますしね。

しかし、重い腰を上げないとアップグレードのやる気が起きないというのがどうも・・・

freebsd-update によって多少ラクになったとはいえ、Ubuntu のお手軽さに比べるとまだまだです。

そして今回も案の定(?)トラブルが発生しましたので、同じ内容でハマったみなさまのためにメモを残しておきたいと思います。

アップグレードの流れ

現状の構成はこうです。

環境バージョン
ホスト12.1-RELEASE
JAIL112.1-RELEASE
JAIL212.1-RELEASE

以前こちらでセットアップした環境です。

FreeBSD 12.1-RELEASE で zfs と iocage を使って VIMAGE で jail を設定する
FreeBSD 12.1-RELEASE で ZFS と iocage をセットアップして、jail をラクラク管理するための環境を構築するための方法についてのメモです。

これらを全部 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 /home/j/mroot2.

FreeBSD Handbook - 14.5. Updating Multiple Jails - 14.5.3. Upgrading

とのことで先にホスト側をアップグレードせよ、となっています。

まぁ、そうですよね。

また 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

調べてみると・・・ありました。

TN 12.0-U1 - Can't upgrade jail releases
So a few days ago, I upgraded my FreeNAS 11.3-Usomething (U4.1, I think) box to TN 12.0-U1. The upgrade was uneventful, jails are still working, shares are sti...

というかこれ今日じゃん。

クリスマスだというのに今まさにリアルタイムで同じ問題にあっている人がいらっしゃるようです。

Unhandled exception when upgrading to 11.4-BETA1 · Issue #1172 · iocage/iocage
Today I tried to upgrade an 11.3-RELEASE-p7 jail to 11.4-BETA1. But iocage crashed with an unhandled exception 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 upgradeiocage upgrade を使った FreeBSD のバージョンアップグレード方法でした。

以前よりだいぶラクになったとは言え、なかなかこなれてこないですね・・・

今回更新したのは自前の WordPress 環境だったのですが、そろそろ別サーバーに移すことも考えておこうと思います。

コメント

タイトルとURLをコピーしました