OCI ComputeのYumリポジトリ構成を調べる & Oracle JDK, Graal VM EEのサブスクリプションが含まれる件

# 1. はじめに

**「Yumを使いこなす」ことは、Linuxを使いこなすうえで重要なことの1つだ。** そしてYum/RPMのコマンドを熟知するだけでなく、標準リポジトリに含まれていないパッケージを、どこから持ってくるかという知識も重要だ。


OCI Computeは、RHEL/CentOSと比べて標準で有効になっているリポジトリが多い。主要なリポジトリを説明する。

# 2. Yumリポジトリを確認する

現在有効になっているリポジトリは`yum repolist enabled`で確認できる。Oracle Linux 7と8では違うのでそれぞれ説明する。

### 2-1. Oracle Linux 7

```shell-session
~]# yum repolist enabled
Loaded plugins: langpacks, ulninfo
repo id                         repo name                                 status
ol7_MySQL80/x86_64              MySQL 8.0 for Oracle Linux 7 (x86_64)        213
ol7_UEKR6/x86_64                Latest Unbreakable Enterprise Kernel Rele    270
ol7_addons/x86_64               Oracle Linux 7Server Add ons (x86_64)        485
ol7_ksplice                     Ksplice for Oracle Linux 7Server (x86_64) 12,868
ol7_latest/x86_64               Oracle Linux 7Server Latest (x86_64)      22,179
ol7_oci_included/x86_64         Oracle Software for OCI users on Oracle L    855
ol7_optional_latest/x86_64      Oracle Linux 7Server Optional Latest (x86 16,052
ol7_software_collections/x86_64 Software Collection Library release 3.0 p 16,313
repolist: 69,235
```

<details><summary><font color="blue">disableになっているリポジトリも含めて全表示（クリックすると開く）</font></summary><div>

```
# yum repolist all
Loaded plugins: langpacks, ulninfo
repo id                         repo name                                                     status
ol7_MODRHCK/x86_64              Latest RHCK with fixes from Orac disabled
ol7_MySQL55/x86_64              MySQL 5.5 for Oracle Linux 7 (x8 disabled
ol7_MySQL56/x86_64              MySQL 5.6 for Oracle Linux 7 (x8 disabled
ol7_MySQL57/x86_64              MySQL 5.7 for Oracle Linux 7 (x8 disabled
ol7_MySQL80/x86_64              MySQL 8.0 for Oracle Linux 7 (x8 enabled:    213
ol7_UEKR3/x86_64                Latest Unbreakable Enterprise Ke disabled
ol7_UEKR3_OFED20/x86_64         OFED supporting tool packages fo disabled
ol7_UEKR4/x86_64                Latest Unbreakable Enterprise Ke disabled
ol7_UEKR4_OFED/x86_64           OFED supporting tool packages fo disabled
ol7_UEKR4_archive/x86_64        Unbreakable Enterprise Kernel Re disabled
ol7_UEKR5/x86_64                Latest Unbreakable Enterprise Ke disabled
ol7_UEKR5_RDMA/x86_64           Oracle Linux 7 UEK5 RDMA (x86_64 disabled
ol7_UEKR5_archive/x86_64        Unbreakable Enterprise Kernel Re disabled
ol7_UEKR6/x86_64                Latest Unbreakable Enterprise Ke enabled:    270
ol7_UEKR6_RDMA/x86_64           Oracle Linux 7 UEK6 RDMA (x86_64 disabled
ol7_addons/x86_64               Oracle Linux 7Server Add ons (x8 enabled:    485
ol7_developer/x86_64            Oracle Linux 7Server Development disabled
ol7_developer_EPEL/x86_64       Oracle Linux 7Server EPEL Packag disabled
ol7_developer_UEKR5/x86_64      Oracle Linux 7Server Unbreakable disabled
ol7_developer_UEKR6/x86_64      Developer Preview of UEK Release disabled
ol7_developer_kvm_utils/x86_64  Oracle Linux 7Server KVM Utiliti disabled
ol7_ksplice                     Ksplice for Oracle Linux 7Server enabled: 12,868
ol7_kvm_utils/x86_64            Oracle Linux 7Server KVM Utiliti disabled
ol7_latest/x86_64               Oracle Linux 7Server Latest (x86 enabled: 22,179
ol7_latest_archive/x86_64       Oracle Linux 7Server Latest (x86 disabled
ol7_oci_included/x86_64         Oracle Software for OCI users on enabled:    855
ol7_optional_archive/x86_64     Oracle Linux 7Server Optional (x disabled
ol7_optional_latest/x86_64      Oracle Linux 7Server Optional La enabled: 16,052
ol7_security_validation/x86_64  Oracle Linux 7Server (x86_64) Se disabled
ol7_software_collections/x86_64 Software Collection Library rele enabled: 16,313
ol7_u0_base/x86_64              Oracle Linux 7Server GA installa disabled
ol7_u1_base/x86_64              Oracle Linux 7Server Update 1 in disabled
ol7_u2_base/x86_64              Oracle Linux 7Server Update 2 in disabled
ol7_u3_base/x86_64              Oracle Linux 7Server Update 3 in disabled
ol7_u4_base/x86_64              Oracle Linux 7Server Update 4 in disabled
ol7_u5_base/x86_64              Oracle Linux 7Server Update 5 in disabled
ol7_u6_base/x86_64              Oracle Linux 7Server Update 6 in disabled
ol7_u7_base/x86_64              Oracle Linux 7Server Update 7 in disabled
ol7_u8_base/x86_64              Oracle Linux 7Server Update 8 in disabled
ol7_u9_base/x86_64              Oracle Linux 7Server Update 9 in disabled
ol7_x86_64_userspace_ksplice    Ksplice aware userspace packages disabled
repolist: 69,235
```

</div></details>

それぞれのリポジトリに含まれているパッケージは以下の通り。Oracle Linuxでは、`ol7_latest`と`ol7_UEKR5`が基本だろう。あとはRHEL系ディストリビューションでよく使用する`EPEL`や、知っていると便利な`ol7_software_collections`くらいは覚えておきたい。

| リポジトリID | 説明 |
|:---|:---|
| ol7_latest | 標準パッケージの最新版  |
| ol7_UEKR6 | UEKR6カーネル  |
| ol7_addons  | DockerやKubernetes、Oracle VM Serverのテンプレート、OS Watcherなど  |
| ol7_optional_latest  | オプショナル・パッケージ  |
| ol7_ksplice  | ライブ・パッチング・システムKsplice  |
| ol7_developer  | VirtualBoxやAnsible、Terraformなどの開発ツール  |
| ol7_developer_EPEL  | FedoraプロジェクトによるEnterprise Linux向けパッケージ。デフォルト無効  |
| ol7_software_collections  | 標準パッケージには含まれない新しいバージョンのパッケージ  |
| ol7_ociyum_config, ol7_oci_included  | Oracle JDKやOracle XE、Oracleインスタント・クライアントなど。ol7_ociyum_configとol7_oci_includedは同じリポジトリ |

<font color="blue">**ヒント**</font>
各リポジトリに含まれているパッケージを調べるには次のコマンドが便利だ。
`yum --disablerepo=* --enablerepo=＜調べたいリポジトリID＞ list available`

### 2-2. Oracle Linux 8

```shell-session
~]# yum repolist enabled
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)
```

<details><summary><font color="blue">disableになっているリポジトリも含めて全表示（クリックすると開く）</font></summary><div>

```
# yum repolist all
repo id               repo name                                         status
ksplice-uptrack                Ksplice Uptrack for Oracle Linux         disabled
ol8_UEKR6                      Latest Unbreakable Enterprise Kernel Rel enabled
ol8_UEKR6_RDMA                 Oracle Linux 8 UEK6 RDMA (x86_64)        disabled
ol8_addons                     Oracle Linux 8 Addons (x86_64)           enabled
ol8_appstream                  Oracle Linux 8 Application Stream (x86_6 enabled
ol8_baseos_latest              Oracle Linux 8 BaseOS Latest (x86_64)    enabled
ol8_codeready_builder          Oracle Linux 8 CodeReady Builder (x86_64 disabled
ol8_developer                  Oracle Linux 8 Development Packages (x86 disabled
ol8_developer_EPEL             Oracle Linux 8 EPEL Packages for Develop disabled
ol8_developer_UEKR6            Developer Preview of UEK Release 6 (x86_ disabled
ol8_ksplice                    Ksplice for Oracle Linux 8 (x86_64)      enabled
ol8_kvm_appstream              Oracle Linux 8 KVM Application Stream (x disabled
ol8_oci                        Oracle Linux 8 OCI Packages (x86_64)     enabled
ol8_oci_included               Oracle Software for OCI users on Oracle  enabled
ol8_u0_baseos_base             Oracle Linux 8 BaseOS GA (x86_64)        disabled
ol8_u1_baseos_base             Oracle Linux 8.1 BaseOS (x86_64)         disabled
ol8_u2_baseos_base             Oracle Linux 8.2 BaseOS (x86_64)         disabled
ol8_x86_64_userspace_ksplice   Ksplice aware userspace packages for Ora disabled
```

</div></details>

| リポジトリID | 説明 |
|:---|:---|
| ol8_UEKR6 | UEKR6カーネル  |
| ol8_addons  | PacemakerやOS Watcherなど  |
| ol8_appstream| AppStreamパッケージ  |
| ol8_baseos_latest| コアパッケージの最新版  |
| ol8_ksplice  | ライブ・パッチング・システムKsplice  |
| ol8_oci | oci-utilsなど  |
| ol8_oci_included  | Oracle JDKやOracle REST Data Services（ords）、OS Management Service Agent（osms-agent）など |
| ol8_developer  | TerraformやVSCode、OCI用Pythonライブラリなど開発で使用するパッケージ。デフォルト無効  |
| ol8_developer_EPEL  | FedoraプロジェクトによるEnterprise Linux向けパッケージ。デフォルト無効  |



### 2-3. Oracle Linux 9

Oracle Linux 9は、ほとんどOracle Linux 8と同じになっている。

```shell-session
~]# yum repolist enabled
yum repolist
repo id                repo name
ol9_UEKR7              Oracle Linux 9 UEK Release 7 (x86_64)
ol9_appstream          Oracle Linux 9 Application Stream Packages (x86_64)
ol9_baseos_latest      Oracle Linux 9 BaseOS Latest (x86_64)
ol9_ksplice            Ksplice for Oracle Linux 9 (x86_64)
ol9_oci_included       Oracle Linux 9 OCI Included Packages (x86_64)
```

### 2-4. 参考リポジトリ情報

* [ Oracle Linux Yum Server - Available Software](https://yum.oracle.com/getting-started.html#available-software)
* [CentOSのyumレポジトリ: EPEL, Remi, Software Collectionsの違いとまとめ](https://qiita.com/takeshi_nozawa/items/ee01981b4fc338209437)
* [Software Collection Library for Oracle Linuxについて](https://docs.oracle.com/cd/E39368_01/E59096/html/ol-scl-relnotes.html#ol-scl-about)

# 3. OCI用Yumリポジトリを理解する

OCI Computeで参照しているYumリポジトリと、オンプレミス用のYumリポジトリは違うことを知っているだろうか。

オンプレミス用YumリポジトリのFQDNはyum.oracle.comである。しかしOCI Computeで参照しているYumリポジトリは、リージョンごとに設置されたyum-tokyo.oracle.comやyum-phx.oracle.comだ。

repoファイルを確認すると、以下のように定義されている。

```:/etc/yum.repos.d/oracle-linux-ol7.repo
[ol7_latest]
name=Oracle Linux $releasever Latest ($basearch)
baseurl=https://yum$ociregion.$ocidomain/repo/OracleLinux/OL7/latest/$basearch/
```

`$ociregion`や`$ocidomain`は変数で、以下のコマンドで確認できる。つまり東京リージョンはyum-ap-tokyo-1.oracle.comを参照している。

```shell-session
$ cat /etc/yum/vars/ociregion
-ap-tokyo-1
$ cat /etc/yum/vars/ocidomain
oracle.com
```

オンプレミスでインストールしたOracle Linuxのrepoファイルもクラウドと同じ定義だ。しかし、`$ociregion`がNULLなのでyum.oracle.comを参照している。以前はpublic-yum.oracle.comと定義されていたこともあるが、yum.oracle.comの別名なので同じサーバーである。

そして覚えておくべきことが三つある。

* <font color="blue">OCI用のYumリポジトリは、OCI以外からはアクセスできない</font>
* <font color="blue">OCI用のYumリポジトリは、Internet GW/NAT GW/Service GWからアクセスできる</font>
* <font color="blue">OCI用のYumリポジトリだけで提供されているパッケージがある</font>

オンプレミスから`curl https://yum-tokyo.oracle.com`を実行すると、待ち状態になってアクセスできない。おそらくホワイトリスト制御が行われているのだろう。

またOracle JDKやOracleインスタントクライアント、Kspliceは、一般のOracle Linux Yumリポジトリでは提供されていない。

# 4. OCIにはOracle JDKのサポートが含まれる

今回書くことになったきっかけが、OCIのOracle JDKサポートだ。Oracle Java有償化問題のなか、OCIのサブスクリプションにはJavaのサポートも含まれる。それもyumで直接アップデートできる。

* [Support for Oracle Java SE now Included with Oracle Cloud Infrastructure](https://blogs.oracle.com/developers/support-for-oracle-java-se-now-included-with-oracle-cloud-infrastructure)
* [OCIでOracle Javaをインストールする方法／How to Install Oracle Java in Oracle Cloud Infrastructure](https://orablogs-jp.blogspot.com/2019/06/how-to-install-oracle-java-in-oracle.html)
* [How to Install Oracle Java in Oracle Cloud Infrastructure](https://blogs.oracle.com/developers/how-to-install-oracle-java-in-oracle-cloud-infrastructure)


上記ブログでは、以下のように`oci-included-release-el7`パッケージをインストールして、`ol7_oci_included`リポジトリを有効にしている。

```shell-session
sudo yum install -y --enablerepo=ol7_ociyum_config oci-included-release-el7
```

しかし、少なくとも最新（2019/5）のoracle-linux-ol7.repoファイルでは不要だ。標準で`ol7_oci_included`リポジトリが含まれているからだ。

パッケージをリストすると、JDK/JREだけでなく、GraalVMやOracle XE、Oracle Instant Clientも含まれている。

ここではOracle Linux 7を使用しているので`ol7`で始まるリポジトリ名だが、他のバージョンは読み替えてほしい。

```shell-session
# yum --disablerepo=* --enablerepo=ol7_oci_included list available
Loaded plugins: langpacks, ulninfo
Available Packages
graalvm19-ee-8.x86_64                     19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-devel.x86_64               19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-javascript.x86_64          19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-jdk.x86_64                 19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-jre.x86_64                 19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-jre-headless.x86_64        19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-libpolyglot.x86_64         19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-llvm.x86_64                19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-llvm-toolchain.x86_64      19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-native-image.x86_64        19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-nodejs.x86_64              19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-nodejs-devel.x86_64        19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-polyglot.x86_64            19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-python.x86_64              19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-python-devel.x86_64        19.3.0-1.el7          ol7_oci_included
graalvm19-ee-8-ruby.x86_64                19.3.0-1.el7          ol7_oci_included
jdk-11.0.3.x86_64                         2000:11.0.3-ga        ol7_oci_included
jdk-11.0.4.x86_64                         2000:11.0.4-ga        ol7_oci_included
jdk-11.0.5.x86_64                         2000:11.0.5-ga        ol7_oci_included
jdk-12.0.1.x86_64                         2000:12.0.1-ga        ol7_oci_included
jdk-12.0.2.x86_64                         2000:12.0.2-ga        ol7_oci_included
jdk-13.x86_64                             2000:13-ga            ol7_oci_included
jdk-13.0.1.x86_64                         2000:13.0.1-ga        ol7_oci_included
jdk1.8.x86_64                             2000:1.8.0_231-fcs    ol7_oci_included
jre-12.x86_64                             12.0.2-ga             ol7_oci_included
jre1.8.x86_64                             1.8.0_231-fcs         ol7_oci_included
oci-linux-config.noarch                   0.1-1.0.601.el7       ol7_oci_included
oracle-database-xe-18c.x86_64             1.0-1                 ol7_oci_included
oracle-instantclient12.2-basic.x86_64     12.2.0.1.0-1          ol7_oci_included
oracle-instantclient12.2-basiclite.x86_64 12.2.0.1.0-1          ol7_oci_included
oracle-instantclient12.2-devel.x86_64     12.2.0.1.0-1          ol7_oci_included
oracle-instantclient12.2-jdbc.x86_64      12.2.0.1.0-1          ol7_oci_included
oracle-instantclient12.2-odbc.x86_64      12.2.0.1.0-1          ol7_oci_included
oracle-instantclient12.2-precomp.x86_64   12.2.0.1.0-1          ol7_oci_included
oracle-instantclient12.2-sqlplus.x86_64   12.2.0.1.0-1          ol7_oci_included
oracle-instantclient12.2-tools.x86_64     12.2.0.1.0-1          ol7_oci_included
oracle-instantclient18.3-basic.x86_64     18.3.0.0.0-1          ol7_oci_included
oracle-instantclient18.3-basiclite.x86_64 18.3.0.0.0-1          ol7_oci_included
oracle-instantclient18.3-devel.x86_64     18.3.0.0.0-1          ol7_oci_included
oracle-instantclient18.3-jdbc.x86_64      18.3.0.0.0-1          ol7_oci_included
oracle-instantclient18.3-odbc.x86_64      18.3.0.0.0-1          ol7_oci_included
oracle-instantclient18.3-precomp.x86_64   18.3.0.0.0-1          ol7_oci_included
oracle-instantclient18.3-sqlplus.x86_64   18.3.0.0.0-1          ol7_oci_included
oracle-instantclient18.3-tools.x86_64     18.3.0.0.0-1          ol7_oci_included
oraclelinux-patchonly-release-el7.x86_64  1.0-1.el7             ol7_oci_included
osms-agent.x86_64                         0.0.1-444.el7         ol7_oci_included
sqlcl.noarch                              19.1.0.094.1619-1.el7 
```

<font color="red">なお、インスタンスの作成時期や種類によっては、有効なリポジトリはol7_oci_includedでは無くol7_ociyum_configのこともある。名前は違っても同じリポジトリなので、どちらを使用してもよい。</font>

したがって、Oracle JDKをインストールしたければ、次のように実行すればよい。あとはブログの記事で紹介されている`alternatives`でバージョンを切り替えれば完璧。

```shell-session
# ol7_oci_includedもしくはol7_ociyum_configを有効化
yum-config-manager --enable ol7_oci_included
# JDKインストール
yum install jdk-12.0.1
```

# 5. OCIにはGraalVM EEのサポートが含まれる

先ほど見たリポジトリにGraalVMがあったように、JDKと同様にGraalVM Enterprise Editionのサポートが含まれる。

[GraalVM Enterprise in Oracle Cloud Infrastructure](https://docs.oracle.com/en/graalvm/enterprise/19/guide/overview/oci/create-instance.html)

上記マニュアルページに書かれている、手動でダウンロードすることも、Yumリポジトリからセットアップすることも可能だ。

# 6. まとめ

* Oracle LinuxのYumリポジトリを提供するサーバーは「yum.oracle.com」と「yum-<リージョン>.oracle.com」がある
* 「yum.oracle.com」はどこからでもアクセスできるのに対し、「yum-<リージョン>.oracle.com」にアクセスできるのはOCIに限られる
* OCIにはOracle JDKとGraalVM EEのサブスクリプションが含まれる
* OCIにはKspliceのサブスクリプションが含まれる。Oracle LinuxではデフォルトでKspliceは有効になっている。またCentOS/Ubuntuでも追加費用無しでKspliceを利用できる。

| リポジトリサーバー | 概要 | 対応Gateway | 制限事項 |
|:-:|:-:|:-:|:-:|
| yum.oracle.com  | どこからでも認証無しにアクセス可能 | Internet GW, NAT GW | Oracle JDKやGraalVM、Kspliceなどは非提供|
| yum-<リージョン>.oracle.com  | OCIからアクセス可能 | Internet GW, NAT GW, Service GW| |