LXF169: Виртуализация Офис на Virtual Box
|
|
|
Виртуализация. Польза от виртуальных машин.
VirtualBox: 6 XP в одном Ubuntu
Максим Черепанов излагает, как построить и администрировать офисные рабочие места с минимумом затрат и максимумом эффективности.
Случилось так, что передо мной встала следующая задача: организовать переезд «полевого», или удаленного (т. е. не подключенного к основной локальной сети), филиала некой фирмы, из 8 рабочих станций. Все они были настроены и работали на разных версиях разных ОС на разномастном реальном железе, которое глючило по-разному. 6 рабочих мест были типовые офисные, т. е. на них накладывались стандартные требования: почта, офис, совместное пользование файлами, печать документов; причем на трех из них должен был быть доступ в Интернет. Остальные два работали с Windows XP на реальном железе: на одном – несколько лицензионных программ и термопринтер этикеток, на втором 1С.
Но все это было в старом помещении, а при переезде в новое неразумно тащить за собой старые проблемы. Заручившись согласием руководства на некоторые дополнительные траты, за 2 месяца до переезда я стал готовить железо и софт.
Оборудование и сетевая инфраструктура
Типовые рабочие места я сразу же решил сделать виртуальными, создав их на сервере, к которому они должны будут подключаться с терминалов. К началу проекта были в наличии:
» Сервер для доступа во внешний мир. Железо – Intel® Core™ 2 Duo, 2 Ethernet, на одном ppp на оптическом модеме, второй со статическим IP смотрит внутрь локальной сети. Софт – совершенно стандартный набор: Ubuntu 10.04 Server, SSH, Webmin, Squid, Shorewall, Postfix. Этот компьютер успешно работал в прежнем помещении, система была переустановлена заново. Внутренний статический IP – 192.168.0.200.
» Два обычных компьютера (перенесены из старого помещения). ОС на них возвращена к исходному виду из слепков, все программы переустановлены заново.
» Несколько принтеров – сетевых и с общим доступом.
» Шесть лицензий Windows XP PRO SP3 Get Genuine Kit. Строго говоря, в них не было необходимости, но они были уже куплены до реконструкции филиала. Не солить же их!
Для доукомплектации потребовались следующие приобретения:
» Для 6 типовых рабочих мест – терминалы Neoware CA-21: VIA Eden 800 МГц CPU, 512 МБ ОЗУ, 1 ГБ Flash, 4 порта USB, VGA, LAN. Короче, все что надо для нормальной работы. По случаю получилось купить на аукционе eBay – в пересчете на российские рубли, по 700 руб./шт.
» Новые клавиатуры и мыши с разъемами PS для полной совместимости с терминалами. Хотя потом выяснилось, что они также прекрасно работают с USB-периферией. Приобрел скорее для того, чтобы все было чисто и красиво – прежняя периферия работала, но была изношена практически до предела.
» Компьютер для сервера виртуальных машин Intel® Core™ i3-2100 CPU @ 3.10 ГГц, 4 ядра, 12 ГБ оперативной памяти, 1-ТБ винчестер. Видео и сеть интегрированные. Софт: Ubuntu-12.04 Server, в ней запущен VirtualBox с дополнительными пакетами, внутри которого крутятся 6 виртуальных ядер Windows XP (рабочие станции), Samba для общего пользования файлами, система запуска ядер, система загрузки терминалов промежуточной ОС. Внутренний IP – 192.168.0.250.
Настройка сервера виртуальных машин
Исходное состояние – свежеустановленный Ubuntu 12.04 Server; конечно, установлены и настроены служба SSH и файловый менеджер mc.
1 На сайте VirtualBox заходим в https://www.virtualbox.org/wiki/Linux_Downloads. Выбираем свой дистрибутив и добавляем в /etc/apt/sources.list нужную строку:
deb http://download.virtualbox.org/virtualbox/debian precise contrib
Скачиваем, сохраняем и устанавливаем публичный ключ Oracle:
wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -
Обновляем репозитории и устанавливаем dkms и virtualbox:
sudo apt-get update
sudo apt-get install dkms virtualbox-4.2
Переходим на https://www.virtualbox.org/wiki/Downloads, копируем ссылку на текущую версию Oracle VM Virtualbox Extention Pack и закачиваем его:
Этот пакет позволяет использовать RDP и USB 2.0.
$ sudo vboxmanage extpack install ~/Oracle_VM_VirtualBox_Extension_Pack-4.2.6-82870.vbox-extpack
Во время установки VirtualBox добавится новая группа vboxusers. Пользователя, от имени которого будет запускаться VirtualBox, нужно добавить в эту группу, иначе запуск будет невозможен:
$ sudo usermod -aG vboxusers ian
Здесь мы добавили в группу vboxusers пользователя ian.
2 Устанавливаем unzip, Apache и пакет для поддержки PHP:
$ sudo apt-get install unzip apache2 libapache2-mod-php5
После установки Apache должен запуститься. Если этого не произошло, на всякий случай перезапустите его:
$ sudo /etc/init.d/apache2 restart
3 Переходим на http://code.google.com/p/phpvirtualbox/, скачиваем и распаковываем phpvirtualbox необходимой версии:
В архиве имеется папка phpvirtualbox-*.* – эту папку (не ее содержимое, а именно ее) переносим в /var/www и переименовываем в /var/www/phpvirtualbox. Переименовываем внутри этой папки файл config.php-example в config.php и редактируем его – надо указать логин пользователя c правами администратора, от имени которого будет запускаться VirtualBox, а также его пароль:
var $username = 'ian'
var $password = 'pass'
и выбрать русский язык для интерфейса:
var $language = ‘ru’
4 Создаем конфигурационный файл для запуска vboxweb-service:
$ sudo touch /etc/default/virtualbox
Его минимальное содержание –
VBOXWEB_USER=ian
а именно логин пользователя, имеющего административные права, от имени которого будет запускаться VirtualBox.
Описание других опций можо посмотреть на http://code.google.com/p/phpvirtualbox/wiki/vboxwebServiceConfigLinux.
5 Стартуем сервис:
$ sudo /etc/init.d/vboxweb-service start
Открываем браузер на своем компьютере и пишем в адресной строке: http://имя_сервера/phpvirtualbox. Логин и пароль по умолчанию – admin и опять же admin.
На рис. 1 изображено то, что вы должны увидеть: такой же интерфейс, как у десктопной версии.
Устанавливаем столько и такие виртуальные машины, как требуется. В моем случае это шесть Windows XP. Я сделал одну машину, а все остальные клонировал с нее. Обязательно устанавливаем дополнения гостевой системы.
6 Организуем автозапуск некоторых виртуальных машин одновременно с host-сервером и автоматическое корректное выключение виртуалок вместе с сервером.
Забираем скрипт на странице: http://mmm-dev.blogspot.ru/2011/04/virtualbox.html. Сохраняем его в /etc/init.d под именем vboxcontrol и делаем исполняемым:
$ sudo chmod +x /etc/init.d/vboxcontrol
Создаем конфигурационные файлы /etc/virtualbox/config и /etc/virtualbox/machines_enabled.
В первом указывается пользователь, от имени которого запускается скрипт (с административными привилегиями):
VM_USER=ian
Во втором перечисляются виртуальные машины, которые будут автоматически стартовать вместе с хостом (по имени машины, каждая с новой строки):
XP_main
XP_1
XP_2
Осталось обновить скрипты init.rc –
$ sudo update-rc.d vboxcontrol defaults 99 10
после чего становятся доступны команды service vboxcontrol start|stop|status|savestate|poweroff (для виртуальной машины из списка), а также service vboxcontrol vm-start|vm-stop|vm-poweroff|vm-savestate|vm-reset VM_NAME (для конкретной виртуальной машины).
Настройка тонких клиентов
По большому счету надо только включить настройку по сети в BIOS (будьте внимательны, обычно она включается в двух местах BIOS’а. Я для удобства записываю на внутреннюю флэш-память еще какой-нибудь маленький Linux типа Puppy или CorePlus) и, конечно, записать MAC-адрес Ethernet карты терминала. Допустим, он 00:60:08:C7:A3:D8 – обычно он записан на корпусе, или его можно узнать, набрав в консоли терминала ifconfig (вот еще для чего я ставлю внутрь маленький Linux: мало ли что написано на корпусе).
Теперь настроим загрузки по сети в сервере виртуальных машин.
1 Установим на сервер виртуальных машин демон TFTP:
$ sudo apt-get install tftp tftpd
По умолчанию TFTP-сервер настроен на использование директории /srv/tftp. Мы перестроим его на использование /tftpboot: в этой директории будут храниться файлы, которые мы можем скачать с сервера или закачать в него.
Отредактируем файл /etc/inetd.conf, найдя строки такого вида:
- BOOT: TFTP service is provided primarily for booting. Most sites
- run this only on machines acting as "boot servers".
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp
Последняя строка должна получиться такой:
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot
Создадим рабочую директорию и поменяем права доступа:
$ sudo mkdir /tftpboot
$ sudo chown -R nobody /tftpboot
Перезапустим сервер inetd:
$ sudo /etc/init.d/openbsd-inetd restart
Поместим в директорию /tftpboot какой-нибудь файл (myfile) и выполним команду
$ tftp localhost
На приглашение TFTP-сервера введем
tftp> get myfile
Если файл получен, значит, все правильно, и перед вами появится сообщение
Received 168 bytes in 0.1 seconds
Если вы не видите этого сообщения, проверяйте все заново.
2 Установим сервер DHCP и настроим его для удаленной загрузки терминалов.
$ sudo apt-get install dhcp3-server
Отредактируем /etc/dhcp3/dhcpd.conf:
ddns-update-style none;
default-lease-time 600;
max-lease-time 7200;
authoritative;
log-facility local7;
server-name “192.168.0.200”; # Адрес DNS сервера, у меня это другая машина
subnet 192.168.0.0 netmask 255.255.255.0 {
pool {
range 192.168.0.170 192.168.0.190; # Диапазон работы DHCP, остальные машины у меня со статическими IP
next-server 192.168.0.250; # Адресе tftp сервера с загрузчиком
filename “pxelinux.0”; # Имя файла с загрузчиком
}
}
Перезапустим DHCP-сервер:
$ sudo /etc/init.d/dhcp3-server restart
3 Наполняем директорию /tftpboot: заходим на http://www.kernel.org/pub/linux/utils/boot/syslinux/, забираем и распаковываем syslinux, оттуда будем брать необходимые файлы.
Создадим директорию /tftpboot/boot и загрузим в нее файл vesamenu.c32 (для создания и редактирования загрузочного меню).
В директорию /tftpboot загрузим файл pxelinux.0 (сетевой загрузчик).
Создадим директорию /tftpboot/pxelinux.cfg, а в ней – файл default следующего содержания:
default /tftpboot/boot/vesamenu.c32
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color disabled 0 #ffffffff #00000000
menu color timeout_msg 0 #ffffffff #00000000
menu color timeout 0 #ffffffff #00000000
menu background #1F45A5
menu title PXE Network Boot Menu
prompt 0
timeout 20
label Thinstation
kernel /tftpboot/pxe/thinstation/vmlinuz
append ramdisk_blocksize 4096 initrd=/tftpboot/pxe/thinstation/initrd root=/dev/ram0 ramdisk_size=524288 splash=silent vga=791 console=ttyS3
label Boot from first hard disk
localboot 0x80
menu end
Заходим на http://www.thinstation.org/, забираем и распаковываем дистрибутив Thinstation. Сейчас уже доступна версия 5, но я использую 2.5, поэтому мне неизвестно, будет ли работать все перечисленное на новой версии.
Создадим директорию /tftpboot/pxe/thinstation, загрузим в нее файлы initrd и vmlinuz из выбранного дистрибутива Thinstation.
В директории /tftpboot создадим файл thinstation.hosts соответствия имен и MAC-адресов для всех тонких клиентов, следующего содержания:
- Имя_компьютера Mac_адрес Имя_группы Коментарии
terminal1 006008C7A3D8 Firma #
terminal2 000000000000 Firma #
terminal3 000000000000 Firma #
terminal4 000000000000 Firma #
terminal5 000000000000 Firma #
terminal6 000000000000 Firma #
Первый MAC-адрес – из нашего примера; видоизмените файл по вашим данным.
Для каждого выбранного вами имени тонкого клиента (первый столбец) создайте в директории /tftpboot собственный конфигурационный файл (thinstation.conf-terminal1 для имени terminal1 и подобные файлы для других терминалов):
AUTOSTART=On
SCREEN_RESOLUTION="1024x768"
SCREEN_COLOR_DEPTH="16"
RDESKTOP_COMPRESSION=On
RDESKTOP_COLOR_DEPTH="16"
KEYBOARD_MAP=en_us # Раскладка клавиатуры
TIME_ZONE="Europe/Moscow"
USB_ENABLED=On # Включение драйверов USB, нужно для клавиатуры и мыши
AUDIO_LEVEL=67
SESSION_0_TITLE="Terminal 1"
SESSION_0_TYPE=rdesktop
SESSION_0_RDESKTOP_SERVER=192.168.0.250:3391 # RDP-порт виртуальной машины
SESSION_0_RDESKTOP_OPTIONS=”-u user -z”# user – под этим логином будет предпринята попытка входа в сессию RDP виртуальной машины
Обратите внимание на предпоследнюю строку: данный порт надо будет прописать в свойствах нужной вам виртуальной машины, позже я напомню про это.
Если все сделано верно, то можно пробовать запускать терминалы. Первым пойдет загрузка PXE, определится сервер DHCP, терминал получит IP, затем пойдет загрузка из /tftpboot, на 2 секунды выскочит загрузочное меню и начнется загрузка Thinstation. Поскольку RDP в виртуальных машинах еще не включен, загрузка закончится серым экраном с двумя опциями: Shutdown и Reconnect.
Настройка виртуальных машин
Будем считать, что все сказанное выше прошло успешно, и виртуальные машины в потребном количестве успешно инсталлированы через phpvirtualbox. Про настройку памяти, сети и прочего виртуального оборудования писать не буду, этого вполне достаточно в Сети. Остановлюсь на активации RDP. Для него обязателен пакет расширения Oracle VM Virtualbox Extention Pack.
На рис. 2 показано, как правильно сделать настройку RDP: поставить галочку и прописать тот порт, который указан в конфигурации. Обратите внимание, что IP при обращении по RDP у виртуальных машин тот же, что и у сервера виртуальных машин, но порт у каждой свой. Это важно помнить, если надо зайти удаленно не с терминала, который автоматически подгружает конфигурацию, а вручную с другого компьютера для помощи пользователю.
Все, перезагружаем север виртуальных машин. Проверяем (заходом на http://имя_сервера/phpvirtualbox), стартовали ли машины из списка. Если да – перезагружаем тонкие клиенты, для которых настроены конфигурационные файлы. У меня через 65 секунд после включения питания появляется окно приглашения входа в Windows.
Дополнения и замечания
1 Доступ к phpvirtualbox организован средствами Shorewall, в rules добавлена следующая строка:
Web/DNAT net loc:192.168.0.250
Таким образом, обращаясь к порту 80 на внешний IP, попадаем на Apache внутреннего сервера виртуальных машин.
2 На сервере виртуальных машин запущена Samba для совместного пользования документами. Поскольку физически операционная система и документы находятся на одной машине, открытие документов происходит в разы быстрее, чем с физической машины, подключенной к этому же серверу по локальной сети.
3 Доступ в Интернет регулируется совершенно так же, как для физических компьютеров: с помощью Squid и статических адресов, которые прописаны в настройках самих виртуальных операционных систем.
4 Я не стал заморачиваться с пробросом портов принтеров и сканеров на терминалы. К двум имеющимся физическим машинам подключил потребное количество периферии проводами подлиннее, открыл к ним общий доступ, и все.
5 В crontab сервера виртуальных машин внесена следующая запись:
30 23 * * * /etc/init.d/vboxcontrol savestate
00 06 * * * /etc/init.d/vboxcontrol start
В 23:30 ежедневно виртуальные машины засыпают, в 6 утра просыпаются. В таком состоянии их можно клонировать или создать их резервные копии. Но поскольку у меня в заготовке есть настроенная полностью исправная машина, и время ее развертывания соизмеримо с развертыванием из ежедневной резервной копии, я не стал дополнительно нагружать crontab.
6 Если вы хотите удаленно помочь пользователю, можно поставить галочку «Разрешать несколько подключений» на свойствах дисплея в виртуальной машине (см. рис. 2, но на рисунке галочка не стоит). Я пробрасываю порт в Shorewall внешнего сервера – в файле rules вписываю строку
DNAT net loc:192.168.0.250:3391 tcp 11011 #RDESKTOP
и обращением по внешнему IP сервера на порт 11011 попадаю на рабочий стол терминала одновременно с пользователем.
7 Виртуальные машины можно тасовать, как карты в колоде, оперируя портами в RDP. Также, изменяя /tftpboot/pxelinux.cfg/default, можно создать большое меню для загрузки других ядер виртуальных машин. Информацию про это легко найти в Сети.
8 В качестве терминала можно использовать абсолютно любой компьютер с функцией загрузки по сети по спецификации PXE, нужно только вписать в общий конфиг MAC-адрес сетевой карты, жесткий диск на таком компьютере не обязателен.
9 Если вам попадется монитор с соотношением сторон 16:9, для нормального отображения придется немного изменить конфигурационный файл терминала:
AUTOSTART=On
X_MONITOR_MODELINE='"1366x768" 85.034880 1366 1424 1568 1776 768 772 776 798 -HSync +VSync'
SCREEN_RESOLUTION="1366x768"
SCREEN_HORIZSYNC="31.5-81"
SCREEN_VERTREFRESH="55-76"
I915RESOLUTION_ENABLED=On
I915RESOLUTION_OPTIONS="3c 1366 768 8"
- SCREEN_RESOLUTION="1024x768"
SCREEN_COLOR_DEPTH="16"
RDESKTOP_COMPRESSION=On
RDESKTOP_COLOR_DEPTH="16"
KEYBOARD_MAP=en_us # Раскладка клавиатуры
TIME_ZONE="Europe/Moscow"
USB_ENABLED=On # Включение драйверов USB
AUDIO_LEVEL=67
SESSION_0_TITLE="Terminal 1"
SESSION_0_TYPE=rdesktop
SESSION_0_RDESKTOP_SERVER=192.168.0.250:3391
SESSION_0_RDESKTOP_OPTIONS="-u user -z"
Кроме того, на сервере виртуальных машин надо явно задать разрешение для конкретной машины:
$ VBoxManage controlvm Terminal1 setvideomodehint 1366 768 16
Если у вас другие разрешение экрана и глубина цвета, поменяйте на свои (1366, 768 и 16) и после этого задайте нужные параметры экрана из виртуальной машины. Кажется достаточно сложным, но к сожалению, у меня без всех этих манипуляций нормального изображения на широкоэкранных мониторах не получалось.
Авторство
Из всего приведенного я не написал ни строчки, правку конфигурационных файлов под свои нужды написанием не считаю. Этот материал – просто сведение вместе известной информации. |