Windows 11 Home 個人用セットアップメモ

# Windows 11 Home 個人用セットアップメモ

新規に Windows 11 PCを購入したので、個人用セットアップメモ。

主に WSL2によるLinux系開発、機械学習、Mac からのリモート接続での利用を想定。(あとはゲーム)

## ユーザディレクトリを変更

Windows セットアップ時に Microsoftアカウントを作成するとホームディレクトリが勝手に先頭5文字のフォルダで作成されてしまうため、セットアップ完了後に変更。

下記手順を参考にユーザディレクトリを変更。ローカルアカウントを再作成して再度Microsoftアカウントと紐づける。

 * [[Windows 11] ユーザー用のフォルダー名の変更](https://answers.microsoft.com/ja-jp/windows/forum/all/windows-11/977f13ae-5cd5-451e-92bb-b98afe6f4adc)
     * 手順の中でローカルアカウントを2回作るが、1回目は一時的な名前を指定し、2回目(「新規ローカルアカウントの作成」の手順)で作りたいユーザディレクトリの名前で作成する。

## WSL2 のインストール

### WSL2 インストール手順
 * 利用できるディストリビューションの確認
```
PS> wsl --list --online
```
 * 今回は AlmaLinux 9 をインストール
```
PS> wsl --install AlmaLinux-9
```
 * 再起動する

~~機械学習用には [CUDA Toolkit](https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu)が WSL2-Ubuntu にしか対応してないようなので別途 Ubuntu で環境構築する~~
と書いたが、推奨のインストールパッケージがUbuntuにしか提供されてないというだけで、自分で [Meta Packageからインストール](https://docs.nvidia.com/cuda/wsl-user-guide/index.html#cuda-support-for-wsl-2)の手順を適切に実行すれば良い。これを試してみた手順は以下の記事に記載した。
 * [WSL2 + AlmaLinux-9 + CUDA + PyTorch 環境構築](https://qiita.com/ksk_ha/items/b5860060ee68de1b2985)


### WSL2 設定

Linux パーミッションを有効にする

 * ```/etc/wsl.conf```
```
[automount]
options = "metadata"
```

### WSL2 ssh サービス有効化

AlmaLinux-9 での手順

```bash
sudo dnf install openssh-server
sudo systemctl start sshd.service
```

## ssh ログイン設定

### OpenSSH サービスの有効化
 * (1) 「設定」「システム」「オプション機能」から「OpenSSHサーバー」をインストール
 * (2) サービスパネル(```services.msc```)から「OpenSSH SSH Server」を自動起動、開始を設定
 * (3) 「セキュリティが強化されたWindows Defender ファイヤウォール」(```wf.msc```)から「受信の規則」「新しい規則」「ポート」「22」

 * 参照URL
     * https://qiita.com/nujust/items/6d5ccea95e635467c96a
     * https://qiita.com/sengoku/items/ce61cb6fd6e513098d0b 
     * https://zenn.dev/zuzuzu/articles/windows_11_ssh

### ssh 鍵認証の設定

管理者権限があるユーザでログインするため、「管理ユーザー」用の設定を行う。

 * (1) 接続元端末の公開鍵ファイルをWindows側へ一旦パスワード認証で scp する(以下 ```id_ecdsa.pub``` として記載)
 * (2) 管理者権限で PowerShell を開く
 * (3) 公開鍵の内容を管理ユーザ用認証キーファイル ```administrators_authorized_keys``` へ追記する
```powershell
Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value (Get-Content -Path .\id_ecdsa_genesis.pub)
```
 * (4) ```administrators_authorized_keys``` のパーミッションを設定する
```powershell
icacls.exe "$env:ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
```
 * (5) 接続元端末からssh鍵認証でログインできることを確認する

備忘録: パーミッション設定前後の状態
 * 設定前の状態
```powershell
> icacls.exe $env:ProgramData\ssh\administrators_authorized_keys
C:\ProgramData\ssh\administrators_authorized_keys NT AUTHORITY\SYSTEM:(I)(F)
                                                  BUILTIN\Administrators:(I)(F)
                                                  NT AUTHORITY\Authenticated Users:(I)(RX)
```
 * 設定後の状態
```powershell
> icacls.exe $env:ProgramData\ssh\administrators_authorized_keys
C:\ProgramData\ssh\administrators_authorized_keys NT AUTHORITY\SYSTEM:(F)
                                                  BUILTIN\Administrators:(F)
```

 * 参照URL
     * https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_keymanagement#administrative-user

### ssh ログインシェルの変更

ssh ログイン時のシェルを powershell.exe へ変更する。

 * (1) 管理者権限で PowerShell を開く
 * (2) ```powershell.exe``` のパスの確認
```powershell
> (Get-Command powershell.exe).Source
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
```
 * (3) レジストリを変更しログインシェルを変更する 
```powershell
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value (Get-Command powershell.exe).Source -PropertyType String -Force
```

なお、ログインシェルを WSL2 の bash.exe に変更すると、クライアント側からの scp や Emacs + Tramp が正常に動作しなくなるため使えない。WSL2 内への直接 ssh 接続は Windows を踏み台としてログインする(次節「ssh クライアントの設定」参照)

 * 参照URL
     * https://takuya-1st.hatenablog.jp/entry/2022/03/04/171043
     * https://learn.microsoft.com/ja-jp/windows-server/administration/OpenSSH/openssh-server-configuration#configuring-the-default-shell-for-openssh-in-windows

### ssh クライアントの設定

別端末から Windows 上の WSL2 マシンへ直接 ssh ログインできるようにするための設定例。Windows マシンを踏み台として WSL2 マシンへ ssh ログインする。

 * ```~/.ssh/config``` (クライアント端末の設定)
 ```
 Host windows
    HostName WindowsマシンIPアドレス
    User Windowsユーザ名
    IdentityFile ~/.ssh/id_ecdsa
#    LocalForward 7860 127.0.0.1:7860 # WSL2内へポートフォワードを行う場合の設定例

Host wsl
    HostName localhost
    User WSL2ユーザ名
    IdentityFile ~/.ssh/id_ecdsa
    HostKeyAlias windows-wsl
    ProxyJump windows
 ```
  * 認証鍵の登録(クライアント端末から実行)
```bash
ssh-copy-id ~/.ssh/id_ecdsa.pub
(パスワード入力)
```
 * sshログイン (クライアント端末から実行)
```bash
ssh wsl
```

補足
 * ホスト名 `windows` `wsl` は任意。適宜変更すること
 * ```HostKeyAlias``` はクライアント端末の ```localhost``` ホスト鍵との衝突を回避するために必要(設定しないとWSL2マシンのホスト鍵が ```localhost``` で登録されてしまう)
 * ```LocalForward``` の設定では ```localhost``` ではなく ```127.0.0.1``` を指定する(```localhost```では動作しない。詳細未調査)

----
## キーボード配列カスタイマイズ

### US配列変換、左右Alt(変換・無変換)でIME制御
 * https://github.com/kskmori/US-AltIME.ahk

### Ctrl/CapsLock 変換
 * https://learn.microsoft.com/ja-jp/sysinternals/downloads/ctrl2cap

----
## Windows 関連の設定
### Windows 電源設定

カバーを閉じておいても ssh ログインができるようにスリープを停止
 * 「設定」「システム」「電源とバッテリー」
     * 「画面、スリープ、休止状態のタイムアウト」「次の時間の経過後にデバイスをスリープ状態にする」を「なし」
     * 「カバー、電源とスリープ 個のボタン コントロール」「カバーを閉じると、PCが」を「何も行わない」

### PowerShell・コマンドライン設定
#### Windows Terminal ベル音のオフ
デフォルトではベル音が結構大きくてびっくりするのでオフにする。

 * ターミナルを開いて「設定」(```Ctrl + ,```)を開く
 * 「プロファイル」→「規定値」→「詳細設定」→「ベル通知スタイル」を開く
 * 「音によるチャイム」のチェックボックスを外して「保存」する
 * 必要に応じてほかのプロファイル(WSL2用の AlmaLinux-9, Ubuntu-24.04 など)も同様に変更する

#### PowerShell 補完を bash 風にする

**TBD:** プロファイル実行ポリシーの適切な設定方法を調査する。それまでは 以下の設定内容の行をPowerShell 起動のたびに実行する
**TBD:** コマンド行編集も bash 風にする

 * プロファイルを新規作成する(すでに作成済みの場合は不要)
```powershell
New-Item -ItemType File -Path $PROFILE.CurrentUserAllHosts -Force
```
 * プロファイルをエディタで開く
```powershell
notepad $PROFILE.CurrentUserAllHosts
```
 * 以下の行を追記して、保存、終了する
```powershell
Set-PSReadLineKeyHandler -Key Tab -Function Complete
```

 * 参照情報
     * https://minus9d.hatenablog.com/entry/2021/01/13/214844
     * [$PROFILE について](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.5&viewFallbackFrom=powershell-7.1#the-profile-variable)
     * [実行ポリシーについて](https://go.microsoft.com/fwlink/?LinkID=135170)
     * https://qiita.com/smicle/items/0ca4e6ae14ea92000d18

#### PowerShell sudo の有効化 (TBD)
 * 参照URL
     * https://qiita.com/kazuhidet/items/a9b3a353df1a4d90f294

### Windows デスクトップ設定

 * タスクバーを左に表示
     * 「タスクバーで右クリック」 → 「タスクバーの動作」 → 「タスクバーの配置」 を「左揃え」に変更
 * ウィンドウのスナップ機能(画面上部に持っていくと勝手にレイアウトされるやつ)の停止
     * 「設定」 → 「システム」 → 「マルチタスク」 → 「ウィンドウのスナップ」 を「オフ」に変更
 * Alt + Tab で Edge の画面をまとめる
     * 「設定」 → 「システム」 → 「マルチタスク」 → 「スナップまたは Alt+Tab を押したときにアプリのタブを表示する」 を「タブを表示しない」に変更

### リモートデスクトップ?

Windows 11 Home Edition ではリモートデスクトップ経由での利用はできない(初めて知った)。フリーでも使えるものを探してみたが、結局 Pro Edition にアップグレードするのが一番面倒がなさそう。

以下備忘録
 * [TightVNC](https://www.tightvnc.com/download.php)
     * サーバ(Windows): TightVNC 2.8.85
     * ビュワー(MacOS): Remote Ripple (App Store経由)
     * 簡単な操作なら可能だが描画が遅く実用には向かない
 * RDP Wrapper 1.6.2
     * Chromeブラウザやアンチウイルスソフトで危険判定される、グレーゾーンなところあり、などから利用は避ける
 * Chrome Remote Desktop
     * 一時的に招待する使い方はできるが継続的にログイン利用するには向かなそう
 * その他商用製品の無料利用版
     * いずれもアカウント作成、サーバ経由のためのインターネット接続が必要など、自宅内LANでの利用とは想定が異なる
     * TeamViewer
     * AnyDesk
     * RealVNC VNC Connect

----
(今後も他にあれば随時追記)