*nixで過ごす日々

PCでの作業に役立つ情報を提供するブログ

Manjaro on Hyper-V with Secure Boot & X11 fowarding to VcXsrv

普段遣いにはWindowsの方が便利。
開発にはLinuxの方が便利。
WSLを使う方法がモダンな方法だが、開発の時はUIもLinux用のデスクトップ環境(DE)の方が便利だと思う。
私のWindows ProでHyper-Vが使えるのでこれを十分に活かして最高に便利な環境を作る。
細かい設定は覚えられないので、ここに記録として残す。

Hyper-V周りの設定

Hyper-Vの設定

個人的にHyper-V関連のファイルはC以外のドライブに保存させたいので移動させる。
Hyper-Vの設定 > 仮想ハードディスクを任意の場所に変える
e.g.) D:\Hyper-V\Virtual Hard Disks
Hyper-Vの設定 > 仮想マシンを任意の場所に変える
e.g.) D:\Hyper-V

仮想スイッチの設定

外部との通信はDefault Switchをそのまま使う。
仮想マシンとホストマシンでファイル共有を簡単にするために固定IPを割振るためのスイッチを1つ作る。
仮想スイッチ マネージャー > 新しい仮想ネットワーク スイッチ > 内部 > 新規スイッチの作成

内部スイッチのIPを固定する

Windowsのバージョンによって操作が変わると思う。ここではWindows11について述べる。
設定 > ネットワークとインターネット > ネットワークの詳細設定 > vEthernet (作成した内部スイッチの名前) > 追加のプロパティを表示 > 編集から以下のような値に変更する。

手動
IPv4: オン
IPアドレス: 172.16.0.2
サブネットマスク: 255.255.255.0
ゲートウェイ: 172.16.0.1
優先DNS: 172.16.0.1
IPv6: オフ

IPv6まで考えるのは面倒なのでオフにする。
どうせPC内のファイル共有にしか使わないのでv4もv6も変わらないだろう。

仮想マシンの作成

新規 > 仮想マシンから仮想マシンを作成する
新規作成ウィザードは以下のように設定する

名前と場所の指定
名前: 適当な名前(今回はmanjaro)
仮想マシンを別の場所に格納する: チェック

仮想マシンを別の場所に格納するにチェックを入れるとHyper-Vの設定で指定したディレクトリに仮想マシンの名前のフォルダが作成されその中に仮想マシンのファイルが保存される。パスは弄らなくて良い。

世代の指定
第2世代
ネットワークの構成
接続: Default Switch

後で追加できるが一応ここでメインの方を付けておく。

インストールオプション
ブートイメージ~~~: Linuxのインストールメディアを指定する

上記に無いウィザードの項目はデフォルトのまま次へを押す。

仮想マシンの設定

仮想マシンを起動する前に追加設定をする。

セキュリティ

設定 > セキュリティ > セキュアブートのセキュアブートを有効にするのチェックを外す。
また、TPMを使いたい場合は一旦TPMもオフにしておいた方が良い。
暗号化のサポート > トラステッドプラットフォームモジュールを有効にするのチェックを外す。
ここの設定項目は正式名称じゃなくTPMとしたほうがわかりやすくなると思うのは私だけだろうか?

ハードウェアの追加

設定 > ハードウェアの追加 > ネットワークアダプター > 追加
その後追加されたネットワークアダプタの設定で作成した内部スイッチを指定する。

この段階でDVDドライブがハードウェアの一覧に存在していない場合は追加しておく。
SCSI コントローラー > DVD ドライブ > 追加
また、インストールメディアを指定していない場合もここで指定する。
DVD ドライブ > メディア > イメージファイル > Linuxのインストールメディアを指定

チェックポイント

気にしなくても良いが自動チェックポイントを使用するのチェックを外しておいたほうが良い。

Linuxのインストール

どのディストリビューションでも大差ないが、Manjaroをインストールするとして話を進める。
大した設定は必要なく、基本的に画面の指示に従って進めれば良い。
Linuxでセキュアブートを簡単にするためにESPを1024MBにする。
1GBという数字には何も根拠は無い。最終的にここにブートローダーとカーネルをすべて詰め込むので、小さすぎなければ良い。

初学者のために設定方法を少し詳しく書いておく。
GUIインストーラーを使っているとディスクの設定の手順が出てくると思う。
まずは、そこで手動で設定するという内容の項目を選ぶ。
次にパーティションテーブルを作成すると言った内容のボタンが有るはずなので押し、GPTを選ぶ。
これでパーティションを作れるようになるので、ディスクの空のところをクリックして選択状態にし、新規とか作成とか書かれているボタンを押す。

容量: 1024M
フォーマット: Fat32 or vFat or efi(ディストリビューションによって表示名が違うのでよしなに選ぶ)
マウントポイント: /boot/efi フラッグ: boot or ESP or efi(ディストリビューションによって表示名が違うのでよしなに選ぶ)

上記設定で1つ目のパーティションを作成する。このパーティションがいわゆるESP(Efi System Partition)となる。
同様の手順で2つ目のパーティションを作る。

容量: 残り全部
フォーマット: ext4 or xfs or btrfs(好きなものを選ぶ。初学者はext4が無難)
マウントポイント: / フラッグ: なし(なしで良いはず。警告が出たりインストールに失敗したりした場合はROOTを選ぶ。)

あとは画面の指示に従ってインストールを進める。
インストール完了後は一旦シャットダウン、インストールメディアの割当解除し、チェックポイントを作成しておく。

仮想マシンの設定

自動ログインの設定

毎回ログインするの面倒なので自動ログインを設定する。
LightDMの場合 /etc/lightdm/lightdm.confに次の設定をする。

[Seat:*]
autologin-user=username
autologin-session=session

usernamesessionには自分が使うユーザー名とDE名を入れる。
そして以下のコマンドでautologinグループを作成し、自分を追加する。

sudo groupadd -r autologin
sudo gpasswd -a $USER autologin

一旦再起動して自動ログインできるか確認する。

X11 fowarding

ホストマシンをホスト名で指定できるようにする

ホスト側をipアドレスで指定しても良いがDHCP環境だと変わったりするので、ホスト名で指定できるようにする。
manjaroはavahiがデフォルトで入っているのでそのまま設定をする。
/etc/nsswitch.confを次のように設定する。

hosts: ~~~ mdns_minimal [NOTFOUND=return] ~~~resolve ~~~ dns

hosts:の行のところでmdns_minimal [NOTFOUND=return]resolvednsより左側に来るようにする。
firewallを有効にしている場合はmdnsを許可しておく。

VcXsrvに転送する設定

Linux側の設定

/etc/profileの末尾に次のように設定する。

export DISPLAY=windows-host-name:0

windows-host-nameには自分のホストマシンのホスト名(=PC名)を入れる。

Windows側の設定

VcXsrvをインストールしておく。wingetを使うのがおすすめ。

winget install marha.VcXsrv

一旦XLaunchを実行し設定ファイルを作成する。
私はあたかもLinuxを実機で使っているかのように使いたいので以下のように設定する。

Select display settings
One window without titlebar
Display number: 0
Select how to start clients
Start no client
Extra settings
Clipboardにチェック
Primary Selectionにチェック
Native openglにチェック
Disable access controlにチェック

Additional parametars fo VcXsrvここを見ながら好みで入れる。
私はr -keyhook -screen 0 @2とした。
-keyhookLinux側のキーバインドを使うためには必須だが、VcXsrvを全画面で実行してしまうとVcXsrvを終了させられなくなってしまう場合があるので注意してた方が良い。
-screen 0 @2Linuxのディスプレイ0windowsのディスプレイ2に表示するという意味になる。
最後にSave configurationボタンを押して適当な場所に保存する。
以降の操作は保存した設定でVcXsrvが起動してあるものとして話を進める。
VcXsrvを通すとWindowsクリップボード仮想マシンクリップボードを共有できる。
要は以降の操作では仮想マシンに対してコピペで操作ができる。

共有フォルダの設定

Windows側の設定

  1. 任意の場所にフォルダを作ってプロパティを開く。
  2. 「共有」タブ
  3. 「詳細な共有(D)...」
  4. 「このフォルダを共有する(S)」
  5. 「共有名(H)」に適当な名前を入れる。この名前でLinux側からアクセスすることになる。
  6. 必要があれば「同時に共有できるユーザー数(L)」の値を変更する。
  7. 必要があれば「アクセス許可(P)」から権限の設定をする。
    私はevery oneを削除しWindowsのログインユーザーにフルコントロールを付与している。
  8. フォルダのプロパティの共有タブ上の方に「ネットワークパス(N)」が表示されているはずなのでメモしておく。
    \\ホスト名\共有名となっているはず。

以降、ネットワークパスが\\WINDOWS\shareとなっているとする。

Linux側の設定

  1. ディストリビューションによってパッケージ名が変わると思うがcifs-utilssambaをインストールする。
  2. 共有フォルダをマウントするディレクトリを作成しておく。
    例として/mnt/hypervを作成する。
    また、後でアクセスし易いように所有者をログインユーザーに変えておく
sudo mkdir /mnt/hyperv
sudo chown $USER:$USER /mnt/hyperv
  1. 共有フォルダをマウントするときに認証情報を入力しなくても良いようにユーザー名とパスワードをファイルに保存しておく。
sudo mkdir -p /etc/samba/creds
sudoedit /etc/samba/creds/windows.cred
username=windowsのユーザー名
password=上記のユーザーのパスワード
  1. systemdのユニットファイルを作成する。
    この時、ファイル名は2.で作成したパスの先頭の/をなくし、先頭以外の/-にしたパスに等しくする必要がある。
sudoedit /etc/systemd/system/mnt-hyperv.mount
[Unit]
Description=mount //WINDOWS/share /mnt/hyperv
Requires=systemd-networkd.service
After=network-online.target systemd-resolved.service
Wants=network-online.target systemd-resolved.service

[Mount]
What=//WINDOWS/share
Where=/mnt/hyperv
Options=credentials=/etc/samba/creds/windows.cred,iocharset=utf8,rw,x-systemd.automount,uid=1000,gid=1000
Type=cifs
TimeoutSec=30

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable mnt-hyperv.mount

セキュアブートの設定

なるべく汎用的な説明にしてきたが、面倒なので次の操作はmanjaroにフォーカスした説明にする。
ブートローダーはrefind+preloader-signedを使う。

sudo pacman -S refind yay
yay -S preloader-signed
sudo refind-install --preloader /usr/share/preloader-signed/PreLoader.efi

ESP/bootをセキュアブートで楽に扱うために調整していく。

sudo su -
mkdir /efi
umount /boot/efi
mount /dev/sda1 /efi
mkdir -p /efi/EFI/Kernels/Manjaro
mv /boot/* /efi/EFI/Kernels/Manjaro
mount --bind /efi/EFI/Kernels/Manjaro /boot
vi /etc/fstab
-UUID=XXXX-XXXX           /boot/efi    vfat    umask=0077 0 2
+UUID=XXXX-XXXX           /efi         vfat    umask=0077 0 2
+/efi/EFI/Kernels/Manjaro /boot        none    bind 0 0

ディストリビューションやインストール時の設定によってオプションに違いがあるかもしれないが適宜読み替える。

refindの設定も変えておく

sudoedit /efi/EFI/refind/refind.conf

ここでは変更する設定だけ記載する。

timeout 2
resolution max
use_graphics_for linux,grub
also_scan_dirs +,EFI/Kernels/Manjaro
extra_kernel_version_strings linux-lts,linux

カーネルパラメータも変えておく

sudoedit /boot/refind_linux.conf
"Boot with standard options"  "root=UUID=xx-xx-xx-xx-xx rw rootflags=subvol=@ intrd=EFI\Kernels\Manjaro\amd-ucode.img initrd=EFI\Kernels\Manjaro\initramfs-%v.img quiet splash apparmor=1 security=apparmor udev.log_priority=3"

上記設定は/ファイルシステムにbtrfsを指定してmanjaroをインストールした場合。
ここで一旦シャットダウンする。
仮想マシンの設定からファームウェアを見に行き、ブート順の最上位が以下のようになっていることを確認する。

種類: ファイル
値: PreLoader.efi

ここでセキュアブートをオフのまま、仮想マシンを起動しログインできるか確認する。
問題なく起動できたらもう一度シャットダウンし、仮想マシンの設定のセキュリティセキュアブートを有効にするにチェックを入れ、Microsoft UEFI 証明機関オープンソースシールドVMを選ぶ。(どちらを選んで良いかいまいちわからない起動してみてダメだったらもう片方とすれば良いと思う)
仮想マシンを起動しMOK managerが起動するか確認する。
refindのブートローダ本体とvmlinuzの2つを登録する。
EFI/refind/loader.efiEFI/Kernles/Manjaro/vmlinuz-6.6-x86_64
(vmlinuzの後の文字列はディストリビューションカーネルによって変わるので注意)
MOK managerを終了し、ログインできるか確認する。

ついでに音も鳴らす

Linux側の設定

sudoedit /etc/pulse/client.conf
default-server = WINDOWS

WINDOWSの部分はホスト名を入れる。
設定後は再起動しておく。

Windows側の設定

pulseaudioのインストール

PulseAudio on Windows – PulseAudio
上記リンクのzipfile containing preview binariesがダウンロードリンクになっている。
ダウンロードして任意の場所に配置する。

pulseaudioの設定

DLしたpulseaudioのファイルを2つ編集する。
etc/pulse/daemon.conf

exit-idle-time = -1

デフォルトだと応答がなかったとき(?)にpulseaudioが終了するので-1にして終了しないようにする。
etc/pulse/default.pa

load-module module-native-protocol-tcp auth-anonymous=1

pulseaudioの起動

bin/pulseaudio.exeを起動すれば良いのだが、windows11では初回にダブルクリックするだけだと通信がファイアウォールに弾かれて起動できなかった。
一旦ターミナルで起動して、ファイアウォールの許可リストに追加する。
起動するとコンソールが開いて何行か出力がある。
Linuxの音を出したい間はこのコンソールを開きっぱなしにしておく必要がある。

おわりに

ここまででタイトル通りの環境がセットアップできた。
後は用途に応じて必要なソフトウェアをインストールしていけば良い。