目次にジャンプページナビゲーションにジャンプ: 前のページ[アクセスキーp]/次のページ[アクセスキーn]
documentation.suse.com / transactional-updateコマンドを使用したSLE Microの管理

transactional-updateコマンドを使用したSLE Microの管理

発行日: 12/12/2024
概要

transactional-updateコマンドを使用すると、読み込み専用ファイルシステムを変更できます。変更は別個のスナップショットで実行され、そのスナップショットでブートするまで実行中のシステムには影響しません。

目的

SLE Microとその更新を管理し、更新の失敗によるシステムのダウンタイムのリスクを最小限に抑えながら、簡単にロールバックできるようにする必要があります。

所要時間

transactional-updateコマンドの理解に30分ほどを要します。

目標

transactional-updateの仕組みと、これを使用してシステムを管理する方法を理解します。

要件
  • SLE Microの実行中のインスタンス。

  • root特権。

1 トランザクション更新

1.1 トランザクション更新とは

ベースオペレーティングシステムの安定性と一貫性を維持するため、SLE Microでは、読み込み専用ルートファイルシステムを使用しています。したがって、たとえばzypperコマンドを使用しても、ルートファイルシステムを直接変更することはできません。SLE Microでは、ルートファイルシステムに1つ以上の変更を適用可能な「トランザクション更新」が代わりに導入されています。

transactional-updateのデフォルトの動作では、変更のたびに現在のルートファイルシステムから新しいスナップショットが作成されます。この変更を適用するにはホストの再起動が必要です。再起動することなくtransactional-updateコマンドを複数回実行して、スナップショットにさらに変更を加えることはできません。このような操作を行うと、以前のスナップショットの変更を含まない独立した別個のスナップショットが作成されます。

1.2 トランザクション更新の動作

パッケージのインストール、何らかの更新、パッチの適用といったシステムの変更操作でtransactional-updateコマンドを呼び出すたびに、次のアクションが実行されます。

手順 1: ルートファイルシステムの変更
  1. 現在のルートファイルシステムまたは指定したスナップショットから、新しい読み書きスナップショットが作成されます。

  2. すべての変更が適用されます(更新、パッチ、パッケージのインストール)。

  3. このスナップショットが読み込み専用モードに切り替わります。

  4. 変更が正常に適用されると、新しいルートファイルシステムのスナップショットがデフォルトとして設定されます。

  5. 再起動すると、新しいスナップショットでシステムがブートします。

1.3 トランザクション更新の利点

  • アトミックであることから、更新は正常に完了した場合にのみ適用されます。

  • 変更は別個のスナップショットに適用されるため、実行中のシステムには影響しません。

  • 変更を容易にロールバックできます。

1.4 transactional-updateコマンド内の環境

transactional-updateコマンドを実行するたびに、新しいスナップショットが変更されます。スナップショットの環境は、transactional-updateコマンドを実行したシェルの環境と異なることがあります。たとえば、現在の作業ディレクトリ($PWD)が、transactional-updateを実行するディレクトリではなく、/に設定されていることがあります。

スナップショットから/varディレクトリにアクセスすることはできません。このディレクトリはスナップショットにも含まれません。ただし、スナップショットからは除外されていても、transactional-update環境でアクセスできるディレクトリもあります(/rootディレクトリなど)。

2 transactional-updateコマンドの使用

transactional-updateコマンドでは、更新のアトミックなインストールまたは削除が可能です。すべてが正常にインストールされている場合にのみ更新が適用されます。transactional-updateは、システムのスナップショットを作成し、それを使用してシステムを更新します。このスナップショットは後で復元できます。再起動後にのみ、すべての変更がアクティブになります。

transactional-updateコマンドの構文は次のとおりです。

transactional-update [option] [general_command] [package_command] standalone_command
注記
注記: 引数を指定しないtransactional-updateの実行

transactional-updateコマンドの実行でどのコマンドもオプションも指定しないと、システム自体が更新されます。

使用できるコマンドパラメータについて、次で詳しく説明します。

transactional-updateオプション
--interactive, -i

パッケージのコマンドで指定すると、対話モードをオンにすることができます。

--non-interactive, -n

パッケージのコマンドで指定すると、非対話モードをオンにすることができます。

--continue [number], -c

--continueオプションでは、再起動せずにルートファイルシステムに複数の変更を適用できます。詳細については、3項 「再起動せずに複数の変更を適用する方法」を参照してください。

--continueオプションには、既存のスナップショットを新しいスナップショットのベースとして選択できる便利な機能もあります。次の例では、transactional-updateを実行して、スナップショット13に基づいてスナップショットに新しいパッケージをインストールしてから、もう一度実行して別のパッケージをインストールする方法を示しています。

> sudo transactional-update pkg install package_1
> sudo transactional-update --continue 13 pkg install package_2
--no-selfupdate

transactional-updateの自己更新を無効にします。

--drop-if-no-change, -d

ルートファイルシステムに変更がなかった場合、transactional-updateで作成されたスナップショットを破棄します。/etcディレクトリに変更があった場合、その変更を現在のファイルシステムにマージします。

--quiet

stdouttransactional-updateコマンドを出力しません。

--help, -h

transactional-updateコマンドのヘルプを出力します。

--version

transactional-updateコマンドのバージョンを表示します。

2.1 一般コマンド

このセクションでは、transactional-updateの汎用のコマンドを一覧にします。

grub.cfg

GRUBブートローダ設定ファイルの再構築に使用します。

bootloader

ブートローダを再インストールします。

initrd

initrdの再構築に使用します。

kdump

ハードウェアやストレージを変更する場合に、Kdump initrdの再構築が必要になることがあります。

shell

終了する前に新しいスナップショットで読み書きシェルを開きます。通常、このコマンドはデバッグの目的で使用します。

reboot

transactional-updateコマンドが完了するとシステムを再起動します。

run <command>

指定されたコマンドを新しいスナップショットで実行します。

setup-selinux

対象のSELinuxポリシーをインストールして有効にします。

3 再起動せずに複数の変更を適用する方法

transactional-updateコマンドは、トランザクションシステムのルートファイルシステムに変更を適用します。デフォルトの動作では、変更のたびに現在のルートファイルシステムから新しいスナップショットが作成され、再起動して変更が適用されます。

再起動せずにルートファイルシステムに複数の変更を適用するには、次の各セクションで説明するいくつかのオプションがあります。

3.1 transactional-update --continueオプション

再起動せずに複数の変更を適用するには、--continueオプションを指定したtransactional-updateコマンドを使用します。このコマンドを実行するたびに、それまでのスナップショットに対するすべての変更と新しい変更を収めた別のスナップショットが作成されます。最後のスナップショットにはすべての変更が記録されています。変更を適用するには、システムを再起動します。これにより、最後のスナップショットが新しいルートファイルシステムになります。

3.2 transactional-update runコマンド

通常、transactional-update runコマンドでは単一のコマンドのみが実行されます。ただし、bashなどのコマンドシェルで複数のコマンドを連結すれば、このコマンドを使用して、単一のトランザクションセッションでそれら複数のコマンドを実行できます。次に例を示します。

> sudo transactional-update run bash -c 'ls && date; if [ true ]; then echo -n "Hello "; echo '\''world'\''; fi'
注記
注記

transactional-update runコマンドには、3.3項 「transactional-updateシェル」での説明にあるtransactional-update shellコマンドと同じ制限があります。入力したコマンドが/var/log/transactional-update.logファイルに記録される点のみが異なります。

3.3 transactional-updateシェル

transactional-update shellコマンドは、transactional-update環境でシェルを開きます。このシェルでは、ファイルシステムを変更するLinuxコマンドのほとんどすべてを入力できます。たとえば、zypperコマンドによる複数のパッケージのインストールや、読み込み専用ファイルシステムに属するファイルの変更などができます。また、それまでにtransactional-updateコマンドで指定した変更が正しいことも確認できます。

重要
重要

このトランザクションシェルにはいくつかの制限があります。たとえば、systemdコマンドによるサービスの開始操作と停止操作や、マウントされていない/varパーティションの変更などはできません。また、シェルセッションで入力したコマンドは/transactional-update.logファイルに記録されません。

ファイルシステムに対するすべての変更は、単一のスナップショットに収められます。ファイルシステムの変更が完了し、exitコマンドを使用してシェルを終了したら、変更を適用するためにホストを再起動する必要があります。

4 スナップショットのクリーンアップの実行

transactional-updateを使用して、未使用のファイルシステムスナップショットや、参照されていない/etcオーバーレイディレクトリをクリーンアップできます。

transactional-updateは、次のクリーンアップコマンドを認識します。

cleanup-snapshots

このコマンドは、すべての未使用スナップショットにSnapperの削除対象としてマークを付けます。

cleanup-overlays

このコマンドは、/var/lib/overlayディレクトリ内にある/etcのすべての未使用オーバーレイレイヤを削除します。

cleanup

このコマンドは、cleanup-snapshotsコマンドとcleanup-overlaysコマンドを組み合わせたものです。

4.1 クリーンアップの仕組み

transactional-update cleanupコマンドを実行すると、クリーンアップアルゴリズムを持たない、すべての古いスナップショットにクリーンアップアルゴリズムが設定されます。すべての重要なスナップショットにもマークが付けられます。このコマンドを使用すると、/var/lib/overlay内の参照されていない(したがって未使用の)すべての/etcオーバーレイディレクトリも削除されます。

numberクリーンアップアルゴリズムが設定されたスナップショットは、/etc/snapper/configs/rootで次のパラメータによって設定されているルールに従って削除されます。

NUMBER_MIN_AGE

自動的に削除できるスナップショットの最小保持期間(秒単位)を定義します。

NUMBER_LIMIT/NUMBER_LIMIT_IMPORTANT

保存するスナップショットの最大数を定義します。指定した最大値を超えるスナップショットは、クリーンアップアルゴリズムによって削除されます。スナップショットとファイルシステムの領域は考慮されません。また、最小値を超えるスナップショットも、スナップショットとファイルシステムの制限に達するまで削除されます。

スナップショットのクリーンアップは、systemdによっても定期的に実行されます。

5 製品の登録

transactional-update registerコマンドを使用して、製品の登録とそのサブスクリプションの管理に関するすべてのタスクを処理できます。以下のオプションを指定できます。

--list-extensions

システムで利用可能な拡張機能を一覧表示します。この出力を使用して、製品のアクティベーションで使用する製品識別子を探し出すことができます。

-p, --product

アクティベーションの対象とする製品を指定できます。製品識別子の形式は<name>/<version>/<architecture>です。たとえば、sle-module-live-patching/15.3/x86_64と指定します。対応するコマンドの形式は次のとおりです。

> sudo transactional-update register -p sle-module-live-patching/15.3/x86_64
-r, --regcode

指定された登録コードでシステムを登録します。このコマンドは、サブスクリプションを登録し、ソフトウェアリポジトリを有効にします。

-d, --de-register

システムの登録を解除します。-pオプションが指定されている場合は拡張機能の登録を解除します。

-e, --email

SUSE Customer Centerで登録に使用する電子メールアドレスを指定します。

--url

登録サーバのURLを指定します。URLは設定に保存され、以降のコマンド呼び出しで使用されます。次に例を示します。

> sudo transactional-update register --url https://scc.suse.com
-s, --status

現在の登録ステータスをJSON形式で表示します。

--write-config

指定されたオプション値を/etc/SUSEConnect設定ファイルに書き込みます。

--cleanup

古いシステム資格情報を削除します。

--version

バージョンを出力します。

--help

コマンドの使用方法を表示します。

6 ソフトウェアパッケージの管理

transactional-updateを使用して、ソフトウェアパッケージをインストール、更新、または削除できます。

SLE Microでは、製品の登録後に利用可能なリポジトリからソフトウェアパッケージを取得します。

transactional-updateでは、次のコマンドを使用してソフトウェアパッケージを管理します。

ヒント
ヒント: pkgコマンドとZypperのオプション

transactional-update pkgコマンドでは、使用するサブコマンドに対応するZypperのオプションを使用できます。たとえば、transactional-update pkg installは、zypper installが理解するすべてのオプションを理解します。

pkg install

zypper installコマンドを使用して、使用可能なチャネルから個々のパッケージをインストールします。このコマンドは、Program Temporary Fix (PTF) RPMファイルをインストールするために使用することもできます。このコマンドのデフォルトオプションは--interactiveです。

> sudo transactional-update pkg install package_name

または

> sudo transactional-update pkg install rpm1 rpm2

ソフトウェアパターンをインストールするには次のように指定します。

> sudo transactional-update pkg install -t pattern pattern_name
pkg remove

zypper removeコマンドを使用してアクティブなスナップショットから個々のパッケージを削除します。このコマンドは、PTF RPMファイルを削除するために使用することもできます。このコマンドのデフォルトオプションは--interactiveです。

> sudo transactional-update pkg remove package_name
pkg update

zypper updateコマンドを使用してアクティブなスナップショットから個々のパッケージを更新します。ベースファイルシステムのスナップショットの一部であるパッケージのみを更新できます。このコマンドのデフォルトオプションは--interactiveです。

> sudo transactional-update pkg update package_name
patch

利用可能なパッチを確認してインストールします。このコマンドのデフォルトオプションは--non-interactiveです。

dup

システムをアップグレードします。このコマンドのデフォルトオプションは--non-interactiveです。

up

インストールされているパッケージをより新しいバージョンに更新します。このコマンドのデフォルトオプションは--non-interactiveです。

migration

選択したターゲットにシステムを移行します。通常、SUSE Customer Centerからシステムを登録している場合に、システムのアップグレードに使用します。

7 システムのロールバックの実行

GRUB 2ではbtrfsスナップショットからブートできます。そのため、新しいスナップショットが正しく機能しない場合、機能する古いスナップショットを使用できます。

スナップショットをブートする場合、スナップショットに含まれているファイルシステムの該当部分が読み込み専用でマウントされます。スナップショットから除外されている他のすべてのファイルシステムと該当部分は読み書き可能でマウントされ、変更できます。

ヒント
ヒント: 特定のインストール状態へのロールバック

システムの初期インストールの終了時に、ブート可能な初期スナップショットが作成されます。このスナップショットをブートすることで、いつでもその状態に戻ることができます。スナップショットは、first root file systemという記述で識別できます。

システムロールバックを実行するには2つの方法があります。

現在のスナップショットが機能している場合は、次のシステムロールバック手順を使用できます。

手順 2: 実行中のシステムからのロールバック
  1. デフォルトとして設定するスナップショットを特定し、その番号をメモします。

    > sudo snapper list
  2. そのスナップショットをデフォルトとして設定します。

    > sudo transactional-update rollback snapshot_number

    snapshot numberを省略すると、現在のスナップショットがデフォルトとして設定されます。

    ヒント
    ヒント: 機能する最後のスナップショットの設定

    機能する最後のスナップショットをデフォルトとして設定するには、rollback lastを実行します。

  3. システムを再起動して、新しいデフォルトのスナップショットでブートします。

次の手順は、現在のスナップショットが壊れていて、そのスナップショットでブートできない場合に使用します。

手順 3: 機能するスナップショットへのロールバック
  1. システムを再起動し、[Start bootloader from a read-only snapshot]を選択します。

  2. ブートするスナップショットを選択します。スナップショットは作成日に従ってソートされ、最新のスナップショットが一番上に表示されます。

  3. システムにログインし、すべてが期待どおりに機能しているかどうかを確認します。スナップショットから除外されたディレクトリに書き込まれたデータはそのまま残ります。

  4. ブートしたスナップショットがロールバックに適さない場合は、システムを再起動して別のスナップショットを選択します。

    スナップショットが期待どおりに機能する場合は、次のコマンドを実行して、ロールバックを実行できます。

    > sudo transactional-update rollback

    その後、再起動します。

8 自動トランザクション更新の管理

自動更新は、1日1回実行されるsystemd.timerによって制御されます。これは、すべての更新に適用され、マシンが再起動する必要があることをrebootmgrdに知らせます。更新が実行される時刻を調整できます。systemd.timer(5)のマニュアルを参照してください。

8.1 自動更新の無効化

デフォルトでは、自動更新が有効化されています。ただし、次のコマンドで無効化できます。

> sudo systemctl --now disable transactional-update.timer

8.2 失敗した更新の通知の設定

自動のtransactional-updateが失敗した場合、失敗したスナップショットは削除されます。その間にシステムが再起動されるため、最後の自動更新が失敗したことを確認できません。したがって、自動のtransactional-updateの失敗を通知するsystemdサービスを設定できます。この設定手順は、次の手順にまとめることができます。

8.2.1 必要なパッケージのインストール

通知を設定するには、パッケージmailxsystemd-status-mailが必要です。これらのパッケージはデフォルトでシステムに存在します。ただし、これらのパッケージをインストールしていない場合は、次のコマンドを実行してインストールします。

> sudo transactional-update pkg in systemd-status-mail mailx

システムを再起動します。

8.2.2 systemd-status-mailサービスの設定

systemd-status-mailサービスを設定するには、設定ファイルを作成するか、jeos-configツールを使用できます。

8.2.2.1 jeos-configを使用したサービスの設定

電子メール通知を設定するには、次に説明するようにjeos-configツールを使用できます。

  1. 設定ウィンドウを開くには、次のコマンドを実行します。

    > sudo jeos-config status_mail
  2. ダイアログで、必要に応じて項目を設定します。

  3. OKをクリックして、確定します。

8.2.2.2 設定ファイルの編集によるサービスの設定

デフォルトの設定ファイルは、/usr/etc/default/systemd-status-mailにあります。これを変更するには、/etc/default/にコピーを作成して次の項目を編集します。

ADDRESS

必須エントリ。通知の送信先の電子メールアドレスを指定します。次に例を示します。

ADDRESS=“tux@example.com”
FROM

通知メールの送信者の電子メールアドレス。アドレスが有効であることを確認します。次に例を示します。

FROM=“geeko@example.com”
MAILER

通知を送信するメールアプリケーションのタイプ。次のように、mailxの値を使用します。

MAILER=“mailx”
RELAYHOST

mailxで使用するメールリレーを指定します。

RELAYHOST=“mail.example.com:587”
MAILX_OPTIONS

必要なオプションを指定し、メールプロバイダが通知メールを確実に受け入れるようにします。

MAILX_OPTIONS="-Sverbose -Ssmtp-use-starttls -Ssmtp-auth=login -Ssmtp-auth-user='tux@example.com' -Ssmtp-auth-password='TopSecret'"