
Използването на виртуални машини на 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, има специално подготвен шаблон за виртуална машина, в който RDP сървърът, работещ с vsock, вече е предварително инсталиран, то с други дистрибуции нещата са все по-малко ясни — така на автора му се е получило да включи 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://:
-port=3389
+port=vsock://-1:3389
; 'port' по-горе трябва да бъде свързан с vsock, а не с tcp
; използвайте това само с число самостоятелно в порта по-горе
; предпочитайте да използвате vsock://: по-горе
-use_vsock=true
+;use_vsock=true
; регулирайте дали слушащият сокет използва опцията сокет 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 сесията.


Свързваме се. Ще видим прозореца за вход в 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
