Виртуализация рабочих станций на Vmware Server 2

Материал из Xgu.ru

Перейти к: навигация, поиск

Автор: Casm

На странице описывается каким образом можно организовать работу сети, состоящей из сервера виртуализации под управлением VMware Server 2, и клиентских машин, работающих в режиме тонких клиентов, подключающихся к этому серверу виртуализации.

Содержание

[править] Задача

Цель: перенести задачи, выполняемые на слабых клиентских машинах, на более мощные виртуальные машины.

Оборудование:

  • клиентские машины – Pentium II, 64 МБ ОЗУ, жесткий диск – 10-20 Гб, клавиатура, мышь, монитор;
  • сервер – проверялось на SLES10, Vmware Server 2, память - из расчета 1 Гб под ОС и Vmware Server 2, +350 МБ на каждую виртуальную машину, файловое хранилище – 10 Гб под систему, + 7-15 Гб на каждую виртуальную машину.

Описание.

Для решения данной задачи потребуется:

  • сервер с Linux, на котором запуститься Vmware Server 2 (проверялось на SLES10)
  • собственно Vmware Server 2 скачать бесплатно можно по ссылке http://www.vmware.com/download/server/
  • Linux дистрибутив для установки на клиентские машины (использовался Debian 5.0.1)

В качестве ОС для клиентских машин можно использовать любой дистрибутив, где запустится клиент VMware Remote Console. Глубоко в зависимостях VMware Remote Console (vmware-vmrc) не разбирался, но судя по всему, все необходимые библиотеки у него встроены и ему требуются только X server.

И так после того, как получили вышеназванное ПО приступаем к настройке. Необходимо будет сделать:

  • Серверная часть
    • Установить Vmware Server 2, создать виртуальные машины.
    • Задать права доступа к виртуальным машинам.
  • Клиентская часть
    • Установить ОС, настроить X Server
    • Установить VMware Remote Console
    • Настроить автозапуск консоли vmware, при старте X Server
    • Настроить автовход пользователя в консоль Linux
    • Настроить выключение физической машины клиента, при выключении виртуальной.

[править] Серверная часть.

[править] Установка Vmware Server 2 и создание виртуальных машин.

На сервер устанавливаем Vmware Server 2, настраиваем, запускаем. Тут сложностей возникнуть не должно. Единственное разве, что модуль vsock может не установиться, но он экспериментальный и по-умолчанию предлагается его не устанавливать. В качестве Администратора указываем существующего на сервере Linux пользователя (вовсе не обязательно, чтобы это был root). Открываем в firewall порты, используемые Vmware - если при установке ничего не меняли, то это 902, 8333. Если меняли - смотрите вывод sudo netstat –nap –-inet | grep vmware, или socklist. Порт 902 используется для авторизации подключающихся клиентов, порт 8333 – для доступа к консоли.

Заходим под пользователем, указанным как администратор при установке, на web-консоль (https://vmware.host:8333). Создаём виртуальные машины для работы. В моём случае это были Windows XP, 1 CPU, 256 Мб ОЗУ, HDD 5ГБ. После создания одной вирт. машины и выполнения всех настроек с ОС и ПО, остальные проще скопировать. Заходим на Linux сервере в основное хранилище (по-умолчанию /var/lib/vmware/Virtual Machines), создаём копии, после чего в web-консоли добавляем их в инвентарь Vmware Server ("Add Virtual Machine to Inventory").

Добавленные машины обязательно запускаем – Vmware Server выдаст вопрос, о том скопировали или переместили вы данную машину - отвечаем «Скопировали». В данном случае у неё будет изменены MAC адреса сетевых карт, и возможно другие идентификаторы железа. Как писалось в предупреждении от vmware server 1, это потребует повторную активацию Windows XP (подробности читайте на сайте Vmware про лицензирование Windows, на виртуальных машинах).

Данные о зарегистрированных вирт. машинах хранятся в файле /etc/vmware/hostd/vmInventory.xml, он нам еще потребуется, так как в нём указаны objID машин. Данный objID у клиента будет определять, к какой виртуальной машине он будет подключаться.

[править] Права доступа к машинам.

Если для подключения к виртуальным машинам будет использоваться одна пара логин/пароль для всех клиентских машин, то на Linux сервере создаем этого пользователя (например, vmrc), после чего в web-консоли Vmware Server 2 в Permissions выставляем разрешения для него. Выставить разрешения можно как для всего хоста и всех виртуальных машин, так и для каждой виртуальной машины в отдельности.

Но сначала необходимо создать шаблон прав (по терминологии vmware - Roles). Для этого заходим слева вверху web-консоли в меню Administration –> Manage roles. Создаём новую роль (шаблон прав доступа), например, vmrc-role.

В открывшемся списке прав (Privileges) находим ветку Virtual Machine -> Interaction в ней выставляем галочки у “Power On” (что бы при подключении клиента виртуальная машина автоматом запускалась), “Power Off”, “Reset” (мало ли что бывает с Windows), “Console Interaction” (иначе пользователь вместо рабочего стола, будет наблюдать только черное окно консоли Vmware), и если необходимо “Device connection” (для подключения клиентского CD-ROM к виртуальной машине, но это должно быть ещё настроено в конфигурации виртуальной машины - в свойствах CD-ROM должно быть указано Client Media).

 Name: vmrc-role
 Privileges                 
 .....                     
 - Virtual Machines       
     Inventory            
   - Interaction          
       +Power on          
       +PowerOff          
        Suspend           
       +Reset             
        Answer Question   
       +Console Interaction
       +Device Connection   
 .....                 

Далее для созданных виртуальных машин в Permissions создаём новое разрешение: для созданного ранее пользователя, для подключения клиентов (vmrc), указываем нашу роль (vmrc-role). Создаём permission любо для каждой машины в отдельности, либо для всего хоста. В итоге в правах будут администратор (указывается при установке vmware) и пользователь с правами, которые задали в Roles для подключения клиентов.

Если для подключения к виртуальным машинам, каждый клиент будет использовать отдельного пользователя, то необходимо их всех завести и на физический сервер (useradd) и в Vmware Server 2 (вкладка Permissions).

При добавлении третьего пользователя в Permissions может возникнуть проблема – vmware выдаст ошибку “Error in the method call SetEntityPermissions : Database temporarily unavailable or has network problems.”. Для решения необходимо отредактировать файл /etc/vmware/hostd/authorization.xml – добавить секцию <ACEData id="12"> </ACEData> и изменить номер в <NextAceId>12</NextAceId> на следующий по порядку (возможно у вас будут другие числа). После повторить добавление пользователя.

[править] Клиентская часть.

Для настройки клиентской части необходимо:

  • установить ОС
  • установить и настроить X server
  • установить VMware Remote Console
  • указать в ~/.xinitrc для X server, клиента vmware-vmrc
  • настроить автовход в консоль, чтобы все запускалось автоматом.

Выбирайте ОС, какая вам удобнее. Мне для реализации потребовалось Debian 5.0.1 CD1, + пакет mingetty http://packages.debian.org/lenny/mingetty (на первом CD его не нашлось).

[править] Установка ОС, настройка X Server

Я ставил Debian в минимальном наборе, а после доставлял пакеты. Отключил лишние по мне службы (nfs, inetd), доставил openssh-server. Необходимо установить xserver-xorg-core, xauth, xinit, fontconfig, шрифты. Если все же не удастся запустить vmware-vmrc попробуйте, установить Firefox (Iceweasel) и подключиться к web-консоли сначала через Firefox. Настраиваем xorg.conf, проверяем, что X server запускается без ошибок.

[править] Установка VMware Remote Console

Теперь необходимо установить собственно клиента для подключения к виртуальным машинам.

Заходим на клиентскую машину под пользователем, который будет использоваться для работы (я при установке создал пользователя vmware). Есть два способа:

  • Запускаем Firefox (iceweasel) с клиента, подключаемся к серверу с Vmware Server 2, запускаем любую вирт. машину, щелкаем по вкладке Console, на ней будет предложение «install plugin», устанавливаем, заходим в профиль firefox в папку с расширениями, ищем расширение «VMwareVMRC@vmware.com» находим в нём папку «plugins», копируем её в более удобной место, например в ~/vmware-vmrc
  • Заходим на физический сервер с Linux (где установлен Vmware Server 2), в каталог /usr/lib/vmware/webAccess/tomcat/apache-tomcat-6.0.16/webapps/ui/plugin/ в нём должен быть файл vmware-vmrc-linux-x86.xpi, копируем его на клиентскую машину (например: scp vmware-vmrc-linux-x86.xpi vmware@vmware-client:/tmp).

Заходим на клиентскую машину, распаковываем скаченное с сервера расширение:

 vmware-client:/tmp$ unzip vmware-vmrc-linux-x86.xpi
 vmware-client:/tmp$ mv plugins ~/vmware-vmrc

В итоге каталог ~/vmware-vmrc будет иметь следующее содержание:

 bin/
 lib/
 libconf/
 share/
 xkeymap/
 np-vmware-vmrc-2.5.0-122581.so
 open_source_licenses.txt
 vmware-desktop-entry-creator
 vmware-vmrc
 vmware-vmrc-daemon
 vmware-vmrc-legacy

Собственно скрипт vmware-vmrc и будет использоваться для подключения к виртуальным машинам. Параметры, которые воспринимает скрипт можно узнать, запустив его с опцией -–help. Мне наиболее интересны были:

  -X – запуск консоли в полноэкранном режиме
  -M – номер виртуальной машины (см. objID в /etc/vmware/hostd/vmInventory.xml на сервере)

Так же есть еще два параметра, которые в справке у меня не отобразились, это

  -u – имя пользователя, используемое для подключения к Vmware Server 2, то, 
  что задавали во вкладке Permissions в консоли Vmware, и опция
  -p – соответствующий пароль пользователя на Linux сервере.

В итоге строка для подключения будет примерно такая:

 vmware-vmrc -X -h "vmware-server:8333" -u <login> -p <password> -M "<objID>"

Значение objID, как уже писал можно узнать в файле /etc/vmware/hostd/vmInventory.xml на сервере, оно определяет, к какой виртуальной машине клиент будет подключаться. Например, если vmInventory.xml содержит следующее:

 <ConfigRoot>
 .....
 <ConfigEntry id="0003">
   <objID>304</objID>
   <vmxCfgPath>/mnt/vmware/WindowsXP01/Windows XP.vmx</vmxCfgPath>
 </ConfigEntry>
 <ConfigEntry id="0004">
   <objID>320</objID>
   <vmxCfgPath>/mnt/vmware/WindowsXP02/Windows XP.vmx</vmxCfgPath>
 </ConfigEntry>
 .....
 </ConfigRoot>

то vmware-vmrc -X -h "192.168.1.3:8333" -u vmrc -p superpwd -M "304" запустит вирт. машину /mnt/vmware/WindowsXP01/Windows XP.vmx, при условии, что пользователь vmrc на сервере 192.168.1.3 имеет право включать данную машину.

Далее помещаем данную строку в ~/.xinitrc

 ~/vmware-vmrc/vmware-vmrc -X -h "192.168.1.3:8333" -u vmrc -p superpwd -M "304"

И пробуем запустить X: startx

Если все нормально запустилось, то должно появиться окно “VMware Remote Console”. При подключении клиента к вирт. машине она запустится (если была отключена), и клиент через несколько секунд (у меня 40-60 сек.) увидит загружающуюся вирт. машину. Вверху будет панель инструментов, где можно произвести аварийную перезагрузку, выключение, приостановить работу вирт. машины, а так же подключить/отключить устройства (CD-ROM, а так же сетевая карта, хотя её и нельзя отключить). От лишних вопросов эту панельку лучше скрыть, так как при нажатии на кнопку «Закрыть», X server завершить работу. Настройки VMware Remote Console хранятся в каталоге ~/.vmware.

Если не получилось увидеть рабочий стол виртуальной машины, то проверьте сетевую доступность сервера, доступ к портам 902, 8333 на сервере, ошибки X server, проверьте, что на клиентской машине установлен пакет xauth. Попробуйте в строке подключения vmware-vmrc указать администратора Vmware Server 2, и подключить под ним. Если под администратором удаётся получить доступ к виртуальной машине - проверьте, что пользователю (в моём примере - vmrc) в роли доступа разрешены “Power On” и “Console Interaction”.

[править] Настройка автоматического запуска консоли VMware Remote Console.

Теперь осталось добиться, чтобы всё это запускалось автоматом. Если на клиентской машине linux пользователь использует bash, то в ~/.bashrc дописываем *

 if [ -z "$DISPLAY" ] && [ $(tty) == /dev/tty1 ] ; then
 startx
 fi

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

Если же зловредный пользователь попытается просмотреть файл .xinitrc, чтобы узнать имя и пароль пользователя для подключения (зная это, он может наблюдать за рабочим столом), ему необходимо будет, либо переключиться на вторую, третью и т.д. консоль, а там его будет ждать приглашение от login, либо завершить X server. Далее будет указан способ, как сделать так, чтобы при завершении работы X server производилось автоматическое выключение компьютера.

Возможно, конечно, загрузиться с livecd и посмотреть данный файл. В таком случае, либо снимайте дисковод, CD-ROM (с флешек компьютеры, работающие на Pentium II, как правило, не умеют загружаться), либо перемещайте клиентские компьютеры и сервер в изолированный vlan, либо все вместе.

Для автовхода можно воспользоваться mingetty. Скачиваем и ставим mingetty (на Debian CD1 пакета не было обнаружено), и редактируем /etc/inittab. Пример, для Debian.

 .....
 #1:2345:respawn:/sbin/getty 38400 tty1
 1:2345:respawn:/sbin/mingetty --autologin <vmware-user> tty1
 2:23:respawn:/sbin/getty 38400 tty2
 .....

где <vmware-user> - пользователь локальной, клиентской ОС, в моём примере это vmware.

Теперь при загрузке клиентской машины c Linux, будет производиться следующее:

  • Автоматический вход в систему
  • Запуск X Server, с клиентом vmware-vmrc
  • Подключение клиента vmware-vmrc к виртуальной машине на Vmware Server 2
  • Включение виртуальной машины, и перенаправление вывода на экран клиентской машины.

[править] Настройка автоматического выключения физической машины клиента при выключении виртуальной.

Пользователь ожидает, что если зайти в меню Пуск и нажать Завершение работы, то его машина будет выключена. В нашем же случае, это приведет к завершению работы консоли vmware-vmrc, завершению работы X server и в результате перед пользователем предстанет черно-белая консоль Linux. Это немного не то, что ожидал пользователь. Для того чтобы после виртуальной машины отключалась и физическая, можно поступить следующим образом:

  • Установить пакет sudo (если не стоял)
  • От root запустить visudo, и добавить правило: vmware ALL = NOPASSWD: /sbin/halt

(если вы используете другого пользователя, то создайте правило для него)

  • В файле ~/.xinitrc для пользователя vmware после строки
 ~/vmware-vmrc/vmware-vmrc -X -h "vmware-server:8333" -u <login> -p <password> -M "<objID>"

необходимо добавить строку:

 sudo /sbin/halt

В итоге получим, что при завершении работы виртуальной машины, завершит работу клиент vmware-vmrc и будет выполнена команда sudo /sbin/halt, что приведет к выключению физической машины. Что нам и требовалось.

Однако, здесь есть недостаток: физическая машина выключиться и при случайном завершении X server. Это может случиться при нажатии Ctrl-Alt-Backspace, или если пользователь закроет клиента VMware Remote Console (крестик на панели инструментов). При повторном же включении физической машины, клиент заново подключиться к виртуальной машине и продолжить работу.

[править] Клонирование клиентских машин.

Далее остаётся клонировать настройки на остальные клиентские машины, изменить значение objID, имя и пароль для подключения (если используются для каждой машины свой). Здесь множество вариантов:

  • Вручную создать архив, начиная с корня, развернуть его на другой клиентской машине, установить загрузчик и перенастроить X Server.
  • Подключить второй жесткий диск и воспользоваться командой dd.
  • Воспользоваться Акронисом.
  • Любой другой способ :)

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

[править] Создание архива.

1. Загружаемся на клиентской машине с livecd (для определенности RIPLinux).

2. Монтируем раздел с системой (при установке Debian, я разбивал диск только на два раздела - под swap, и под корень).

3. Переходим в смонтированный раздел (в моём случае в RipLinux, это был каталог /mnt/sda2), удаляем все из tmp, var/tmp.

4. Запускаем архивацию с выводом на удалённую машину (в моём случае это была моя рабочая машина):

 /mnt/sda2:# tar cvf - . | ssh user@remote-machine “dd of=~/vmware-vmrc.tar” 

В случае использования Debian архив оказался около 550 МБ, после сжатия bzip -9 - 250 Мб. Если удалить часть пакетов из стандартной системы (perl, python, так же стоял Iceweasel), то можно еще высвободить место. Можно конечно было сразу указать tar cvjf - ..., но я сжимал позже на удалённой машине, так как она мощнее.

[править] Развертывание архива.

1. Можно интегрировать полученный архив в livecd, например можно скопировать тот же диск RipLinux во временный каталог, переместить в него созданный архив vmware-vmrc.tar.bz2, создать загрузочный образ, и записать его на CD.

2. Загрузиться с созданного CD, на очередной клиентской машине.

3. Разбить жёсткий диск, создать swap, отформатировать и смонтировать файловую систему (например, в /mnt/target).

4.Развернуть архив:

 /mnt/target:# tar –xvjf /путь_к_архиву/vmware-vmrc.tar.bz2 

5. Установить загрузчик (например, Grub):

  • Предварительно монтируем /dev:
 #mount –-bind /dev /mnt/target/dev
  • Переходим в клонированную систему:
 #chroot /mnt/target
  • Если жесткий диск, в клонированной системе имеет другое наименование, то редактируем /boot/grub/device.map, /boot/grub/menu.lst, /etc/fstab
  • Устанавливаем Grub:
 grub –-no-floppy (с –-no-floppy запускается быстрее)
 grub> root (hd0,1) # hd0,0 – swap, hd0,1 - корень
 grub> setup (hd0)  # ставим в mbr

если успешно - выходим

 grub> quit
  • Выходим из chroot: ^D (Ctrl-D)
  • Размонтируем, что монтировали:
 # umount /mnt/target/dev
 # umount /mnt/target

6. Перезагружаемся. Если клонированная система не загружается, используем снова LiveCd, правим /mnt/target/boot/grub/menu.lst, /mnt/target/etc/fstab.

Если решили сменить файловую систему (например, в той с которой делали архив корень был под reiserfs, а на той, которой развертываете архив, решили сделать ext3), проверьте, что в initrd есть модуль для файловой системы, на которой развертываете. Как правило, initrd, это архив cpio или gzip (смотрите вывод file initrd). Если модуля нет, то chroot /mnt/target, указываем в файле настроек mkinitrd какие модули включать, собираем initrd:

 cd /boot/
 mkinitrd -o /boot/initrd.img <версия_ядра> 
 (версии ядра смотрите в /boot/grub/menu.lst, или в /lib/modules).

7. После того, как загрузили клонированную систему, настраиваем X server под новое оборудование (если при старте X server падает и согласно .xinitrc выполняется /sbin/halt, то загружаемся в single mode).

8. Редактируем ~/.xinitrc: изменяем objID, login, password для подключения.

9. Пробуем загрузиться в штатном режиме.

Если все успешно переходим к следующей машине.

[править] Загрузка по сети

Сделать загрузку по сети (bootp) в данном случае проблематично, так как необходимо, чтобы у всех клиентов были указаны различные objID. С бездисковыми станциями я не сталкивался, поэтому напишу только свои идеи, как сделать это. Реализуемо это или нет - решать Вам.

Если все будут загружать один и тот же образ, то получиться, что один пользователь будет пытаться работать за виртуальной машиной, а остальные будут ему мешать :)

Как решение можно, например, в .xinitrc написать скрипт, который в зависимости, например, от MAC адреса сетевой карты, выбирал определенный objID, и подставлялся его в строку подключения. Пример скрипта .xinitrc (я не проверял, можно ли такое помещать в .xinitrc):

 #Вот примеры выражений, задающих переменной mac,
 #значение MAC адреса сетевой карты
 #(предполагается, что карта одна).
 # mac=`ip addr | grep link\/ether | cut -d ' ' -f 6`
 # mac=`/sbin/ifconfig | grep HWaddr | cut -d ' ' -f 11`
 mac=`/sbin/ifconfig | grep HWaddr | cut -d ' ' -f 11`
 case $mac in
   00:11:22:33:44:01)
       objid=304
       vmlogin=vmrc1
       vmpwd=superpwd1
       ;;
   00:11:22:33:44:02)
       objid=320
       vmlogin=vmrc2
       vmpwd=superpwd2
       ;;
 ......
      *)echo "Для данной машины настройки не заданы"
       return 0 # или sudo /sbin/halt :)
       ;;
 esac
 ~/vmware-vmrc/vmware-vmrc -X -h "vmware-server:8333" -u $vmlogin -p $vmpwd -M $objid
 sudo /sbin/halt

Но, как и говорил ранее, с загрузкой по сети на работал, поэтому работоспособность не проверял.

Примечание: клиент vmware-vmrc способен подключаться и к VMWare ESXi.


VMware
VMware ESX Server | VMware vSphere | VMware View Open Client
VMFS
Виртуализация рабочих станций на Vmware Server 2 | Команды для работы с VMware