Oracle Autonomous Linuxをハックする Part 1

# 1. Oracle Autonomous Linuxの発表

2019年9月に開催された「Oracle OpenWorld 2019」で、驚いたトピックの1つが「Oracle Autonomous Linuxの発表」だ。Autonomousが近年Oracle社のキーメッセージになっているとはといえ、まさかLinuxだとは思わなかった。

* [In an Industry First, Oracle Brings Autonomous Operation to Linux](https://blogs.oracle.com/cloud-infrastructure/in-an-industry-first%2c-oracle-brings-autonomous-operation-to-linux)
* [Oracle Autonomous Linux for Oracle Cloud](https://www.oracle.com/cloud/compute/autonomous-linux.html)
* [Getting Started with Oracle Autonomous Linux](https://blogs.oracle.com/cloud-infrastructure/getting-started-with-oracle-autonomous-linux?source=:so:tw:or:awr:ocl:&SC=:so:tw:or:awr:ocl:&pcode=)

いずれの記事も説明は抽象的だが、おそらく以下のようなスペックだと思われる。そこで実際に触って機能をあきらかにしたい。

* Oracle Autonomous LinuxはOracle Cloud Infrastructureで提供
* 自動RPMパッケージ・アップデート
* 自動セキュリティパッチ適用
* Kspliceによるゼロ・ダウンタイム・アップグレード

# 2. Oracle Autonomous Linuxを作成する

Oracle Autonomous Linuxインスタンスを作成してみよう。マニュアルはOracle Cloud Infrastructure Computeの[Marketplaceページ](https://console.us-phoenix-1.oraclecloud.com/marketplace/application/63236232/usageInformation)にある（要Oracle Cloud Infrastructureアカウント）。

~~ただし、現時点のマニュアルは難解でタイポも散見される。今後の機能向上とともに、マニュアルも改善されることを期待したい。~~

2020/05時点では以下のページが最良のマニュアルのようだ。

* [Getting Started: Deploying and Configuring Oracle Autonomous Linux on Oracle Cloud Infrastructure](https://community.oracle.com/docs/DOC-1034101)
* [Tips for Using Oracle Autonomous Linux on Oracle Cloud](https://community.oracle.com/docs/DOC-1037259)

<font color="red">愚痴モードで言うなら、少なくとも2019/9/7のファーストバージョンでは、IAMの構文に複数の間違いがあり、構文エラーを直すのに時間がかかった。使わせないために、わざとやっていると思うほど。</font>

### 2-1. 設定の流れ

マニュアルに書かれている設定手順は以下のとおり。これはインスタンス・プリンシパルを利用する手順で、ほかにAPIキーを利用する手順もある。

**1. Notifications（通知）のセットアップ**
　- トピックの作成
　- トピックにemailアドレスの関連付け

**2. インスタンス・プリンシパルのセットアップ**
　- ダイナミック・グループの作成
　- ダイナミック・グループにポリシー割り当て

**3. Oracle Autonomous Linuxインスタンスの作成**
　- Oracle Autonomous Linuxイメージを使用してインスタンスを作成
　- al-configコマンドでインスタンスとトピックを関連付け
　
### 2-2. Notifications（通知）のセットアップ

メッセージング・サービスのNotifications（Amazon SQS相当）をセットアップする。

1. OCI管理コンソールのメニューから**[Application Integration]-[Notifications]**を選択する。
1. **[Create Topic]**をクリックしてトピックを作成する。今回は「AL_Notifications」という名前で作成。
1. 作成したトピックをクリックして詳細を表示する。
1. **[Create Subscription]**をクリックしてサブスクリプションを作成する。今回は
通知先emailアドレスを設定する。email以外にSlackやPagerDuty、URLも指定できる。
1. サブスクリプションを作成すると、通知先のアドレスにメールが送信される。送信されたメール内のリンクをクリックして有効化する。有効化すると、ステータスがPENDINGからACTIVEに変わる。

### 2-3. インスタンス・プリンシパルのセットアップ

Oracle Autonomous Linuxインスタンスが存在するコンパートメント内からメッセージを通知できるように、ダイナミック・グループとポリシーを構成する。

1. OCI管理コンソールから**[Identity]-[Dynamic Groups]**を選択する。
1. 以下の内容でダイナミック・グループを作成する。

| 項目 | 値 |
|:---|:---|
| NAME | AL_Notifications_comp1_grp  |
| DESCRIPTION | for Autonomous Linux Notifications |
| Matching Rules | ALL {instance.compartment.id = '＜compartment OCID＞'}  |

3.OCI管理コンソールから**[Identity]-[Policies]**を選択する。
4.以下の内容でポリシーを作成する。

| 項目 | 値 |
|:---|:---|
| NAME | AL_Notifications_pol  |
| DESCRIPTION | for Autonomous Linux Notifications  |
| Policy Statements | Allow dynamic-group ＜dynamic group name＞  to use ons-topics in compartment ＜topic compartment name＞ where request.permission='ONS_TOPIC_PUBLISH'  |

### 2-4. Oracle Autonomous Linuxインスタンスの作成

インスタンスの作成方法は、通常のComputeインスタンスと同じだ。以前はOracle Imagesから選択していたが、現在はPlatform Imagesから選択する。

1. **「Autonomous Linux」**のイメージを選択する。
![oraclelinux05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/ead30873-5874-7a63-0666-ac42cef515de.png)

2. 一番下までスクロールして**[Select Image]**をクリックする。
![oraclelinux06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/68444ad9-ddde-e425-7a5e-1d09b13e1436.png)

3. 作成が完了したら、次のコマンドを実行してトピックを関連付ける。インスタンス作成時の**User Data**で指定してもよい。成功すると登録したメールアドレスにメールが送信される。<font color="red">OCIDは、サブスクリプションではなくトピックなので気をつけること。</font>

```shell-session
$ sudo al-config -T ＜topic OCID＞ 
```

インスタンス作成時のUser Dataで指定するときは以下のようにするとよい。

```shell-session
#cloud-config
timezone: Asia/Tokyo
locale: ja_JP.utf8
runcmd:
  - systemctl restart rsyslog
  - al-config -T ＜topic OCID＞ 
```

# 3. Oracle Autonomous Linuxの設定を調べる

まずはOSの設定を確認する。ディストリビューションのバージョンや起動しているサービスなど、基本的な設定を確認する。

### 3-1. OS基本設定

ベースはOracle Linux 7.7で、UEK Release 5カーネルを使用している。

```shell-session
$ cat /etc/oracle-release
Oracle Linux Server release 7.7

$ uname -a
Linux ＜ホスト名＞ 4.14.35-1902.4.8.el7uek.x86_64 #2 SMP Sun Aug 4 22:25:18 GMT 2019 x86_64 x86_64 x86_64 GNU/Linux

#ファイアウォール有効
$ systemctl is-active firewalld.service
active

#SELinux有効
$ getenforce
Enforcing
```

### 3-2. 自動起動するサービス

デフォルトで起動しているサービスを調べる。

```shell-session
$ systemctl list-units --type=service
```
<details><summary><font color="blue">有効になっているサービス一覧（クリックすると開く）</font></summary><div>

```shell-session
UNIT                         LOAD   ACTIVE SUB     DESCRIPTION
abrt-ccpp.service            loaded active exited  Install ABRT coredump hook
abrt-oops.service            loaded active running ABRT kernel log watcher
abrtd.service                loaded active running ABRT Automated Bug Reporting
al-config.service            loaded active exited  Autonomous Linux configuratio
atd.service                  loaded active running Job spooling tools
auditd.service               loaded active running Security Auditing Service
bnxt-set-channel.service     loaded active exited  (null)
chronyd.service              loaded active running NTP client/server
cloud-config.service         loaded active exited  Apply the settings specified
cloud-final.service          loaded active exited  Execute cloud user/final scri
cloud-init-local.service     loaded active exited  Initial cloud-init job (pre-n
cloud-init.service           loaded active exited  Initial cloud-init job (metad
crond.service                loaded active running Command Scheduler
dbus.service                 loaded active running D-Bus System Message Bus
firewalld.service            loaded active running firewalld - dynamic firewall
getty@tty1.service           loaded active running Getty on tty1
gssproxy.service             loaded active running GSSAPI Proxy Daemon
irqbalance.service           loaded active running irqbalance daemon
iscsi-boot-volume.service    loaded active exited  Set boot volume startup to on
iscsi-shutdown.service       loaded active exited  Logout off all iSCSI sessions
iscsi.service                loaded active exited  Login and scanning of iSCSI d
iscsid.service               loaded active running Open-iSCSI
kdump.service                loaded active exited  Crash recovery kernel arming
kmod-static-nodes.service    loaded active exited  Create list of required stati
libstoragemgmt.service       loaded active running libstoragemgmt plug-in server
lvm2-lvmetad.service         loaded active running LVM2 metadata daemon
lvm2-monitor.service         loaded active exited  Monitoring of LVM2 mirrors, s
network.service              loaded active running LSB: Bring up/down networking
oci-yum-repo-mapper.service  loaded active exited  Oracle Cloud Infrastructure Y
ocid.service                 loaded active running Oracle Cloud Infrastructure u
oracle-cloud-agent-updater.service loaded active running Oracle Cloud Infrastruc
oracle-cloud-agent.service   loaded active running Oracle Cloud Infrastructure a
polkit.service               loaded active running Authorization Manager
rhel-dmesg.service           loaded active exited  Dump dmesg to /var/log/dmesg
rhel-domainname.service      loaded active exited  Read and set NIS domainname f
rhel-import-state.service    loaded active exited  Import network configuration
rhel-readonly.service        loaded active exited  Configure read-only root supp
rhnsd.service                loaded active running LSB: Starts the Spacewalk Dae
rngd.service                 loaded active running Hardware RNG Entropy Gatherer
rpcbind.service              loaded active running RPC bind service
rsyslog.service              loaded active running System Logging Service
selinux-policy-migrate-local-changes@targeted.service loaded active exited  Migr
serial-getty@ttyS0.service   loaded active running Serial Getty on ttyS0
smartd.service               loaded active running Self Monitoring and Reporting
sshd.service                 loaded active running OpenSSH server daemon
sysstat.service              loaded active exited  Resets System Activity Logs
systemd-hwdb-update.service  loaded active exited  Rebuild Hardware Database
systemd-journal-catalog-update.service loaded active exited  Rebuild Journal Cat
systemd-journal-flush.service loaded active exited  Flush Journal to Persistent
systemd-journald.service     loaded active running Journal Service
systemd-logind.service       loaded active running Login Service
systemd-machine-id-commit.service loaded active exited  Commit a transient machi
systemd-random-seed.service  loaded active exited  Load/Save Random Seed
systemd-remount-fs.service   loaded active exited  Remount Root and Kernel File
systemd-sysctl.service       loaded active exited  Apply Kernel Variables
systemd-tmpfiles-setup-dev.service loaded active exited  Create Static Device No
systemd-tmpfiles-setup.service loaded active exited  Create Volatile Files and D
systemd-udev-settle.service  loaded active exited  udev Wait for Complete Device
systemd-udev-trigger.service loaded active exited  udev Coldplug all Devices
systemd-udevd.service        loaded active running udev Kernel Device Manager
systemd-update-done.service  loaded active exited  Update is Completed
systemd-update-utmp.service  loaded active exited  Update UTMP about System Boot
systemd-user-sessions.service loaded active exited  Permit User Sessions
systemd-vconsole-setup.service loaded active exited  Setup Virtual Console
tuned.service                loaded active running Dynamic System Tuning Daemon
vdo.service                  loaded active exited  VDO volume services

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

66 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
```
</div></details>

Autonomous LinuxだけでActiveなサービスは以下のとおり。ocid.serviceはOracle Linux 7にもあるので、al-config.serviceがAutonomous Linux固有のサービスだと思われる。

* **al-config.service**：Autonomous Linux configuration service
* **ocid.service**：Oracle Cloud Infrastructure utilities daemon
* **serial-getty＠ttyS0.service**：Serial Getty on ttyS0
* **systemd-hwdb-update.service**：Rebuild Hardware Database


### 3-3. ファイアウォール設定

ファイアウォール設定はOracle Linux 7と同じだ。

```shell-sesson
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

### 3-4. Yumリポジトリ設定
Yumリポジトリは「Autonomous Linux専用」と「ユーザー空間用Ksplice(glibcとopenssl)」が有効になっている。

```shell-session
$ sudo yum repolist enabled
Loaded plugins: langpacks, ulninfo
repo id                      repo name                                    status
★al7/x86_64                   Autonomous Linux 7Server (x86_64)            1,360
ol7_x86_64_userspace_ksplice Ksplice aware userspace packages for Oracle    432
repolist: 1,783
```

参考までにOracle Linux 7.7では以下のようになっている。al7リポジトリのパッケージ数が1,360であるのに対し、ol7_latestが15,430と差が大きい。al7リポジトリは、提供しているパッケージを絞っているようだ。

```shell-session
repo id                         repo name
ol7_UEKR5/x86_64                Latest Unbreakable Enterprise Kernel Release 5 for Oracle Linux 7Se    162
ol7_addons/x86_64               Oracle Linux 7Server Add ons (x86_64)                                  370
ol7_developer/x86_64            Oracle Linux 7Server Development Packages (x86_64)                     980
ol7_developer_EPEL/x86_64       Oracle Linux 7Server Development Packages (x86_64)                  28,157
ol7_ksplice                     Ksplice for Oracle Linux 7Server (x86_64)                            1,093
★ol7_latest/x86_64               Oracle Linux 7Server Latest (x86_64)                                15,430
ol7_oci_included/x86_64         Oracle Software for OCI users on Oracle Linux 7Server (x86_64)          33
ol7_optional_latest/x86_64      Oracle Linux 7Server Optional Latest (x86_64)                       11,437
ol7_software_collections/x86_64 Software Collection Library release 3.0 packages for Oracle Linux 7 14,024
repolist: 71,686
```

list availableでインストール可能なパッケージ数をカウントしてみると、標準リポジトリだけでも差が大きい。al7リポジトリにはtreeコマンドも含まれていなかった。

```shell-session
Oracle Autonomous Linuxで実行
# yum --disablerepo=* --enablerepo=al7 list available | wc -l
227

Oracle Linux 7.7で実行
# yum --disablerepo=* --enablerepo=ol7_latest list available | wc -l
4928
```

### 3-5. インストールされているパッケージ
インストールされているパッケージでめぼしいものを探してみる。--lastを指定すると、新しくインストールしたパッケージから降順に表示できる。

なお、日を変えてインスタンスを作成したところバラツキがあった。Autonomous Linuxは絶賛開発中なので、実行時期によって変わるのだろう。

気になる部分に★を付けた。Autonomous Linux専用サービスのal-config、PythonのOracle DB/OCI系のライブラリ、Oracleインスタント・クライアント、tunedのOCI専用プロファイルあたりだろうか。

```shell-session
# rpm -qa --last |less
★al-config-1.0-1.0.26.el7.noarch               Sun Sep  8 12:52:15 2019
python-oci-cli-2.6.3-1.el7.noarch             Sun Sep  8 12:52:13 2019
python2-jmespath-0.9.3-1.el7.noarch           Sun Sep  8 12:52:11 2019
python-oci-sdk-2.3.3-1.el7.x86_64             Sun Sep  8 12:52:11 2019
pytz-2016.10-2.el7.noarch                     Sun Sep  8 12:52:03 2019
python2-packaging-16.8-5.el7.noarch           Sun Sep  8 12:52:03 2019
python2-click-6.7-6.el7.noarch                Sun Sep  8 12:52:03 2019
python-terminaltables-3.1.0-1.el7.noarch      Sun Sep  8 12:52:03 2019
python-retrying-1.3.3-1.el7.noarch            Sun Sep  8 12:52:03 2019
python-jwt-1.5.3-1.0.1.el7.noarch             Sun Sep  8 12:52:03 2019
python-configparser-3.5.0-0.2.el7.noarch      Sun Sep  8 12:52:03 2019
python-certifi-2017.4.17-1.el7.noarch         Sun Sep  8 12:52:03 2019
python-asn1crypto-0.22.0-1.el7.noarch         Sun Sep  8 12:52:03 2019
pyparsing-2.0.3-1.el7.noarch                  Sun Sep  8 12:52:03 2019
python-ndg_httpsclient-0.3.2-1.el7.noarch     Sun Sep  8 12:52:02 2019
python-cx_Oracle-7.0-1.0.1.el7.x86_64         Sun Sep  8 12:52:02 2019
★oracle-instantclient18.3-basic-18.3.0.0.0-2.x86_64 Sun Sep  8 12:52:01 2019
python2-arrow-0.10.0-1.el7.noarch             Sun Sep  8 12:51:55 2019
python-httpsig_cffi-15.0.0-1.el7.noarch       Sun Sep  8 12:51:55 2019
python-dateutil-2.7.3-2.el7.noarch            Sun Sep  8 12:51:55 2019
yum-cron-3.4.3-163.0.1.el7.noarch             Sun Sep  8 12:51:52 2019
openssl-libs-1.0.2k-19.0.1.ksplice1.el7.x86_64 Sun Sep  8 12:51:50 2019
openssl-1.0.2k-19.0.1.ksplice1.el7.x86_64     Sun Sep  8 12:51:50 2019
glibc-2.17-292.0.1.ksplice1.el7.x86_64        Sun Sep  8 12:51:49 2019
glibc-common-2.17-292.0.1.ksplice1.el7.x86_64 Sun Sep  8 12:51:48 2019
ksplice-helper-1.0.42-1.el7.x86_64            Sun Sep  8 12:51:45 2019
ksplice-known-exploit-detection-1.0.42-1.el7.x86_64 Sun Sep  8 12:51:43 2019
★tuned-profiles-oci-recommend-2.11.0-5.0.2.el7_7.1.noarch Sun Sep  8 12:51:33 201
9
★tuned-profiles-oci-2.11.0-5.0.2.el7_7.1.noarch Sun Sep  8 12:51:33 2019
```

### 3-6. cron設定
Oracle Autonomous Linuxでは各種自動化が行われているのでcron設定を確認する。

* [Oracle Linux 7 管理者ガイド, タスクの自動化について](https://docs.oracle.com/cd/E77565_01/E54669/html/ol7-about-autotask.html)
* [RHEL7システム管理者ガイド, システムタスクの自動化](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-automating_system_tasks)

```shell-session
# ls -F /etc/cron*
/etc/cron.deny  /etc/crontab

/etc/cron.d:
0hourly  al-update  ksplice  raid-check  sysstat  uptrack

/etc/cron.daily:
0yum-daily.cron*  logrotate*  man-db.cron*  mlocate*

/etc/cron.hourly:
0anacron*  0yum-hourly.cron*

/etc/cron.monthly:

/etc/cron.weekly:
```

Oracle Autonomous Linux専用コマンドの1つ、al-updateが毎日12時29分に実行される。時間を変更するときは直接変更するのではなく`al-config -w`で変更する。オプションなしで実行するとヘルプが表示される。

```shell-session:/etc/cron.d/al-update
# Daily cron job for AL updates
# Created by al-config, do not modify this file.
# If you want to change update time, use
# 'sudo al-config -w <time window>' to set auto update time window
29 12 * * * root /usr/sbin/al-update &>/dev/null
```

Ksplice用のcronファイルはあるが、2つともコメントアウトされている。

```shell-session:/etc/cron.d/ksplice
# 5,35 * * * * root export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin && [ -x /usr/bin/ksplice ] && (/usr/bin/ksplice --cron user upgrade; /usr/bin/ksplice --cron xen upgrade)
```

```shell-session:/etc/cron.d/uptrack
# 16,46 * * * * root export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin && [ -x /usr/sbin/uptrack-upgrade ] && /usr/sbin/uptrack-upgrade --cron
```

Yumアップデートの自動化ツールyum-cronの設定ファイルは、毎時と毎日の2つがある。

```shell-session
# ls -F /etc/cron*/*yum*
/etc/cron.daily/0yum-daily.cron*  /etc/cron.hourly/0yum-hourly.cron*
```

```shell-session:/etc/cron.daily/0yum-daily.cron
if [[ ! -f /var/lock/subsys/yum-cron ]]; then
  exit 0
fi

# Action!
exec /usr/sbin/yum-cron
```

```shell-session:/etc/cron.hourly/0yum-hourly.cron
if [[ ! -f /var/lock/subsys/yum-cron ]]; then
  exit 0
fi

# Action!
exec /usr/sbin/yum-cron /etc/yum/yum-cron-hourly.conf
```

それぞれの設定ファイルで`apply_updates = no`になっている。そのためyum-cronを実行しても、RPMパッケージはアップデートされないハズだ。

```shell-session
# grep apply_updates /etc/yum/yum-cron*conf
/etc/yum/yum-cron.conf:apply_updates = no
/etc/yum/yum-cron-hourly.conf:apply_updates = no
```

しかし`/var/log/yum.log`を見ると、アップデートされているように見える。このあたりは次回以降の課題にする。

```shell-session:/var/log/yum.log
Oct 02 12:29:13 Updated: python-oci-sdk.x86_64 2.5.1-1.el7
Oct 02 12:29:14 Updated: python-oci-cli.noarch 2.6.6-1.el7
Oct 02 12:29:15 Updated: sg3_utils-libs.x86_64 1.37-18.0.1.el7_7.1
Oct 02 12:29:16 Updated: kernel-tools-libs.x86_64 3.10.0-1062.1.2.el7
Oct 02 12:29:17 Updated: kernel-tools.x86_64 3.10.0-1062.1.2.el7
Oct 02 12:29:18 Updated: sg3_utils.x86_64 1.37-18.0.1.el7_7.1
Oct 02 12:29:28 Updated: al-config.noarch 1.0-1.0.28.el7
Oct 02 12:29:34 Installed: kernel-uek.x86_64 4.14.35-1902.5.2.2.el7uek
Oct 02 12:29:35 Updated: python-perf.x86_64 3.10.0-1062.1.2.el7
Oct 02 12:29:45 Installed: kernel.x86_64 3.10.0-1062.1.2.el7
Oct 02 12:29:46 Updated: bpftool.x86_64 3.10.0-1062.1.2.el7
Oct 02 12:29:46 Updated: tzdata.noarch 2019c-1.el7
```

### 3-7. tuned設定
自動チューニングサービスのtunedは、Oracle Cloud Infrastructure独自のものが設定されている。

* [RHEL7:第3章 TUNED](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/performance_tuning_guide/chap-red_hat_enterprise_linux-performance_tuning_guide-tuned)

```shell-session
# tuned-adm active
Current active profile: oci-rps-xps oci-busy-polling oci-cpu-power
```

`profile_info`を指定するとプロファイル情報が表示されるが、サマリーなのでよく分からない。RPS/XPSだからネットワーク系か。

```shell-session
# tuned-adm profile_info oci-rps-xps
Profile name:
oci-rps-xps

Profile summary:
Enable RPS/XPS conditionally in OCI
```

それぞれのプロファイルの実体は、以下のファイルで確認できる。本題では無いので説明しないが、どのような設定になっているか興味のある人は確認してほしい。

```shell-session
# ls -F /usr/lib/tuned/
balanced/     latency-performance/  oci-cpu-power/  throughput-performance/
desktop/      network-latency/      oci-rps-xps/    virtual-guest/
functions     network-throughput/   powersave/      virtual-host/
hpc-compute/  oci-busy-polling/     recommend.d/
```

# おわりに

長くなったので、ひと区切り付けることにする。次回はKsplice設定やOracle Autonomous Linux固有の機能を調査する。

* [Oracle Autonomous Linuxをハックする Part 2](https://qiita.com/yamada-hakase/items/b735ec62ddcb38eb19f5)