Включаємо 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

Купити надійний хостинг для сайтів із захистом від DDoS, VPS VDS сервери 🔥 Купити надійний хостинг для сайтів із захистом від DDoS, VPS VDS сервери | ProHoster