.NETがIBM Powerでサポートされたので試してみる

# .NET 7.0 で IBM Power のサポート発表

IBM Power上のRHEL(Red Hat Enterprise Linux)で.NET 7.0がサポートされるようになったと発表がありました。  
https://devblogs.microsoft.com/dotnet/announcing-dotnet-7/

>64-bit IBM Power support  
In addition to x64 architecture (64-bit Intel/AMD), ARM64 (64-bit ARM) and s390x (64-bit IBM Z), .NET is now also available for the ppc64le (64-bit IBM Power) architecture targeting RHEL 8.7 and RHEL 9.1.  
>
>With the availability to now run natively on Power, the 25,000 plus IBM Power customers can consolidate existing .NET apps on Windows x86 to run on the same Power platform as their IBM i and AIX business apps and databases. Doing so can significantly improve sustainability with up to a 5x smaller carbon footprint combined with on-premises pay-as-you-go scaling for RHEL and OpenShift capacity while delivering industry leading end-to-end-enterprise transaction and data security.

ということで、Powerの上で.NETを動かしてみます。  
今回は、Hello Worldを表示する簡単なチュートリアルを試してみます。  
https://dotnet.microsoft.com/en-us/learn/dotnet/hello-world-tutorial/intro  

RHELのサポートは8.7, 9.1とのことです。 特に言及はないため他のアーキテクチャーで動かすLinuxと同じように使えるのではないかと思います。

# .NETのインストール

RHELの場合は、`yum`から.NETをインストールできるようです。  
まずは、`yum search` でインストール可能なパッケージがあるのか確認してみます。  

```
[root@thel ~]# yum search dotnet
Updating Subscription Management repositories.
メタデータの期限切れの最終確認: 2:55:43 時間前の 2022年11月14日 20時50分55秒 に実施しました。
================================================ 名前 完全一致: dotnet =================================================
dotnet.ppc64le : .NET CLI tools and runtime
================================================== 名前 一致: dotnet ===================================================
dotnet-apphost-pack-7.0.ppc64le : Targeting Pack for Microsoft.NETCore.App 7.0
dotnet-host.ppc64le : .NET command line launcher
dotnet-hostfxr-7.0.ppc64le : .NET command line host resolver
dotnet-runtime-7.0.ppc64le : NET 7.0 runtime
dotnet-sdk-7.0.ppc64le : .NET 7.0 Software Development Kit
dotnet-targeting-pack-7.0.ppc64le : Targeting Pack for Microsoft.NETCore.App 7.0
dotnet-templates-7.0.ppc64le : .NET 7.0 templates
```

.NET用のパッケージがいくつか見つかりました。  
SDKをインストールすると、依存関係で他のパッケージもインストールされるようです。  
`dotnet-sdk-7.0` をインストールします。  

```
[root@rhel ~]# yum install dotnet-sdk-7.0 -y
Updating Subscription Management repositories.
メタデータの期限切れの最終確認: 2:58:03 時間前の 2022年11月14日 20時50分55秒 に実施しました。
依存関係が解決しました。
========================================================================================================================
 パッケージ                           Arch          バージョン            リポジトリー                            サイズ
========================================================================================================================
インストール:
 dotnet-sdk-7.0                       ppc64le       7.0.100-1.el8_7       rhel-8-for-ppc64le-appstream-rpms        53 M
依存関係のインストール:
 aspnetcore-runtime-7.0               ppc64le       7.0.0-1.el8_7         rhel-8-for-ppc64le-appstream-rpms       2.8 M
 aspnetcore-targeting-pack-7.0        ppc64le       7.0.0-1.el8_7         rhel-8-for-ppc64le-appstream-rpms       1.6 M
 dotnet-apphost-pack-7.0              ppc64le       7.0.0-1.el8_7         rhel-8-for-ppc64le-appstream-rpms       100 k
 dotnet-host                          ppc64le       7.0.0-1.el8_7         rhel-8-for-ppc64le-appstream-rpms       190 k
 dotnet-hostfxr-7.0                   ppc64le       7.0.0-1.el8_7         rhel-8-for-ppc64le-appstream-rpms       175 k
 dotnet-runtime-7.0                   ppc64le       7.0.0-1.el8_7         rhel-8-for-ppc64le-appstream-rpms       7.8 M
 dotnet-targeting-pack-7.0            ppc64le       7.0.0-1.el8_7         rhel-8-for-ppc64le-appstream-rpms       2.9 M
 dotnet-templates-7.0                 ppc64le       7.0.100-1.el8_7       rhel-8-for-ppc64le-appstream-rpms       3.1 M
 netstandard-targeting-pack-2.1       ppc64le       7.0.100-1.el8_7       rhel-8-for-ppc64le-appstream-rpms       1.5 M

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

ダウンロードサイズの合計: 73 M
インストール後のサイズ: 311 M
パッケージのダウンロード:
(1/10): aspnetcore-targeting-pack-7.0-7.0.0-1.el8_7.ppc64le.rpm                         2.9 MB/s | 1.6 MB     00:00
(2/10): dotnet-host-7.0.0-1.el8_7.ppc64le.rpm                                           338 kB/s | 190 kB     00:00
(3/10): dotnet-runtime-7.0-7.0.0-1.el8_7.ppc64le.rpm                                     11 MB/s | 7.8 MB     00:00
(4/10): aspnetcore-runtime-7.0-7.0.0-1.el8_7.ppc64le.rpm                                9.9 MB/s | 2.8 MB     00:00
(5/10): netstandard-targeting-pack-2.1-7.0.100-1.el8_7.ppc64le.rpm                      5.3 MB/s | 1.5 MB     00:00
(6/10): dotnet-apphost-pack-7.0-7.0.0-1.el8_7.ppc64le.rpm                               395 kB/s | 100 kB     00:00
(7/10): dotnet-templates-7.0-7.0.100-1.el8_7.ppc64le.rpm                                 10 MB/s | 3.1 MB     00:00
(8/10): dotnet-targeting-pack-7.0-7.0.0-1.el8_7.ppc64le.rpm                             9.1 MB/s | 2.9 MB     00:00
(9/10): dotnet-hostfxr-7.0-7.0.0-1.el8_7.ppc64le.rpm                                    786 kB/s | 175 kB     00:00
(10/10): dotnet-sdk-7.0-7.0.100-1.el8_7.ppc64le.rpm                                      41 MB/s |  53 MB     00:01
------------------------------------------------------------------------------------------------------------------------
合計                                                                                     32 MB/s |  73 MB     00:02
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                1/1
  インストール中   : dotnet-host-7.0.0-1.el8_7.ppc64le                                                             1/10
  インストール中   : aspnetcore-targeting-pack-7.0-7.0.0-1.el8_7.ppc64le                                           2/10
  インストール中   : netstandard-targeting-pack-2.1-7.0.100-1.el8_7.ppc64le                                        3/10
  インストール中   : dotnet-apphost-pack-7.0-7.0.0-1.el8_7.ppc64le                                                 4/10
  インストール中   : dotnet-templates-7.0-7.0.100-1.el8_7.ppc64le                                                  5/10
  インストール中   : dotnet-targeting-pack-7.0-7.0.0-1.el8_7.ppc64le                                               6/10
  インストール中   : dotnet-hostfxr-7.0-7.0.0-1.el8_7.ppc64le                                                      7/10
  インストール中   : dotnet-runtime-7.0-7.0.0-1.el8_7.ppc64le                                                      8/10
  インストール中   : aspnetcore-runtime-7.0-7.0.0-1.el8_7.ppc64le                                                  9/10
  インストール中   : dotnet-sdk-7.0-7.0.100-1.el8_7.ppc64le                                                       10/10
  scriptletの実行中: dotnet-sdk-7.0-7.0.100-1.el8_7.ppc64le                                                       10/10
  検証             : dotnet-host-7.0.0-1.el8_7.ppc64le                                                             1/10
  検証             : aspnetcore-targeting-pack-7.0-7.0.0-1.el8_7.ppc64le                                           2/10
  検証             : dotnet-runtime-7.0-7.0.0-1.el8_7.ppc64le                                                      3/10
  検証             : aspnetcore-runtime-7.0-7.0.0-1.el8_7.ppc64le                                                  4/10
  検証             : netstandard-targeting-pack-2.1-7.0.100-1.el8_7.ppc64le                                        5/10
  検証             : dotnet-apphost-pack-7.0-7.0.0-1.el8_7.ppc64le                                                 6/10
  検証             : dotnet-templates-7.0-7.0.100-1.el8_7.ppc64le                                                  7/10
  検証             : dotnet-targeting-pack-7.0-7.0.0-1.el8_7.ppc64le                                               8/10
  検証             : dotnet-sdk-7.0-7.0.100-1.el8_7.ppc64le                                                        9/10
  検証             : dotnet-hostfxr-7.0-7.0.0-1.el8_7.ppc64le                                                     10/10
Installed products updated.

インストール済み:
  aspnetcore-runtime-7.0-7.0.0-1.el8_7.ppc64le           aspnetcore-targeting-pack-7.0-7.0.0-1.el8_7.ppc64le
  dotnet-apphost-pack-7.0-7.0.0-1.el8_7.ppc64le          dotnet-host-7.0.0-1.el8_7.ppc64le
  dotnet-hostfxr-7.0-7.0.0-1.el8_7.ppc64le               dotnet-runtime-7.0-7.0.0-1.el8_7.ppc64le
  dotnet-sdk-7.0-7.0.100-1.el8_7.ppc64le                 dotnet-targeting-pack-7.0-7.0.0-1.el8_7.ppc64le
  dotnet-templates-7.0-7.0.100-1.el8_7.ppc64le           netstandard-targeting-pack-2.1-7.0.100-1.el8_7.ppc64le

完了しました!
```

インストールが完了しました。  
これで.NETが使えるようになっているはずです。
コマンドでインストールされた.NETの情報を確認してみます。

```
[root@rhel ~]# dotnet --info
.NET SDK:
 Version:   7.0.100
 Commit:    e12b7af219

ランタイム環境:
 OS Name:     rhel
 OS Version:  8
 OS Platform: Linux
 RID:         rhel.8-ppc64le
 Base Path:   /usr/lib64/dotnet/sdk/7.0.100/

Host:
  Version:      7.0.0
  Architecture: ppc64le
  Commit:       d099f075e4

.NET SDKs installed:
  7.0.100 [/usr/lib64/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 7.0.0 [/usr/lib64/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 7.0.0 [/usr/lib64/dotnet/shared/Microsoft.NETCore.App]

Other architectures found:
  None

Environment variables:
  Not set

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download
```

# チュートリアルの実行
それでは、チュートリアルに沿って試していきます。  
新しいアプリを作成します。  

```
[root@rhel ~]# dotnet new console -o MyApp -f net7.0

.NET 7.0 へようこそ!
---------------------
SDK バージョン: 7.0.100

----------------
ASP.NET Core の HTTPS 開発証明書をインストールしました。
証明書を信頼するには、'dotnet dev-certs https --trust' (Windows および macOS のみ) を実行します。
HTTPS の詳細については、https://aka.ms/dotnet-https を参照してください
----------------
最初のアプリを作成するには、https://aka.ms/dotnet-hello-world を参照してください
最新情報については、https://aka.ms/dotnet-whats-new を参照してください
ドキュメントを探索するには、https://aka.ms/dotnet-docs を参照してください
GitHub で問題の報告とソースの検索を行うには、https://github.com/dotnet/core を参照してください
'dotnet --help' を使用して使用可能なコマンドを確認するか、https://aka.ms/dotnet-cli にアクセスしてください
--------------------------------------------------------------------------------------
テンプレート "コンソール アプリ" が正常に作成されました。

作成後の操作を処理しています...
/root/MyApp/MyApp.csproj を復元しています:
  Determining projects to restore...
  Restored /root/MyApp/MyApp.csproj (in 210 ms).
正常に復元されました。
```

コマンドを実行したディレクトリに `MyApp` が作成されています。
```
[root@rhel ~]# ls
MyApp
```

`MyApp`の中身を確認すると、以下のファイルが生成されていました。  
```
[root@rhel ~]# cd MyApp/
[root@rhel MyApp]# ls
MyApp.csproj  Program.cs  obj
```

テンプレートで `Program.cs` という名前のプログラムが準備されています。  
このファイルの中身を確認すると、Consoleに `Hello World！` を表示する記載がされています。  
```
[root@rhel MyApp]# cat Program.cs
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
```

では、実行してみます。`dotnet run` で実行できます。  
```
[root@rhel MyApp]# dotnet run
Hello, World!
```

無事、動くことが確認できました。  
チュートリアルなので、とても簡単なプログラムの実行でしたが.NETの開発・実行環境が使えるようになりました。

# コンテナでも.NET

他にも、Red Hat Ecosystem Catalogに .NETのコンテナイメージも登録されていました。
もちろんPower(ppc64le)版のイメージもありました。
https://catalog.redhat.com/software/containers/rhel8/dotnet-70/633c2b499d5bb2048bbc36ba?architecture=ppc64le

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/f8908bf9-190f-9221-6644-6353bbfc924e.png)


コンテナを起動してみましたが、同じように使えそうでした。
``` 
[root@rhel MyApp]# podman run -it registry.access.redhat.com/ubi8/dotnet-70 bash
Trying to pull registry.access.redhat.com/ubi8/dotnet-70:latest...
WARN[0000] "/run/user/0" directory set by $XDG_RUNTIME_DIR does not exist. Either create the directory or unset $XDG_RUNTIME_DIR.: stat /run/user/0: no such file or directory: Trying to pull image in the event that it is a public image.
Getting image source signatures
Checking if image destination supports signatures
Copying blob 6c256570e90e done
Copying blob 3a396d1417be done
Copying blob 5b27cce89638 done
Copying config 4d57d139a7 done
Writing manifest to image destination
Storing signatures
bash-4.4$ dotnet --info
.NET SDK:
 Version:   7.0.100
 Commit:    e12b7af219

Runtime Environment:
 OS Name:     rhel
 OS Version:  8
 OS Platform: Linux
 RID:         rhel.8-ppc64le
 Base Path:   /usr/lib64/dotnet/sdk/7.0.100/

Host:
  Version:      7.0.0
  Architecture: ppc64le
  Commit:       d099f075e4

.NET SDKs installed:
  7.0.100 [/usr/lib64/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 7.0.0 [/usr/lib64/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 7.0.0 [/usr/lib64/dotnet/shared/Microsoft.NETCore.App]

Other architectures found:
  None

Environment variables:
  Not set

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download
bash-4.4$ dotnet new console -o MyApp -f net7.0
The template "Console App" was created successfully.

Processing post-creation actions...
Restoring /opt/app-root/src/MyApp/MyApp.csproj:
  Determining projects to restore...
  Restored /opt/app-root/src/MyApp/MyApp.csproj (in 213 ms).
Restore succeeded.


bash-4.4$ cd MyApp/
bash-4.4$ dotnet run
Hello, World!
bash-4.4$
```