Monday, January 12, 2009

FreeBSD 7.1 and VMware Workstation

(2009/05/07 Update: 3-й эпизод см. тут.)

Полного погружения с open-vm-tools не получилось. Хотя, с другой стороны, максимальный минимализм все-таки преодолен. То есть, если раньше из комплекса tools идущих с VMware Workstation использовалась ровно 1: vmware-guestd (попробуйте догадаться для каких сложных вещей!), то с любознательным щупаньем одновременно свежей FreeLSD 7.1 и не очень свежих open-vm-tools (в портах есть только летняя версия) добавилась insane возможность: содержимое X Primary стало отображаться в Windows clipboard (и наоборот).

(голосом офисного морона): Новые технологии в действии!

Стартовые условия остались прежними. Разница в версии FreeBSD и использовании open-vm-tools вместо идущих проприетарных tools с VMware Workstation.

Порт open-vm-tools ставит, среди прочей чепухи, 1 демон, 4 ядерных модуля и 1 Очень Полезную Программу (о ней в самом конце заметки). 1 из модулей бессмыслен по условиям задачи -- vmxnet.ko; vmmemctl.ko выполняет роль мебели или даже настенной лепки; vmblock.ko и vmhgfs.ko -- это те 2 штуки, которые якобы дают использовать Drag and Drop и shared folders соответственно.

Кто дал тебе имя
Малышка из квартала Симмати?
Зачем так искусно
Губами ласкаешь коралл?
О бездна блаженства!
-- Рубоко Шо, Время Цикад

Автор порта почему-то прописал в /usr/local/etc/rc.d/vmware-guestd вот такое:

[ -z "$vmware_guestd_enable" ] && vmware_guestd_enable="YES"

Это значит, что вам не нужно ничего добавлять в /etc/rc.conf чтобы vmware-guestd стал во тьме ram бегать за цикадами. Зато нужно (это было правдой и раньше, но ваш покорный слуга об этом самым подлым образом хранил молчание) добавить в .vmx файл виртуальной машины строчку:

tools.syncTime = "TRUE"

Иначе время никто не будет синхронизировать (точные сведения из tarball'а см. в guestd/toolsDaemon.c и lib/include/vm_app.h). Это также означает что для минималистической задачи (иметь условно точные 1 раз в минуту часы и ничего более от open-vm-tools), можно собирать порт open-vm-tools-nox11, чтобы не мышеелозить по вкладкам vmware-toolbox.

Btw, vmware-guestd разжирел на свободных харчах и начал предъявлять нахальные требования к ресурсам:

% top | grep guestd
  649 root          1  96    0 18116K   640K select   0:20  0.00%  vmware-guestd

в тоже время когда закрытый предшественник:

% top | grep guestd
  665 root          1  96    0  1620K   308K select   3:49  0.00%  vmware-guestd

[...] африканские слоны и вообще не могут сравнится
с индийскими даже и при равной численности -- последние
далеко превосходят их и размерами, и боевым духом.
-- Тит Ливий, История Рима от основания города, XXXVII, 39, 13

Экзотика, которой являются кернельные модули vmblock.ko и vmhgfs.ko напоминают мне боевых слонов. При первом взгляде они поражают воображение свои видом, а их наездники смотрят на окружающих с тем особенным интересом, который присущ человеку рассматривающему на корточках муравейник в лесу.

Но в битвах, как показала практика войн римского народа, слоны вносят только помеху в большей степени именно тому войску, которое их выставило на устрашение противника -- если слонов напугать, они начинают метаться, давить собственных солдат и лететь, куда глаза глядят, сверкая бивнями и хлопая ушами.

Как и для всякой экзотики, интерес к vmblock.ko и vmhgfs.ko угасает, когда пытаешься заставить их делать что-то более полезное, чем таємниче виблискування из output команды kldstat.

Drag and Drop между host & guest реализован так: vmblock.ko -- это драйвер "блокирующей" файловой системы. Предполагается, что искомый файл, перед тем как переедет на новое место жительства, сначала попадет в temporally directory (обычно /tmp/VMwareDnD), откуда принимающая программа не получит его (он будет для нее "блокирован") до тех пор, пока тот не перепишется в нее полностью. Принимающая сторона ничего не знает об temporally directory -- она читает смонтированный каталог с симлинками (во FreeBSD это как бы /var/run/vmblock), думая, что они (симлинки) и есть нужный ей файлы, о которых она пролила столько слез.

Хороший пример, как пользовать vmblock filesystem, можно прочесть в патче Chris'a Malley к ядру Linux 2.6.27.

У vmblock есть свои проблемы идеологического свойства (например, такой факт, что реализация этой файловой системы сделана как модуль ядра, а не современным методом Filesystem in Userspace (FUSE)), но в любом случаи, вся эта красота разбивается при попытке монтирования ее в FreeLSD 7.1.

Для еще пущего нагнетания сообщим, что смонтировать ее командой mount вообще не получится, ибо просто нечем монтировать, как вежливо сообщил по этому поводу Ryan Beasley: Unfortunately a standalone mounter for vmblock on FreeBSD was never written. Mounting was embedded in the vmware-user setuid wrapper. А этот самый vmware-user setuid wrapper вообще исключен из состава порта.

Я, как и советовали, полез в vmware-user-suid-wrapper/wrapper-freebsd.c, поправил путь к vmblock.ko в LoadVMBlock(), пересобрал, запустил vmware-user-suid-wrapper в предвкушении и радости появления смонтированного каталога /var/run/vmblock, с чувством схожим на проявления счастья у моей кошки, когда я ей варю рыбу. К несчастью, ожидания накрылись медным тазом, который больше известен под названием паника ядра:

Красиво, правда? Ровно такая же реакция наблюдается при запуске mount_vmhgfs для монтирования shared foldes. Какую из этого можно извлечь мораль? Только ту, что для порта open-vm-tools у вас в /etc/rc.conf должна быть 1 (одна) строчка:

vmware_guest_vmmemctl_enable=YES

Остальное будет ждать лучших времен. Может причина поведения vmblock.ko и vmhgfs.ko есть та, что у меня не самая последняя версия WMware Workstation, а может потому, что не были проведены священные ауспиции и в Workstation многое запуталось и пришло в беспорядок, или потому, что погода нынче такая, когда после утренней пробежки тащишься в парадном синий как лазурит, а под душем чувствуешь себя будто только что поплававший в обществе косатки ниже 60 параллели и вытащенный из воды проплывавшим мимо кораблем со шведскими туристами.

The last tip for today: запустите vmware-user из под иксов, to enable copy and paste to and from your virtual machine, не забыв предварительно поставить галочку в Settings->Options->Guest Isolation вашей виртуальной машины. vmware-user хоть и грязно выругается на невозможность to initialize blocking driver, но для copy and paste дармоедствующий модуль vmblock.ko не требуется.

No comments:

Post a Comment