Help us understand the problem. What is going on with this article?

OCIでKspliceを使う Part1

Ksplice使ったことありますか?

Kspliceの名前は知っていても、実際に使ったことがある人は少ないのでは無いだろうか。Kspliceの詳細はネット検索するとか、このあたりのSlideShareを見てもらうとして、今回は簡単に説明すると共に実際に触ってみる。

実はOCIやOCI-Cでは初めからセットアップされていて、すぐに使えるようになっている。

OCI Computeでyum updateすると、やたら時間がかかる

と思っているあなた。それはKspliceの仕組みが関係しているからだ。yum update自体はKspliceとは直接関係しない。

Kspliceがインストールされた環境でカーネルをアップデートすると、Kspliceを組み込むためにinitrdやinitramfsなどのカーネルのコンポーネントが再構成される。それなりに重いタスクなので時間がかかっているのだ。

Kspliceとは

概要

KspliceとはOracle Linuxで利用できるライブ・パッチング・システムだ。RHELのkpatchやSUSEのkGraftに相当する機能である。アップデートしたLinuxカーネルを有効にするには、通常OSを再起動する必要がある。しかしKspliceを使用すると、再起動しなくてもアップデートを有効化できる。

おもなメリットは以下の通り。

  • ダウンタイム無しのパッチ適用/ロールバック
  • 迅速なセキュリティ脆弱性への対応

Kspliceを使用するにはOracle Linux Premier Support契約が必要で、さらに初回の設定作業が必要だ。だけれどOCI Computeでは初めからセットアップされていて、Oracle Linux Premier Support相当も含まれているので、追加のサポート契約は不要である。

Kspliceのライブパッチ対象となるコンポーネント

  • Oracle Linux 5以降のUEKとRHCK
  • Oracle Linux 6以降のglibcとopenssl(拡張クライアントが必要)

上記以外にもRHELやCentOS、Ubuntuでも利用可能。Kspliceのインストール方法はOracle Cloud Infrastructure内へのKsplice Uptrackのインストールを参照。

Kspliceクライアントの種類

Ksplice自体は単一のテクノロジーだが、操作するためコマンドとして、以下2種類のクライアントがある。

  • Ksplice Uptrackクライアント
  • Ksplice 拡張クライアント(2015年~)

それぞれの違いは以下の通り。ユーザ空間のサポートとは、kernel以外にglibcとopensslもサポートしていることを指す。

Ksliceクライアント ユーザ空間のサポート 以前のバージョンとの互換性 オフラインモード
拡張クライアント サポートしている なし あり
Uptrackクライアント サポートしていない あり あり

利用のためのネットワーク条件

KspliceのリポジトリはYum同様Internetに公開されている。そのためOCIでは、Internet GatewayもしくはNAT Gatewayを利用できること。現在Service Gatewayはサポートしていないようだ(2019/10)。

おもなドキュメント

Kspliceには、さまざまなドキュメントがある。日本語版のマニュアルもいいけれど、ksplice.comのKsplice Uptrack User's ManualFAQは一度見て欲しい。

日本語情報:

英語情報:

Kspliceの設定状況を確認する

OCI Computeを使って実際に確認する。今回はOracle Linux 7を使っているが、Oracle Linux 6や他のLinuxディストリビューションでもKspliceの操作は同じである。

検証環境

  • Oracle Linux 7.6
  • ksplice-1.0.38-1.el7.x86_64
  • uptrack-1.2.54-0

CentOSやRed Hat Enterprise Linux、Ubuntuなどを使用するときは、デフォルトではインストールされていないので、手動でインストールする必要がある。Oracle Cloud Infrastructureユーザーの場合、ULN(Unbreakable Linux Network)に登録しなくてもKspliceを使用できる。

Kspliceクライアントを確認する

インストールされているKspliceクライアントを確認する。拡張クライアント(ksplice)とUptrackクライアント(uptrack)の両方がインストールされている。ただし少し古いイメージ(2019年3月)では拡張クライアントがインストールされていないものもあった。またOracle Linux 6だと少し異なる。

  • 拡張クライアントがインストールされている例
$ rpm -qa | grep -e ksplice -e uptrack | sort
ksplice-1.0.38-1.el7.x86_64
ksplice-core0-1.0.38-1.el7.x86_64
ksplice-release-el7-1.0-5.el7.x86_64
ksplice-tools-1.0.38-1.el7.x86_64
uptrack-1.2.54-0.el7.noarch
  • Uptrackクライアントだけの例
$ rpm -qa | grep -e ksplice -e uptrack | sort
ksplice-release-el7-1.0-2.el7.x86_64
uptrack-1.2.54-0.el7.noarch

拡張クライアントがインストールされているときはksplice*だけでなく、uptrackもインストールされている。これは依存関係があるからで、カーネルのライブパッチング機能はuptrackに含まれている。

Kspliceの設定ファイルを確認する

Kspliceの設定ファイル/etc/uptrack/uptrack.confを確認する。grepのオプションは空行やコメント行を削除している。accesskeyが設定されていればKspliceを使用できる。また拡張クライアントがインストールされていない環境ではuser_update_repo_urlの行が無いはずだ。

$ grep -v -e '^\s*#' -e '^\s*$' /etc/uptrack/uptrack.conf
--ここから下が出力--
[Auth]
accesskey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(意図的に伏せ字)
[Network]
https_proxy =
gconf_proxy_lookup = no
update_repo_url=https://oraclecloud-updates-ksplice.oracle.com/update-repository
user_update_repo_url=https://oraclecloud-updates-ksplice.oracle.com/ksplice/request
[Settings]
install_on_reboot = yes
autoinstall = no

起動しているサービスがあるか確認する

Kspcliceは設定すれば自動アップデートする機能もあるので関連の確認してみる。すると6と7の双方でいくつかのサービスがある。

  • Oracle Linux 7の場合
$ systemctl list-unit-files --type service| grep -e uptrack -e ksplice
uptrack-late.service                          masked
uptrack-prefetch.service                      enabled
uptrack.service                               enabled
  • Oracle Linux 6の場合
$ chkconfig --list | grep  -e uptrack -e ksplice
ksplice-xen     0:off   1:off   2:on    3:on    4:on    5:on    6:off
uptrack         0:off   1:off   2:on    3:on    4:on    5:on    6:off
uptrack-late    0:off   1:off   2:on    3:on    4:on    5:on    6:off

Yumリポジトリを確認する

リポジトリを確認すると、カーネル用のkspliceリポジトリが有効になっている。ユーザ空間用のKspliceリポジトリuserspace_kspliceは見当たらない。

  • Oracle Linux 7の場合
# yum repolist enabled
Loaded plugins: langpacks, ulninfo
repo id                         repo name                                 status
ol7_UEKR5/x86_64                Latest Unbreakable Enterprise Kernel Rele    138
ol7_addons/x86_64               Oracle Linux 7Server Add ons (x86_64)        326
ol7_developer/x86_64            Oracle Linux 7Server Development Packages    775
ol7_developer_EPEL/x86_64       Oracle Linux 7Server Development Packages 26,135
ol7_ksplice                     Ksplice for Oracle Linux 7Server (x86_64)  1,426★これ
ol7_latest/x86_64               Oracle Linux 7Server Latest (x86_64)      12,820
ol7_optional_latest/x86_64      Oracle Linux 7Server Optional Latest (x86  9,834
ol7_software_collections/x86_64 Software Collection Library release 3.0 p 13,606
repolist: 65,060
  • Oracle Linux 6の場合
# yum repolist enabled
読み込んだプラグイン:security, ulninfo
リポジトリー ID          リポジトリー名                                   状態
ol6_UEKR4                Latest Unbreakable Enterprise Kernel Release 4 f    135
ol6_addons               Oracle Linux 6Server Add ons (x86_64)               415
ol6_developer            Oracle Linux 6Server Packages for Development an     76
ol6_ksplice              Ksplice for Oracle Linux 6Server (x86_64)         2,143★これ
ol6_latest               Oracle Linux 6Server Latest (x86_64)             11,878
ol6_software_collections Software Collection Library release 3.0 packages 10,796
repolist: 25,443

念のためにdisableになっているリポジトリも含めて検索すると発見。単にdisableになっているだけだった。

# yum repolist all | grep ksplice
ol7_ksplice                     Ksplice for Oracle Linux 7Server enabled:  1,426
ol7_x86_64_userspace_ksplice    Ksplice aware userspace packages disabled★これ

ここまでで分かったこと

  • Kspliceを使うと、再起動しなくても新しいカーネルアップデートを適用できる
  • OCI ComputeではデフォルトでKspliceを利用できる
  • KspliceはUEKとRHCKの両方で利用できる
  • 拡張クライアントを使うとglibcとopensslも対象になる(デフォルトでは利用不可)

Kspliceを使ってみる

実際にKspliceを使って、どのようなものなのか体感してみよう。現在使っているカーネルバージョンを確認する。

# uname -r
4.14.35-1844.3.2.el7uek.x86_64

最新のカーネルバージョンを確認する。現在の4.14.35-1844.3.2より新しい4.14.35-1844.5.3がリリースされている。

# yum check-update kernel-uek
kernel-uek.x86_64               4.14.35-1844.5.3.el7uek                ol7_UEKR5

Kspliceのアップデートがリリースされているか確認する。表示するのにuptrack-upgrade -nというコマンドは不思議に思うかもしれないが、対話モードで入力するNoを指定している。uptrack-show --availableコマンドでも同じことができる。

# uptrack-upgrade -n
Effective kernel version is 4.14.35-1844.3.2.el7uek
The following steps will be taken:
Install [jqu0nve5] Add support for runtime configuration of target LIO inquiry strings.
Install [q5v4oo0p] Denial-of-service in the Infiniband core driver when allocating protection domains.
Install [ksx9kjdz] CVE-2019-6974: Use-after-free in KVM device creation.
Install [jvnb5n4d] CVE-2019-7222: Information disclosure in KVM VMX emulation.
以下省略

Kspliceで最新アップデートを適用する。このときは約30個のアップデートがあったが、10秒以内に適用できた。

# uptrack-upgrade -y
The following steps will be taken:
Install [jqu0nve5] Add support for runtime configuration of target LIO inquiry strings.
Install [q5v4oo0p] Denial-of-service in the Infiniband core driver when allocating protection domains.
★中略★
Installing [oehos3cn] Known exploit detection.
Installing [s8jh2mwf] Known exploit detection for CVE-2017-7308.
Installing [dcgq70uq] Known exploit detection for CVE-2018-14634.
Your kernel is fully up to date.
Effective kernel version is 4.14.35-1844.4.5.2.el7uek

再び確認すると4.14.35-1844.3.2のままで変わっていない。「これまでの説明と違う!」と思うかもしれないが、それは確認方法が違うからである。

# uname -r
4.14.35-1844.3.2.el7uek.x86_64

Kspliceのアップデートを適用した実効のカーネルバージョンは、以下のコマンドで表示できる。

# uptrack-uname -r
4.14.35-1844.4.5.2.el7uek.x86_64

残念ながら最新の4.14.35-1844.5.3では無いが、もとの4.14.35-1844.3.2より新しい4.14.35-1844.4.5.2に更新されている。

最新にならない理由は不明だが、Kspliceのアップデートが開発中なのか。それとも、ちょうどこのときIntel MDS脆弱性があり、マイクロコード更新のため再起動が必要だったからなのか。後者だったら逆にすごいのだが。

おわりに

Kspliceを使うと、簡単かつ短時間にカーネルをアップデートできることがわかっただろうか。次回はさらに踏み込んで細かく調べたい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした