Poem/LXCUbuntu
概要†
- LXCコンテナ上で動かしているUbuntu 22.04LTS (jammy) を 24.04LTS (noble) にアップグレードします。
- 実際のアップグレードパスの提供は8/15日以降らしいのですが、デバッグオプション(-d)を使って、一足先にやっつけます。
- ホストOSは、最初から Ubuntu 24.04LTSであることを仮定します。
方法†
- 説明のため、Ubuntu 22.04LTS コンテナの名称は jammy としておきます。
- (1) まず、configファイルを編集します。
- text:/var/lib/lxc/jammy/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 が馴染めなかったりする。・・・人によるんかな