Hyper-V上で拡張セッションOK（=Win間とのコピペ可能）なDebianを立ち上げる

# はじめに
色々とやりたくて個人情報の載っていない比較的安心な仮想環境を安価に作りたいと思って、WindowsのHyper-V上でDebianを立ち上げて色々したときのメモ。

Debianは（Ubuntuも）Hyper-V上に単にインストールしただけではクリップボードを共有できず、ホストとゲスト間でのデータのやりとりが非常に不便です。
そこで、拡張セッションという機能を有効にする必要があり、このためホスト側・ゲスト側双方に変更を加えていきます。


本記事は突き詰めると以下3つの記事を合体したような内容となっています。
そのため、詳細は各記事を参照した方がいい場合もあるかと思います。

https://qiita.com/amama-nagigi/items/9a80484da7daf392a6d7

https://zenn.dev/junkor/articles/cb486c14a2db18

https://qiita.com/Ogun/items/6a2518df2788456ce123

一応、最後に沼ったときに得た知見などをいくつか書けたらなと思いつつ・・まとまりがあまりない気配・・。


# 前提
* Hyper-V 有効化済み
* インストールメディア・イメージファイルなど準備済み
    * Debian12 デスクトップ環境（GNOME）使用
* IP固定・ssh使用（設定失敗時の入口用）
    * 今回のIP構成は下記
        * ホスト側仮想ネットワークスイッチ：192.168.120.1/24
        * Debian：192.168.120.100/24
        * ネームサーバ:1.1.1.1

# 手順
## IP固定の下準備
1. Hyper-Vマネージャーを立ち上げ、Hyper-Vホストに接続
1. ホストマシンの仮想スイッチマネージャーを起動
![スクリーンショット 2025-03-31 165146 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/77c7d787-4f89-4087-8103-de8813855517.png)
1. 新しい仮想ネットワークスイッチから「内部」タイプの仮想スイッチを新規作成（ここではfor Debian12）![スクリーンショット 2025-03-31 165155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/361a4a1e-fec1-4d1e-9989-95e78828f85b.png)
1. 適当な名前を設定
1. ネットワークの設定を行う![スクリーンショット 2025-03-31 171227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/c87c7aaa-3051-493e-942f-e5f2f0732925.png)
![スクリーンショット 2025-03-31 171254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/d8374df9-14da-4255-8ebc-77e2f3e75599.png)
1. 管理者権限でPowershellを起動
    1. 以下のコマンドを実行
        ```
        New-NetNat -Name "WinNAT" -InternalIPInterfaceAddressPrefix 192.168.120.0/24
        ```
    * NATを設定して仮想環境→外部へのアクセスを可能にしている
    * 設定に失敗した場合は下記のコマンドで削除可能
        ```
        Remove-NetNat -Name "WinNAT"
        ```

## 仮想マシンを作成
1. ホストを右クリックし、新規→仮想マシンを選択![スクリーンショット 2025-03-31 165753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/8767c7ea-a1b4-437b-b231-2eb7e201959f.png)
1. 以降しばらく指示に従えば概ね問題ないが、注意点を列挙しておく
    1. 世代の指定
        * Linuxの場合は第1世代しか選べないらしい？
        * 第2世代でLinuxを設定しているページもあったのでできるかも
    1. ネットワーク構成は先ほど作成したネットワークアダプタ―を選択する![スクリーンショット 2025-03-31 114039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/002b963c-58d1-4344-8c4b-c52240936e12.png)
## 仮想マシンを起動する（OSセットアップ）
* 起動するとインストーラが実行される
1. Graphical installを選択
1. 言語設定・地域設定を自身の環境に合わせて設定
1. ネットワーク設定はDHCPプロトコルがないためコケるため、手動で設定する![スクリーンショット 2025-03-31 114945.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/3f338666-c750-4569-ab16-7e49d94c4428.png)![スクリーンショット 2025-03-31 114951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/b9b8c87b-40ce-44d0-9f4c-7fc63288e34f.png)
    * 基本指示通りに入力していけば問題ないが、ネームサーバーを指示通り空白区切で複数個設定するとドメインを解決できず、パッケージの追加インストールを上手くできなかった
1. ソフトウェアの選択
    1. 添付画像の通り選択![スクリーンショット 2025-03-31 122521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/27bb59b3-3d9c-4f2f-a198-57d51a83a737.png)
1. ブートローダのインストール
    * いいえにして進めたら起動できなくなったので、（必要ないと思うが）はいを選ぶ
1. インストールが完了したら「続ける」を選択し、起動完了を待つ
## Debian上でターミナルを起動しxrdpをインストール
1. 下記コマンドを実行
    ```
    su
    apt update
    apt upgrade
    apt install xrdp
    ```
1. /etc/xrdp/xrdp.iniの設定を書き換える
    ```/etc/xrdp/xrdp.ini 24行目付近
    ; port=3389
    port=vsock://-1:3389
    ```
1. DebianをHyper-Vから停止する
1. ホストOSのPowershellを管理者で起動
    1. 以下のコマンドを実行し、拡張セッションを有効にする
        ```
        Set-VM -VMName Debian -EnhancedSessionTransportType HvSocket
        ```
        * Debianの部分は仮想環境の名称に合わせて書き換え
        * うまく起動しない場合、標準のタイプ設定に変更できる
        ```
        Set-VM -VMName Debian -EnhancedSessionTransportType VMBus
        ```
1. うまく行っていれば、これで起動・接続すれば画像のようなログイン画面が出てくるので、usernameとpasswordを入れてOKを押す
![スクリーンショット 2025-03-31 175701.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/4d48d3f3-dea6-4eb6-a131-7da94b2e0755.png)

    
# うまくいかない場合
## 原因調査に役立ちそうなログ
3. 仮想環境で以下を直接実行し観察
    `Xorg :10 -config xrdp/xorg.conf`
1. /var/log/xrdp-sesman.log
2. ~/.xorgxrdp.*.log
3. /var/log/xrdp.log

## ログイン画面が表示されない
* あまり起きなかったので記憶が薄い
* xrdpが有効ならほぼここまでは来るはず

## ログイン後、なにも表示されない
* rootアカウントでのログインを試し、rootでログイン可能であれば各種権限の見直し
    * /etc/X11/Xwrapper.config
    ```/etc/X11/Xwrapper.config
    allowed_users=anybody
    needs_root_rights=yes
    ```
    * 下記内容で/etc/udev/rules.d/99-mytty.rulesを新規作成し、`udevadm control --reload-rules`を実行
    ```/etc/udev/rules.d/99-mytty.rules
    SUBSYSTEM=="tty", KERNEL=="tty[0-7]*", GROUP="tty", MODE="0660"
    ```
    * ログインユーザーに対してグループ登録
    ```
    sudo usermod -aG tty,input,video username
    ```
    [参考URL](https://github.com/neutrinolabs/xrdp/issues/2253)


設定的に外部からアクセスされるリスクがあまりないと思っているので、sshの設定について特に変更していないことにしているが、最終的には必要に応じてパスワード方式を禁止したりルートログインを禁止したり、そもそもssh自体をふさぐ等の措置が必要。

# おわりに
もともとIPも固定せず、拡張セッションの設定も妥協して運用していたDebianの環境を後から変更しようとしたら何故かGUIでログインできなくなって色々と沼にハマったので整理・・と思って立ち上げからやったら何の苦労もなく繋がってしまった・・。
たぶん、以前に中途半端にVNCの設定とかをしようとしたことが原因でXorg？ xrdp？ の設定が変に書き換わっていたんじゃないかとか思いつつ、今後も似たような沼にハマる可能性はありそうなので、特にログや設定ファイルについてはメモしておこうかなと。

当てになりそうなログや設定のpathはChatGPTがかなりアドバイスをくれたけれど、最終的に核心的な修正は[参考URL](https://github.com/neutrinolabs/xrdp/issues/2253)を見つけるまで全く出てこなかった。
とはいえ、検索キーワードを引っ張り出すのに非常に役立ったので自分にとってまったく未知で検証困難なことを相談する場合でもそこそこ役に立つ感じがした。

↓画像みたいな抽象と具体で乖離したことを言うときがあったので、あまり無警戒に使えないなとも思いつつ・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/9bb5eeba-d490-4ee7-a133-f01ef0bbafcc.png)