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

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

Користування віртуальними машинами на 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-сервер XRDP вже встановлено, то з іншими дистрибутивами все менш однозначно — так, у автора цієї посади вдалося включити 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

Репозиторій linux-vm-tools на 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-сесії.

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

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

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

Введемо свої ім'я користувача та пароль.

Використання

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

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

Буфер обміну працює нормально. Прокидати принтери всередину не можна, це не тільки не підтримується, а й ламає прокидання дисків. Також не працює звук, але автору це й не потрібно. Щоб захоплювалися поєднання клавіш на кшталт 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
  2. Багрепорти на GitHub: 1, 2

Джерело: habr.com

Додати коментар або відгук