Картинка блога

Задача появилась из-за нежелания устанавливать какой-либо WAMP стек. Идея в том, чтобы создать переносимый сервер выполняемый в собственной песочнице. Он должен быть достаточно быстрым в загрузке и не требовать много ресурсов. Нужен был сервер на базе Linux, максимально приближенный к боевым (production) условиям. Так и родилась идея запустить Ubuntu Server на VirtualBox в Headless режиме. Оба продукта Ubuntu Server и VirtualBox довольно мощные и распространяются свободно. Но к сожалению без определенных знании о работе подобного софта неизбежно попадешь на грабли. Надеюсь, данный пост поможет частично обойти это «минное поле». Текущее описание подразумевает, что хостовая машина бегает под Windows, но оно не должно сильно отличатся и для других систем. И еще, описание требует определенных знаний работы с bash — иначе зачем вам вообще консоль?

Предварительные установки.

Если у вас нет VirtualBox или Ubuntu Server, качаем их по ссылкам. Ставим VirtualBox со стандартными настройками. Теперь из GUI создаем жесткий диск и систему с OS Ubuntu. В качестве диска используем скаченный ISO образ Ubuntu Server. И устанавливаем сервер как на обычную машину. В общем, все стандартно, за исключением того, что может потребоваться галочка в Система->Процессор->Включить PAE/NX если ее не поставил за вас мастер.

И еще, при установке можно выбрать некоторые серверные приложения — Apache, FTP, SSH и другие — можно поставить их сразу и пропустить часть текущего описания об установке софта. Данный топик для тех кто забыл или просто предпочитает все ставить сам. В итоге мы получаем консоль в окне виртуального сервера и сетевое подключение типа NAT.

Установка «Дополнений гостевой ОС».

Дополнительные модули понадобятся для открытия папок между хостовой и гостевой машинами. А также для удобного фокуса. Дополнения патчат ядро, значит понадобятся дополнительные библиотеки. Войти в систему под своим аккаунтом и выполнить команду:

sudo apt-get install build-essential linux-headers-`uname -r`

Теперь ставим сами дополнения. Вставляем в виртуальный привод «GuestAdditions» из меню виртуальной машины: Устройства->Установить дополнения гостевой ОС… или просто нажав кнопку Host-D (по умолчанию в VirtualBox кнопка Host соответствует правому Control).

Если папка /media/cdrom пуста или ее совсем нет, значит диск нужно монтировать в ручную

mount /dev/cdrom /media/cdrom

В моем случае меня тут ждал облом — /media/cdrom уже был монтирован на пустой /dev/sr0, тогда монтируем cdrom в другое место, например /media/cdrom2

mkdir /media/cdrom2
mount /dev/cdrom /media/cdrom2

из примонтированой папки запускаем

./VBoxLinuxAdditions-x86.run

Единственная ошибка будет выглядеть так

Installing the Window System drivers ...fail!
(Could not find the X.org or XFree86 Window System.)

Для нас это бозначает — нету XServer — нету copy/paste между машинами. Если ошибки бесят, можно поставить XServer (пакет на 71+ MB):

sudo apt-get install xserver-xorg xserver-xorg-core 71mb +

Правда в консоли доступ до буфера обмена это все равно не даст (эта проблема будет решена другим способом). Перезагружаемся:

sudo shutdown -r now

И получаем нормальную интеграцию мышки (для MC — об этом позже) и доступ до общих папок. Формат монтирования такой: sudo mount -t vboxsf share ~/host.

Например, добавленный диск «C» в режиме — только чтение из меню Устройства->Общие папки. Можно монтировать следующим образом.

mount -t vboxsf c_drive /media/vbox

Для справки:

Для монтирования при загрузке используется /etc/fstab.

В Ubuntu есть пакет <strong>virtualbox-guest-additions</strong>, он старее чем идет вместе с VirtualBox. Значит даже если он совместим с текущей версией Ubuntu, это не значит что он совместим с версией VirtualBox. Установить ее можно так:

sudo aptitude install virtualbox-guest-additions

Настройка сетевого подключения

NAT для сервера не подойдет из за отсутствия возможности подключения к серверу. По этому я использую сетевой мост. Таки образом сервер получит свой собственный IP внутри локальной сети. Меняем настройки виртуальной машины соответствующим образом и перезагружаем сервер. Тут через раз может ожидать облом — гостевая машина никак не может получить IP с помощью DHCP. С этой проблемой можно биться бесконечно, я даже на время смог его заставить все-таки работать. В помощь гугл, команды ifconfig, route, netstat, /etc/init.d/networking restart и файл настроек /etc/network/interfaces, если проблемы с железяками или модулями ядра, то помогут команды lspci и lsmod.

Но проще (по крайне мере для меня) DHCP отключить, уж много факторов влияет на его исправность. Для этого в /etc/network/interfaces находим наш интерфейс:

auto eth0
iface eth0 inet dhcp

Меняем в моем случае на:

auto eth0
iface eth0 inet static
address 192.168.10.100
netmask 255.255.255.0
broadcast 192.168.10.255
network 192.168.10.1
gateway 192.168.10.1

Откуда я взял настройки? Посмотрел их на хостовой машине конечно с помощью команды ipconfig /all

Беспроводное сетевое соединение 2 - Ethernet адаптер:

DNS-суффикс этого подключения . . : empire
Описание  . . . . . . . . . . . . : Адаптеры Broadcom 802.11a/b/g WLAN
Физический адрес. . . . . . . . . : 00-1A-73-9C-65-42
Dhcp включен. . . . . . . . . . . : да
Автонастройка включена  . . . . . : да
IP-адрес  . . . . . . . . . . . . : 192.168.10.152
Маска подсети . . . . . . . . . . : 255.255.255.0
Основной шлюз . . . . . . . . . . : 192.168.10.1
DHCP-сервер . . . . . . . . . . . : 192.168.10.1
DNS-серверы . . . . . . . . . . . : 192.168.10.1
Аренда получена . . . . . . . . . : 28 ноября 2010 г. 18:59:52
Аренда истекает . . . . . . . . . : 28 ноября 2010 г. 19:59:52

В сопоставить что-куда и какой IP выбрать надеюсь сложностей не возникнет. Теперь, когда сеть сервера настроена и пингуется (ping 192.168.10.100) с хостовой машины, можно начать установку софта.

Софт на сервер

В первую очередь SSH сервер.

apt-get install ssh openssh-server

После установки к серверу можно будет подключится с помощью putty или winscp. Это решит проблему с буфером обмена, так как теперь используется только хостовый. Можно копировать текст консоли в буфер и вставлять буфер в командную строку.

Далее webmin — это веб интерфейс управления сервером. Правда он и не поддерживается debian и ubuntu, значит его не поставить стандартным способом. К тому-же после установки и использования не гарантируется нормальная работа операционной системы, так что будьте внимательны.

Заходим на Webmin SourceForge Download и ищем последнюю версию webmin (не путать с usermin). На момент написания статьи, это — 1.520. Берем deb пакет:

wget http://sourceforge.net/projects/webadmin/files/webmin/1.520/webmin_1.520_all.deb/download

и устанавливаем:

# ставим зависимости
apt-get install perl libnet-ssleay-perl apt-show-versions libapt-pkg-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl
# добавляем пакет
dpkg -i usermin-webmail_1.450_all.deb
# запускаем установку, флаг -f должен помочь до загрузить зависимости, если такие остались.
apt-get -f install

Если возникли проблемы, нужно грызть официальный мануал. Или наслаждаемся интерфейсом на https://guest-host:10000 (в качестве guest-host прописываем гостевой IP).

По желанию можно поставить еще кое-что:

apt-get install proftpd #фтп сервер, лучше ставить после установки apache
apt-get install mc #midnight commander
apt-get install phpmyadmin #phpmyadmin - потребует apache
apt-get install ntp ntpdate #демон синхронизации времени
apt-get install console-cyrillic

Совет: По возможности с этими дополнениями лучше подождать до установки apache.
Справка:
В качестве клиента для FTP можно использовать fileZilla или FreeCommander


Я не случайно использую apt-get без sudo. Дело в том, что я открыл учетную запись root (что является небезопасным!), но лишний текст меня утомляет. Следующая команда включит учетную запись root в Ubuntu:

sudo passwd root

Настраиваем хосты для работы без IP

Если у вас не настроен собственный DNS сервер. Хосты которые система будет преобразовывать в IP можно в ручную.
В XP файл с хостами находится здесь: C:\WINDOWS\system32\drivers\etc\hosts, для других версий путь может быть другим.

Получаем имя хоста с гостевой машины Ubuntu

hostname #локальное имя
hostname -f #полное имя

У меня это vm-ubuntu, а IP был 198.168.10.100 их мы и записываем в файл hosts.

Справка: Для удобства можно использовать молодой проект hostscmd, позволяющий работать с хостами из командной строки.

Установка Apache

Вот мы и дошли до основной идеи. Можно поставить и сконфигурировать все руками, но я не склонен к мазохизму, по этому я устанавливаю весь стек сразу выбираем один из наборов:

#графический - потребует настройку кодировки в putty в UTF-8)
sudo tasksel install lamp-server
#обычный
sudo apt-get install lamp-server^

Оба поставят стабильные Apacha2, MySQL и PHP5. Если версии имеют значение, то такой сбособ — конечно — не подойдет. Установка на этом закончена.

Настройка виртуальных хостов

Будем добавлять новый виртуальный хост с названием test1.com.

Для этого нужно:

  1. Добавить виртуальный домен в конфигурацию apache.
  2. Прописать домен в хостах основной машины (на которой будет открыт браузер).
  3. Перезапустить apache.

Для этих целей у нас есть уже знакомый hostscmd (конфигурация хостовой машины), команда sudo /etc/init.d/apache2 reload (для перезагрузки apache2), и еще a2enmod, a2ensite. Вот что о них пишут:

На самом деле когда мы вызываем команду a2ensite myhost, то происходит просто создание символьной ссылки в папке /etc/apache2/sites-enabled/ на файл myhost в папке /etc/apache2/sites-avaliable/. Так же после запуска команды a2ensite myhost необходимо перегрузить конфиги апача. В debian это делается так: /etc/init.d/apache2 reload А при запуске этой команды апач просто подгружает в качестве конфигов все файлы из папки /etc/apache2/sites-enabled/. И таким образом включаются все ваши виртуальные хосты. Источник

Значит, нам только нужно создать файл с конфигурацией в папке /etc/apache2/sites-available/ и запустить a2ensite.
Создаем файл /etc/apache2/sites-available/test1.com c содержимым:

<VirtualHost>
DocumentRoot /home/ikutsin/test1.com
ServerName test1.com
</VirtualHost>

и выполняем:

a2ensite test1.com

Это все. Если возникли проблемы:

  • перепроверяем имена,
  • пробуем перезагрузить сервер
  • переустанавливаем или включаем php:
    apt-get install php5
    s1enmod php5
    
  • смотрим логи: tail -f /var/log/apache2/error.log

VirtualBox в режиме HeadLess

Headless — это такой режим, когда машина запускается без каких-либо окон. В принципе при текущей настройке Ubuntu Server, лишнее окно терминала только мешает. Запустим наш сервер в этом режиме. Для этого в папке установки VirtualBox есть пара консольных программ: VBoxManage и VBoxHeadless.

запускаем командную строку на хосте и выполняем следующее:

::Добавляем пути для поиска
set PATH=%PATH%;C:\Program Files\Oracle\VirtualBox
:: Получаем список зарегистрированных машин
vboxmanage list vms

В ответ:

Oracle VM VirtualBox Command Line Management Interface Version 3.2.10
(C) 2005-2010 Oracle Corporation
All rights reserved.

"Ubuntu Server" {e7261990-4df9-4de8-83ae-9053520dd08b}

Теперь этот UUID можно использовать для запуска машины:

:: порт для localhost потключения в windows через RDP
vboxheadless --startvm e7261990-4df9-4de8-83ae-9053520dd08b -p 5000
::запуск без RDP
vboxheadless --startvm e7261990-4df9-4de8-83ae-9053520dd08b -v off

Дело в том, что если RDP порт будет оставлен по умолчанию, Windows не разрешит вам подключится «в самого себя» опасаясь рекурсии. А вот localhost:5000 прокатит. После запуска консоль не закрывается (по идее туда должна идти отладочная информация), это не правильно и ошибка, возможно, скоро будет исправлена.

Пока можно воспользоваться прелестями WScript, создав и запустив файл run-vm.vbs со следующим содержимым:

Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run """C:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe"" --startvm e7261990-4df9-4de8-83ae-9053520dd08b --vrdp=off", 0

Теперь консоли нет, а VBoxHeadless остался только в менеджере задач.

Справка: Примечательно, что в таком режиме гостевая машина помешается на 30mb ram (и ~100 mb в виртуальной памяти). Недостаток только в давольно большем VDI файле, который больше 1 гигабайта. Но и он пакуется примерно в 4 раза.

Для того чтобы узнать, какие машины работают, используем VBoxManage:

C:\&amp;amp;amp;amp;gt;vboxmanage list runningvms
Oracle VM VirtualBox Command Line Management Interface Version 3.2.10
(C) 2005-2010 Oracle Corporation
All rights reserved.

"Ubuntu Server" {e7261990-4df9-4de8-83ae-9053520dd08b}

Чтобы отклюсить машину, тот же файл:

C:\&amp;amp;amp;amp;gt;vboxmanage controlvm e7261990-4df9-4de8-83ae-9053520dd08b poweroff
Oracle VM VirtualBox Command Line Management Interface Version 3.2.10
(C) 2005-2010 Oracle Corporation
All rights reserved.

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

Справка: Подробней о режиме Headless можно узнать здесь на русском или на официальном сайте — на английском.

В качестве заключения.

  • В принципе, нам ничего не мешает управлять всеми аспектами гостевой машины из браузера. Webmin уже установлен, осталось только настроить VirtualBox Web Console с его замечательным VirtualBox RDP Web Control (по сути RDP клиент, написанный на Flash).
  • Не забывайте запускать apt-get update и apt-get autoupgrate на своем сервере.
  • Данный подход использовался для создания маршрутизатора, фильтра сообщений и firwall-а для Windows с помощью Linux. Он был описан в одном из недавних журналов Хакер. Это доказывает ценность данного подхода и незаменимость при некоторых обстоятельствах.
  • Вместо настройки сетевого моста можно использовать альтернативный вариант маршрутизации, основанный на возможности VirtualBox перебрасывать порты с хостовой машины на гостевую.

Метки:, , , ,

16 комментариев в “Установка виртуального LAMP сервера на оcнове VirtualBox и Ubuntu”

  1. Только что столкнулся с несовершенством предложенной сдесь настройки сети. У меня виртуальна машина бегает на лаптопе, и получает IP через DHCP — вообщем стандартно. Многие рутеры бегают не на 192.168.10.1 с маской 255.255.255.0, а напимер 192.168.0.1… В этих случаях статический IP виртуальной машины остается не у дел. Чтобы не морочится с маршрутизацией, лучше использовать проброс портов, о нем я расскажу подробней в следующих статьях.

  2. По поводу установки гостевых дополнений, не нужно создавать новый каталог cdrom2, просто переходите в cdrom он автоматически монтирует диск.

  3. Кстати, совсем не обязательно указывать UUID для запуска машины без окна, я вводил обычное название виртуальной машины в кавычках в место UUID

  4. Да, с названием все верно. В статье о Bitnami, как раз использую имена.

    А вот насчет cdrom, вам повезло. У меня он был, но при монтирован к чему-то «пустому».

  5. Огромное спасибо, все очень подробно расписано 🙂
    Статья очень полезная, добавляю в букмаркс 🙂

  6. Привет. К сожалению, виртуальная машина отъедает от доступного системе объема памяти ровно столько, сколько ей выделено через менеджер. Вот:

    http://leonid.shevtsov.me/ru/s.....ya-mashina

  7. Можно использовать http://www.turnkeylinux.org/lampstack

  8. Здравствуйте, скажите пожалуйста, столкнулся с проблемой открытия вирт машины под VirtualBox для основного хоста на win 7/64, также нужно открыть вирт машину(Ubuntu Srevet 11.10) для доступа из интернета.
    На основной системе два сетевых адаптера, первый смотрит в интернет а второй в локальную сеть.

    Пожалуйста помогите настроить все это, так как знаний в этом почти ноль и добусь уже неделю…
    Спасибо.

  9. Насколько я понимаю, вам нужно настроить тунелирование трафика из интернета в вирт.машину? Для этого нужно разрешить форвардинг трафика в windows это делается с помощью реестра. Все руки не доходят дописать пост про настройку..

  10. Здравствуйте, проблема вот в чем:
    Основная машина (Windows 7/64) + VirtualBox 4.1.8 + Гость (Ubuntu Server 10.04)

    На основной машине два сетевых интерфейса.
    Первый смотрит в интернет статический белый IP 195.88.x.x
    Второй 192.168.137.1 смотрит в локалку.

    Для первого адаптера IP 195.88.x.x — общий доступ к подключении интернета-> разрешен.

    В гостевой ВиртМашине — УБУНТУ:
    \etc\network\interfaces

    # This file describes the network interfaces available on your system
    # and how to activate them. For more information, see interfaces(5).

    # The loopback network interface
    auto lo
    iface lo inet loopback

    # The primary network interface
    # auto eth0
    # iface eth0 inet dhcp
    auto eth0
    iface eth0 inet static
    address 192.168.137.20
    netmask 255.255.255.0
    gateway 192.168.137.1
    broadcast 192.168.137.255
    network 192.168.137.0

    Для вирт.машины указан — Сетевой мост и выбран интерфейс Локальной сети(192.168.137.1)

    Также в Основной системе в настройках первого адаптера IP 195.88.x.x — Свойства — Доступ — Настройка — стоит галочка возле «Веб сервер HTTP» и указан IP Гостя->ВиртМашину (Ubuntu) 192.168.137.20

    На Гостевой — установлен Apache

    Интернет есть везде.
    С основной машины пингуется гость.
    С гостя при включеном брандмауре(Windows) — Основная не пингуется, при выключеном брендмауре — пингуется.
    Также при включеном брандмауре нет пинга основной машины с http://ping.eu/ping/ первого даптера( IP 195.88.x.x).
    Основная недоступна из инета при любом положении брандмауера.

    Задача — сделать Гостя доступным из интернета+ взаимодрступность между хостом, гостем и локалкой.

    Если не трудно чуть подробней где это настраивать.

    Спасибо.

  11. А какой ИП вы хотите чтобы был виден из интернета?
    Как я понимаю, у вас один ИП и виртуальная сеть (сеть между VM гостям) уже внутренняя.
    Если я правильно понимаю, тут поможет только пророс портов — тоже самое что делают на рутерах.

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

    вот как раз проброс поротв в винде я и непонимаю как сделать правельно.
    пытался ставить галки(писал уже в пред сообщениях) и открывал порты 80 в брандмауре винды.
    хз, невидно. хотя после этих действий порт из вне показывает как открытый.

    спс.

  13. проброс портов делаестся из UI управления виртуальными машинами уже в принципе с давних пор. Тут описание как это сделать с консоли.

  14. да, я выставляль в NAT и делал проброс через VBox с внешнего IP(виден с интернета) на IP гостя (IP host -> IP guest 10.0.2.15)
    НО, в логах доступа видно что к сайту обращается IP 10.0.2.2 а не внешний IP посетителя.
    Как это можно решить?

  15. Сервер должен писать удаленный ип, тот, куда надо ответить. У вас получается, что сервер работает как прокси. В качестве хотера сайта апач используется?

  16. Спасибо вам, очень дельные рекомендации.