
Користування віртуальними машинами на Linux у Hyper-V з коробки — дещо менш комфортне заняття, ніж із гостьовими Windows-Машинами. Причиною тому є те, що Hyper-V все ж таки спочатку не призначався для десктопного користування; не можна просто взяти, поставити пакет гостьових доповнень та отримати працездатне графічне прискорення, буфер обміну, загальні директорії та інші радощі життя, як це відбувається у VirtualBox.
Hyper-V сам надає - так, гості можуть користуватися службою тіньового копіювання (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-сервер вже встановлено, то з іншими дистрибутивами все менш однозначно — так, у автора вдалося включити ESM в Fedora. Тут ми активуємо Enhanced Session Mode для віртуальної машини з Arch Linux.
Встановлення сервісів інтеграції
Тут все більш-менш просто, нам достатньо встановити пакет hyperv з репозиторію community:
% sudo pacman -S hypervВключимо послуги VSS, обміну та файлами:
% for i in {vss,fcopy,kvp}; do sudo systemctl enable hv_${i}_daemon.service; doneВстановлення XRDP
Репозиторій на 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, vsock://-адрес, тому доведеться встановити XRDP з Git та драйвер Xorg до нього з AUR вручну. Патч до XRDP, пропонований в AUR, також трохи застарів, тому доведеться відредагувати PKGBUILD і патч вручну.
Схиляємо репозиторії з PKGBUILD-ами з AUR (зазвичай цю процедуру разом із збиранням автоматизують програмами на кшталт , але автор робив всю цю процедуру на чистій системі):
% 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, який на момент написання статті з постачання 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 це визначить і в меню буде доступний пункт вид -> Розширена сесія. При виборі цього пункту нам запропонують встановити роздільну здатність екрана, а на вкладці Місцеві ресурси діалогу можна буде вибрати пристрої, що прокидаються всередину RDP-сесії.


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

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

Буфер обміну працює нормально. Прокидати принтери всередину не можна, це не тільки не підтримується, а й . Також не працює звук, але автору це й не потрібно. Щоб захоплювалися поєднання клавіш на кшталт Alt+Tab, потрібно розгортати vmconnect весь екран.
Якщо з будь-яких причин є бажання використовувати замість програми vmconnect вбудований у Windows RDP-клієнт або, наприклад, підключатися до цієї машини з іншої машини, потрібно буде поміняти у файлі /etc/xrdp/xrdp.ini port на tcp://:3389. Якщо віртуальна машина підключена до Default Switch і отримує мережеві налаштування по DHCP, підключитися до неї з хоста можна за адресою название_машины.mshome.net. Увійти до TTY можна лише з програми vmconnect, вимкнувши Enhanced Mode.
Використані джерела:
- Багрепорти на GitHub: ,
Джерело: habr.com
