クラウド・シェルでJava21を使いたい(csruntimectlを調べる)

この記事は、 JPOUG Advent Calendar 2024 6日目の記事です。
5日目はNoraさんの記事でした。

 

クラウド・シェルでは、Javaが使えます。

クラウド・シェルの使用

-言語ランタイムの管理

 

現在クラウド・シェルでサポートされているランタイムのバージョンを確認するには、listオプションを使用します。例:

csruntimectl java list

 

実際に確認してみると3種類のJavaランタイムが使えるようです。

xxx@cloudshell:~ (ap-osaka-1)$ csruntimectl java list
   graalvmjdk-17                                                      /usr/lib64/graalvm/graalvm-java17
   oraclejdk-1.8                                              /usr/lib/jvm/jdk-1.8.0_431-oracle-aarch64
 * oraclejdk-11                                                 /usr/lib/jvm/jdk-11.0.25-oracle-aarch64

 

が、、、少し古くない?

Java21*が使いたいんだけど。。

 

*マイクラプラグイン開発はJava21が標準らしいので、クラウド・シェルでできたら嬉しい。

 

というわけで、今回は、csruntimectlについて調べてみることにします。

そもそも、csruntimectl って何?どこかにインストールされている?

 

xxxxxx@cloudshell:~ (ap-osaka-1)$ which csruntimectl
/usr/bin/which: no csruntimectl in (/usr/lib/jvm/jdk-11.0.25-oracle-aarch64/bin/:/opt/dataflow/scala/scala-2.12.15/bin/:/opt/dataflow/sbt/sbt/bin/:/opt/dataflow/df_setup/spark-*-bin*/bin/:/opt/ogg/bin:/home/s4r_agent/.yarn/bin:/home/s4r_agent/.config/yarn/global/node_modules/.bin:/opt/oracle/sqlcl/bin:/usr/lib/oracle/19.10/client64/bin/:/opt/odsp:/home/oci/.pyenv/plugins/pyenv-virtualenv/shims:/home/oci/.pyenv/shims:/home/oci/.pyenv/bin:/opt/rh/rh-ruby27/root/usr/local/bin:/opt/rh/rh-ruby27/root/usr/bin:/opt/rh/rh-python38/root/usr/local/bin:/opt/rh/rh-python38/root/usr/bin:/opt/rh/rh-maven35/root/usr/bin:/opt/rh/rh-git218/root/usr/bin:/opt/rh/httpd24/root/usr/bin:/opt/rh/httpd24/root/usr/sbin:/opt/rh/devtoolset-10/root/usr/bin:/home/oci/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/s4r_agent/.composer/vendor/bin:/opt/yarn-v1.22.19/bin)

 

実行ファイルじゃなさそうですね。

プロファイルを追いかけます。

 

 

.bashrc

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
source /etc/bashrc.cloudshell

 

いかにもそれっぽいの読み込んでますね。

 

 cat /etc/bashrc.cloudshell

# Make sure to source the script 'manage-runtime'
function csruntimectl() {
  source /usr/local/bin/manage-runtime "$@"
}

# Export JAVA_HOME and PATH env variables for the current java runtime.
csruntimectl java export

 

ありました!

 

さらに調べます。

cat  /usr/local/bin/manage-runtime

#!/usr/bin/env bash

if grep -q "Red Hat Enterprise Linux Server release 7" /etc/redhat-release 
then
  source manage-runtime-ol7 "$@"
elif grep -q "Red Hat Enterprise Linux release 8" /etc/redhat-release
then
  source manage-runtime-ol8 "$@"
fi

 

OSのバージョンで分岐してるみたいですね。

cat /etc/redhat-release

Red Hat Enterprise Linux Server release 7.9 (Maipo)

 

ということで、分岐先のファイルを見ます。

 

 less /usr/local/bin/manage-runtime-ol7

#!/usr/bin/env bash

#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
#
# Copyright (c) 2022 Oracle and/or its affiliates. All rights reserved.
#

[ -n "$ENABLE_DEBUG" ] && set -x

JDK_VERSION_ROOT="${HOME}/.oci/java"
CURRENT_VERSION_FILE="${JDK_VERSION_ROOT}/current-version"
OCI_ROOT="/etc"
VERSIONS_FILE="${OCI_ROOT}/java-versions"

# Default jdk version alias specified in format javaProvider-javaVersion
DEFAULT_JAVA_VERSION=oraclejdk-11

javaRuntime=false

usage() {
  echo "Usage:"
  echo "" 
  echo "  csruntimectl java set <version alias>    Switch to a specific java version by giving a version alias."
  echo "  csruntimectl java list                   Display all java version aliases and their corresponding JAVA_HOME."
  echo "  csruntimectl help                        Output this help usage."
  echo "" 
  return 1
}

# Get the full path from the versions file based on the javaShortVersion
searchJavaPath() {
  javaShortVersion=$1

  javaHomePath=""
  if [ -f ${VERSIONS_FILE} ]; then
    while read -a line;  do
      if [ -n "${line}" ]; then
        IFS='='
        read -ra strarray <<< "${line}"   # version is read into an array as tokens separated by IFS
         #${strarray[0]} ${strarray[1]}
         if [ "${strarray[0]}" = "${javaShortVersion}" ]; then
           # Found the matching short java version
           javaHomePath="${strarray[1]}"
           break
         fi
        IFS=' '  # reset to default
      fi
    done < "${VERSIONS_FILE}"
  else
    echo >&2 "${VERSIONS_FILE} does not exist. No java version to manage."
    return 1
  fi
  echo "${javaHomePath}"
}

・・・・・

 

/etc/java-versions をからcsruntimeutilでセットできるJavaを見ている模様。

そして、、、/etc/java-versionを編集する方法は、、、ありません。

 

クラウド・シェルの制限

 

  • クラウド・シェルではルート・アクセスができず、sudoも使用できないため、インストールにルート・アクセスが必要なパッケージはインストールできません。インストールにルートを必要としないバージョンのパッケージが多数用意されています。解凍してホーム・ディレクトリにインストールできます。

 

 

個別にJavaを配置すれば使用できるみたいですね。

 

xxxx@cloudshell: (ap-osaka-1)$wget https://download.oracle.com/java/21/latest/jdk-21_linux-aarch64_bin.tar.gz

 

xxxx@cloudshell: (ap-osaka-1)$cd jdk-21*/bin

 

xxxx@cloudshell:bin (ap-osaka-1)$ ./java -version
java version "21.0.5" 2024-10-15 LTS
Java(TM) SE Runtime Environment (build 21.0.5+9-LTS-239)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.5+9-LTS-239, mixed mode, sharing)

 

 

今日はここまで。

 

明日は、gowatanaさんの記事です。

 

 

ADWにgoogle colaboratoryから接続する (JPOUG Advent Calendar2021 & Oracle Cloud Infrastructure Advent Calendar 2021 3日目)

この記事は

JPOUG Advent Calendar 2021

Oracle Cloud Infrastructure Advent Calendar 2021

の3日目の記事です。

 

JPOUG Advent Calendar 2021 の2日目の記事はwrcsus4さんの PDBのUnPlugとPlug でした。

Oracle Cloud Infrastructure Advent Calendar 2021 の2日目の記事はwrcsus4さんのitokazuさんのOracle Cloud で OS のログ監視を実装する  でした。

 

最近、機械学習(とpython)のお勉強でGoogle colaboratoryを使用しているのですが、データの処理※1や保存※2をDBで行いたいと思うケースが多々あり、Google colaboratoryからADWに接続する方法を調べてみました。

 

結論としては、以下のURLで手順が公開されていますので、手っ取り早く試したい方は以下をどうぞ。

Connection to Oracle Cloud from Google Colab Notebook

 

使う分には上記の手順で全く問題ないのですが、以下が気になりました。

oracle instant client導入に関して、非rpm系のライブラリが用意されているのに、無理やりalienコマンドでrpmパッケージを入れている。(google Colab はubuntu)

 

というわけでrpmパッケージを使用しない方法を試してみました。

解凍して配置&ldconfigを使用する以外、ほとんど元の記事と違いはないのですが、

ldconfigでかなりハマりました。通常、導入したライブラリ(xx.so)は環境変数LD_LIBRARY_PATHで認識してくれるはずなのですが、認識してくれず、ldconfigで対応しています。(colabはコンテナ(docker?)で実行されているようなので、そこが関係しているのか、、、、調べきれず)今回は動かしておしまいです。

 

※1 pandasで処理自体はできるのですが、SQLで処理したらもっと早く処理できるよね。と思うことがしばしば。あとは、pandas慣れしてないので、ちょっとした処理でも小一時間かかる。。。(SQLの集計処理とかPL/SQLならすぐわかるのに。。。とか)

 

※2 google driveと連携すれば、処理結果を保存できます。

LINSTORのビルド(Oracle Linux 8.3)

LINSTOR SDSを検証したくて、ビルドを試みるもかなりハマったので、メモ。

2021/4/29時点の情報です。RHEL8.3、CentOS8、AlmaLinuxも同じ手順で行けると思います。

 

#環境

Oracle Linux8.3

 

#必要なパッケージのインストール

sudo dnf install -y zip unzip make git rpm-build wget java-1.8.0-openjdk-devel python2 python3

 

##linstor-serverのrpm作成

#gradle(javaのビルドツール)のインストール

#gradleは6.7でないと、linstor-serverビルドに失敗。
wget https://services.gradle.org/distributions/gradle-6.7-bin.zip
sudo mkdir /opt/gradle
sudo unzip -d /opt/gradle gradle-6.7-bin.zip
export PATH=$PATH:/opt/gradle/gradle-6.7/bin

 

#linstorのソースダウンロード

wget http://www.linbit.com/downloads/linstor/linstor-server-1.12.0.tar.gz
mkdir -p ~/rpmbuild/SOURCES
cp linstor-server-*.tar.gz ~/rpmbuild/SOURCES
tar xvzf linstor-server-1.12.0.tar.gz
cd linstor-server-1.12.0
rpmbuild -bb linstor.spec

 

#ビルドされたrpmの確認

ls ~/rpmbuild/RPMS/noarch/
linstor-common-1.12.0-1.el8.noarch.rpm
linstor-controller-1.12.0-1.el8.noarch.rpm
linstor-satellite-1.12.0-1.el8.noarch.rpm

 

#python-linstorのビルド

wget http://www.linbit.com/downloads/linstor/python-linstor-1.7.0.tar.gz
tar xvf python-linstor-1.7.0.tar.gz
cd python-linstor-1.7.0
make rpm

ls dist
python-linstor-1.7.0-1.noarch.rpm python-linstor-1.7.0.tar.gz
python-linstor-1.7.0-1.src.rpm

 

 

##python-linstorのビルドのビルド
wget http://www.linbit.com/downloads/linstor/linstor-client-1.7.1.tar.gz
tar xvf linstor-client-1.7.1.tar.gz
cd linstor-client-1.7.1/
ls dist
linstor-client-1.7.1-1.noarch.rpm linstor-client-1.7.1.tar.gz
linstor-client-1.7.1-1.src.rpm

 

参考

https://abelog.tech/archives/94

 

日本語環境でroot.sh時に CRS-4003: Resource 'ora.crsd' is registered.

現象

1ノード目のroot.shで以下エラー

PRCT-1011 : Failed to run "crsctl". Detailed error: CRS-4003: Resource 'ora.crsd' is registered.
/bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

 

 

環境
Oracle RAC 19.7(19.3+p30899722_190000_Linux-x86-64.zip)
RHEL 8.3

 

 

原因
OSインストール時に日本語でインストールすると、locale en_US.UTF-8がインストールされていないため。
locale -a でen_US.UTF-8 が無ければ、インストールする必要がある。

 

 

対処方法
dns install glibc-langpack-en

Oracle RAC on Azure(2020版)

 この記事は、JPOUG Advent Calendar 2020 / Azure Advent Calendar 2020 の2日目の記事です。

JPOUG Advent Calendar 2020 の1日目は @wrcsus4さんの記事でした。
Azure Advent Calendar 2020 の1日目は @jkudoさんの記事でした。


<前提>
2020年12月時点の情報です。

OS:OracleLinux 8.2
Oracle Database: 19.7
Oracle Grid Infrastructure: 19.7

 

<Azure固有>
・共有ディスク
以前は、iSCSINFSサーバをインスタンス上で構成する必要がありましたが、
Azure マネージドディスクで共有ディスクのサポートが始まりました。
Azure Ultra Disksを使用して、maxSharesを設定します。

・名前解決
以前はプライベート(内部)のDNSは解決できなかったのですが、
現在はAzure DNS Private Zonesがありますので、
VIPやSCANの名前解決はAzure DNS Private Zonesで解決します。


<他のクラウドでも共通>
・ネットワーク(マルチキャスト対応含む)
クラウド環境やコンテナ環境ではネットワークが一本しかない、
固定IPを指定できない、マルチキャスト対応してない など様々な制約があります 。
Azureもマルチキャストに対応していません。
これらの制約に対応する為、仮想ネットワーク(vxlan)を使います。vxlanはユニキャストモード使用します。
vxlanはNetworkManager Dispatcherスクリプトを作成して構成します。


インスタンスメタデータ
169.254.169.254への通信が可能だとOracle Grid Infrastructureのインストール(root.sh)に失敗します。
firewalldで169.254.169.254への通信をrejectします。


・自動化
何度も作って壊すのとクラウド間での構築手順を最大限共通化するために、以下のようなフレームワークを作っています。

マネージドサービス、インスタンス構築・・・・terraform
OS起動後の設定、インストール・・・・ansible
terraform⇒ansinbleの仲介・・・各CLIを用いたシェル


スクリーンショット

※ansibleの実行結果を張り付けた関係上、少々見づらいです。
f:id:KNOPP:20201130215909j:image


f:id:KNOPP:20201130215926j:image


f:id:KNOPP:20201130215943j:image

Oracle Linux 8でServer With GUIをインストールする

Oracle Linux 8.1(GUIなし)に"Server With GUI”をインストールしようとしたときに、

以下のようなエラーがでます。

 

sudo dnf -y group install "Server With GUI"

~略

'dnf clean packages' を実行することでキャッシュパッケージを削除できます。
エラー: トランザクションの確認時にエラー:
ファイル /usr/share/doc/libstoragemgmt/NEWS は libstoragemgmt-1.8.1-2.el8.i686 と libstoragemgmt-1.8.3-1.el8.x86_64 のインストールで競合しています。
ファイル /usr/share/man/man1/lsmcli.1.gz は libstoragemgmt-1.8.1-2.el8.i686 と libstoragemgmt-1.8.3-1.el8.x86_64 のインストールで競合しています。
ファイル /usr/share/man/man1/lsmd.1.gz は libstoragemgmt-1.8.1-2.el8.i686 と libstoragemgmt-1.8.3-1.el8.x86_64 のインストールで競合しています。
ファイル /usr/share/man/man1/simc_lsmplugin.1.gz は libstoragemgmt-1.8.1-2.el8.i686 と libstoragemgmt-1.8.3-1.el8.x86_64 のインストールで競合しています。
ファイル /usr/share/man/man5/lsmd.conf.5.gz は libstoragemgmt-1.8.1-2.el8.i686 と libstoragemgmt-1.8.3-1.el8.x86_64 のインストールで競合しています。 

 

ググってしらべたところ、以下に該当しそうです。

https://bugzilla.redhat.com/show_bug.cgi?id=178289

bugzilla.redhat.com

 

上記のwork aroundに従い、

sudo dnf -y group install "Server With GUI" --nobest

sudo dnf -y group upgrade "Server With GUI"

 

でインストールできました。

 RHEL8/CentOS8も該当すると思います。

advent calendar振り返り

Oracle Cloud always free Advent Calendar 2019の25日目です。


本日はOracle Cloud always free Advent Calendar 2019の最終日ですので、Oracle Cloudを使ってみた感想を書きたいと思います。


・always freeは太っ腹

22日目の記事で分かるように、かなり太っ腹です。CPUがちょっと弱い気もしますが、ちょっとしたVPSであれば、置き換え可能だと思います。転送量月10TBまで無料というのもかなり魅力的です。

また、automonous databaseが使用可能というのも画期的です。

 

・always freeの枯渇

11月は問題なくalways freeのcomputeインスタンスが作成できたのですが、12月に入ってからは、out of host capacityというエラーで作成できなくなりました。2インスタンスなんて太っ腹なことやらず1インスタンスにしておけば、、、と思いつつ、早急な拡充を祈るばかりです。

 

・ポリシーが分かりづらい

ポリシーの考え方がAWSGoogle Cloudに比べてかなり独特で分かりづらいです。また、簡単ポリシー割り当てウィザードみたいなものがないので、そのあたりもつらいです。今後の改善を期待したいところです。

 

Oracle Cloudはまだまだ黎明期

こう書くと怒られる気もしますが、Oracle Cloudはまだまだ黎明期だなーと感じます。理由としては、
 ・Web記事が少ない       

          メジャーな機能については日本語の記事も増えてきましたが、 マイナーな機能や使い方については、英語も含めて記事が少ない(もしくはまったくない)ことがあります。 REST APIJDBC接続(JKS)は手探りで記事を書きました。  

  ・Web記事のほとんどがコンソールベース

           Web記事ではCLIでの手順がほとんどなく、初期のAWSを思い出します。今後、UIの変更が度々走ると、UIの変更に耐えられなくなって、CLIベースの手順が増えるとは思いますが。

 

・automonous databaseへの接続はTNSがカギ

オンプレのOracle Databaseでwalletを使用していないと、接続方法に戸惑います。 基本的にTNSでwalletの位置などを指定することになるので、TNS周りが理解できてないとかなり厳しいと思います。 今回のOracle Cloud always free Advent Calendar 2019では、様々なツールから負荷をかけていますが、 sqlplusの接続から順を追って確認したおかげで、TNSまわりの理解ができ、接続まわりでハマることはありませんでした。

 

Oracle Machine Learningの学習コスト
ノートブックでの言語がPL/SQLのみとなっているため、機械学習の知識+PL/SQLのコーディング力となってしまうため、学習コストがかかります。titanicの予測あたりをやってみたかったのですが、PL/SQLでやるのがしんどくてあきらめてしまいました。
RかPythonサポートしてくれませんかねぇ。。。


以上、取り止めない感じですが、Oracle Cloud always free Advent Calendar 2019の最終日としたいと思います。