Включаємо 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, якщо він ще не встановлений, разом із компілятором та іншим софтом для ручних зборок, після чого схиляємо репозиторій:
На момент написання цієї статті найсвіжішим випуском XRDP, що встановлюється скриптом makepkg.sh, запропонованим у репозиторії, є 0.9.11, в якому зламано парсингvsock://-адрес, тому доведеться встановити XRDP з Git та драйвер Xorg до нього з AUR вручну. Патч до XRDP, пропонований в AUR, також трохи застарів, тому доведеться відредагувати PKGBUILD і патч вручну.
Схиляємо репозиторії з PKGBUILD-ами з AUR (зазвичай цю процедуру разом із збиранням автоматизують програмами на кшталт яй, але автор робив всю цю процедуру на чистій системі):
У патчі arch-config.diff, що править юніти та скрипти запуску XRDP під шляхи до файлів, що використовуються в Arch Linux, міститься в тому числі патч до скрипту instfiles/xrdp.sh, який на момент написання статті був видалений з постачання XRDP, тому патч доведеться відредагувати вручну:
Зберемо та встановимо пакет командою % 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 від адміністратора:
Як тільки після запуску системи запуститься сервіс XRDP, програма vmconnect це визначить і в меню буде доступний пункт вид -> Розширена сесія. При виборі цього пункту нам запропонують встановити роздільну здатність екрана, а на вкладці Місцеві ресурси діалогу можна буде вибрати пристрої, що прокидаються всередину RDP-сесії.
Підключимося. Побачимо вікно входу XRDP:
Введемо свої ім'я користувача та пароль.
Використання
Профіт від цих маніпуляцій помітний: сесія RDP працює набагато чуйніше, ніж під час роботи з віртуальним дисплеєм без Enhanced Session. Прокинуті всередину VM через диски RDP доступні в директорії ${HOME}/shared-drives:
Буфер обміну працює нормально. Прокидати принтери всередину не можна, це не тільки не підтримується, а й ламає прокидання дисків. Також не працює звук, але автору це й не потрібно. Щоб захоплювалися поєднання клавіш на кшталт Alt+Tab, потрібно розгортати vmconnect весь екран.
Якщо з будь-яких причин є бажання використовувати замість програми vmconnect вбудований у Windows RDP-клієнт або, наприклад, підключатися до цієї машини з іншої машини, потрібно буде поміняти у файлі /etc/xrdp/xrdp.iniport на tcp://:3389. Якщо віртуальна машина підключена до Default Switch і отримує мережеві налаштування по DHCP, підключитися до неї з хоста можна за адресою название_машины.mshome.net. Увійти до TTY можна лише з програми vmconnect, вимкнувши Enhanced Mode.