OCIでKspliceを使う Part1

# 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のインストール](https://docs.oracle.com/cd/F22978_01/oracle-linux/ksplice-user/ol_inst_ksplic_oc.html)を参照。

* [Ksplice Provides Zero-Downtime Patching for Red Hat Enterprise Linux and CentOS Instances](https://blogs.oracle.com/cloud-infrastructure/ksplice-provides-zero-downtime-patching-for-red-hat-enterprise-linux-and-centos-instances
)
* [Oracle Ksplice Zero-Downtime Patching for Ubuntu Instances](https://blogs.oracle.com/cloud-infrastructure/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](https://docs.oracle.com/en/operating-systems/oracle-linux/ksplice-user/)や[FAQ](https://www.ksplice.com/uptrack/faq)は一度見て欲しい。

**日本語情報：**

* [Kspliceユーザーズ・ガイド](https://docs.oracle.com/cd/F22978_01/oracle-linux/ksplice-user/index.html)
* [OTN-J: Ksplice](https://www.oracle.com/technetwork/jp/server-storage/ksplice/overview/index.html)
* [OCIマニュアル：Oracle Kspliceのインストールと実行](https://docs.oracle.com/cd/E97706_01/Content/Compute/Tasks/installingconfiguringksplice.htm)

**英語情報：**

* [Ksplice User's Guide](https://docs.oracle.com/en/operating-systems/oracle-linux/ksplice-user/)
* [OTN: Ksplice Overview](https://www.oracle.com/technetwork/server-storage/ksplice/overview/overview-1896886.html)
* [ksplice.com](http://www.ksplice.com/)
* [Ksplice Overview（ksplice.com）](http://ksplice.oracle.com/uptrack/guide)
* [OCI Manual：Installing and Running Oracle Ksplice:](https://docs.cloud.oracle.com/iaas/Content/Compute/Tasks/installingconfiguringksplice.htm)

# 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などを使用するときは、デフォルトではインストールされていないので、手動でインストールする必要がある。<font color="red">Oracle Cloud Infrastructureユーザーの場合、ULN（Unbreakable Linux Network）に登録しなくてもKspliceを使用できる。</font>

* [Oracle Cloud Infrastructure内へのKsplice Uptrackのインストール](https://docs.oracle.com/cd/F22978_01/oracle-linux/ksplice-user/ol_inst_ksplic_oc.html)

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

* **拡張クライアントがインストールされている例**

```shell-session
$ 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クライアントだけの例**

```shell-session
$ 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```の行が無いはずだ。

```shell-session
$ 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の場合

```shell-session
$ 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の場合
 
```shell-session
$ 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の場合

```shell-session
# 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の場合

```shell-session
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の場合

```shell-session
# 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になっているだけだった。

```shell-session
# 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を使って、どのようなものなのか体感してみよう。現在使っているカーネルバージョンを確認する。

```shell-session
# uname -r
4.14.35-1844.3.2.el7uek.x86_64
```

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

```shell-session
# 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```コマンドでも同じことができる。

```shell-session
# 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秒以内に適用できた。

```shell-session
# 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```のままで変わっていない。「これまでの説明と違う！」と思うかもしれないが、それは確認方法が違うからである。

```shell-session
# uname -r
4.14.35-1844.3.2.el7uek.x86_64
```

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

```shell-session
# 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を使うと、簡単かつ短時間にカーネルをアップデートできることがわかっただろうか。次回はさらに踏み込んで細かく調べたい。

* [OCIでKspliceを使う Part2](https://qiita.com/yamada-hakase/items/b00a2495a03b539407aa)