Ksplice使ったことありますか?
Kspliceの名前は知っていても、実際に使ったことがある人は少ないのでは無いだろうか。Kspliceの詳細はネット検索してもらうとして、今回は簡単に説明すると共に実際に触ってみる。
OCIでは初めからセットアップされていて、すぐに使えるようになっている。
OCI Computeでyum updateすると、やたら時間がかかる
と思っているあなた。それはKspliceの仕組みが関係しているからだ。yum update自体はKspliceとは直接関係しない。
Kspliceがインストールされた環境でカーネルをアップデートすると、Kspliceを組み込むためにinitrdやinitramfsなどのカーネルのコンポーネントが再構成される。それなりに重いタスクなので時間がかかっているのだ。
Kspliceとは
概要
KspliceとはOracle Linuxで利用できるライブ・パッチング・システムだ。RHELのkpatchやSUSEのKLPに相当する機能である。アップデートした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 Provides Zero-Downtime Patching for Red Hat Enterprise Linux and CentOS Instances
- Oracle Ksplice Zero-Downtime Patching for Ubuntu Instances
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 ManualやFAQは一度見て欲しい。
日本語情報:
英語情報:
- Ksplice User's Guide
- OTN: Ksplice Overview
- ksplice.com
- Ksplice Overview(ksplice.com)
- OCI Manual:Installing and Running Oracle Ksplice:
Kspliceの設定状況を確認する
OCI Computeを使って実際に確認する。今回はOracle Linux 7を使っているが、Oracle Linux 6/8や他の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/8の場合
$ 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 8の場合
repo id repo name
ol8_UEKR6 Latest Unbreakable Enterprise Kernel Release 6 for Oracle Linux 8 (x86_64)
ol8_addons Oracle Linux 8 Addons (x86_64)
ol8_appstream Oracle Linux 8 Application Stream (x86_64)
ol8_baseos_latest Oracle Linux 8 BaseOS Latest (x86_64)
ol8_ksplice Ksplice for Oracle Linux 8 (x86_64)★これ
ol8_oci Oracle Linux 8 OCI Packages (x86_64)
ol8_oci_included Oracle Software for OCI users on Oracle Linux 8 (x86_64)
- 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を使うと、簡単かつ短時間にカーネルをアップデートできることがわかっただろうか。次回はさらに踏み込んで細かく調べたい。