概要
- LXCコンテナ上で動かしているUbuntu 22.04LTS (jammy) を 24.04LTS (noble) にアップグレードします。
- 実際のアップグレードパスの提供は8/15日以降らしいのですが、デバッグオプション(-d)を使って、一足先にやっつけます。
- ホストOSは、最初から Ubuntu 24.04LTSであることを仮定します。
方法
-
説明のため、Ubuntu 22.04LTS コンテナの名称は jammy としておきます。
-
(1) まず、configファイルを編集します。
・・・
# Container specific configuration
lxc.apparmor.profile = generated
lxc.apparmor.allow_nesting = 1
lxc.rootfs.path = dir:/var/lib/lxc/jammy/rootfs
lxc.uts.name = jammy
・・・
「# Container specific configuration」のところに、
lxc.apparmor.profile = generated と
lxc.apparmor.allow_nesting = 1
を追記しておいてください。
- (2) jammyのLXCコンテナを起動します。
# lxc-start -d -n jammy
- (3) ssh もしくは lxc-attach -n jammy でLXCゲストに接続します。
- (4) # apt update ; apt dist-upgrade したのち、
# do-release-upgrade -d
で、Ubuntu を一気に22.04 → 24.04 にアップグレードします。
- (5) 成功。
自分の環境では、うまくいきました。
ダメパターン
-
以前は、何度やってもコンテナが落ちてしまったり、アップグレードに失敗してました。
-
途中で失敗するパターンとして、i386のmultilibが含まれていてアップグレード先がないので落ちる場合がありました。(あらかじめi386はお掃除しておきましょう。あとで入れられます)
-
また、do-release-upgrade で一気に22.04 → 24.04 することが出来ず、
-
/etc/update-manager/release-upgradesファイルを編集し、 一度 LTS から prompt=normal に戻して、22.04 → 23.10 → 24.04 を試みるもうまくいかず・・・
-
コンテナが落ちる原因は、configに2行足すことで解決しました。
-
Linuxのディレクトリ構成が usr merge していない場合は libcのdpkg-divertで失敗する可能性があります。( https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/2072532 )
-
コンテナホストのLinuxは、元の/etc/の内容等をバックアップしておいたのち、新規に Ubuntu 24.04 LTSを導入して設定したほうが楽かもしれません。
(というか物理マシンの22.04 → 24.04 はまだ成功していないので・・・)
.
7/24追記
- 物理マシンの22.04LTS → 24.04LTSへの do-release-upgrade -d は成功しました。
.
ホストOSとコンテナゲストOSのVersionを合わせる必要性について:
- コンテナゲスト側で ip6tables を使用する場合は、ホスト24.04LTSとゲスト22.04LTSの組み合わせでは動作しません。
- 理由は、ご想像の通りで、カーネルが24.04のものなのに、ip6tablesのコマンドやカーネルモジュール(ライブラリ)が(ゲストの)22.04になって非互換になるためです。たまたまiptablesのほうは動作します。
そもそも LXC って、何?
- え?そっから????
ここを見る
https://qiita.com/propella/items/18165c933bd485c2c0ae
-
Dockerとの違いを聞かれているけれど、DockerとLXCは(用途が)全然違うわ。
-
:
-
Dockerは、Linuxのアプリ(サーバーソフト。nginxとかredmineとかmysql)をLinux のホストOSからいちいち分離した環境で動かすインフラ
-
(なんでサーバーソフトをそれぞれ分離OS環境上で動かすのかというと・・・セキュリティ向上のためらしいけど、よくわからん)
-
LXC は、Dockerよりもずっと前から存在したもので、仮想化技術(バーチャルマシン)を使用せずに、ホストLinux上でゲストLinuxを動かすツール。
-
Linuxのユーザーランド(/(ルート) ファイルシステムと思ってよい)だけを分離するものとして、chroot というものが太古のLinux(unix)からあったんだけど、それに加えてプロセス名前空間を分離したりネットワーク環境を分離したりして、まるで軽量VMのように、ホストLinux上でゲストLinuxが丸ごと動いているように見える・・・(Dockerと一緒じゃん)
-
自分的には、/var/lib/lxc/<ゲストLinux名称>/rootfs/ 以下にゲストのファイルシステムが全部見れたり、それ以外にmount出来たりするのが便利。
-
逆にDockerの union fs が馴染めなかったりする。・・・人によるんかな