- PVSM.RU - https://www.pvsm.ru -

Включаем Enhanced Session Mode для Arch Linux-гостей в Hyper-V

КДПВ

Пользование виртуальными машинами на Linux в Hyper-V из коробки — несколько менее комфортное занятие, чем с гостевыми Windows-машинами. Причиной тому является то, что Hyper-V все же изначально не предназначался для десктопного пользования; нельзя просто взять, поставить пакет гостевых дополнений и получить работоспособное графическое ускорение, буфер обмена, общие директории и другие радости жизни, как это происходит в VirtualBox.

Hyper-V сам предоставляет несколько сервисов интеграции [1] — так, гости могут пользоваться службой теневого копирования (VSS) хоста, гостям можно послать сигнал выключения, гости могут синхронизировать системное время с хостом виртуализации, с хоста возможен обмен файлами с виртуальной машиной (Copy-VMFile в PowerShell). Для некоторых гостевых операционных систем, в числе которых, конечно, находится и Windows, в приложении Virtual Machine Connection (vmconnect.exe) доступен Enhanced Session Mode, работающий по протоколу RDP и позволяющий пробрасывать в виртуальную машину дисковые устройства и принтеры, а также пользоваться общим буфером обмена.

Enhanced Session Mode из коробки работает в Windows в Hyper-V сразу после установки. С гостями на Linux нужно устанавливать RDP-сервер, поддерживающий vsock (специальное виртуальное сетевое адресное пространство в Linux, предназначенное для коммуникации с гипервизором). Если для Ubuntu в приложении VMCreate, идущим с Hyper-V на настольных редакциях Windows, есть специальный подготовленный шаблон виртуальной машины, в котором работающий с vsock RDP-сервер XRDP [2] уже предустановлен, то с другими дистрибутивами все менее однозначно — так, у автора этого поста [3] получилось включить ESM в Fedora. Здесь же мы активируем Enhanced Session Mode для виртуальной машины с Arch Linux.

Установка сервисов интеграции

Здесь все более или менее просто, нам достаточно установить пакет hyperv из репозитория community:

% sudo pacman -S hyperv

Включим сервисы VSS, обмена метаданными [4] и файлами:

% for i in {vss,fcopy,kvp}; do sudo systemctl enable hv_${i}_daemon.service

Установка XRDP

Репозиторий linux-vm-tools [5] на GitHub предоставляет скрипты, автоматизирующие процесс установки и настройки XRDP, для Arch Linux и Ubuntu. Установим Git, если он еще не установлен, вместе с компилятором и другим софтом для ручных сборок, после чего склонируем репозиторий:

% sudo pacman -S git base-devel
% git clone https://github.com/microsoft/linux-vm-tools.git
% cd linux-vm-tools/arch

На момент написания этой статьи самым свежим выпуском XRDP, который устанавливается скриптом makepkg.sh, предложенным в репозитории, является 0.9.11, в котором сломан парсинг [6] vsock://-адресов, поэтому придется установить XRDP из Git и драйвер Xorg к нему из AUR вручную. Патч к XRDP, предлагаемый в AUR, также слегка устарел, поэтому придется отредактировать PKGBUILD и патч вручную.

Склонируем репозитории с PKGBUILD-ами из AUR (обычно эту процедуру вместе со сборкой автоматизируют программами вроде yay [7], но автор проделывал всю эту процедуру на чистой системе):

% git clone https://aur.archlinux.org/xrdp-devel-git.git
% git clone https://aur.archlinux.org/xorgxrdp-devel-git.git

Установим сначала сам XRDP. Откроем файл PKGBUILD любым текстовым редактором.

Отредактируем параметры сборки. PKGBUILD для сборки XRDP из Git не включает поддержку vsock при сборке, поэтому включим ее самостоятельно:

 build() {
   cd $pkgname
   ./configure --prefix=/usr 
               --sysconfdir=/etc 
               --localstatedir=/var 
               --sbindir=/usr/bin 
               --with-systemdsystemdunitdir=/usr/lib/systemd/system 
               --enable-jpeg 
               --enable-tjpeg 
               --enable-fuse 
               --enable-opus 
               --enable-rfxcodec 
               --enable-mp3lame 
-              --enable-pixman
+              --enable-pixman 
+              --enable-vsock
   make V=0
 }

В патче arch-config.diff, правящем юниты и скрипты запуска XRDP под пути к файлам, используемым в Arch Linux, содержится в том числе патч к скрипту instfiles/xrdp.sh, который на момент написания статьи был удален [8] из поставки XRDP, поэтому патч придется отредактировать вручную:

  [Install]
  WantedBy=multi-user.target
-diff -up src/xrdp-devel-git/instfiles/xrdp.sh.orig src/xrdp-devel-git/instfiles/xrdp.sh
---- src/xrdp-devel-git/instfiles/xrdp.sh.orig  2017-08-30 00:27:28.000000000 -0600
-+++ src/xrdp-devel-git/instfiles/xrdp.sh   2017-08-30 00:28:00.000000000 -0600
-@@ -17,7 +17,7 @@
- # Description: starts xrdp
- ### END INIT INFO
- 
--SBINDIR=/usr/local/sbin
-+SBINDIR=/usr/bin
- LOG=/dev/null
- CFGDIR=/etc/xrdp
- 
 diff -up src/xrdp-devel-git/sesman/startwm.sh.orig src/xrdp-devel-git/sesman/startwm.sh
 --- src/xrdp-devel-git/sesman/startwm.sh.orig  2017-08-30 00:27:30.000000000 -0600

Соберем и установим пакет командой % makepkg --skipchecksums -si (ключ --skipchecksums нужен для отключения проверки контрольных сумм исходных файлов, поскольку мы редактировали их вручную).

Перейдем в директорию xorgxrdp-devel-git, после чего просто соберем пакет командой % makepkg -si.

Перейдем в директорию linux-vm-tools/arch и запустим скрипт install-config.sh, устанавливающий настройки XRDP, PolicyKit и PAM:

% sudo ./install-config.sh

Скрипт устанавливает устаревшую настройку use_vsock, которая игнорируется с версии 0.9.11, поэтому отредактируем файл конфигурации /etc/xrdp/xrdp.ini вручную:

 ;   port=vsock://<cid>:<port>
-port=3389
+port=vsock://-1:3389

 ; 'port' above should be connected to with vsock instead of tcp
 ; use this only with number alone in port above
 ; prefer use vsock://<cid>:<port> above
-use_vsock=true
+;use_vsock=true

 ; regulate if the listening socket use socket option tcp_nodelay

Добавим в файл ~/.xinitrc запуск своего предпочитаемого оконного менеджера / среды рабочего стола, который будет выполняться при запуске X-сервера:

% echo "exec i3" > ~/.xinitrc

Выключим виртуальную машину. Активируем транспорт vsock для виртуальной машины, выполнив следующую команду в PowerShell от администратора:

PS Admin > Set-VM -VMName НАЗВАНИЕ_МАШИНЫ -EnhancedSessionTransportType HvSocket

Включим виртуальную машину снова.

Подключение

Как только после запуска системы запустится сервис XRDP, приложение vmconnect это определит и в меню станет доступен пункт View -> Enhanced Session. При выборе этого пункта нам предложат установить разрешение экрана, а на вкладке Local Resources открывшегося диалога можно будет выбрать устройства, пробрасываемые внутрь RDP-сессии.

Диалог выбора разрешения экрана
Диалог выбора Local Resources

Подключимся. Увидим окно входа XRDP:

Окно входа XRDP

Введем свои имя пользователя и пароль.

Использование

Профит от этих манипуляций заметен: сессия RDP работает намного отзывчивее, чем при работе с виртуальным дисплеем без Enhanced Session. Проброшенные внутрь VM через RDP диски доступны в директории ${HOME}/shared-drives:

Проброшенное внутрь VM содержимое диска C

Буфер обмена работает нормально. Пробрасывать принтеры внутрь нельзя, это не только не поддерживается, но и ломает проброс дисков [9]. Также не работает звук, но автору это и не требовалось. Для того, чтобы захватывались сочетания клавиш вроде Alt+Tab, нужно разворачивать vmconnect на весь экран.

Если по каким-либо причинам есть желание использовать вместо приложения vmconnect встроенный в Windows RDP-клиент или, например, подключаться к этой машине из другой машины, то нужно будет поменять в файле /etc/xrdp/xrdp.ini port на tcp://:3389. Если виртуальная машина подключена к Default Switch и получает сетевые настройки по DHCP, то подключиться к ней с хоста можно по адресу название_машины.mshome.net. Войти в TTY можно только из приложения vmconnect, выключив Enhanced Mode.

Использованные источники:

  1. Hyper-V — Arch Wiki [10]
  2. Багрепорты на GitHub: 1 [11], 2 [12]

Автор: tdemin

Источник [13]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/virtualizatsiya/341546

Ссылки в тексте:

[1] несколько сервисов интеграции: https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/integration-services

[2] XRDP: https://github.com/neutrinolabs/xrdp

[3] этого поста: https://secanablog.wordpress.com/2018/10/24/enhanced-session-mode-under-fedora-28/

[4] метаданными: https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/integration-services#hyper-v-data-exchange-service-kvp

[5] linux-vm-tools: https://github.com/microsoft/linux-vm-tools

[6] в котором сломан парсинг: https://github.com/microsoft/linux-vm-tools/issues/94#issuecomment-533838042

[7] yay: https://github.com/Jguer/yay

[8] был удален: https://github.com/neutrinolabs/xrdp/commit/5fc804c67d208371ee79004190c8d20578b2bcd8

[9] ломает проброс дисков: https://github.com/microsoft/linux-vm-tools/wiki/FAQ#q1-how-do-i-share-drives-with-my-linux-vm

[10] Hyper-V — Arch Wiki: https://wiki.archlinux.org/index.php/Hyper-V

[11] 1: https://github.com/microsoft/linux-vm-tools/issues/94

[12] 2: https://github.com/neutrinolabs/xrdp/issues/1403

[13] Источник: https://habr.com/ru/post/482372/?utm_source=habrahabr&utm_medium=rss&utm_campaign=482372