2019年11月23日土曜日

Eclipse Che + Azure DNS + Let's Encrypt な環境構築

基本的に、 Installing Che on Microsoft Azure | Eclipse Che Documentation の通りに進めていくだけ。

前提

  • 使用するドメインはあらかじめ取得しておく

Azure へログイン

AKS 接続用の Docker コンテナを使う。

Azure へログイン。

以降、このコンテナ内で作業を行う。

Kubernetes クラスタ作成

Ingress デプロイ

kubernetes/ingress-nginx の yaml をそのまま使ってデプロイ。

ingress-nginxLoadBalancerEXTERNAL-IP が割り当てられるまで待つ。

Ingress の公開 IP アドレスをメモ。

Azure 設定

Azure DNS を作成

Azure DNS へドメインを移管

詳細はドメインレジストラのドキュメントを見ること。

お名前.com の場合には、以下リンク先のように移管作業できるようだ。

cert-manager 用のサービスプリンシパルの作成

cert-manager は、Let’s Encrypt からの証明書発行を自動でやってくれるやつ。 これが Azure DNS のレコード操作を行う必要があるため、Azure DNS にアクセス可能なサービスプリンシパルを作成する。

Kubernetes に cert-manager をデプロイ

ログを確認して証明書が正常に発行されるのを待つ。

Che のデプロイ

tiller デプロイ

che デプロイ

その他

ノード操作

ノード停止。

参考資料

2019年9月26日木曜日

TOPPERS/FMP3 を Xilinx/qemu で動かす

この記事を読む前に

この記事を書いた翌日に、「fmp_3.0/target/zybo_z7_gcc/target_user.txt にビルド方法書いてあるよ」って教えてもらえました。

4.システム構築手順と実行手順

4.1 システム構築

ZYBO_Z7用のFMP3カーネルを構築する手順は,「TOPPERS/FMP3カーネル ユーザー
ズマニュアル」の「3.クイックスタートガイド」の章に記述されている通り
である.

シリアルドライバを使用する際には以下のオプションでシリアルドライバと各
種システムサービスをビルド対象とする.

configure.rb -T zybo_z7_gcc -w -S "syslog.o banner.o serial.o chip_serial.o logtask.o xuartps.o"
                         

Xilinx SDKでビルドする場合は,ワークスペースを作成し,zybo_z7_sdkフォルダ
にあるプロジェクトをインポートすることで,サンプルプログラムがビルド可
能である.

fmp3_zybo_z7_gcc-20190830.zipfmp_3.0/target/zybo_z7_gcc/target_user.txt より引用

以上、解散!

背景

xilinx/qemu で動く TOPPERS カーネルの確認メモ - mikoto2000 の日記 で、 「動かなかった(そもそもビルドが成功しない)」と報告した。

しかし、 TOPPERS のメーリングリストにビルドのヒントがあったので再挑戦する。

■ TOPPERS/FMP3, HRMP3 対応

  現状の TOPPERS/FMP3, HRMP3 は、TECS 未対応のために configure.rb
  実行時に -w (OMIT_TECS = true) を指定しなければ、ビルドするこ
  とができません。この状況を一刻も早く改めるべく、TECS WG では、
  これらのカーネルの TECS 対応を行っています。

  本セッションでは、初めに TOPPERS/FMP3, HRMP3 カーネルに TECS を
  適用することのメリットを説明した後、今回初めて対応するクラス
  (プロセッサコアを割付る単位) を TECS でどのように扱うのが妥当か
  を、ご相談させていただくつもりです。

  昨年の TECS のセッションではコアな部分の説明にとどまっておりま
  したが、本年はチュートリアル的な説明をさせていただいた上で、コ
  アな部分のご相談をさせていただくつもりです。TECS や、それらのカー
  ネルをご存じない方がご参加いただいても、なにがしか得らるものが
  あるように配慮いたします。

(toppers-users 1) TOPPERS開発者会議セッション内容のご案内 より引用。

configure.rb -w とすればよいようだ。試す。

環境構築

xilinx/qemu で動く TOPPERS カーネルの確認メモ - mikoto2000 の日記 の「前提」、 「準備」で準備した環境と同じものを使う。

作業記録

-w を付けて configure して make する。

cd /zybo_z7/fmp_3.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_z7_gcc -w
make

...リンクエラーになった。

...(略)
arm-none-eabi-gcc -O2 -Wall -g   -mlittle-endian -mcpu=cortex-a9 -DTOPPERS_OMIT_TECS  -DUSE_BYPASS_IPI_DISPATCH_HANDER -D__TARGET_ARCH_ARM=7  -I. -I../include  -I../target/zybo_z7_gcc -I../arch/arm_gcc/zynq7000 -I../arch/arm_gcc/common -I../arch/gcc -I.. -I../sample -I./gen -I../tecs_kernel -I../tecsgen/tecs -I../tecsg
en/tecs/rpc -L objs -nostdlib  -mlittle-endian -mcpu=cortex-a9   -Wl,-T,../target/zybo_z7_gcc/zybo_z7.ld  -L. -o fmp \
                objs/start.o  objs/sample1.o objs/log_output.o objs/vasyslog.o objs/t_perror.o objs/strerror.o     objs/kernel_cfg.o \
                -lkernel -lc -lgcc
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `syslog':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:253: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `t_perror':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:268: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:268: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:268: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `t_syslog_3':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o:/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:268: more undefined references to `syslog_wri_log' follow
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `main_task':
/zybo_z7/fmp_3.0/mysample/../sample/sample1.c:639: undefined reference to `syslog_msk_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../sample/sample1.c:649: undefined reference to `serial_opn_por'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../sample/sample1.c:654: undefined reference to `serial_ctl_por'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../sample/sample1.c:726: undefined reference to `serial_rea_dat'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `t_syslog_3':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `t_perror':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:268: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `main_task':
/zybo_z7/fmp_3.0/mysample/../sample/sample1.c:934: undefined reference to `syslog_msk_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../sample/sample1.c:938: undefined reference to `syslog_msk_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o: in function `_kernel_inthdr_82':
/zybo_z7/fmp_3.0/mysample/kernel_cfg.c:324: undefined reference to `sio_isr'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x448): undefined reference to `logtask_terminate'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x450): undefined reference to `sio_terminate'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x478): undefined reference to `print_banner'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x490): undefined reference to `print_banner'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:/zybo_z7/fmp_3.0/mysample/kernel_cfg.c:440: undefined reference to `syslog_initialize'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x4a8): undefined reference to `print_banner_copyright'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x4b0): undefined reference to `serial_initialize'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x718): undefined reference to `logtask_main'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: ./libkernel.a(target_kernel_impl.o): in function `_kernel_target_initialize':
/zybo_z7/fmp_3.0/mysample/../target/zybo_z7_gcc/target_kernel_impl.c:201: undefined reference to `sio_initialize'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: ./libkernel.a(target_kernel_impl.o): in function `target_fput_initialize':
/zybo_z7/fmp_3.0/mysample/../target/zybo_z7_gcc/target_kernel_impl.c:252: undefined reference to `sio_opn_por'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../target/zybo_z7_gcc/target_kernel_impl.c:252: undefined reference to `sio_opn_por'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: ./libkernel.a(target_kernel_impl.o): in function `zybo_z7_uart_fput':
/zybo_z7/fmp_3.0/mysample/../target/zybo_z7_gcc/target_kernel_impl.c:264: undefined reference to `sio_snd_chr'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../target/zybo_z7_gcc/target_kernel_impl.c:264: undefined reference to `sio_snd_chr'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: ./libkernel.a(gic_kernel_impl.o): in function `t_syslog_3':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: ./libkernel.a(core_kernel_impl.o): in function `t_syslog_3':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: ./libkernel.a(core_kernel_impl.o):/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:220: more undefined references to `syslog_wri_log' follow
collect2: error: ld returned 1 exit status
make: *** [Makefile:443: fmp] Error 1

syslog_wri_log が見つからない。これはどこにあるんだろう?

syslog_wri_log を探す

# find /zybo_z7/fmp_3.0 -name "*.c" -print0 | xargs -0 grep syslog_wri_log
/zybo_z7/fmp_3.0/syssvc/syslog.c: *  syslog_wri_logの入口にトレースログマクロを置く.
/zybo_z7/fmp_3.0/syssvc/syslog.c:syslog_wri_log(uint_t prio, const SYSLOG *p_syslog)

syssvc/syslog.c。たしかにビルドログを見てもこれをビルドしている様子はない。どうにかしてビルド対象に入れる必要があるようだ?

とりあえず Makefileconfigure.rb を流し読み。

configure.rb-S オプションがあるようだ。

#  -S <syssvcobjs>              システムサービスのオブジェクトファイル
#                                               (.oファイル名で指定.複数指定可)

試す。

ruby ../configure.rb -T zybo_z7_gcc -w -S syslog.o
make clean
make

またリンクエラー。

serial_*, sio_*, print_banner, logtask_*, xuartps_* が順番に見つからなくなっていったが、同じように find + grep でファイルを特定して -S に追加。

ruby ../configure.rb -T zybo_z7_gcc -w -S "syslog.o serial.o chip_serial.o banner.o logtask.o xuartps.o"
make clean
make

configuration check passed。良い感じ?

qemu で実行。

# qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./fmp

TOPPERS/FMP3 Kernel Release 3.0.0 for ZYBO_Z7 <Zynq-7000, Cortex-A9> (Sep 26 2019, 12:37:57)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

Processor 2 start.
Processor 1 start.
local_inirtn exinf = 2, counter = 1
local_inirtn exinf = 1, counter = 2
Server task 2 starts.
System logging task is started on port 1.
Server task 1 starts.
Sample program starts (exinf = 1).
select tskno 0x11
select cycid 1
select almid 1
select processor 1
select class     1
task1_1 is running on prc1 (001) .   |
task1_1 is running on prc1 (002) .   |
task1_1 is running on prc1 (003) .   |
task1_1 is running on prc1 (004) .   |
task1_1 is running on prc1 (005) .   |
...(略)

動いた。 -S に入れるべきか微妙なオブジェクトファイルを追加してしまっているが、そのあたりはまぁ動いたから良いかということで許して...。

今回はここまで。

更新履歴

日付 更新内容
2019/9/26 新規作成
2019/9/27 ハードウェア依存部のドキュメントにビルド方法が明記されている件について追記

2019年9月9日月曜日

xilinx/qemu で動く TOPPERS カーネルの確認メモ

xilinx/qemu で、 TOPPERS カーネルがどこまで動くかを確認した記録。

前提

debian:buster-slim 環境に、ツール群を一通りそろえて検証した。

起動コマンドは以下。

docker run -it "debian:buster-slim"

準備

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

# いつもの
apt-get update
apt-get -y upgrade

# qemu ビルドに必要なもの
apt-get install -y build-essential python libglib2.0-dev libgcrypt20-dev zlib1g-dev autoconf automake libtool bison flex libpixman-1-dev

# dtb ビルドに必要なもの
apt-get install -y git device-tree-compiler

# TOPPERS カーネルビルドに必要なもの
apt-get install -y perl ruby

# その他
apt-get install -y curl unzip

xilinx/qemu のビルド

cd /
git clone --recursive https://github.com/Xilinx/qemu.git
cd qemu
./configure --target-list="aarch64-softmmu,microblazeel-softmmu,arm-softmmu" --enable-fdt --disable-kvm --disable-xen
make
make install

devicetree のビルド

xilinx/qemu-devicetree

cd /
git clone --recursive https://github.com/Xilinx/qemu-devicetrees.git
cd qemu-devicetrees
make OUTDIR=/var/dts

Xilinx/linux-xlnx

cd /
git clone https://github.com/Xilinx/linux-xlnx.git
cd linux-xlnx
sed -i -e "s/#include/\/include\//" arch/arm/boot/dts/zynq-zybo.dts
dtc -I dts -O dtb -o /var/dts/zynq-zybo.dtb arch/arm/boot/dts/zynq-zybo.dts

cfg の配置

curl -L https://github.com/mikoto2000/cfg-1/releases/download/1.9.7.2/cfg.tar.gz -O
tar xf cfg.tar.gz -C /usr/local/bin
rm cfg.tar.gz

GNU Arm Embedded Toolchain の配置

GNU-A

Aarch32

cd /
curl -L "https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-eabi.tar.xz?revision=402e6a13-cb73-48dc-8218-ad75d6be0e01&la=en" -o gcc-arm-8.3-2019.03-x86_64-arm-eabi.tar.xz
tar xf gcc-arm-8.3-2019.03-x86_64-arm-eabi.tar.xz -C /opt/
rm gcc-arm-8.3-2019.03-x86_64-arm-eabi.tar.xz
export PATH=$PATH:/opt/gcc-arm-8.3-2019.03-x86_64-arm-eabi/bin

Aarch64

cd /
curl -L "https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-elf.tar.xz?revision=d678fd94-0ac4-485a-8054-1fbc60622a89&la=en" -o gcc-arm-8.3-2019.03-x86_64-aarch64-elf.tar.xz
tar xf gcc-arm-8.3-2019.03-x86_64-aarch64-elf.tar.xz -C /opt/
rm gcc-arm-8.3-2019.03-x86_64-aarch64-elf.tar.xz
export PATH=$PATH:/opt/gcc-arm-8.3-2019.03-x86_64-aarch64-elf/bin

GNU-RM

cd /
curl -L "https://developer.arm.com/-/media/Files/downloads/gnu-rm/8-2019q3/RC1.1/gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2?revision=c34d758a-be0c-476e-a2de-af8c6e16a8a2?product=GNU%20Arm%20Embedded%20Toolchain,64-bit,,Linux,8-2019-q3-update" -o gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
tar xf gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2 -C /opt/
rm gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
export PATH=$PATH:/opt/gcc-arm-none-eabi-8-2019-q3-update/bin

確認結果

atk2-sc1-mc

Zynq UltraScale+ MPSoC Cortex-R5

1.4.2(atk2-sc1-mc_zynqmp_r5_gcc-20190620.tar.gz)(動かなかった)

QEMU での実行時にコンソールが無反応。

1.4.2(atk2-sc1-mc_zynqmp_r5_gcc-20170929.tar.gz)(動いた)

ビルド

atk2-sc1-mc_zynqmp_r5_gcc-20190620.tar.gz だと、 QEMU での実行時にコンソールが無反応だったので atk2-sc1-mc_zynqmp_r5_gcc-20170929.tar.gz を使用した。

cd /
curl -L https://toppers.jp/download.cgi/atk2-sc1-mc_zynqmp_r5_gcc-20170929.tar.gz -O
tar xf atk2-sc1-mc_zynqmp_r5_gcc-20170929.tar.gz
rm atk2-sc1-mc_zynqmp_r5_gcc-20170929.tar.gz

cd atk2-sc1-mc_1.4.2/
mkdir mysample
cd mysample
../configure -g /usr/local/bin/cfg -T zynqmp_r5_gcc
make GCC_TARGET=arm-none-eabi
実行
qemu-system-aarch64 -M arm-generic-fdt -nographic -serial mon:stdio -dtb /var/dts/LATEST/SINGLE_ARCH/zcu102-arm.dtb -device loader,file=./atk2-sc1-mc,cpu-num=4 -device loader,addr=0xff5e023c,data=0x80008fde,data-len=4 -device loader,addr=0xff9a000,data=0x8000218,data-len=4

ASP3

ZYBO-Z7

3.4.0(動いた)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/asp3_zybo_z7_gcc-20190830.zip -O
unzip asp3_zybo_z7_gcc-20190830.zip -d /zybo_z7
rm asp3_zybo_z7_gcc-20190830.zip

cd /zebo_z7/asp_3.4.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_z7_gcc
make
実行
qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./asp

ZYBO

3.4.0(いちおう動いた)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/asp3_zybo_gcc-20190325.zip -O
unzip asp3_zybo_gcc-20190325.zip
rm asp3_zybo_gcc-20190325.zip

cd asp_3.4.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_gcc
make
実行

以下コマンドで QEMU での動作を試した。 カーネル起動まではするが、タスクが想定通りの挙動をしない。

 qemu-system-aarch64 -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel ./asp

TOPPERS/ASP3 Kernel Release 3.4.0 for ZYBO <Zynq-7000, Cortex-A9> (Sep  8 2019, 12:20:51)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

System logging task is started.
(何も表示されない、反応しない)

以下だとロゴすら表示されない。

qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./asp

qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./asp -> qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel ./asp -> qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./asp としたらプログラムが起動した。初期化に問題があるかも。

3.2.0(動かなかった)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/asp3_zynq7000_gcc-20170726.zip -O
unzip asp3_zynq7000_gcc-20170726.zip
rm asp3_zynq7000_gcc-20170726.zip

cd asp_3.2.0
mkdir mysample
cd mysample
ruby -Ku ../configure.rb -T zynq7000_gcc
make
実行

以下コマンドで QEMU での動作を試した。 カーネル起動まではするが、タスクが想定通りの挙動をしない。

 qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel ./asp

TOPPERS/ASP3 Kernel Release 3.4.0 for ZYBO <Zynq-7000, Cortex-A9> (Sep  8 2019, 12:20:51)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

System logging task is started.
(何も表示されない、反応しない)

以下だとエラー。

 qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./asp

TOPPERS/ASP3 Kernel Release 3.2.0 for Xilinx Zynq-7000(Cortex-A9) (Sep  8 2019, 17:42:57)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2017 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

System logging task is started.
../arch/arm_gcc/common/gic_kernel_impl.c:191: Assertion `TMIN_INTPRI <= intpri && intpri <= TMAX_INTPRI' failed.

いろいろ調整が必要なようだ。

HRP3

ZYBO-Z7

3.1.0(いちおう動いた)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/hrp3_zybo_z7_gcc-20190830.zip -O
unzip hrp3_zybo_z7_gcc-20190830.zip -d /zybo_z7
rm hrp3_zybo_z7_gcc-20190830.zip

cd /zybo_z7/hrp_3.1
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_z7_gcc
make
実行

以下だと何も表示されない。

qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./hrp

qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./hrp -> qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel ./hrp -> qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./hrp としたらプログラムが起動した。初期化に問題があるかも。

ZYBO

3.1.0(いちおう動いた)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/hrp3_zybo_gcc-20190325.zip -O
unzip hrp3_zybo_gcc-20190325.zip
rm hrp3_zybo_gcc-20190325.zip

cd /hrp3_3.1.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_gcc
make
実行

以下コマンドで QEMU での動作を試した。 カーネル起動まではするが、タスクが想定通りの挙動をしない。

 qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel ./hrp

TOPPERS/HRP3 Kernel Release 3.1.0 for ZYBO <Zynq-7000, Cortex-A9> (Sep  8 2019, 11:18:06)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

System logging task is started.
(何も表示されない、反応しない)

以下だとロゴすら表示されない。

qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./hrp

qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./hrp -> qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel ./hrp -> qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./hrp としたらプログラムが起動した。初期化に問題があるかも。

FMP3

ZYBO-Z7

3.0.0(動かなかった)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/fmp3_zybo_z7_gcc-20190830.zip -O
unzip fmp3_zybo_z7_gcc-20190830.zip -d /zybo_z7
rm fmp3_zybo_z7_gcc-20190830.zip

cd /zybo_z7/fmp_3.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_z7_gcc
make

make 時点で make: *** No rule to make target 'sample1.cdl', needed by 'gen/tecsgen.timestamp'. Stop. が発生。

実行

なし。

ZYBO

3.0.0(動かなかった)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/fmp3_zybo_gcc-20190331.tar.gz -O
tar xf fmp3_zybo_gcc-20190331.tar.gz
rm fmp3_zybo_gcc-20190331.tar.gz

cd /fmp3_3.0.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_gcc
make

make 時点で make: *** No rule to make target 'sample1.cdl', needed by 'gen/tecsgen.timestamp'. Stop. が発生。

実行

なし。

HRMP3

ZYBO-Z7

3.0.0(動かなかった)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/hrmp3_zybo_z7_gcc-20190830.zip -O
unzip hrmp3_zybo_z7_gcc-20190830.zip -d /zybo_z7
rm hrmp3_zybo_z7_gcc-20190830.zip

cd cd /zybo_z7/hrmp_3.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_z7_gcc
make

make 時点で make: *** No rule to make target 'sample1.cdl', needed by 'gen/tecsgen.timestamp'. Stop. が発生。

実行

なし。

ZYBO

3.0.0(動かなかった)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/hrmp3_zybo_gcc-20190329.tar.gz -O
tar xf hrmp3_zybo_gcc-20190329.tar.gz
rm hrmp3_zybo_gcc-20190329.tar.gz

cd /hrmp3_3.0.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_gcc
make

make 時点で make: *** No rule to make target 'sample1.cdl', needed by 'gen/tecsgen.timestamp'. Stop. が発生。

実行

なし。

FMP

Zynq UltraScale+ MPSoC Cortex-A53 AArch64

1.4.0(動いた)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/fmp_zynqmp_a53_arm64_gcc-20190125.zip -O
unzip fmp_zynqmp_a53_arm64_gcc-20190125.zip -d a53
rm fmp_zynqmp_a53_arm64_gcc-20190125.zip

cd /a53/fmp_1.4.0/
mkdir mysample
cd mysample
chmod u+x ../configure
../configure -T zynqmp_a53_arm64_gcc -g /usr/local/bin/cfg
make GCC_TARGET=aarch64-elf
実行
qemu-system-aarch64 -M arm-generic-fdt -nographic -serial mon:stdio -dtb /var/dts/LATEST/SINGLE_ARCH/zcu102-arm.dtb -device loader,file=./fmp,cpu-num=0 -device loader,addr=0xfd1a0104,data=0x8000000e,data-len=4

Zynq UltraScale+ MPSoC Cortex-A53 AArch32(未検証)

QEMU を aarch32 で起動する方法がわからなかったため未検証。

Zynq UltraScale+ MPSoC Cortex-R5

1.4.0(fmp_zynqmp_a53_arm_gcc-20190125.zip)(動かなかった)

QEMU での実行時にコンソールが無反応。

1.4.0(fmp_zynqmp_a53_arm_gcc-20180713.zip)(動いた)

ビルド

fmp_zynqmp_r5_gcc-20190125.zip だと、 QEMU での実行時にコンソールが無反応だったので mp_zynqmp_r5_gcc-20180713.zip を使用した。

cd /
curl -L https://toppers.jp/download.cgi/fmp_zynqmp_r5_gcc-20180713.zip -O
unzip fmp_zynqmp_r5_gcc-20180713.zip -d r5
rm fmp_zynqmp_r5_gcc-20180713.zip

cd /r5/fmp_1.4.0/
mkdir mysample
cd mysample
chmod u+x ../configure
../configure -T zynqmp_r5_gcc -g /usr/local/bin/cfg
make GCC_TARGET=arm-none-eabi ENABLE_G_SYSLOG=true
実行
qemu-system-aarch64 -M arm-generic-fdt -nographic -serial null -serial mon:stdio -dtb /var/dts/LATEST/SINGLE_ARCH/zcu102-arm.dtb -device loader,file=./fmp,cpu-num=4 -device loader,addr=0xff5e023c,data=0x80008fde,data-len=4 -device loader,addr=0xff9a000,data=0x8000218,data-len=4

まとめに代えて

まとまらん...。

動かなかったものの大半が、 qemu の仕組み・使い方の問題の気がするので、もうちょっとドキュメント読み込んでいかないといけなさそう。

参考資料

2019年8月16日金曜日

Minikube on Debian 10 に Eclipse Che をデプロイする(Hyper-V & ベアメタル版)

前回(Debian 10 に minikube をインストールする(Hyper-V & ベアメタル版)) からの続き。

Running Che locally | Eclipse Che Documentation を実施していく。

必要なツールのインストール

Che のデプロイに必要なものたちをインストールする。

socat

helm でのデプロイ時に使用する。VirtualBox の時には必要なかったけど今回は必要らしい。

apt-get install -y socat

helm

バイナリをダウンロードして /usr/local/bin へ移動。

curl -L https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz -O
tar xf helm-v2.14.3-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/
sudo mv linux-amd64/tiller /usr/local/bin/
rm -rf helm-v2.14.3-linux-amd64.tar.gz linux-amd64/

Snappy(snap?) を使うとパッケージとして管理できるようだがとりあえずバイナリダウンロードで済ませてしまう。

chectl

こちらもバイナリをダウンロード。

2019/8/15 時点のドキュメントで指定されているバージョンは、--domain オプションの指定が正しく動かないので、現時点で最新のバージョンである 20190802065601 をダウンロードしてくる。(ベアメタルインストールの場合、 --domain オプション使わないけど...)

RELEASE="20190802065601/chectl-linux"
URL=https://github.com/che-incubator/chectl/releases/download/${RELEASE}
sudo curl -L ${URL} -o /usr/local/bin/chectl
sudo chmod +x /usr/local/bin/chectl

Minikube の設定

なし。root で起動するだけ。

sudo minikube start

Eclipse Che のデプロイ

sudo chectl server:start

動作確認

Windows から http://${DEBIAN_IP}.nip.io に接続。

  • ${DEBIAN_IP}: Debian の IP アドレスに置き換える。

OK.

参考資料

Debian 10 に Minikube をインストールする(Hyper-V & ベアメタル版)

前提

前回前々回と、 VirtualBox を使用してきたが、 Minikube をベアメタルで動かせば Nested Virtualization 無しで環境構築ができそうだったので試した。

  • ホスト OS: Windows 10 Pro
  • Hyper-V 上の Debian にて動作確認
  • ゲスト OS: Debian 10
  • 最小構成インストールに、以下のパッケージを導入・設定した状態
    • sshd
    • sudo
  • Minikube をベアメタルインストール

必要なツール群のインストール

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

各種ツールインストールで使用するパッケージ群を、 apt でインストールする。

sudo apt-get update
sudo apt-get install -y apt-transport-https curl gnupg2 ca-certificates software-properties-common

Docker のインストール

Get Docker Engine - Community for Debian | Docker Documentation の通りにインストールを進める。

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

kubectl のインストール

Install and Set Up kubectl - Kubernetes に従ってインストール。

echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" \
 | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y kubectl

minikube のインストール

Linux | minikube に従ってインストールとセットアップを行う。

インストール

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_1.3.1.deb \
 && sudo dpkg -i minikube_1.3.1.deb
sudo rm minikube_1.3.1.deb

セットアップ

sudo minikube start --vm-driver=none
sudo minikube config set vm-driver none

動作確認

kubectl get pods で、それっぽい pod が起動していることを確認する。

sudo kubectl get pods --all-namespaces

参考資料

2019年8月15日木曜日

Minikube on Debian 10 に Eclipse Che をデプロイする

前回(Debian 10 に minikube をインストールする) からの続き。

Running Che locally | Eclipse Che Documentation を実施していく。

必要なツールのインストール

Che のデプロイに必要なものたちをインストールする。

helm

バイナリをダウンロードして /usr/local/bin へ移動。

curl -L https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz -O
tar xf helm-v2.14.3-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/
sudo mv linux-amd64/tiller /usr/local/bin/
rm -rf helm-v2.14.3-linux-amd64.tar.gz linux-amd64/

Snappy(snap?) を使うとパッケージとして管理できるようだがとりあえずバイナリダウンロードで済ませてしまう。

chectl のインストール

こちらもバイナリをダウンロード。

2019/8/15 時点のドキュメントで指定されているバージョンは、--domain オプションの指定が正しく動かないので、現時点で最新のバージョンである 20190802065601 をダウンロードしてくる。

RELEASE="20190802065601/chectl-linux"
URL=https://github.com/che-incubator/chectl/releases/download/${RELEASE}
sudo curl -L ${URL} -o /usr/local/bin/chectl
sudo chmod +x /usr/local/bin/chectl

Minikube の設定

VM の起動とポートフォワーディングの設定を行う。

VM を作成して Minikube 起動

最低でもメモリ 4 GB が必要なので、その設定を行う。

ポートフォワーディングでホストの 80 番ポートをフォワードする必要があるので sudo で実行する。

「sudo で実行しないでください」って怒られるし、何か回避策があると良いのだけれど...。

sudo minikube start --memory=4096 --cpus=2

ポートフォワーディング

Minikube が動いている VirtualBox に、ポートフォワーディングの設定を行う。

  • ホストの 80 -> Minikube の 80
sudo vboxmanage controlvm "minikube" natpf1 "che,tcp,,80,$(sudo minikube ip),80"

Eclipse Che のデプロイ

sudo chectl server:start --domain="${DEBIAN_IP}.nip.io"
  • ${DEBIAN_IP}: Debian の IP アドレスに置き換える。

動作確認

Windows から http://${DEBIAN_IP}.nip.io に接続。

OK.

参考資料

2019年8月14日水曜日

Debian 10 に minikube をインストールする

前提

Windows10 上に Debian VM を立てて検証しているため、仮想化関連機能に由来する制限がたくさんある。

  • ホスト OS: Windows 10 Pro
  • VirtualBox6 上の Debian にて動作確認
    • VM のプロセッサー設定「ネステッドVT-x/AMD-Vを有効化」にチェックがついていること
  • CPU: AMD の CPU
    • 試したマシンが AMD CPU だったので、この手順もそれ用のもの
    • nested virtualization のサポート有無が CPU に依存するため Intel CPU の人は VirtualBox 使えない
    • Intel CPU なら Hyper-V でいけるっぽい?(未確認)
  • ゲスト OS: Debian 10
  • 最小構成インストールに、以下のパッケージを導入・設定した状態
    • sshd
    • sudo

インストール条件がそろっているかの確認

以下のコマンドの実行結果が空でなければインストールできるはず。

grep -E --color 'vmx|svm' /proc/cpuinfo

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

各種ツールインストールで使用するパッケージ群を、 apt でインストールする。

sudo apt-get update
sudo apt-get install -y apt-transport-https curl gnupg2

VirtualBox のインストール

Linux_Downloads – Oracle VM VirtualBox に従ってインストール。

echo "deb https://download.virtualbox.org/virtualbox/debian buster contrib" \
 | sudo tee -a /etc/apt/sources.list.d/virtualbox.list
curl -fsSL https://www.virtualbox.org/download/oracle_vbox_2016.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y virtualbox-6.0

kubectl のインストール

Install and Set Up kubectl - Kubernetes に従ってインストール。

echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" \
 | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y kubectl

minikube のインストール

Linux | minikube に従ってインストールとセットアップを行う。

インストール

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_1.3.1.deb \
 && sudo dpkg -i minikube_1.3.1.deb
sudo rm minikube_1.3.1.deb

セットアップ

minikube start --vm-driver=virtualbox
minikube config set vm-driver virtualbox

動作確認

kubectl get pods で、それっぽい pod が起動していることを確認する。

kubectl get pods --all-namespaces

参考資料

更新履歴

日付 更新内容
2019/8/14 新規作成
2019/8/15 前提条件に CPU, ホスト OS の話題を追加

2019年8月12日月曜日

Visual Studio Code の LSP 拡張を作る

mikoto2000/lsp4snippet を Visual Studio Code で使いたい。

前提

  • OS: Windows 10 Pro
  • VSCode: 1.37.0
  • Node: v10.16.2
  • npm: 6.4.1

開発に必要なツールのインストール

npmyo, generator-code をインストール。

npm install -g yo generator-code

プロジェクトひな形の作成

yo code で対話的にプロジェクトの作成ができる。

PS C:\Users\mikoto> cd ~/project/
PS C:\Users\mikoto\project> yo code

     _-----_     ╭──────────────────────────╮
    |       |Welcome to the Visual  │
    |--(o)--|Studio Code Extension  │
   `---------´   │        generator!        │
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? What type of extension do you want to create? New Extension (TypeScript)
? What's the name of your extension? snippet
? What's the identifier of your extension? snippet
? What's the description of your extension? Language Support for Snippet.
? Initialize a git repository? Yes
? Which package manager to use? npm
   create snippet\.vscode\extensions.json
   create snippet\.vscode\launch.json
   create snippet\.vscode\settings.json
   create snippet\.vscode\tasks.json
   create snippet\src\test\runTest.ts
   create snippet\src\test\suite\extension.test.ts
   create snippet\src\test\suite\index.ts
   create snippet\.vscodeignore
   create snippet\.gitignore
   create snippet\README.md
   create snippet\CHANGELOG.md
   create snippet\vsc-extension-quickstart.md
   create snippet\tsconfig.json
   create snippet\src\extension.ts
   create snippet\package.json
   create snippet\tslint.json


I'm all done. Running npm install for you to install the required dependencies. If this fails, try running the command yourself.


npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN snippet@0.0.1 No repository field.
npm WARN snippet@0.0.1 No license field.

added 143 packages from 573 contributors and audited 325 packages in 3.974s
found 0 vulnerabilities


Your extension snippet has been created!

To start editing with Visual Studio Code, use the following commands:

     cd snippet
     code .

Open vsc-extension-quickstart.md inside the new extension for further instructions
on how to modify, test and publish your extension.

For more information, also visit http://code.visualstudio.com and follow us @code.


PS C:\Users\mikoto\project> # プロジェクト管理の都合でディレクトリの名前変更
PS C:\Users\mikoto\project> mv .\snippet .\vscode-snippet

LSP に必要なパッケージを追加

vscode-languageclient を追加する。

cd vscode-snippet
npm install --save vscode-languageclient

プロジェクトのメタデータを編集

package.json を編集。

{
  "name": "snippet",
  "displayName": "snippet",
  "description": "Language Support for Snippet.",
  "version": "0.0.1",
  "publisher": "mikoto2000",
  "engines": {
    "vscode": "^1.37.0"
  },
  "categories": [
    "Other"
  ],
  "activationEvents": [
    "*"
  ],
  "main": "./out/extension.js",
  "contributes": {},
  "scripts": {
    "vscode:prepublish": "npm run compile",
    "compile": "tsc -p ./",
    "watch": "tsc -watch -p ./",
    "pretest": "npm run compile",
    "test": "node ./out/test/runTest.js"
  },
  "devDependencies": {
    "@types/glob": "^7.1.1",
    "@types/mocha": "^5.2.6",
    "@types/node": "^10.12.21",
    "@types/vscode": "^1.37.0",
    "glob": "^7.1.4",
    "mocha": "^6.1.4",
    "typescript": "^3.3.1",
    "tslint": "^5.12.1",
    "vscode-test": "^1.0.2"
  },
  "dependencies": {
    "vscode-languageclient": "^5.2.1"
  }
}
  1. 発行者(publisher) を追加
  2. スニペットサーバーは常時起動させておきたいので、 activationEvents* に修正
  3. コマンドは必要ないので contributes/commands を削除

LSP サーバー起動コードの実装

import * as vscode from 'vscode';
import { Executable, LanguageClient, LanguageClientOptions, StreamInfo } from 'vscode-languageclient';

export function activate(context: vscode.ExtensionContext) {

  const serverOptions: Executable = {
      // TODO: requirements に「java にパスを通しておくこと」を追加したうえで java に修正
      command: 'C:/Java/openjdk-12.0.1/bin/java',
      args: ['--add-modules=ALL-SYSTEM',
          '--add-opens',
          'java.base/java.util=ALL-UNNAMED',
          '--add-opens', 'java.base/java.lang=ALL-UNNAMED',
          '-Declipse.application=org.eclipse.jdt.ls.core.id1',
          '-Dosgi.bundles.defaultStartLevel=4',
          '-Declipse.product=org.eclipse.jdt.ls.core.product',
          '-Dlog.level=ALL',
          '-noverify',
          '-Dfile.encoding=UTF-8',
          '-Xmx1G',
          // TODO: jar を同梱する
          '-jar',
          'C:/Users/mikoto/project/lsp4snippet/build/libs/lsp4snippet-1.0.0.jar',
          // TODO: config 化
          '--snippet', 'C:/Users/mikoto/project/dotvim/.vim/snippets/java.yaml',
          '--snippet', 'C:/Users/mikoto/project/dotvim/.vim/snippets/markdown.yaml']
  };

  const clientOptions: LanguageClientOptions = {
      documentSelector: [{ scheme: 'file', language: '*' }]
  };

  const disposable = new LanguageClient('lsp4snippet', 'lsp4snippet', serverOptions, clientOptions).start();
  context.subscriptions.push(disposable);
}

// this method is called when your extension is deactivated
export function deactivate() {}
  1. serverOptions で、 LSP サーバー起動に必要な情報を組み立て
  2. LanguageClientOptions.documentSelector で、この拡張が有効になる条件を指定。今回は常時有効にしたいので以下のように設定
    • scheme: file
    • language: *
  3. 「1.」「2.」を使って LanguageClient を作成し、 context.subscriptions に push

動作確認

起動。

code .
vscode-snippet プロジェクト

プロジェクトが開くので、 F5 押下。

ビルドが走り、 vscode-snippet 拡張機能が組み込まれた VSCode が新しく立ち上がるので、 適当なマークダウンファイルを開いて追加した補完候補が表示されることを確認する。

追加した補完が機能している

ドキュメント系は置いておくとして、あとは、jar 組込みとスニペット定義ファイル指定のコンフィグ化ができると、とりあえず使える感じにはなるかな?

以上。

参考資料

2019年8月7日水曜日

Eclipse Che に java12 のスタックを追加する

この「スタック一覧」に「Java12 Gradle」が欲しいわけです。

前提

スタック用のコンテナを作成

che7 の場合、「ランタイム用」と言うのが正確っぽいのだけど、「SELECT STACK」って書いてあるし、とりあえずスタックと呼んでおく。

eclipse/stack-base:debian をベースイメージとして、環境を組み立てていく。

Docker イメージは Docker Hub の eclipse/stack-base で公開されている。

スタック用の Docker コンテナを作成

バイナリをダウンロードして展開、パス追加を行う。

Dockerfile:

FROM eclipse/stack-base:debian

LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version "1.0.0"
LABEL description "OpenJDK: 12.0.2, Gradle: 5.5.1"

USER root

RUN wget -q https://download.java.net/java/GA/jdk12.0.2/e482c34c86bd4bf8b56c0b35558996b9/10/GPL/openjdk-12.0.2_linux-x64_bin.tar.gz \
    && tar xf openjdk-12.0.2_linux-x64_bin.tar.gz -C /opt \
    && rm openjdk-12.0.2_linux-x64_bin.tar.gz \
    && wget -q https://services.gradle.org/distributions/gradle-5.5.1-bin.zip \
    && unzip gradle-5.5.1-bin.zip -d /opt \
    && rm gradle-5.5.1-bin.zip

USER user

ENV JAVA_HOME /opt/jdk-12.0.2
ENV PATH $JAVA_HOME/bin:/opt/gradle-5.5.1/bin:$PATH

これを使ってビルド。

docker build -t mikoto2000/che-stack_java12-gradle5:latest .

コンテナレジストリに登録

Docker Hub に push。

docker push mikoto2000/che-stack_java12-gradle5:latest

自作スタックを登録した che-devfile-registry を作成

che-server は、「どんなスタックがあるか・つかえるか」を、 che-devfile-registry に問い合わせ、 その結果を前述の「SELECT STACK」の一覧に表示している。

なので、自作プラグインを登録した che-devfile-registry を作成する必要がある。

この章で che-devfile-registry を作っていく。

eclipse/che-devfile-registry をクローン

clone して checkout。

cd ~/project
git clone https://github.com/eclipse/che-devfile-registry.git
cd che-devfile-registry
$CHE_DEVFILE_REGISTRY_SOURCE=$(pwd)

スタック情報を追加

スタック情報を記述した meta.yaml, devfile.yaml を作成・追加する。

ディレクトリ $CHE_DEVFILE_REGISTRY_SOURCE/devfiles/java12-gradle5/ に、 ファイル meta.yamldevfile.yaml を作成する。

java-gradle を参考に書き換え書き換えしていった。

meta.yaml:

---
displayName: Java12 Gradle5
description: Java Stack with OpenJDK 12 and Gradle 5.5.1
tags: ["Java", "OpenJDK", "Gradle", "Debian"]
icon: https://www.eclipse.org/che/images/logo-eclipseche.svg
globalMemoryLimit: 2674Mi

devfile.yaml

---
apiVersion: 1.0.0
metadata:
  name: java12-gradle5
projects:
  - name: console-java-simple
    source:
      type: git
      location: "https://github.com/che-samples/console-java-simple.git"
components:
  - type: chePlugin
    id: mikoto2000/java12/latest
  - type: dockerimage
    alias: gradle
    image: mikoto2000/che-stack_java12-gradle5:latest
    env:
      - name: GRADLE_USER_HOME
        value: /home/user/.gradle
      - name: JAVA_OPTS
        value: "-XX:MaxRAMPercentage=50 -XX:+UseParallelGC -XX:MinHeapFreeRatio=10
          -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90
          -Dsun.zip.disableMemoryMapping=true -Xms20m -Djava.security.egd=file:/dev/./urandom"
      - name: JAVA_TOOL_OPTIONS
        value: "-XX:MaxRAMPercentage=50 -XX:+UseParallelGC -XX:MinHeapFreeRatio=10
          -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90
          -Dsun.zip.disableMemoryMapping=true -Xms20m -Djava.security.egd=file:/dev/./urandom"
      - name: HOME
        value: /home/user
    memoryLimit: 512Mi
    volumes:
      - name: gradle
        containerPath: /home/gradle/.gradle
    mountSources: true

che-devfile-registry のコンテナを作成

cd $CHE_DEVFILE_REGISTRY_SOURCE
docker build -t mikoto2000/che-devfile-registry:latest -f ./build/dockerfiles/Dockerfile --target registry .

コンテナレジストリに登録

docker push mikoto2000/che-devfile-registry:latest

che の設定とデプロイ

che-server が、先ほど作った che-devfile-registry に問い合わせを投げるように設定して、デプロイしなおす。

$CHE_SOURCE/deploy/kubernetes/helm/che/custom-charts/che-devfile-registry/values.yaml を修正

che-devfile-registry/values.yamlcheDevfileRegistry で、 先ほど作った mikoto2000/che-devfile-registry を使用するように修正。

before:

cheDevfileRegistry:
  image: quay.io/eclipse/che-devfile-registry:nightly
  imagePullPolicy: Always
  memoryLimit: 32Mi
  memoryRequests: 16Mi

after:

cheDevfileRegistry:
  image: mikoto2000/che-devfile-registry:latest
  imagePullPolicy: Always
  memoryLimit: 32Mi
  memoryRequests: 16Mi

これで、 che を再デプロイした時に、改造した che-devfile-registry が使われる。

che の再デプロイ

helm upgrade の使い方がわからないので、いったん削除してからデプロイしなおす。

cd $CHE_SOURCE/deploy/kubernetes/helm/che
helm delete --purge che
helm repo update
helm dependency update
helm upgrade --install che --namespace che --set cheImage=eclipse/che-server:7.0.0-rc-4.0 --set global.cheWorkspacesNamespace="che" --set global.ingressDomain=${CHE_DOMAIN}.nip.io ./

これで、 http://che-che.${CHE_DOMAIN}.nip.io/ にアクセスすると、改造した che-devfile-registry を使用する che にアクセスできる。

スタックが追加されていることを確認

最初と同じようにワークスペースの作成画面に行くと、 SELECT STACK の一覧の中に Java12 Gradle5 が追加されていることがわかる。

参考資料

更新履歴

日付 更新内容
2019/8/07 新規作成
2020/6/10 docker build のコマンド間違いを修正