0%

きっかけ

今の自宅の回線がマンション共用の物なので、ルーターがいじれません。
ルーターがいじれないという事はインターネットからのアクセスのポートマッピング(ポート開放)ができないという事です。
ただ、回線の速度や安定感はあるので追加で回線を契約するほどのコストをかけたくないですし、
今までは宅内サーバーをインターネットに公開するために ngrok (HTTPやTCP) や localtonet (UDP) を利用して公開していましたが、
localtonet は 日本サーバーが無いために、ping 値が高くなる等、歯がゆい状況でした。

そこで他に方法ないかなと探していたら見つけました。
tailscale の exitnode を利用し、インターネットからのアクセスを受けた マシン(VPS) から tailscale ネットワーク内のマシンにポートフォワーディングして、
VPS のマシンが実質ルーター代わりになるという方法

例えば yayoi_8128 さんのこんな方法

ポートフォワーディングについては、uredir を使わずに nginx や iptables でフォワーディングの設定をする、でもよかったんですが、以下の理由で uredir を採用してます。

  • uredir のコマンドが覚えやすかった (uredir :8211 フォワーディング先IP:8211)
  • iptables のコマンドを覚えるのがむずかしかった
  • 実際に nginx を使用して比較しても体感できる差が感じられなかった

Azure, Sakura, WebArena の VPS それぞれで パルワールドサーバーのUDP フォワーディング を試した結果、安定性や速度が異なったので感想とともに記録を残します。

テスト環境の構築

OS: ubuntu 22.04 server

  1. tailscale をインストールして exitnode を有効化
1
2
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up --advertise-exit-node
  1. tailscale AdminConsole から “Use as exit node” にチェック

image

  1. IPv4 フォワーディングを許可

    1
    2
    3
    echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
    echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
    sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
  2. その他

vps 側で 22 や 8211 の inbound を許可

注意点

その時たまたま VPS プロバイダ側で障害があったとか、一時的な問題が起きていた可能性もあるのであくまで参考程度にしてください。

条件もきっちり揃えられていません。

各 VPS で試してみた

Azure VM

テストに利用したスペック

  • コア数とメモリ: 1コア1GB
  • ネットワーク: 100Mbps
  • 金額: 1271円/月 以上

image

速度

速度は出ているけど、レイテンシの値が高い。
何故かコロンビアやインドのサーバーを利用してました。

image

念のため別のサイトでも試してみる。

image

Ping も Jitter も良好

パルワールドを遊んでみる

ロードがなかなか終わらない・・・

image

10分程度待てば接続はされた。
とはいえ建築物の表示にもかなりの時間がかかるため遊ぶのはきびしそう

image

image

その他気になった事

tailscale up したときに見覚えのないログが出た、何か改善の余地あり?

Warning: UDP GRO forwarding is suboptimally configured on eth0, UDP forwarding throughput capability will increase with a configuration change.

この方法で最適化されるらしいですが、残念ながら体感できず。。。

1
2
NETDEV=$(ip route show 0/0 | cut -f5 -d' ')
sudo ethtool -K $NETDEV rx-udp-gro-forwarding on rx-gro-list off

Sakura VPS

テストに利用したスペック

  • コア数とメモリ: 2コア1GB
  • ネットワーク: 100Mbps
  • 金額: 990円/月

image

速度

image

パルワールドを遊んでみる

tailscale ネットワークだけで接続するのと体感は変わらず快適

image

WebArena Indigo

テストに利用したスペック

  • コア数とメモリ: 1コア1GB
  • ネットワーク: 100Mbps
  • 金額: 449円/月

image

安くてよさそう

速度

ちょっと遅いかな

image

パルワールドを遊んでみる

なんだかパケロスが激しい

接続してから数十秒の間、建築物のオブジェクトが読み込まれず、これで遊ぶのは厳しそう、と感じました。

image

Conoha VPS

テストに利用したスペック

  • コア数とメモリ: 2コア1GB
  • ネットワーク: 100Mbps(インターネット)
  • 金額: 1064円/月(時間課金)

image

速度

image

パルワールドを遊んでみる

ロード時間がそこそこ長くかかった

建築物等がなかなか読み込まれず、表示されるまでに5分くらいかかった

Azure VM を少しマシにした様なレベルで、これで遊ぶのは厳しい

image

AWS Lightsail

テストに利用したスペック

  • コア数とメモリ: 2コア1GB
  • ネットワーク: 1Gbps?
  • 金額: $5/月

image

速度

シアトル経由になってしまった
image

別のサイトで測るとジッターもpingも良好
image

パルワールドを遊んでみる

体感は Sakura と変わらない
image

その他

採用されたのは・・・

さくら VPS でした。安定感がどエライです。
LIghtsail も快適だったので、こっちへの乗り換えもアリ
Azure VM の回線速度も優秀ではあるけど、不安定すぎる

なんで安定感に差がでるのか

わからないです。知ってる人いたら教えてほしいです。

他の VPS について

他に試したい VPS もいくつかあるので試したら追記していきます。

きっかけ

サーバーにある Palworld のデータはローカルプレイで使える様に移動できるのか疑問だったので調べてわかった事をメモ。

ikuma0366 さんの記事を見て、この情報をベースにセーブデータを覗いてみました。

セーブデータの場所

専用サーバーで遊んだ場合

専用サーバー全体のセーブデータとプレイヤー毎のセーブデータがわかれている。
どちらもサーバー側で保存されているので、プレイヤー側でセーブデータを探しても見つからない。

専用サーバーのセーブデータ

1
PalServer/Pal/Saved/SaveGames/0/<サーバーID>/Level.sav

内容例

情報量が多く json 化すると 数GBの容量になる、中身を覗いてみて、わかった事だけメモ。

  • 接続した事のあるプレイヤー情報
  • 捕獲された後のパル情報
  • 各プレイヤーの最後にいた位置
  • 他にも沢山ありすぎてワロタ
  • その他、プレイヤー毎のセーブデータ以外の情報全て

プレイヤー毎のセーブデータ

1
PalServer/Pal/Saved/SaveGames/0/<サーバーID>/Players/<プレイヤーID※先頭8文字>以降は0.sav
  • ファイル名の例
    1
    813399F0000000000000000000000000.sav

813399F0 という8文字目までを見れば ok

内容例

こっちは情報量が比較的少なく、json 化しても 数KBの容量、中身を覗いてみて、わかった事だけメモ

  • キャラメイクの設定値
  • レシピ アンロック情報(アンロックした事があるレシピのみ記載)
  • ボスの討伐状況(倒した事があるパルのみ記載)
  • パルを捕まえた数(捕まえた事があるパルのみ記載なので全て1以上)
  • 手記の入手状況(入手した事がある手記のみ記載)

このファイル内にプレイヤー名の記載はないため Level.sav から確認するのが確実

コンプリートしたデータを一つ用意できればコンプリートしたデータを他のプレイヤーにコピーする事はできそう

ソロで遊んだ場合

以下のパスにセーブデータが保存されている様ですが、この記事では、この中のセーブデータについては触れてないです。

1
C:\Users\noma3\AppData\Local\Pal\Saved\SaveGames\<ワールドのID>

.sav の中身の見方

.sav は Unreal Engine のゲームで使われるセーブデータではあるものの、Unreal Engine 経由でないと直接中身を見る事が出来ないので、

有志が作成したツール(convert.py)を使って、json 化する必要がある

また、Unreal Engine のゲームは .json をセーブデータとして扱わないので、もしセーブデータを書き換えて使いたいなら .sav に戻してやる必要がある。

このツールの動作には python 3.9 以上が必要との事、一応 3.12 でも動作した。

json 化の方法

1
convert.py "savファイルのパス" --to-json

.sav 化の方法

1
convert.py ".jsonファイルのパス" --from-json

おまけ

Level.sav.json からプレイヤーを探す正規表現

vim で使った正規表現なので サクラエディタ だと少し変わるかも。

1
IsPlayer": {\n.*\": true

これで接続したことのあるプレイヤー名を確認した。

筆者が管理してるサーバーのプレイヤーID.sav 対応表

ファイル名 ユーザー名
813399f0*.sav noma
65332aeb*.sav KOB
06d842d5*.sav sakura
e74926a0*.sav yocha-424
120f57b4*.sav pia24mo
e7574940*.sav にゃんごろげ
98e4c6ac*.sav せつこ
d3a7451e*.sav mavu33

必要になった経緯

ゲームサーバーを自宅で立てるとなると、外からでもそのサーバーにアクセスできる様にポート開放する必要がありますが、
引っ越しをしてからマンション共有の回線を使っているためにルーターの設定ができず、ポート開放できない環境なため別の方法を探しました。
ただ、回線の品質は特に悪くないので自分で回線を契約するのはちょっともったいない・・・と思い別の方法をとりました。
localtonet への課金もしてみましたが、複数のフォワーディングをしない限り無料枠で事足りそうな雰囲気

localtonet の使い方

localtonet に登録

とりあえず登録します。

token をコピー

ダッシュボードに表示される AuthToken をコピーしておく

image

tunnel を作成し起動しておく

My Tunnels > TCP - UDP から作成する

image

Protocol Type と Server, ローカルのポートを指定して Create
作成されたら Start もクリックしておく
image

サーバー側でやる事

localtonet をインストールして次のコマンドを実行

1
localtonet authtoken <token>

すると以下の様に tunnel が表示されれば OK
image

IP/Url に表示されたアドレスに接続できる様になっているはず。

ngrok じゃだめ?

ポートフォワーディングしてくれる有名なツールに ngrok がありますが、そちらは UDP のフォワーディングはできません。

その他所感

リージョンに日本がない・・・

どこのサーバーを経由するか選べますが、日本がありません。ngrok では勝手に日本サーバー使ってくれるけど・・・
中国を選んで使っていて以外とラグも感じないですが、日本サーバーが使えたらよかったな

外部から見たポートの固定は有料でも無料でもできない

localtonet を起動する度に外部から見たポート番号が変わります。
なのでサーバーを複数人で利用している場合、 localtonet を再起動したあとは新しいポート番号の接続先を共有する必要が出てきます。
これは ngrok の有料プランだとできたとおもうので、ちょっとおしい

環境

ubuntu 22.04,20.04

SteamCMD のインストール

1
2
sudo add-apt-repository multiverse; sudo dpkg --add-architecture i386; sudo apt update
sudo apt install steamcmd

ゲームサーバーのインストール・アップデート

インストールもアップデートも以下コマンドでできる

1
steamcmd +login anonymous +app_update <appid> validate +quit

※ appid は SteamDB で確認、例えば 2394010 は palworld

このコマンドを実行すると、以下のディレクトリが作成される

  • ~/Steam

以下のディレクトリ以下に指定したゲームのサーバーファイルが保存される

  • ~/Steam/steamapps/common/

例えば palworld は以下になるが、さらにそれより下のファイルはゲームにより異なる

  • ~/Steam/steamapps/common/PalServer

vencord ってなに

以前から改造版 Discord クライアントとして主流な BetterDiscord がありましたが、
最近出てきた(私が見かける様になった)新しい 改造版 Discord クライアントです。

導入方法

ここを見て Discord PTB をインストールし、Discord PTB に Vencord を適用しました。Canary も前に入れてるので、3ついれてる。

【BetterDiscord超え】新改造版Discord、”Vencord”の入れ方とおすすめプラグイン - その1

Vencord を導入したら 設定 > Plugins から Translater を有効化しましょう。

image

あれ、日本語にならない。。。

image

日本語に翻訳させる方法

プラグインを有効化する時に設定画面を開くこともできるのですが、ここには変換先の言語を選べる所がないんですよね。。。

image

でも、プラグインのソースコードを漁っていたらなんだか変更できたりしちゃいそうな書き方になっている。

image

色々みていた結果、設定 > Plugin の画面で変更しているのはこのファイルの様でした。

%appdata%\Vencord\settings\settings.json

translate の設定部分も見つかったので見てみると、ありました。

image

receivedOutput を ja にして保存しましょう。

1
2
3
4
5
6
"Translate": {
"enabled": true,
"autoTranslate": false,
"receivedInput": "auto",
"receivedOutput": "ja"
},

また、英語の発言を右クリックして translate すると、できた。

image

GTX1080 から RTX 3090 に乗り換えたので、GPU-PV(旧名GPU-V) を改めて試してみようかなと
2020/11 頃に某ゲームを多重起動するために Windows 10 で実施していましたが、その時と手順は全く変わりませんでした。

現存する仮想マシンに GPU を使ってもらう方法

  1. DDA
    • グラボが限定されます
  2. Remote FX
    • 廃止済、今はできないはず
  3. GPU-PV(旧名GPU-P)
    • 今回はコレ

前提

  • ホストマシン
    • Windows 11 OSビルド 22621.1992
    • CPU: Ryzen9 3950X (16core/32threads)
    • GPU: RTX 3090
  • ゲストマシン
    • Windows 11

手順

0. Hyper-V を実行するホストマシンでは事前に以下の設定をしておく

  1. マザーボード側で VT-x または SR-IOV を有効化しておく
  2. Windows 側で Hyper-V を有効化しておく(機能の有効化)

1. Hyper-V で Windows 11 マシンを作成する

2. ホスト側 で以下コマンドを実行

Windows 11 マシンを停止し、管理者権限で以下 PowerShell を実行

1
2
3
4
5
6
$MachinName="Hyper-V 上のマシン名"
Add-VMGpuPartitionAdapter -VMName "${MachinName}"
Set-VMGpuPartitionAdapter -VMName "${MachinName}" -MinPartitionVRAM 80000000 -MaxPartitionVRAM 100000000 -OptimalPartitionVRAM 100000000 -MinPartitionEncode 80000000 -MaxPartitionEncode 100000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 80000000 -MaxPartitionDecode 100000000 -OptimalPartitionDecode 100000000 -MinPartitionCompute 80000000 -MaxPartitionCompute 100000000 -OptimalPartitionCompute 100000000
Set-VM -GuestControlledCacheTypes $true -VMName "${MachinName}"
Set-VM -LowMemoryMappedIoSpace 1GB -VMName "${MachinName}"
Set-VM -HighMemoryMappedIoSpace 32GB -VMName "${MachinName}"

3. ホストマシンからゲストマシンへファイルをコピーする

ホストからのコピー元とゲストへのコピー先のパスが異なるので別々に記載、2つのファイルがあります。

以下の二つのファイルがコピー元

    1. PowerShell で以下を実行すると出てくるフォルダ丸ごと
      1
      2
      explorer.exe "$(Get-CimInstance -ClassName Win32_VideoController -Property * | Select-Object -ExpandProperty InstalledDisplayDrivers | Write-Output)".Split(",")[0].Trim("\nvldumdx.dll")
      例: C:\WINDOWS\System32\DriverStore\FileRepository\nv_dispi.inf_amd64_50916785244854f2
    1. C:\Windows\System32\nvapi64.dll

コピー先

    1. C:\Windows\System32\HostDriverStore\FileRepository\ #HostDriverStore 以下のフォルダは自身で作成してください。
    1. C:\Windows\System32\ #ホストと同じ場所

ここまで実施して再起動するとデバイスマネージャーに表示される
どこかに漏れがあるとビックリマークついてるかもしれません。

  • うまくいった例
    image

  • うまくいってない例
    image

どんな感じ?

ゲスト側のタスクマネージャでは GPU 表示されない

ゲスト側の使用率はゲスト側で見たかったんですけど見えず、0 % 表示

image

ただ FF14 ベンチが動作したので GPU は使えている様です

image

ホスト側 FF14ベンチ (4K)

image

ホスト側 FF14ベンチ (FullHD)

image

ゲスト側 FF14ベンチ (4K)

image

ゲスト側 FF14ベンチ (FullHD)

image

ゲスト側 FF14ベンチ (4K)

  • 設定値を少し変えた、わかりにくいですが、1桁あがっていたりしています。
    1
    Set-VMGpuPartitionAdapter -VMName "HyperVマシン名" -MinPartitionVRAM 1000000000 -MaxPartitionVRAM 1000000000 -OptimalPartitionVRAM 1000000000 -MinPartitionEncode 1000000000 -MaxPartitionEncode 1000000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 1000000000 -MaxPartitionDecode 1000000000 -OptimalPartitionDecode 1000000000 -MinPartitionCompute 1000000000 -MaxPartitionCompute 1000000000 -OptimalPartitionCompute 1000000000

image

  • 20230725追記
    設定値戻してもスコアがあがる事はありませんでした。何の差なんだ・・・

Surface Laptop 3 (4K)

手元にあった Surface でもベンチしました。驚愕のスコア

image

体感

GPU-PV ないよりはいいかも、な感じ
-> 20230725追記: 6000くらい出ている時は結構いい

参考にしたサイト

おまけ

これを管理者権限有効 PowerShell で実行すると拡張セッション無し解像度4Kが使える様になる

1
Set-VMVideo -VMName "HyperVマシン名" -HorizontalResolution 3840 -VerticalResolution 2160 -ResolutionType Single

コマンド

Get-Command は gcm の alias も持つので、置き換え可です。

コマンドがどこから参照されてるのか確認

1
2
3
4
5
6
7
8
9
> Get-Command echo
CommandType Name Version Source
----------- ---- ------- ------
Alias echo -> Write-Output

> Get-Command Write-Output
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Write-Output 3.1.0.0 Microsoft.PowerShell.Utility

参照元はどんなコマンドが使えるのか

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Get-Command -Module Microsoft.PowerShell.Utility

Cmdlet Get-Random 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-Runspace 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-RunspaceDebug 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-TraceSource 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-TypeData 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-UICulture 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-Unique 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-Variable 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Group-Object 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Import-Alias 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Import-Clixml 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Import-Csv 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Import-LocalizedData 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Import-PSSession 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Invoke-Expression 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Invoke-RestMethod 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Invoke-WebRequest 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Measure-Command 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Measure-Object 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet New-Alias 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet New-Event 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet New-Object 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet New-TimeSpan 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet New-Variable 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Out-File 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Out-GridView 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Out-Printer 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Out-String 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Read-Host 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Register-EngineEvent 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Register-ObjectEvent 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Remove-Event 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Remove-PSBreakpoint 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Remove-TypeData 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Remove-Variable 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Select-Object 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Select-String 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Select-Xml 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Send-MailMessage 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-Alias 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-Date 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-PSBreakpoint 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-TraceSource 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-Variable 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Show-Command 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Sort-Object 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Start-Sleep 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Tee-Object 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Trace-Command 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Unblock-File 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Unregister-Event 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Update-FormatData 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Update-List 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Update-TypeData 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Wait-Debugger 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Wait-Event 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Debug 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Error 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Host 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Information 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Output 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Progress 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Verbose 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Warning 3.1.0.0 Microsoft.PowerShell.Utility

所感

もっとはやくしりたかった

記事の更新の仕方すら忘れてしまいそうだったので何か書きこんどこうかなと

curl コマンド

1
2
3
4
5
6
7
curl https://api.openai.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer トークン" -d @- <<EOF
{
"model":"gpt-3.5-turbo-0301",
"messages": [{"role":"user","content":"こんにちは"}],
"temperature":0.7
}
EOF

ドキュメント

https://platform.openai.com/docs/guides/chat

java 1.17 を入れる手順も含むので空のVM 等で実施する事をお勧めします。

環境

ubuntu 20.04 on WSL で確認

コマンド

1
2
3
4
5
6
7
8
9
10
11
12
wget https://aka.ms/download-jdk/microsoft-jdk-17-linux-x64.tar.gz
tar -zxf microsoft-jdk-17*.tar.gz
cd jdk-17*
export JAVA_HOME=`pwd`
cd ..
export PATH=${JAVA_HOME}/bin:$PATH
java -version
mkdir SpringBoot
git clone https://github.com/spring-guides/gs-spring-boot-for-azure
cd gs-spring-boot-for-azure/complete
./mvnw clean package #Failed するかもしれませんが無視して起動できました。
./mvnw spring-boot:run

java-optsを指定する場合

環境変数 MAVEN_OPTS をいじります。

1
export MAVEN_OPTS="-javaagent:/root/SpringBoot/gs-spring-boot-for-azure/complete/applicationinsights-agent-3.4.13.jar";./mvnw spring-boot:run

参考

https://spring.pleiades.io/guides/gs/spring-boot-for-azure/