LTS Enablement Stacksって何だ?

本日なんかおかしな挙動をしてたXセッションを裏から操作するために、Ctrl+Alt+F3とかでコンソール操作を試みていたところ、

ubuntu login: xxx
password:
 
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.13.0-39-generic x86_64)
 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0のアップデートはすぐに適用されます。

Your Hardware Enablement Stack (HWE) is supported until April 2025.
最終ログイン: 2022/04/01 (金) 00:00:00 JST 日時 pts/0
xxx@ubuntu:~$

ここで「Your Hardware Enablement Stack (HWE) is supported until April 2025.」というメッセージに気付きました。今まで見過ごしていたのか、今日初めて出てきたのか知りませんが、これの意味が分からずにモヤっとします。今回はこれを調べてみました。

HWEって何だ?

まずHardware Enablement Stackなるものの意味が分かりません。ググってみると、

https://wiki.ubuntu.com/Kernel/LTSEnablementStack

あたりにLTS enablement = Hardware Enablementと同じ意味だとあります。以下、上記URLに書いてある内容ですが、HWEスタックとは、LTSリリースにカーネルとXだけ新しいバージョンにしたもののことです。そしてカーネルとXが元のバージョンのままのものをGA (General Availability) スタックと呼びます。LTS以外は今回説明の対象としません。

Ubuntuは18.04までは基本的にGAスタックがデフォルトで、ユーザーが入れない限りはGAスタックが使用されます。Ubuntu 20.04からはDesktop版のデフォルトがHWEスタックで、Server版のデフォルトがGAスタックになります。

例えば…

HWEスタックの20.04では2022年4月1日現在、カーネルのバージョンが5.13.0-39になっています。他方GAスタックの20.04では5.4.0-107になります。

HWEスタックの20.04ではカーネル(とX)のバージョンが21.10と同じになるということです。

HWE/GAスタックの確認方法

インストールしたパッケージを見て直接確認

手動インストールしたカーネルのパッケージ名を調べます。

$ LC_ALL="C" apt search '^linux-generic' | grep '\[installed\]'

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

linux-generic/focal-updates,focal-security,now 5.4.0.107.111 amd64 [installed]
$

この例はGAスタックの例で、パッケージとしてはlinux-genericが入っていることが分かります。

HWEスタックの場合は、こうなります。

$ LC_ALL="C" apt search '^linux-generic' | grep '\[installed\]'

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

linux-generic-hwe-20.04/focal-updates,focal-security,now 5.13.0.39.44~20.04.24 amd64 [installed]
$

パッケージとしてはlinux-generic-hwe-20.04が入っていることが分かります。

hwe-support-status –verboseで確認

当該コマンドを実行するだけです。

HWEスタックの場合

Your Hardware Enablement Stack (HWE) is supported until 4月 2025.

GAスタックの場合

You are not running a system with a Hardware Enablement Stack. Your system is supported until 4月 2025.

メッセージ出力の仕組み

用語の意味は分かりましたが、次は今まで気付かなかった理由も含め、このメッセージの意味するところを調べるため、コードを追っていきます。

ログインメッセージをググってみると、motdという単語が出てきます。Ubuntuの場合、以下のマニュアルページにあるとおり、

http://manpages.ubuntu.com/manpages/focal/man5/update-motd.5.html

/etc/update-motd.d/*のスクリプトで動的に生成されたメッセージが出力されます。この中で今回のメッセージは、/etc/update-motd.d/95-hwe-eolが出力しているようです。

このスクリプトでは/usr/lib/update-notifier/update-motd-hwe-eolを呼んでいるだけなので、

#!/bin/sh

if [ -x /usr/lib/update-notifier/update-motd-hwe-eol ]; then
    exec /usr/lib/update-notifier/update-motd-hwe-eol
fi

この中を見てみると…

#!/bin/sh -e
...
    if type systemd-detect-virt > /dev/null 2>&1  && systemd-detect-virt -q -c; then
        exit
    fi
...
# check time when we did the last update check
stamp="/var/lib/update-notifier/hwe-eol"
...
# output something for update-motd
if [ "$NEED_EOL_CHECK" = "yes" ]; then
    {
        # the script may exit with status 10 when a HWE update is needed
        /usr/bin/hwe-support-status || true
    } > "$tmpfile"
    mv "$tmpfile" "$stamp"
fi

# output what we have (either cached or newly generated)
cat "$stamp"

systemd-detect-virtでコンテナでないことを確認し、/usr/bin/hwe-support-statusを実行して出力しています。パッケージが更新されない限りキャッシュされた結果(/var/lib/update-notifier/hwe-eol)を出力する分ちょっと長くなっていますが、やりたいことはhwe-support-statusだけのようです。

hwe-support-statusの中身はpythonスクリプトで、基本的にHWEスタックのサポート期限切れを検出するためのツールのようです。

...
def advice_about_hwe_status(unsupported_hwe_packages, supported_hwe_packages,
                            installed_packages, has_update_manager, today,
                            verbose):
...
    elif supported_hwe_packages:
        print(Messages.HWE_SUPPORTED)
    elif verbose:
        print(
            _("You are not running a system with a Hardware Enablement Stack. "
              "Your system is supported until %(month)s %(year)s.") % {
                  'month': LTS_EOL_DATE.strftime("%B"),
                  'year': LTS_EOL_DATE.year})
...
if __name__ == "__main__":
...
    if not options.show_all_unsupported and not options.show_replacements:
        advice_about_hwe_status(
            unsupported_hwe_packages, supported_hwe_packages,
            installed_packages, has_update_manager, today,
            options.verbose)
...

中を読む限りHWEスタックでない場合は原則何も出力しません。HWEスタックである場合は、日付をチェックし、期限切れのパッケージをチェックし、必要に応じてアドバイスを表示してくれます(最初は期限の表示だけ)。

メッセージの意味

HWEスタック利用者に該当するパッケージがサポート期限切れする前に必要な対処を促す意味のメッセージです。

HWEスタックはもともと、新しいハードウェアを古いLTSシステムで使いたいときに使用するものだったようで、それが20.04からデスクトップ版だけデフォルトになったようです。ただし古いシステムが無限に新しいハードウェアをサポートするわけではなく期限が決まっています。この期限がLTSのサポート期限と前後する可能性があるためにこのような仕組みがあるのではないかと推測しています

なぜ気付かなかったのか?

普段使っているVirtualBox上のLubuntu20.04は確か最小構成から入れてGAスタックになっていて、このサーバーもUbuntuですがServer版なのでGAスタックで、唯一HWEスタックだったUbuntu20.04デスクトップ版(native)でも普段はデスクトップログインばかりで、ログインメッセージを読む機会がほとんどなく、気付かなかったということのようです。

未分類ubuntu

Posted by first_user