WSL2の基本操作

# 要旨
WindowsからLinuxを動作させる定番ソフトは、VirtualBOXやVMware Workstation Playerでした。
しかし、(a) 起動に時間がかかる、(b) ホスト・ゲスト間の連携に難がある、(c) Pコア+Eコアのマシンでの動作が不安定、... などの課題があり快適とはいえない状況でした。
現在はこれらの課題が改善されたWSL2の利用が増えています。
WSLを快適に使うための基本操作を簡単にまとめました。
WSL2やVS-Codeは活発に開発が行われていて、改善・仕様変更されています。
柔軟に考えることも必要かもしれません。

# 1. 基本操作
## 1.1 確認した環境
2025年4月17日時点において、最新のリリース版を使用しました。
```powershell
wsl --version
WSL バージョン: 2.4.13.0
カーネル バージョン: 5.15.167.4-1
WSLg バージョン: 1.0.65
MSRDC バージョン: 1.2.5716
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.26100.3775
```
## 1.2 使用したLinuxディストリビューションとアプリ
"wsl -l -o" コマンドで表示されるディストリビューションを使用しました。
OracleLinux 9は、利用者が少ないようです。tar形式の別メディアからのインストールが推奨されました。
```
PS C:\Users\xxxyyy> wsl -l -o
'wsl.exe --install <Distro>' を使用してインストールします。

NAME                            FRIENDLY NAME
AlmaLinux-8                     AlmaLinux OS 8
AlmaLinux-9                     AlmaLinux OS 9
AlmaLinux-Kitten-10             AlmaLinux OS Kitten 10
Debian                          Debian GNU/Linux
FedoraLinux-42                  Fedora Linux 42
SUSE-Linux-Enterprise-15-SP5    SUSE Linux Enterprise 15 SP5
SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6
Ubuntu                          Ubuntu
Ubuntu-24.04                    Ubuntu 24.04 LTS
archlinux                       Arch Linux
kali-linux                      Kali Linux Rolling
openSUSE-Tumbleweed             openSUSE Tumbleweed
openSUSE-Leap-15.6              openSUSE Leap 15.6
Ubuntu-18.04                    Ubuntu 18.04 LTS
Ubuntu-20.04                    Ubuntu 20.04 LTS
Ubuntu-22.04                    Ubuntu 22.04 LTS
OracleLinux_7_9                 Oracle Linux 7.9
OracleLinux_8_7                 Oracle Linux 8.7
OracleLinux_9_1                 Oracle Linux 9.1
```
全て、WSL Ver. 2です。
- elmer_deb12　
   Debian 12にElmer (Elmer/Ice, MUMPS, Hypre, MMG, Zoltan and NetCDF) 
- Smeca-Alma9
   Alma Linux 9にSalome-meca 2024.1 (Apptainer, NVIDIA Container Toolkit, 
   /etc/apptainer/apptainer.confを編集し、--nvを有効化)                
- Fistr_Oracle9
   Oracle Linux 9にFrontISTR(autofistrのスクリプトにより、oneAPIのIMPIとMKLを組み込んだ）とEasyISTR 


デスクトップアプリは、Flatpak、AppImage、ParaviewやScilabのようにLinuxディストリビューションの種類によらず動作するものが増えました。
昔と比べて、OSにはパッケージの新しさが要求されなくなったと思います。
リリースから2年弱のDebian 12、十分なテストで検証されたRHEL9互換を選びました。
アプリが古くて困ることはなかったです。

## 1.3 Windowsターミナルからの起動
WSLをインストール後、しばらくしてから管理者でWindowsターミナルを開くとWSLの端末が自動的に追加されます。

:::note info
インフォメーション
入れ替えを繰り返すと、「無効な "icon" を持つプロファイルが見つかりました。...」のエラーが発生しました。
:::

一度、アイコンを「無し」にして、エラーが止まってから、再度iconを指定することで登録を復旧できました。

なお、WSLの仕様変更によって、sourceの表記も変わったようです。

旧（ネット検索でよく見つかる従来の表記）　　　　　　　　　新たな表記
"source": "Windows.Terminal.Wsl"　　　　→　　　　　　"source": "Microsoft.WSL"

同様のことが以下のURLに記載されています。
[対処法「ユーザー設定の読み込み中にエラーが発生しました。」](https://progzakki.sanachan.com/os/how-to-fix-error-while-loading-user-setting-on-windows-terminal/)

なお、設定の記録にはsetting.jsonとレジストリが用いています。

```JSON:settings.json
{
    "$help": "https://aka.ms/terminal-documentation",
    "$schema": "https://aka.ms/terminal-profiles-schema",
    "actions": [],
    "copyFormatting": "none",
    "copyOnSelect": false,
    "defaultProfile": "{574e775e-4f2a-5b96-ac1e-hjfsimdcvo}",
    "keybindings": 
...
            {
                "guid": "{574e775e-4f2a-5b96-ac1e-jdgicmighs}",
                "hidden": false,
                "name": "PowerShell",
                "source": "Windows.Terminal.PowershellCore"
            },
            {
                "closeOnExit": "always",
                "guid": "{58486d3e-83cb-5614-962b-hjcusxgkv}",
                "hidden": false,
                "icon": "D:\\WSL_VMs\\elmer_deb12\\Elmer.ico",
                "name": "elmer_deb12",
                "source": "Microsoft.WSL"
            },
            {
                "closeOnExit": "always",
                "guid": "{dce20538-5b37-57f9-b601-iahcnumz}",
                "hidden": false,
                "name": "Smeca-Alma9",
                "source": "Microsoft.WSL"
            },
            {
                "closeOnExit": "always",
                "commandline": "wsl -d Fistr_Oracle9",
                "guid": "{c7477bdc-7b4a-55ba-a81d-cenhvvlbnicmc}",
                "hidden": false,
                "icon": "C:\\Users\\xxhhyd\\AppData\\Local\\Packages\\3810OracleAmericaInc.62074632F71C9_viklcionc\\LocalState\\frontistr-2.ico",
                "name": "Fistr_Oracle9",
                "pathTranslationStyle": "wsl",
                "startingDirectory": "~"
            }
...
```
:::note info
強引に編集すると、ディストリビューションを認識しなくなることがありました。
レジストリやJSONファイルの編集、GUIからの設定と弄る箇所が多いので、消えたときの対処が面倒です。
時間に余裕ある方以外は、GUIからの最小限の設定に止めた方が無難です。
:::

![スクリーンショット 2025-04-22 142552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/58967f9f-5fd3-4cc8-b69d-249526eea82e.png)

PowerShell (pwsh.exe)にwsl -d ディストリビューション名によって、起動する方法が一般的です。

:::note info
Windowsターミナルでは、「パスの変換」の機能はあり（新しい環境ではデフォルトで設定される）、WindowsとLinuxのフォルダ名を相互変換してくれます。
:::

![スクリーンショット 2025-04-22 142719.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/1bc62cfd-fab6-4b9e-94f9-da6493de8796.png)

エクスプローラーとWindowsターミナル（LinuxのBash）とを用いて、ディレクトリ名の手直しなしに移動できます。

:::note info
つまり、bashからLinuxアプリを起動し、Windows側のデータを簡単に開くことができます。
:::

![Windowsターミナルとエクスプローラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/a511d655-0ef4-408c-be5e-e8288a69b6d4.png)


## 1.4 スピード（一例としてFrontISTRのTutorial 2の計算時間により比較した）
Windows → Linux, Linux → Windowsの異なるファイルシステムをまたぐと、遅くなります（1.2～1.4倍の時間）。4年前は2倍近くかかっていたので、チューニングが進んで改善されたと思われます。

#### ソルバー：Windows、データの場所：Windows
```powershell
D:\DEXCS\easyIstr-Work\FrontISTR\tutorial\02_elastic_hinge_parallel>mpiexec -np 4 fistr1 -t 1
##################################################################
#                         FrontISTR                              #
##################################################################
---
version:      5.7
git_hash:     ef119f4133e843f4d6db0f6a9c018982c89a9fc8
build:
  date:       2025-04-07T08:04:48%z
  MPI:       "2.0, Microsoft MPI"
  OpenMP:     201511
  option:    "-p --with-tools --with-refiner --with-metis --with-mumps --with-lapack --with-ml "
  HECMW_METIS_VER: 5
...
  [MUMPS]: Analysis and Factorization completed.
  [MUMPS]: Solution completed.
 setup time :    2.6756726999999501
 solve time :   0.12167199999998957
### Relative residual = 3.92644E-10
### FSTR_SOLVE_NLGEOM FINISHED!

 ====================================
    TOTAL TIME (sec) :      3.48
           pre (sec) :      0.10
         solve (sec) :      3.38
 ====================================
 FrontISTR Completed !!
 ```
 
#### ソルバー：Windows、データの場所：Linux


```powershell
PS Microsoft.PowerShell.Core\FileSystem::\\wsl.localhost\Fistr_Oracle9\home\masahiro\autofistr\FrontISTR\tutorial\02_elastic_hinge_parallel> mpiexec -np 4 "D:\DEXCS\FrontISTR-msmpi_openblas-20250407\fistr1.exe" -t 1
##################################################################
#                         FrontISTR                              #
##################################################################
---
version:      5.7
git_hash:     ef119f4133e843f4d6db0f6a9c018982c89a9fc8
build:
  date:       2025-04-07T08:04:48%z
  MPI:       "2.0, Microsoft MPI"
  OpenMP:     201511
  option:    "-p --with-tools --with-refiner --with-metis --with-mumps --with-lapack --with-ml "
  HECMW_METIS_VER: 5
...
  [MUMPS]: Analysis and Factorization completed.
  [MUMPS]: Solution completed.
 setup time :    2.7948485000001710
 solve time :   0.12351859999989756
### Relative residual = 3.92583E-10
### FSTR_SOLVE_NLGEOM FINISHED!

 ====================================
    TOTAL TIME (sec) :      4.79
           pre (sec) :      0.26
         solve (sec) :      4.54
 ====================================
 FrontISTR Completed !!
 ```

 #### ソルバー：Linux、データの場所：Linux

```bash
[masahiro@Desktop-12th 02_elastic_hinge_parallel]$ mpirun -np 4 fistr1 -t 1
##################################################################
#                         FrontISTR                              #
##################################################################
---
version:      5.7
git_hash:     ef119f4133e843f4d6db0f6a9c018982c89a9fc8
build:
  date:       2025-04-21T19:41:36%z
  MPI:       "3.1, Intel MPI 2021.15.0"
  OpenMP:     201511
  option:    "-p --with-tools --with-refiner --with-metis --with-mumps --with-lapack --with-ml --with-parmetis --with-mkl "
  HECMW_METIS_VER: 5
...
  [MUMPS]: Analysis and Factorization completed.
  [MUMPS]: Solution completed.
 setup time :    2.8609017844502489
 solve time :    8.5876552006922680E-002
### Relative residual = 4.93683E-10
 Start visualize PSF 1 at timestep 1
### FSTR_SOLVE_NLGEOM FINISHED!

 ====================================
    TOTAL TIME (sec) :      3.49
           pre (sec) :      0.09
         solve (sec) :      3.39
 ====================================
 FrontISTR Completed !!
 ```

#### ソルバー：Linux、データの場所：Windows

```bash
[masahiro@Desktop-12th 02_elastic_hinge_parallel]$ cd /mnt/d/DEXCS/easyIstr-Work/FrontISTR/tutorial/02_elastic_hinge_parallel
[masahiro@Desktop-12th 02_elastic_hinge_parallel]$ mpirun -np 4 fistr1 -t 1
##################################################################
#                         FrontISTR                              #
##################################################################
---
version:      5.7
git_hash:     ef119f4133e843f4d6db0f6a9c018982c89a9fc8
build:
  date:       2025-04-21T19:41:36%z
  MPI:       "3.1, Intel MPI 2021.15.0"
  OpenMP:     201511
  option:    "-p --with-tools --with-refiner --with-metis --with-mumps --with-lapack --with-ml --with-parmetis --with-mkl "
  HECMW_METIS_VER: 5
...
  [MUMPS]: Analysis and Factorization completed.
  [MUMPS]: Solution completed.
 setup time :    2.8661856873756619
 solve time :    8.5866299930444256E-002
### Relative residual = 4.90191E-10
 Start visualize PSF 1 at timestep 1
### FSTR_SOLVE_NLGEOM FINISHED!

 ====================================
    TOTAL TIME (sec) :      4.03
           pre (sec) :      0.16
         solve (sec) :      3.87
 ====================================
 FrontISTR Completed !!
 ```
 

## 1.5 LinuxフォルダのデータをWindowsアプリから開く
Windowsの標準仕様のアプリであれば、設定を弄ることなく、WindowsのアプリからLinuxフォルダのデータを開くことができます。
開くことができない例としては、CAD、メッシャー、ポストなどの統合環境 "Salome Platform"があります。
デイレクトリを移動して、アプリを開くには、以下の方法があります。
### エクスプローラーでLinuxフォルダ(初回のみ"\\wsl$"の入力が必要)に移動し、上のバーにコマンド入力
データ可視化ソフトのコマンド名”Paraview"と入力する
![エクプローラーの上バーへの入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/2b5c56be-cfe8-46e7-93ab-fe0ad7cb8777.png)

Paraviewはディレクトリが移動した状態で起動します
![Paraviewのファイル開く-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/f9ccf5df-b9c9-4fd1-8ea2-638ba9280ddf.png)

resultsフォルダのvtuファイルを選んで、読み込み・表示することが可能です
![Paraview-温度データ可視化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/287f1ca4-e57a-4f7b-8438-a718357237e5.png)

### 右クリックして端末を開く
Linuxフォルダに移動するまでは同じです。エクスプローラー下側の余白部分で右クリックすると、下図のポップアップが表示されます。
![ターミナルで開く.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/6e8e0478-c8a8-41ba-82fb-4948e2760a1f.png)

LinuxのディレクトリでWindowsの端末が起動します
![ディレクトリを移動して端末が開いた.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/33348636-41b1-45d3-bffb-999c72021b6b.png)

# 2. WSLのファイル編集・実行

## 2.1 sudo（管理者権限）が必要なファイル
ターミナル上で動作するソフト（vi、Emacsなど）からの編集が推奨されています（私はnanoを使用）。
但し、CAE用途に加えられた/optや/usr/localの長いファイル（壊れてもOSの動作自体に影響しません）は、GUIから操作をしたいので、"sudo gedit"により編集しています。

## 2.2 homeディレクトリのファイル
- 短く、作業内容が単純なもの
nanoを使うことが多いです
- 文法チェックやシンタックスハイライトの機能を利用したいとき
VS-Codeを使うようにしています。ファイルの編集と実行のみで開発者用の機能は活用していません。
エクスプローラーからWSLのファイルの場所で右クリックし、ファイルを開き、編集します。

## 2.3 ファイルの編集と実行
WSLのLinux側からWindowsへのPATHが通っていると、Linux側から「code .」と入力すると、支援機能が自動インストールされるようです。
[Linux 用 Windows サブシステムで Visual Studio Code の使用を開始する](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode)

私の場合は、コンパイル時にWindows側をスキャンして、ご認識することがあり、Windows側のPATHを追加しない設定にしています。
```/etc/wsl.conf
# Default user
[user]
default=elmeruser

# Do not append Windows PATH
[interop]
appendWindowsPath = false
```
CAE用の設定ファイルを編集して実行するだけなので、VS Codeからフォルダーを開けばEditorと、ディレクトリを移動したbash端末が使用できます。
Windowsターミナルを開くことなく作業ができます。
![スクリーンショット 2025-04-22 170032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/0bd584ef-2cd1-4ee0-b2d1-e4882835634b.png)