Poem/LXCUbuntu

Newest

概要

  • 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は、元の/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 が馴染めなかったりする。・・・人によるんかな