先日設定した KVM/QEMU 上の Windows ですが(「Ubuntu 上の KVM/QEMU で Windows 11 を走らせる」)、Ubuntu 側とディスク共有を設定したいところです。VMWare では GUI で簡単に設定できたのですが、けっこう手間がかかりました。
まず、Ubuntu 側に virtiofsd をインストールします。
$ sudo apt install virtiofsd
共有するフォルダを作成します。ホームディレクトリの .vmshare としました。隠しフォルダにした理由はあとで書きます。
次に、仮想マシン側の設定です。Windows をシャットダウンして、仮想マシンマネージャの「表示」から「詳細」を選ぶと、仮想マシンの設定画面になります。
「メモリ」を開いて「共有メモリを有効にする」にチェックを入れます。これを先にやっておかないと virtiofs ファイルシステムを追加できないようです。
「ハードウェアを追加」から「ファイルシステム」を追加します。ドライバーは「virtiofs」、ソースパスは ~/.vmshare(フルパスで書く), ターゲットパスは vmshare とします。ソースパスが共有される Ubuntu 上のフォルダで、ターゲットパスは Windows 上で見える名前です。
設定を保存して、仮想マシン上で Windows を起動します。WinFspをインストールします(https://winfsp.dev/rel/)。
Windowsツールの「サービス」を起動します。
「VirtIO FS Service」を探し、「プロパティ」を開きます。「スタートアップの種類」を「自動」とし、「サービスの状態」の「開始」を押して「実行中」状態にします。
エクスプローラーを開くと、ドライブZ:に共用フォルダがマウントされています(ドライブレターは環境依存)。
2つ以上のフォルダを共有したいときは、さらにもう一手間かける必要があります。WinFsp は virtio ディスクを1つしかマウントできないため、Ubuntu 側で Bind マウントという機能を使って、ディレクトリをマウントします。次のようにすると、~/Downloads の内容が .vmshare/Downloads の中に、~/Development/wxMyProjects の内容が .vmshare/wxMyProjects の中に、それぞれ見えるようになります。
$ mkdir $HOME/.vmshare/Downloads
$ sudo mount --bind $HOME/Downloads $HOME/.vmshare/Downloads
$ mkdir $HOME/.vmshare/wxMyProjects
$ sudo mount --bind $HOME/Development/MyProjects $HOME/.vmshare/MyProjects
永続的にマウントするには、/etc/fstab に下のように追記します。
/home/tnagata/Downloads /home/tnagata/.vmshare/Downloads none bind 0 0
/home/tnagata/Development/wxMyProjects /home/tnagata/.vmshare/wxMyProjects none bind 0 0
なお、Bind マウントしたディレクトリは、ファイルシステムの中で二重に存在していることになるので、バックアップ対象から外しておきます。また、Ubuntu 側の普段使いで混乱しないように、隠しフォルダに入れるようにしました。
これで、Windows から2つの共有フォルダが見えるようになりました。