GraalVM
なんでやったの
Java(TM) SE Runtime Environment 18.9 (build 11.0.3+12-LTS)
- ユニバーサルJVMだからJavaのmoduleをPythonで作るとかできるらしい。
- JakartaEE勉強のための一環
- メイン機がWindows Homeなので仕方なくAWSでインスタンス立てテストしてみる。
インストール
- とりあえず最新版
$ https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.0.0/graalvm-ce-java11-linux-amd64-20.0.0.tar.gz
- 解凍して名前変えとく
$ tar xf graalvm-ce-java11-linux-amd64-20.0.0.tar.gz $ mv graalvm-ce-java11-20.0.0 graalvm-ce
$ sudo mv graalvm-ce /usr/local/ $ ls -l /usr/local/graalvm-ce/ total 352 drwxrwxr-x 2 ec2-user ec2-user 4096 Apr 19 09:35 bin drwxrwxr-x 4 ec2-user ec2-user 112 Apr 19 09:35 conf -rw-rw-r-- 1 ec2-user ec2-user 2316 Feb 17 18:22 GRAALVM-README.md drwxrwxr-x 3 ec2-user ec2-user 152 Apr 19 09:35 include drwxrwxr-x 2 ec2-user ec2-user 4096 Apr 19 09:35 jmods drwxrwxr-x 6 ec2-user ec2-user 52 Apr 19 09:35 languages drwxrwxr-x 71 ec2-user ec2-user 4096 Apr 19 09:35 legal drwxrwxr-x 14 ec2-user ec2-user 4096 Apr 19 09:35 lib -rw-rw-r-- 1 ec2-user ec2-user 27181 Feb 17 18:22 LICENSE.txt -rw-r--r-- 1 ec2-user ec2-user 3541 Feb 17 18:44 release -rw-rw-r-- 1 ec2-user ec2-user 306188 Feb 17 18:22 THIRD_PARTY_LICENSE.txt drwxrwxr-x 7 ec2-user ec2-user 91 Apr 19 09:35 tools
- binの中
$ ls -l /usr/local/graalvm-ce/bin total 141336 lrwxrwxrwx 1 ec2-user ec2-user 23 Feb 17 18:44 gu -> ../lib/installer/bin/gu -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jar -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jarsigner -rwxr-xr-x 1 ec2-user ec2-user 8720 Feb 17 18:40 java -rwxr-xr-x 1 ec2-user ec2-user 8784 Feb 17 18:40 javac -rwxr-xr-x 1 ec2-user ec2-user 8784 Feb 17 18:40 javadoc -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 javap -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jcmd -rwxr-xr-x 1 ec2-user ec2-user 12888 Feb 17 18:40 jconsole -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jdb -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jdeprscan -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jdeps -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jfr -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jhsdb -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jimage -rwxr-xr-x 1 ec2-user ec2-user 12880 Feb 17 18:40 jinfo -rwxr-xr-x 1 ec2-user ec2-user 8784 Feb 17 18:40 jjs -rwxr-xr-x 1 ec2-user ec2-user 8784 Feb 17 18:40 jlink -rwxr-xr-x 1 ec2-user ec2-user 12880 Feb 17 18:40 jmap -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jmod -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jps -rwxr-xr-x 1 ec2-user ec2-user 8792 Feb 17 18:40 jrunscript lrwxrwxrwx 1 ec2-user ec2-user 22 Feb 17 18:44 js -> ../languages/js/bin/js -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jshell -rwxr-xr-x 1 ec2-user ec2-user 12880 Feb 17 18:40 jstack -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jstat -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 jstatd -rwxr-xr-x 1 ec2-user ec2-user 6341 Feb 6 17:35 jvisualvm -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 keytool lrwxrwxrwx 1 ec2-user ec2-user 25 Feb 17 18:44 lli -> ../languages/llvm/bin/lli lrwxrwxrwx 1 ec2-user ec2-user 24 Feb 17 18:44 node -> ../languages/js/bin/node lrwxrwxrwx 1 ec2-user ec2-user 23 Feb 17 18:44 npm -> ../languages/js/bin/npm -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 pack200 -rwxr-xr-x 1 ec2-user ec2-user 144200783 Feb 17 18:44 polyglot -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 rmic -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 rmid -rwxr-xr-x 1 ec2-user ec2-user 8744 Feb 17 18:40 rmiregistry -rwxr-xr-x 1 ec2-user ec2-user 8736 Feb 17 18:40 serialver -rwxr-xr-x 1 ec2-user ec2-user 117704 Feb 17 18:40 unpack200
- javaのバージョン確認
$ /usr/local/graalvm-ce/bin/java -version openjdk version "11.0.6" 2020-01-14 OpenJDK Runtime Environment GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02) OpenJDK 64-Bit Server VM GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02, mixed mode, sharing)
- JVMがGraalになってる
OpenJDK Runtime Environment GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02)
- javaのpath通した
$ java -version openjdk version "11.0.6" 2020-01-14 OpenJDK Runtime Environment GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02) OpenJDK 64-Bit Server VM GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02, mixed mode, sharing)
- 適当になんか書く
public class GraalTest { public static void main(String[] args) { System.out.print("Hello World!\n"); } }
- native image 作ってみるよ
$ gu install native-image
- 失敗した
$ native-image GraalTest Build on Server(pid: 948, port: 33429) [graaltest:948] classlist: 524.06 ms, 0.37 GB [graaltest:948] (cap): 365.60 ms, 0.37 GB [graaltest:948] setup: 557.88 ms, 0.37 GB Error: Unable to compile C-ABI query code. Make sure native software development toolchain is installed on your system. Error: Use -H:+ReportExceptionStackTraces to print stack
- とりあえずverbose
$ native-image --verbose GraalTest Build on Server(pid: 948, port: 33429) SendBuildRequest [ -task=com.oracle.svm.hosted.NativeImageGeneratorRunner -imagecp /usr/local/graalvm-ce/lib/svm/builder/svm-llvm.jar:/usr/local/graalvm-ce/lib/svm/builder/graal-llvm.jar:/usr/local/graalvm-ce/lib/svm/builder/llvm-wrapper-shadowed.jar:/usr/local/graalvm-ce/lib/svm/builder/javacpp-shadowed.jar:/usr/local/graalvm-ce/lib/svm/builder/llvm-platform-specific-shadowed.jar:/usr/local/graalvm-ce/lib/svm/builder/svm.jar:/usr/local/graalvm-ce/lib/svm/builder/objectfile.jar:/usr/local/graalvm-ce/lib/svm/builder/pointsto.jar:/usr/local/graalvm-ce/lib/svm/library-support.jar:/home/ec2-user/java -H:Path=/home/ec2-user/java -H:CLibraryPath=/usr/local/graalvm-ce/lib/svm/clibraries/linux-amd64 -H:Class=GraalTest -H:Name=graaltest ] [graaltest:948] classlist: 486.59 ms, 0.37 GB [graaltest:948] (cap): 317.02 ms, 0.37 GB [graaltest:948] setup: 466.29 ms, 0.37 GB Error: Unable to compile C-ABI query code. Make sure native software development toolchain is installed on your system. Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception Error: Image build request failed with exit status 1 com.oracle.svm.driver.NativeImage$NativeImageError: Image build request failed with exit status 1 at com.oracle.svm.driver.NativeImage.showError(NativeImage.java:1527) at com.oracle.svm.driver.NativeImage.build(NativeImage.java:1289) at com.oracle.svm.driver.NativeImage.performBuild(NativeImage.java:1250) at com.oracle.svm.driver.NativeImage.main(NativeImage.java:1209) at com.oracle.svm.driver.NativeImage$JDK9Plus.main(NativeImage.java:1707)
エラー文言でぐぐったけどWindows系の対処方法しかなかった
解決
- doc はちゃんと読もうね
For compilation native-image depends on the local toolchain, so please make sure: glibc-devel, zlib-devel (header files for the C library and zlib) and gcc are available on your system.
- 下記を実行
sudo yum install glibc-devel sudo yum install zlib-devel sudo yum install gcc
- 再実行、うまくいったっぽい
$ native-image --verbose GraalTest Build on Server(pid: 948, port: 33429) SendBuildRequest [ -task=com.oracle.svm.hosted.NativeImageGeneratorRunner -imagecp /usr/local/graalvm-ce/lib/svm/builder/svm-llvm.jar:/usr/local/graalvm-ce/lib/svm/builder/graal-llvm.jar:/usr/local/graalvm-ce/lib/svm/builder/llvm-wrapper-shadowed.jar:/usr/local/graalvm-ce/lib/svm/builder/javacpp-shadowed.jar:/usr/local/graalvm-ce/lib/svm/builder/llvm-platform-specific-shadowed.jar:/usr/local/graalvm-ce/lib/svm/builder/svm.jar:/usr/local/graalvm-ce/lib/svm/builder/objectfile.jar:/usr/local/graalvm-ce/lib/svm/builder/pointsto.jar:/usr/local/graalvm-ce/lib/svm/library-support.jar:/home/ec2-user/java -H:Path=/home/ec2-user/java -H:CLibraryPath=/usr/local/graalvm-ce/lib/svm/clibraries/linux-amd64 -H:Class=GraalTest -H:Name=graaltest ] [graaltest:948] classlist: 586.08 ms, 0.37 GB [graaltest:948] (cap): 1,519.61 ms, 0.37 GB [graaltest:948] setup: 4,825.24 ms, 0.37 GB [graaltest:948] (typeflow): 20,870.66 ms, 0.37 GB [graaltest:948] (objects): 12,267.76 ms, 0.37 GB [graaltest:948] (features): 500.71 ms, 0.37 GB [graaltest:948] analysis: 34,038.85 ms, 0.37 GB [graaltest:948] (clinit): 459.90 ms, 0.37 GB [graaltest:948] universe: 1,395.97 ms, 0.37 GB [graaltest:948] (parse): 7,364.63 ms, 0.37 GB [graaltest:948] (inline): 4,375.56 ms, 0.37 GB [graaltest:948] (compile): 33,904.71 ms, 0.37 GB [graaltest:948] compile: 46,654.57 ms, 0.37 GB [graaltest:948] image: 2,174.40 ms, 0.37 GB [graaltest:948] write: 358.19 ms, 0.37 GB [graaltest:948] [total]: 90,857.98 ms, 0.37 GB
- 作成したimageを実行してみる
$ ./graaltest Hello World!
今更
JDKのあれこれ
Oracle JDKライセンスの有償化
リリースサイクル変更にともない、Oracle JDK の運用には有償サポートが必要になると発表された。
c.f. https://www.oracle.com/technetwork/jp/articles/java/ja-topics/jdk-release-model-4487660-ja.html
これによって「Java有償化混乱」が起きたけど、実際違う。無料で使える。
OracleJDKの機能はOpenJDKに提供されていて、有償機能として提供されていた機能もオープンソース化 されている。
そして、OpenJDKがOracleJDKに追従するためには半年ごとのアップデートが必要ということになり、現実的な運用にはOracleJDKの有償ライセンスが必要だよね。という発想のもと起きた混乱
実際にはAdoptOpenJDKとかAmazonがOpenJDKビルドを提供しているので、Java 8/11 のメンテナンスがメンテナンスが継続されている。
なので、OracleJDKの有償化はコミュニティからのディストリビューションでの提供による形にシフトしていったという方が正しい解釈になる。
まぁ、実際びびった。
JDKディストリビューション
- Oracle JDK
- Oracle OpenJDK
- Red Hat OpenJDK
- Azul zulu
- SapMachine
- BellSoft Liberica JDK
- AdoptOpenJDK with HotSpot
- Amazon Corretto
いずれもマルチプラットフォームに対応している。
各ベンダはOracleのリリースに伴って競い合うようにjdkの提供を行っている。
AdoptOpenJDKにはOpenJDKの則ったJVMであるHotSpot版とIBMが支援するOSS JVMのEclipse OpenJ9版がある。
後者だとIBMの商用サポートを得られることができる。
どのJDKディストリビューションを使用するか問題が出て来ているけど、将来的にはプラットフォーム依存が出てきそうかなと言うのが個人的な感想です。
FHS
FHS
LinuxにおけるファイルシステムのレイアウトはFHS(Filesystem Hierarchy Standard)で標準化されている。
主要ディストリビューションではFHSをサポートしている。
- /bin
- /sbin
- /etc
- /dev
- /lib
/bin
基本的なコマンドを格納。一般ユーザでも実行可能。
cat chown cp などなど
/sbin
システム管理に必要なコマンドを格納。rootユーザのみが実行可能。
Shutdown fdisk fsck などなど
/etc
システムやアプリケーションの設定ファイルやスクリプトファイルを格納。
/dev
HDDやDVD-ROM等のデバイスファイルを格納。
/lib
共有ライブラリやカーネルモジュールを格納
/binや/sbinに必要なライブラリはここにある。
/media
DVD-ROM等のリムーバブルメディアのマウントポイントを配置
/mnt
一時的にマウントするファイルシステムのマウントポイントを配置
/opt
パッケージ管理の仕組みでプログラムがインストールされるディレクトリ。
パッケージが追加されていくことになるのでパーティションを分けた方が良い
/proc
カーネル内部の情報にアクセスするための仮想的なファイルシステム。
実際にはディスクに存在しない。
root
rootユーザのディレクトリ。/home ファイルシステムがマウントできなくなった場合などでもメンテナンスができるよう、/homeとは別になる
/boot
起動に必要な設定やカーネルイメージが配置される。
起動時にBIOSの制限を受けないために、ルートファイルシステムとは別にディスク先頭に配置されることがある。
/home
ユーザごとのホームディレクトリを格納。
ユーザが増える場合を考慮して別のパーティションにした方が良い。
/tmp
一時ファイルが格納される。全てのユーザが書き込みと読み込みを行える。
/var
ログファイルなど頻繁に書き込みが発生するファイルが配置される。
パーティションは分けた方がいい。
/usr
コマンドやユーティリティが格納される。
- /usr/bin
一般ユーザが使用するコマンドを配置。
- /usr/sbin
rootユーザが使用するコマンドを配置。
緊急メンテナンス等に必須ではないコマンドが配置される。
- /usr/lib
プログラムの実行に必要なライブラリが配置される。
- /usr/local
ローカルシステムで必要とされるコマンドやライブラリ等を配置。
中にはbin sbin/lib などのディレクトリがある。
- usr/share
システムアーキテクチャに依存してしないファイルを配置。
/usr/share/man には manコマンドで使用するマニュアルがある。
- /usr/src
ブートローダ
ブートローダ
- HDD等のストレージからOSを読み込んで起動するプログラムのこと。
- LinuxにおけるブートローダはGRUB(Grand Unified Bootloader)で、0.9.x系をGRUB Legacy、1.9.x系のGRUB2がある。
- GRUB Legacy と GRUB2には設定ファイル名等差異があるので注意。
GRUBのインストール
$ grub-install /dev/sda
GRUB Legacyの設定ファイルは /boot/grub/menu.list で直接ファイルを編集して設定変更を行う。
- /etc/default/gurb で設定を行い下記のコマンドを実行して grub.cfgファイルを作成する。
$ grub-mkconfig -o /boot/grub/grub.cfg $ grub2-mkconfig -o /boot/grub/grub.cfg
ブートオプションの指定
$ grub append > ro root=/dev/VolGroup00/LogVol100 rhgb quiet
オプション | 説明 |
---|---|
root=デバイス | ルートパーティションをしてマウントするデバイス |
nousb | USBデバイスを使用しない |
single | シングルユーザモードで起動 |
1 ~ 5 | ランレベルの指定 |
BIOS
BIOSとUEFI
BIOS
- OSを起動するためのプログラムをディスクから読み込んで実行する。
- デバイスの動作を設定する。
- 基本的な入出力の制御を行う。
現在ではBIOSの後継となるIntelが開発したUEFI(Unified Extensible Firmware Interface)が主流となっている。
UEFIのメリットは以下の2点
システム起動までの流れ
電源投入からシステム起動までの一連の処理をブートもしくはブートストラップと言う。 電源投入後の流れ
BIOSが起動
- ハードウェアの最低限の認識をして起動デバイスの優先順位の決定や初期化を行う。
- 起動する順番にデバイスの先頭セクタにあるMBR(Master Boot Record) を読み込みブートローダに制御を移す。
ブートローダ
カーネル
init systemd
サービスを順次起動する。
SysVinit
systemd
tar覚書
tarのオプション覚えられない問題
- tarに限らずコマンドのオプション覚えられない。
- 多分省略前を覚えれば行けるのではないかと思ってまとめておく
オプション | 内容 | 省略前 |
---|---|---|
-c | 新しいアーカイブを作成 | create |
-x | アーカイブを展開 | extract |
-t | アーカイブの内容を一覧表示 | test |
-f | アーカイブのファイル名表示 | file |
-v | 処理の詳細を表示 | verbose |
-z | gzipを通して圧縮・展開 | gzip |
-j | bzip2を通して圧縮・展開 | ? |
-J | xzを通して圧縮・展開 | ? |
xzのオプション覚えられない問題
- xz形式でファイルを圧縮・解凍でするときに使う
- 引数なしで圧縮する
- 拡張子は「.xz」
- bzip2よりも圧縮率が高い
オプション | 内容 | 省略前 |
---|---|---|
-d, --decompress | 圧縮ファイルの展開(unxzコマンドでも解凍できる) | decompress(解凍する) |
-k , --keep | 圧縮・展開後に元のファイルを削除しない | keep |
-l , --list | 圧縮ファイルの情報を表示する | list |
bzip2
- bzip2形式でファイルを圧縮する時に使う
- 拡張子は「.bz2」
オプション | 内容 | 省略前 |
---|---|---|
-d, | 圧縮ファイルの展開(bunzipでも解凍できる) | decompress(解凍する) |
-c | 元ファイルを残して標準出力に表示 | ? |
gzip
- gzip形式でファイルを圧縮するときに使う
- 拡張子は「.gz」
オプション | 内容 | 省略前 |
---|---|---|
-d | 圧縮ファイルの展開(gunzipコマンドでも解凍できる) | decompress(解凍する) |
-c | 元ファイルを残して標準出力に表示する | ? |
-r | ディレクトリ内の全てのファイルを再起的にそれぞれ圧縮 | recursive |
dockerコンテナで立てたjenkinsにlocalhostで接続できなくなった話
概要
タイトル通りでdockerを使ってjenkinsを試してみようとしたら接続できなくなってハマったのでメモ
いじった内容
$ cat docker-compose.yml version: "3.3" services: master: container_name: jenkins image: jenkins:latest ports: - 18080:8080 volumes: - ./jenkins_home:/var/jenkins_home $ docker-compose up -d
ここまでで http:localhost:18080にアクセスすれば例のJenkinsの初期の画面が見れる想定だった。でもアクセスできない
$ docker ps してみたけどなんの問題もなさそう。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c9436371666e jenkins:latest "/bin/tini -- /usr/l…" 2 minutes ago Up 2 minutes 50000/tcp, 0.0.0.0:18080->8080/tcp jenkins
結局なんだったのか
docker-machineでvirtualboxを立てていた。そういえばdockerの勉強をしていてそんなことをしていた気がする。
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS default * virtualbox Running tcp://192.168.99.100:2376 v19.03.5
curl を投げてみる。いけたっぽい
$ curl -Iv http://192.168.99.100:18080 * Rebuilt URL to: http://192.168.99.100:18080/ * Trying 192.168.99.100... * TCP_NODELAY set * Connected to 192.168.99.100 (192.168.99.100) port 18080 (#0) > HEAD / HTTP/1.1 > Host: 192.168.99.100:18080 > User-Agent: curl/7.60.0 > Accept: */* > < HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden < Date: Mon, 02 Mar 2020 12:42:54 GMT Date: Mon, 02 Mar 2020 12:42:54 GMT < X-Content-Type-Options: nosniff X-Content-Type-Options: nosniff < Set-Cookie: JSESSIONID.f86c67a1=4bkiel39hx2dpwwhhggt7w8w;Path=/;HttpOnly Set-Cookie: JSESSIONID.f86c67a1=4bkiel39hx2dpwwhhggt7w8w;Path=/;HttpOnly < Expires: Thu, 01 Jan 1970 00:00:00 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT < Content-Type: text/html;charset=UTF-8 Content-Type: text/html;charset=UTF-8 < X-Hudson: 1.395 X-Hudson: 1.395 < X-Jenkins: 2.60.3 X-Jenkins: 2.60.3 < X-Jenkins-Session: 5f75fc09 X-Jenkins-Session: 5f75fc09 < X-Hudson-CLI-Port: 50000 X-Hudson-CLI-Port: 50000 < X-Jenkins-CLI-Port: 50000 X-Jenkins-CLI-Port: 50000 < X-Jenkins-CLI2-Port: 50000 X-Jenkins-CLI2-Port: 50000 < X-You-Are-Authenticated-As: anonymous X-You-Are-Authenticated-As: anonymous < X-You-Are-In-Group-Disabled: JENKINS-39402: use -Dhudson.security.AccessDeniedException2.REPORT_GROUP_HEADERS=true or use /whoAmI to diagnose X-You-Are-In-Group-Disabled: JENKINS-39402: use -Dhudson.security.AccessDeniedException2.REPORT_GROUP_HEADERS=true or use /whoAmI to diagnose < X-Required-Permission: hudson.model.Hudson.Administer X-Required-Permission: hudson.model.Hudson.Administer < Content-Length: 677 Content-Length: 677 < Server: Jetty(9.2.z-SNAPSHOT) Server: Jetty(9.2.z-SNAPSHOT)
dockerで立てたVitualbox上のVMのIPアドレスが 192.168.99.100 ということらしい。
つまり dockerコンテナへのアクセスはlocalhostではなく、VMのIPアドレスを使用してアクセスしなければならない。
とにかくハマったのでメモ書き程度に。。。