grubで止まったEFI機のLinuxを起動させる


Oracle Cloud上のCentOS 7インスタンスをOracle Linux 7にコンバートさせたら、一部のパッケージがうまくインストールできず、centos2ol.sh が途中で失敗した。

yum distro-syncを実行したらうまくいったので、大丈夫かな?と思ったら、grub関連が更新できずに起動に失敗した模様。

Oracle Cloudの場合、Web管理コンソールから該当インスタンスのディスプレイをVNC接続で表示するための設定ができるので、それでつなげてみたところ下記の様にgrubで停止していた。

まず、ディスクとパーテーションがどう認識されているが分からないので「ls」を実行します。

そうすると、「(ディスク名)」と「(ディスク名),(パーテーション名)」の一覧が表示されます。

grub> ls
(hd0)  (hd0,gpt3)  (hd0,gpt2)  (hd0,gpt1)  (fd0)  (fd1)
grub> 

上記の場合、hd0の中にパーテーションが3つある、ということになります。

各パーテーションのファイルシステムがなんなのかを「ls (hd0,gpt0)」と実行すると表示されます。

grub> ls (hd0,gpt2)
(hd0,gpt2): Filesystem is unknown.
grub> ls (hd0,gpt3)
(hd0,gpt3): Filesystem is xfs.
grub> ls (hd0,gpt1)
(hd0,gpt1): Filesystem is fat.
grub>

上記の結果により、パーテーション1:FAT、パーテーション3:XFS、パーテーション2:不明となります。

「ls (hd0,gpt1)/」と最後に/をつけると中にどんなファイル/ディレクトリがあるかを確認出来ます。

grub> ls (hd0,gpt1)/
efi/
grub> ls (hd0,gpt3)/
./ ../ boot/ dev/ proc/ run/ sys/ etc/ var/ root/ tmp/ usr/ bin sbin lib lib64
home/ media/ mnt/ opt/ srv/
grub>

上記により efi/があるパーテーション1は、/boot/efi があるパーテーション
パーテーション3は / があるパーテーションとなり
消去法的にパーテーション2は、ファイルシステムがないのでswapパーテーションとなる。

起動するにあたっては、linuxefi でvmlinuzファイルと、root=で/パーテーション指定を行い、initrdedi でinitramfsファイルを指定する形となる。

下記の様に入力して起動を行う。

grub> linuxefi (hd0,gpt3)/boot/vmlinuz-5.4.17-2102.202.5.el7uek.x86_64 root=/dev/sda3
grub> initrdefi (hd0,gpt3)/boot/initramfs-5.4.17-2102.202.5.el7uek.x86_64.img
grub> boot

なお、vzlinuzやinitramfsのファイル名は分からないと思うが、その場合は下記の様に「initrdefi (hd0,gpt3)/boot/initra」まで入力してからタブキーを押すと候補が表示されるので、それを利用すると良い。

画像

bootが開始されると、クラウド上でも普通のLinux環境と同じように起動表示がある。

で、ログインが出来るようになった。

Oracle Cloud上のインスタンスは、ssh keyでログインしているのでパスワードがわからないので、ssh経由で接続して続きを行う。

まず、起動できなかった原因は /etc/grub2-efi.cfg (/boot/efi/EFI/redhat/grub.cfg)が存在しないということだった。

「sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg」を実行して、grub.cfgを再作成することで対応できる。

参照:CentOS8からOracle Linux 8への移行1

再作成して再起動するときちんと下記の様にkernel選択画面が表示され、自動起動することが確認出来た。

Oracle Cloud上の古いOracle Linux 7インスタンスのyum設定を更新する


「Notices: General Notices for Oracle Linux Images」というページに「2021.03 – Yum Update for Oracle Linux 7 and Oracle Linux 8 Instances」というのを発見した。

たしかに2021年3月より前に作成したインスタンス Oracle-Linux-7.7-2019.08.28-0, Oracle-Autonomous-Linux-7.8-2020.05-0 には oci-linux-config というパッケージはインストールされていなかった。

$ rpm -qa|grep oci-linux-config
$

とりあえず、ここに書いてある手順通りに進めていく

$ curl -H "Authorization:Bearer Oracle" -sfm 25 http://169.254.169.254/opc/v2/instance/ 2>/dev/null | jq -r '.regionInfo.realmKey'
oc1
$

上記では「oc1」という結果が出力されているが、「oc1」~「oc4」ならOKとのこと。

oci-linux-config パッケージをインストール

$ sudo yum -y install oci-linux-config
読み込んだプラグイン:langpacks, ulninfo
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ oci-linux-config.noarch 0:1.0-3.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================
 Package               アーキテクチャー
                                   バージョン      リポジトリー            容量
================================================================================
インストール中:
 oci-linux-config      noarch      1.0-3.el7       ol7_ociyum_config       13 k

トランザクションの要約
================================================================================
インストール  1 パッケージ

総ダウンロード容量: 13 k
インストール容量: 29 k
Downloading packages:
oci-linux-config-1.0-3.el7.noarch.rpm                      |  13 kB   00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : oci-linux-config-1.0-3.el7.noarch               1/1
IMPORTANT: PLEASE NOTE!!  Oracle Linux yum repository configurations have been updated. New repository configuration files have been installed but are disabled.  To complete the transition, run this script as root user:

/usr/lib/oci-linux-config/oci_yum_configure.sh

  検証中                  : oci-linux-config-1.0-3.el7.noarch               1/1

インストール:
  oci-linux-config.noarch 0:1.0-3.el7

完了しました!
$

/usr/lib/oci-linux-config/oci_yum_configure.sh を実行して /etc/yum.repos.d/ のレポジトリファイルを作成

$ ls -l /etc/yum.repos.d/
合計 84
-rw-r--r--. 1 root root  488  2月 17 06:40 ksplice-ol7.repo
-rw-r--r--. 1 root root  273  5月 13 15:39 oracle-epel-ol7.repo
-rw-r--r--. 1 root root  242  8月 15  2019 oracle-epel-ol7.repo.20190815
-rw-r--r--. 1 root root  252  5月 13 15:38 oracle-epel-ol7.repo.20210217
-rw-r--r--. 1 root root 4322  6月 11 04:12 oracle-linux-ol7.repo
-rw-r--r--. 1 root root 3825  7月 10  2020 oracle-linux-ol7.repo.20200710
-rw-r--r--. 1 root root 4586  6月  9 12:57 oracle-linux-ol7.repo.rpmnew
-rw-r--r--. 1 root root 1067  2月 26 04:35 oracle-php-ol7.repo
-rw-r--r--. 1 root root  797  4月  6  2020 oracle-php-ol7.repo.20200406
-rw-r--r--. 1 root root  275  8月 15  2019 oracle-softwarecollection-ol7.repo
-rw-r--r--. 1 root root  276  2月 17 06:38 oracle-softwarecollection-ol7.repo.rpmnew
-rw-r--r--. 1 root root 1041  2月  5 04:15 oraclelinux-developer-ol7.repo
-rw-r--r--. 1 root root  802 12月 27  2019 oraclelinux-developer-ol7.repo.20200406
-rw-r--r--. 1 root root 3117  9月 30  2019 public-yum-ol7.repo.sav
-rw-r--r--. 1 root root 2577  5月 28  2020 uek-ol7.repo
-rw-r--r--. 1 root root 2108  4月  6  2020 uek-ol7.repo.20200406
-rw-r--r--. 1 root root 2587  2月 17 06:42 uek-ol7.repo.rpmnew
-rw-r--r--. 1 root root  225  5月 28  2020 virt-ol7.repo
-rw-r--r--. 1 root root  226  2月 17 06:42 virt-ol7.repo.rpmnew
$ sudo /usr/lib/oci-linux-config/oci_yum_configure.sh
読み込んだプラグイン:langpacks, ulninfo
No packages marked for update
Disabling Repository ol7_UEKR6
Repository ol7_developer already enabled
Repository ol7_developer_EPEL already enabled
Repository ol7_developer_php74 already enabled
Repository ol7_ksplice already enabled
Repository ol7_latest already enabled
Repository ol7_software_collections already enabled
Enabling Repository ol7_UEKR5
Enabling Repository ol7_addons
Repository ol7_developer already enabled
Repository ol7_developer_EPEL already enabled
Repository ol7_developer_php74 already enabled
Repository ol7_ksplice already enabled
Repository ol7_latest already enabled
Enabling Repository ol7_ociyum_config
Enabling Repository ol7_optional_latest
Repository ol7_software_collections already enabled
$ ls -l /etc/yum.repos.d/
合計 104
-rw-r--r--. 1 root root  488  2月 17 06:40 ksplice-ol7.repo
-rw-r--r--. 1 root root  273  5月 13 15:39 oracle-epel-ol7.repo
-rw-r--r--. 1 root root  242  8月 15  2019 oracle-epel-ol7.repo.20190815
-rw-r--r--. 1 root root  252  5月 13 15:38 oracle-epel-ol7.repo.20210217
-rw-r--r--. 1 root root 4586  6月 16 10:15 oracle-linux-ol7.repo
-rw-r--r--. 1 root root 3825  7月 10  2020 oracle-linux-ol7.repo.20200710
-rw-r--r--. 1 root root 4322  6月 11 04:12 oracle-linux-ol7.repo.bkp
-rw-r--r--. 1 root root 4586  6月  9 12:57 oracle-linux-ol7.repo.rpmnew.bkp
-rw-r--r--. 1 root root 1067  2月 26 04:35 oracle-php-ol7.repo
-rw-r--r--. 1 root root  797  4月  6  2020 oracle-php-ol7.repo.20200406
-rw-r--r--. 1 root root  276  2月 17 06:38 oracle-softwarecollection-ol7.repo
-rw-r--r--. 1 root root  275  8月 15  2019 oracle-softwarecollection-ol7.repo.bkp
-rw-r--r--. 1 root root  276  2月 17 06:38 oracle-softwarecollection-ol7.repo.rpmnew.bkp
-rw-r--r--. 1 root root 1041  2月  5 04:15 oraclelinux-developer-ol7.repo
-rw-r--r--. 1 root root  802 12月 27  2019 oraclelinux-developer-ol7.repo.20200406
-rw-r--r--. 1 root root 3117  9月 30  2019 public-yum-ol7.repo.sav
-rw-r--r--. 1 root root 2587  6月 16 10:15 uek-ol7.repo
-rw-r--r--. 1 root root 2108  4月  6  2020 uek-ol7.repo.20200406
-rw-r--r--. 1 root root 2577  5月 28  2020 uek-ol7.repo.bkp
-rw-r--r--. 1 root root 2587  2月 17 06:42 uek-ol7.repo.rpmnew.bkp
-rw-r--r--. 1 root root  226  2月 17 06:42 virt-ol7.repo
-rw-r--r--. 1 root root  225  5月 28  2020 virt-ol7.repo.bkp
-rw-r--r--. 1 root root  226  2月 17 06:42 virt-ol7.repo.rpmnew.bkp
$

以前のrepoファイルは全て bkpという名前にリネームされて置き換わった感じですね。

各レポジトリファイルの変更点は「baseurl=https://yum$ociregion.oracle.com/repo/OracleLinux/」という記載だったものが「baseurl=https://yum$ociregion.$ocidomain/repo/OracleLinux/」というように「oracle.com」以外のドメインが設定される可能性に配慮したものに変更されていた。

この$ociregionや$ocidomainはどこで設定されているかというと /etc/yum/vars/ にあるファイルで定義されています。

$ ls -l /etc/yum/vars/
合計 12
-rw-r--r--. 1 root root 11  6月 16 10:15 ocidomain
-rw-r--r--. 1 root root 14  6月 16 10:15 ociregion
-rw-r--r--. 1 root root 13  6月 16 10:15 region
$ cat /etc/yum/vars/ocidomain
oracle.com
$ cat /etc/yum/vars/ociregion
-us-phoenix-1
$ cat /etc/yum/vars/region
us-phoenix-1
$

Oracle Cloud上のLinuxインスタンスでiscsistartというサービスが起動失敗している


Oracle Cloud上Linuxインスタンスでol-consolebaud.serviceの起動に失敗している」の件で、これまでに作ったインスタンスの状態を確認していったところ、一番古いLinuxインスタンスでは「iscsistart_169.254.0.2:::1:iqn.2015\http://x2d02.oracle.boot:uefi.service」というサービスの起動に失敗していた。

ぐぐるとOracleサポートの「OCI: iscsistart attempts to connect iscsi target when the network link is not ready (Doc ID 2610486.1)」が出てくるがサポートがないので内容がわからない。

とりあえず、起動失敗しているものと起動成功しているものの/etc/default/grubを比較してみたところ、起動成功しているもののGRUB_CMDLINE_LINUX行には「rd.iscsi.bypass」が追加されていた。

GRUB_CMDLINE_LINUX行に追加して「grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg」を実行してgrub設定を更新、再起動して、問題無く起動するようになった。


確認したOracle Linuxインスタンスの /etc/default/grub設定の比較

Oracle-Linux-7.7-2019.08.28-0 の /etc/default/grub

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_DISABLE_RECOVERY="true"
GRUB_TERMINAL="console"
GRUB_CMDLINE_LINUX="crashkernel=auto LANG=en_US.UTF-8 console=tty0 console=ttyS0,9600 rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0 netroot=iscsi:169.254.0.2:::1:iqn.2015-02.oracle.boot:uefi iscsi_param=node.session.timeo.replacement_timeout=6000 net.ifnames=1 nvme_core.shutdown_timeout=10 ipmi_si.tryacpi=0 ipmi_si.trydmi=0 ipmi_si.trydefaults=0 libiscsi.debug_libiscsi_eh=1 loglevel=4"

CentOS-7-2020.06.16-0 の /etc/default/grub

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_DISABLE_RECOVERY="true"
GRUB_TERMINAL="console"
GRUB_CMDLINE_LINUX="crashkernel=auto LANG=en_US.UTF-8 transparent_hugepage=never console=tty0 console=ttyS0,9600 libiscsi.debug_libiscsi_eh=1 rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0 ip=dhcp netroot=iscsi:169.254.0.2::::iqn.2015-02.oracle.boot:uefi iscsi_param=node.session.timeo.replacement_timeout=6000 net.ifnames=1 rd.iscsi.bypass"

Oracle-Autonomous-Linux-7.8-2020.05-0 の /etc/default/grub

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_DISABLE_RECOVERY="true"
GRUB_TERMINAL="console"
GRUB_CMDLINE_LINUX="crashkernel=auto LANG=en_US.UTF-8 console=tty0 console=ttyS0,9600 rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0 rd.iscsi.bypass=1 netroot=iscsi:169.254.0.2:::1:iqn.2015-02.oracle.boot:uefi iscsi_param=node.session.timeo.replacement_timeout=6000 net.ifnames=1 nvme_core.shutdown_timeout=10 ipmi_si.tryacpi=0 ipmi_si.trydmi=0 ipmi_si.trydefaults=0 libiscsi.debug_libiscsi_eh=1 loglevel=4"

Oracle-Linux-8.3-2021.05.12-0 の /etc/default/grub

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
GRUB_TERMINAL="console"
GRUB_CMDLINE_LINUX="crashkernel=auto LANG=en_US.UTF-8 console=tty0 console=ttyS0,9600 rd.luks=0 rd.md=0 rd.dm=0 rd.lvm.vg=ocivolume rd.lvm.lv=ocivolume/root rd.net.timeout.carrier=5 netroot=iscsi:169.254.0.2:::1:iqn.2015-02.oracle.boot:uefi rd.iscsi.param=node.session.timeo.replacement_timeout=6000 net.ifnames=1 nvme_core.shutdown_timeout=10 ipmi_si.tryacpi=0 ipmi_si.trydmi=0 libiscsi.debug_libiscsi_eh=1 loglevel=4 ip=single-dhcp crash_kexec_post_notifiers"

Oracle-Linux-8.3-aarch64-2021.05.12-0 の /etc/default/grub

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
GRUB_TERMINAL="console"
GRUB_CMDLINE_LINUX="crashkernel=auto LANG=en_US.UTF-8 console=ttyAMA1 console=ttyAMA0,115200 rd.luks=0 rd.md=0 rd.dm=0 rd.lvm.vg=ocivolume rd.lvm.lv=ocivolume/root rd.net.timeout.carrier=5 netroot=iscsi:169.254.0.2:::1:iqn.2015-02.oracle.boot:uefi rd.iscsi.param=node.session.timeo.replacement_timeout=6000 net.ifnames=1 nvme_core.shutdown_timeout=10 ipmi_si.tryacpi=0 ipmi_si.trydmi=0 libiscsi.debug_libiscsi_eh=1 loglevel=4 ip=single-dhcp crash_kexec_post_notifiers"

Oracle Cloud上Linuxインスタンスでol-consolebaud.serviceの起動に失敗している


2020年にOracle Cloud上に作ったLinuxインスタンスの状態を「systemctl status」で確認してみたら、ol-consolebaud.serviceの起動に失敗していた。

画像
ol-consolebaud.service: main process exited, code=exited, status=1/FAILURE
Failed to start Check console baud rate.
Unit ol-consolebaud.service entered failed state.
ol-consolebaud.service failed.

検索してみるとRogerio Eguchi Blog の「OCI – ol-consolebaud.service」を発見。

/etc/default/grub に書かれているシリアルコンソール設定の速度が9600から115200に変更になったことが原因のようである。

Oracle Cloud Infrastructure ドキュメントを確認すると「インポートされたLinuxイメージでのシリアル・コンソール・アクセスの有効化」のブートローダの構成で設定している速度が115200になっている。そして、”シリアルコンソールアクセスの検証”では9600になっていてドキュメントの整合性がとれていない・・・というわけで、途中で変更されたようなのだが、All Oracle Linux 7.x Images の履歴をみたけど、それっぽい変更が見当たらない・・・うーん?

まあ、ともかく原因は判明したのでGRUB_CMDLINE_LINUX行の「console=ttyS0,9600」を「console=ttyS0,115200」に変更。

そして、 「grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg」でgrubブートローダに変更を反映して、再起動。

これでol-consolebaudが正常に起動するようになった。

Oracle Cloud上のインスタンスから管理メールを送信する手法


Oracle Cloud上に作成したインスタンスのうち、Oracle Autonomouse Linux 7インスタンスだと適切に設定している場合、yum-cronなどが実行された際に 送信者 noreply@notification.~.oci.oraclecloud.com でメールを送信する設定になっている。

Oralce Linux 8インスタンスだとそのような設定にはなっていない。

似たような形でインスタンスのrootから送信されるメールを noreply@notification.~.oci.oraclecloud.com で発信する方法があるかを確認した。

参考ドキュメント
Oracle Cloud Infrastructureドキュメント「電子メール配信の開始
Oracle Cloud Infrastructureドキュメント「Postfixと電子メール配信の統合

しかし、「電子メール配信」については有料アカウントが必要になるようだ。

Oracle Autonomouse Linux 7インスタンスが利用しているのは「通知」の方になっている

このサブスクリプション設定が流用できればいいんですけど・・・

Oracle Cloud : 通知サービスとoci-cliを使って一時間ごとにDBCSの状態を通知する

この情報が使えそうです。

今回の環境ではすでに[開発者サービス]-[アプリケーション統合]-[通知]に

すでにAutonomouse Linux用で作成したトピックが作成されているため、それを流用します。

上記の「AL_notification」のトピックOCIDを使用してコマンドを実行・・・

$ oci ons message publish --topic-id ocid1.onstopic.oc1.ap-tokyo-1.<略> --title "test mail" --body "test mail"
-bash: oci: command not found
$

oci-utilsのパッケージがアップデートされていないとエラーになります。その場合はアップデートします。

2024/10/15: いまは python39-oci-cli か python36-oci-cli にociコマンドが含まれているようなので、 oci-utils と python3?-oci-cli をインストールします。

$ sudo dnf update oci-utils -y
Last metadata expiration check: 4:26:16 ago on Tue 08 Jun 2021 01:30:06 PM JST.
Dependencies resolved.
================================================================================
 Package                  Arch     Version            Repository           Size
================================================================================
Upgrading:
 oci-utils                noarch   0.12.4-1.el8       ol8_oci_included    245 k
Installing dependencies:
 python3-arrow            noarch   0.17.0-1.0.1.el8   ol8_oci_included    101 k
 python3-click            noarch   6.7-8.el8          ol8_appstream       131 k
 python3-convertdate      noarch   2.3.0-1.0.1.el8    ol8_oci_included     83 k
 python3-dateparser       noarch   1.0.0-1.0.1.el8    ol8_oci_included    392 k
 python3-hijri-converter  noarch   2.1.1-1.0.1.el8    ol8_oci_included     30 k
 python3-jmespath         noarch   0.10.0-1.el8       ol8_oci_included     48 k
 python3-pymeeus          noarch   0.3.6-2.0.1.el8    ol8_oci_included    1.1 M
 python3-regex            aarch64  2021.4.4-1.el8     ol8_developer_EPEL  328 k
 python3-retrying         noarch   1.3.3-1.0.1.el8    ol8_oci_included     22 k
 python3-terminaltables   noarch   3.1.0-1.0.1.el8    ol8_oci_included     31 k
 python3-tzlocal          noarch   2.0.0-4.el8        ol8_oci_included     37 k
 python36-oci-cli         noarch   2.22.1-1.el8       ol8_oci_included    6.4 M

Transaction Summary
================================================================================
Install  12 Packages
Upgrade   1 Package

Total download size: 8.9 M
<略>
$

$ oci ons message publish --topic-id ocid1.onstopic.oc1.ap-tokyo-1.<略> --title "test mail" --body "test mail"
ERROR: Could not find config file at /home/opc/.oci/config, please follow the instructions in the link to setup the config file https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm
$

ociコマンドに必要な諸設定を行っていないのでエラーになりました。

まず、キーを作成します。なお、passphraseは何も入力せずエンターキーのみにします(そうしないとスクリプト実行の時にpassphraseを要求される)

$ oci setup keys
Enter a passphrase for your private key (empty for no passphrase):
Public key written to: /home/opc/.oci/oci_api_key_public.pem
Private key written to: /home/opc/.oci/oci_api_key.pem
Public key fingerprint: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx


    If you haven't already uploaded your API Signing public key through the
    console, follow the instructions on the page linked below in the section
    'How to upload the public key':

        https://docs.cloud.oracle.com/Content/API/Concepts/apisigningkey.htm#How2

$  ls -al ~/.oci
total 8
drwx------. 2 opc opc   59 Jun  7 17:32 .
drwx------. 5 opc opc  138 Jun  7 17:32 ..
-rw-------. 1 opc opc 1679 Jun  7 17:32 oci_api_key.pem
-rw-------. 1 opc opc  451 Jun  7 17:32 oci_api_key_public.pem
$

作成された oci_api_key_public.pem の内容を[アイデンティティとセキュリティ]-[アイデンティティ]-[ユーザー]に登録されている各ユーザから、使用するユーザを選択し[リソース]-[APIキー]に登録します。

なお、APIキーは無料アカウントでは3つまで登録可能で、それ以上は登録できませんでした。
使ってないものを消すには面倒くさいですが、各ユーザの~/.oci/oci_api_key.pem のフィンガープリントを計算して、登録されているものを比較する必要があります。

フィンガープリントの計算手法はOracle Cloudドキュメント「キーのフィンガープリントの取得方法」にあるように「openssl rsa -pubout -outform DER -in ~/.oci/oci_api_key.pem | openssl md5 -c」で実施出来ます。

つぎに~/.oci/config ファイル作成のために

[ガバナンスと管理]-[アカウント管理]-[テナンシ詳細]にて、テナントのOCIDを取得

また、ユーザのOCIDと先ほど登録したAPIキーのフィンガープリントを configファイルに記載する。

$ cat ~/.oci/config
[DEFAULT]
key_file=/home/opc/.oci/oci_api_key.pem
region=ap-tokyo-1
tenancy=ocid1.tenancy.oc1..aaaaaaaa7lml<略>
user=ocid1.user.oc1..aaaaaaaamenibh4iny<略>
fingerprint=<略>
$

記載してociコマンドを再実行

$ oci ons message publish --topic-id ocid1.onstopic.oc1.ap-tokyo-1.aa<略> --title "test mail" --body "test mail"
WARNING: Permissions on /home/opc/.oci/config are too open.
To fix this please try executing the following command:
oci setup repair-file-permissions --file /home/opc/.oci/config
Alternatively to hide this warning, you may set the environment variable, OCI_CLI_SUPPRESS_FILE_PERMISSIONS_WARNING:
export OCI_CLI_SUPPRESS_FILE_PERMISSIONS_WARNING=True

{
  "data": {
    "message-id": "56ca7636-1605-7a19-5344-<略>",
    "time-stamp": null
  }
}
$

まず、「WARNING: Permissions on /home/opc/.oci/config are too open.」についてはパーミッション問題なので、書いてある通りに対処する。

$ ls -l /home/opc/.oci/config
-rw-rw-rw-. 1 opc opc 299 Jun  7 17:43 /home/opc/.oci/config
$ oci setup repair-file-permissions --file /home/opc/.oci/config
$ ls -l /home/opc/.oci/config
-rw-------. 1 opc opc 299 Jun  7 17:43 /home/opc/.oci/config
$

再実行

$ oci ons message publish --topic-id ocid1.onstopic.oc1.ap-tokyo-1.aaaaaaaacesi5<略> --title "test mail" --body "test mail"
{
  "data": {
    "message-id": "c491e672-9401-beb3-16f5-<略>",
    "time-stamp": null
  }
}
$

成功か失敗か分かりづらいですが、成功していました。(WARNING: Permissions の時のやつもメール送信は出来ていました)

というわけで、ociコマンドを使用することで、Oracle Cloudの通知を使ってシステムメールを送信することができそうなことがわかりました。

ociコマンドは https://github.com/oracle/oci-cli にソースがある

つぎに dnf automaticでそれを実行するにはどういう手法が最適化の検討です。

DNF Automatic」には「[command] section」と「[command_email] section」があり、利用できそうです。

違いの詳細については「RHEL8/CentOS8のdnf automaticのemitters設定を調べた」に書きましたが、今回の場合は[command_email]sectionを使うことにします。

dnf automaticではメール本文を標準入力で指定することになっていて、そのままではociコマンドのbodyオプションとして渡すことができません。

なので、Oracle Cloud Infrastructure Document Notifications Publish Messages(日本語版) を起点に調べていったところOracle Cloud Infrastructure Documentation / API Reference and Endpoints の「PublishMessage」にて、REST API/Java SDK/Python SDK/Go SDK/TypeScript SDK/.NET SDK/Ruby SDKを使った場合のコードサンプルを発見。

ociコマンドはpyhonを使っているので、Python SDKのサンプルコードを利用した /usr/local/bin/oci-notification-mail を作って使用します。

topic_id=のところは自分の環境に合わせてください。

$ sudo vi /usr/local/bin/oci-notification-mail
$ cat /usr/local/bin/oci-notification-mail
#!/usr/bin/python3
# This is an automatically generated code sample.
# To make this code sample work in your Oracle Cloud tenancy,
# please replace the values for any parameters whose current values do not fit
# your use case (such as resource IDs, strings containing ‘EXAMPLE’ or ‘unique_id’, and
# boolean, number, and enum parameters with values not fitting your use case).

import oci
import sys

argvs=sys.argv
argc = len(argvs)
subject=argvs[1]
textbody="".join(sys.stdin.readlines())

# Create a default config using DEFAULT profile in default location
# Refer to
# https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm#SDK_and_CLI_Configuration_File
# for more info
config = oci.config.from_file()


# Initialize service client with default config file
ons_client = oci.ons.NotificationDataPlaneClient(config)

# Send the request to service, some parameters are not required, see API
# doc for more info
publish_message_response = ons_client.publish_message(
    topic_id="ocid1.onstopic.oc1.ap-tokyo-1.<略>",
    message_details=oci.ons.models.MessageDetails(
        body=textbody,
        title=subject),
    message_type="RAW_TEXT")

# Get the data from response
print(publish_message_response.data)
$ sudo chmod a+x /usr/local/bin/oci-notification-mail
$

まずこれを作成したあと、送信テストをします。

$ cat /etc/hosts | /usr/local/bin/oci-notification-mail testmail
{
  "message_id": "ef1aa15b-98d0-1824-68ef-<略>",
  "time_stamp": null
}
$

これを実行してしばらく待つと、「Subject:testmail」 で、本文が/etc/hostsの中身になっているメールが届きます。

スクリプトが正常に動作することを確認できたら、ociコマンドがrootユーザでも実行できるように .oci ディレクトリの内容を /root/.oci にコピーします。書かれてるpemファイルのパスなどはそのままでかまいません。注意点は /root/.oci ディレクトリの権限を 700 にしておく、ということです。

最後にdnf automaticの設定を変更します。

変更する場所は2つ

「[emitters] セクション」のemit_via を「emit_via=command_email」に変更

「[command_email]セクション」のcommand_formatを「command_format = “/usr/local/bin/oci-notification-mail {subject}”」、「#stdin_format = “{body}”」を「stdin_format = “{body}”」に変更します。

これにより、dnf automaticでパッチが適用された場合に下記の様なメールが届くようになりました。

おまけ

ちなみに、Oracle Linux 8の標準インスタンスではpostfixやsendmailではなく、esmtp というパッケージでメール送信が行われるようです。

$ ls -l /usr/sbin/sendmail
lrwxrwxrwx. 1 root root 21 May 27 13:04 /usr/sbin/sendmail -> /etc/alternatives/mta
$ ls -l /etc/alternatives/mta
lrwxrwxrwx. 1 root root 22 May 27 13:04 /etc/alternatives/mta -> /usr/bin/esmtp-wrapper
$ ls -l /usr/bin/esmtp-wrapper
-rwxr-xr-x. 1 root root 3374 Jul  2  2020 /usr/bin/esmtp-wrapper
$  rpm -qa|grep smtp
esmtp-1.2-15.el8.aarch64
libesmtp-1.0.6-18.el8.aarch64
$ alternatives --display mta
mta - status is auto.
 link currently points to /usr/bin/esmtp-wrapper
/usr/bin/esmtp-wrapper - priority 30
 slave mta-sendmail: /usr/bin/esmtp-wrapper
 slave mta-sendmailman: /usr/share/man/man1/esmtp.1.gz
 slave mta-mailq: /usr/bin/esmtp-wrapper
 slave mta-mailqman: /usr/share/man/man1/esmtp.1.gz
Current `best' version is /usr/bin/esmtp-wrapper.
$

公式ページに「THIS PROJECT IS NO LONGER BEING MAINTAINED. IF IT DOESN’T WORK FOR YOU SEE THESE LINKS.」って書いてあるのにRHEL/CentOS/Oracle Linux 8で使っているのか・・・