Показаны сообщения с ярлыком виртуализация. Показать все сообщения
Показаны сообщения с ярлыком виртуализация. Показать все сообщения

воскресенье, 24 марта 2013 г.

NAT для VirtualBox с возможностью прямого доступа к виртуальным машинам с хоста

Когда создавал новую виртуальную машину в Virtualbox (Ubuntu 12.04 LTS) решил спрятать его за NAT в виртуальной сети, но таким образом чтобы иметь возможность достучаться до него напрямую через SSH.
Для этой цели поднял виртуальный сетевой интерфейс, настроил NAT, настроил раздачу айпи и обработку DNS-запросов создаваемой виртуальной сети:

  1. Устанавливаем пакет uml-utilities с утилитой для создания интерфейса tap0
    $ sudo apt-get install uml-utilities
    В файл «/etc/network/interfaces» добавляем описание нового интерфейса
    auto tap0
    iface tap0 inet static
            address 10.0.55.1
            netmask 255.255.255.0
     pre-up /usr/sbin/tunctl -t tap0
     post-down /usr/sbin/tunctl -d tap0
    Поднимаем новый интерфейс
    $ sudo ifup tap0
  2. Теперь настраиваем NAT. Для этой цели используем идущее с системой средство настройки брандмауэра ufw. Редактируем файл «/etc/ufw/before.rules» и добавляем в самом начале строки
    *nat
    :POSTROUTING ACCEPT [0:0]
    -F POSTROUTING
    -A POSTROUTING -s 10.0.55.0/24 -j MASQUERADE
    COMMIT
    Редактируем файл «/etc/default/ufw» и меняем следующие параметры
    DEFAULT_INPUT_POLICY="ACCEPT"
    DEFAULT_OUTPUT_POLICY="ACCEPT"
    DEFAULT_FORWARD_POLICY="ACCEPT"
    Запускаем ufw
    $ sudo ufw enable
  3. Чтобы каждый раз вручную не прописывать айпишники днс-сервера вновь созданным виртуальным машинам устанавливаем dnsmasq
    $ sudo apt-get install dnsmasq
    В файл конфигурации «/etc/dnsmasq.conf» добавляем следующие строки
    # Слушаем порты только на указанном интерфейсе
    bind-interfaces
    # Слушаем на созданном нами интерфейсе
    interface=tap0
    # Не слушаем на локальном интерфейсе. Там как правило слушает запущенный Netwok Manager процесс dnsmasq
    except-interface=lo
    # Диапазон раздаваемых по DHCP адресов виртуальным машинам.
    dhcp-range=10.0.55.10,10.0.55.200,72h
    # Домен создаваемой сети
    domain=virtual
    Запускаем dnsmasq с новыми настройками
    $ sudo service dnsmasq stop
    $ sudo service dnsmasq start

четверг, 24 февраля 2011 г.

OpenVZ: Упрощение автомонтирования разделов

Чтобы не писать для каждой гостевой машины по два скрипта, для монтирования и демонтирования разделов или директорий, создал один универсальный для всех. Сохраняем представленный ниже скрипт в директории «/etc/vz/scripts» под именем «mount» и назначаем ему права на выполнение. Далее, в директории «/etc/vz/conf» создаем симлинки скрипта под именем «VEID.mount» и «VEID.umount», где VEID – идентификатор гостевого хоста. В этой директории создаем еще один файл под именем «VEID.fstab», где прописываем монтируемые разделы в формате «fstab». Обратите внимание, что точки монтирования должны указываться с корневого раздела «/» гостевого хоста.

Собственно сам скрипт:

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

source /etc/vz/vz.conf
source ${VE_CONFFILE}

FSTAB="$(dirname $0)/${VEID}.fstab"
ACTION="$(basename $0 | sed -r 's/^[^\.]+\.//')"

if [ -e "$FSTAB" ]
then
        if [ $ACTION = "mount" ]
        then
                cat "$FSTAB" | sed -r "/^(#|$)/d" | \
                        awk -v VE_ROOT="${VE_ROOT}" '{ print "-t " $3 " -o " $4 " " $1 " " VE_ROOT $2; }' | \
                        xargs -n 1 -d'\n' -I{} sh -c 'echo mount {}; /bin/mount {};'
        elif [ $ACTION = "umount" ]
        then
                cat "$FSTAB" | sed -r "/^(#|$)/d" | \
                        awk -v VE_ROOT="${VE_ROOT}" '{ print VE_ROOT $2; }' | \
                        xargs -n 1 -d'\n' -I{} sh -c  'echo umount {}; /bin/umount {};'
        fi
fi

exit 0

понедельник, 4 мая 2009 г.

Скрипт для корректного выключения гостевых хостов в libvirt

Ввиду неспособности libvirt-bin корректно отключать гостевые хосты при выключении/ребуте сервера, решил написать свой скрипт

#!/bin/sh
### BEGIN INIT INFO
# Provides: kvm-shutdown
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Shutdown Guest KVM Hosts
# Description: Shutdown Guest KVM Hosts
### END INIT INFO

# Author: Князь <demiurg (at) propheta.ru>
#

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Shutdown Guest KVM Hosts"
NAME=kvm-shutdown
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "/usr/bin/virsh" ] || exit 0
[ -S "/var/run/libvirt/libvirt-sock" ] || exit 0

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

export LANG=C

#
# Function that stops the daemon/service
#
virsh_list()
{
virsh list 2>/dev/null | grep -E 'running$' | awk '{ print $2 }'
}

do_stop()
{
LIST=$(virsh_list)
for i in $LIST;
do
virsh shutdown $i 1>/dev/null 2>/dev/null
echo
echo -n "Shutdown $i ";
while [ "$(virsh_list | grep $i)" ];
do
echo -n '.'
sleep 2
done;
done;
if [ "$LIST" ]; then echo; fi;
}

case "$1" in
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Activating $DESC" "$NAME"
do_stop
case "$?" in
0|1)
[ "$VERBOSE" != no ] && log_end_msg 0
break
;;
2)
[ "$VERBOSE" != no ] && log_end_msg 1
break
;;
esac
break
;;
*)
echo "Usage: $SCRIPTNAME stop" >&2
exit 3
;;
esac
Сохраняем скрипт в файл «/etc/init.d/kvm-shutdown» и делаем его исполняемым
$ sudo chmod +x /etc/init.d/kvm-shutdown
Создаем символические ссылки в rc0, rc1, rc6
$ sudo ln -s ../init.d/kvm-shutdown /etc/rc0.d/K19kvm-shutdown
$ sudo ln -s ../init.d/kvm-shutdown /etc/rc1.d/K19kvm-shutdown
$ sudo ln -s ../init.d/kvm-shutdown /etc/rc6.d/K19kvm-shutdown
Префикс K19 выбран для того, чтобы скрипт запускался перед «/etc/init.d/libvirt-bin» (префикс K20)

суббота, 13 декабря 2008 г.

Доступ к гостевой машине в Virtualbox

Сетевое соединение гостевой машины в VirtualBox по умолчанию настраивается через NAT. Одним из плюсом является простая настройка. Но в то же время невозможно соединиться с открытыми портами на гостевой машине, что бывает необходимо в экспериментах с сетевыми сервисами.
Решение заключается в пробросе (туннелировании) порта в виртуальное окружение.

Делается это следующим образом

  1. Порт, который будем пробрасывать «внутрь»
    $ VBoxManage setextradata "GuestMachineName" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort" 2222
  2. С каким портом гостевой машины надо соединяться
    $ VBoxManage setextradata "GuestMachineName" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/GuestPort" 22
  3. По какому протоколу
    $ VBoxManage setextradata "GuestMachineName" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/Protocol" TCP
  4. Выключаем и снова включаем гостевую машину.
  5. Попытаемся соединиться
    $ ssh -p 2222 user@localhost
Можно проверить введённые параметры
$ VBoxManage getextradata "GuestMachineName" enumerate
или удалить уже заданный параметр, задав ему пустое значение
$ VBoxManage setextradata "GuestMachineName" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/GuestPort"

среда, 3 сентября 2008 г.

Как отключить автоопределение типа сетевого подключения в Ubuntu

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

  1. Узнаем подробности про сетевой интерфейс etho
    $ sudo ethtool eth0
    Settings for eth0:
    Supported ports: [ TP MII ]
    Supported link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    Advertised auto-negotiation: Yes
    Speed: 100Mb/s
    Duplex: Half
    Port: MII
    PHYAD: 1
    Transceiver: internal
    Auto-negotiation: on
    Supports Wake-on: pumbg
    Wake-on: d
    Current message level: 0x00000001 (1)
    Link detected: yes
  2. Теперь меняем скорость, дуплекс и автоопределение
    $ sudo ethtool -s eth0 speed 10 duplex full autoneg off
  3. Смотрим еще раз состояние eth0
    $ sudo ethtool eth0
    Settings for eth0:
    Supported ports: [ TP MII ]
    Supported link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    Advertised auto-negotiation: Yes
    Speed: 10Mb/s
    Duplex: Full
    Port: MII
    PHYAD: 1
    Transceiver: internal
    Auto-negotiation: off
    Supports Wake-on: pumbg
    Wake-on: d
    Current message level: 0x00000001 (1)
    Link detected: yes
  4. Если все устраивает редактируем файл конфигурации «/etc/network/interfaces»
    auto eth0
    iface eth0 inet static
    address 192.168.0.7
    netmask 255.255.255.0
    gateway 192.168.0.1
    up /usr/sbin/ethtool -s $IFACE speed 10 duplex full autoneg off
    В случае, если адрес берется по dhcp
    auto eth0
    iface eth0 inet dhcp
    up /usr/sbin/ethtool -s $IFACE speed 10 duplex full autoneg off
  5. Когда на машине используется Xen, сетевые интерфейсы «ethX» становятся виртуальными. Сами физические интерфейсы обозначаются как «pethX».
    Действия, описанные в пунктах 1-3, выполняем с интерфейсом peth0.

    В «/etc/network/interfaces» добавляем
    auto peth0
    iface peth0 inet manual
    up ifconfig $IFACE up
    up /usr/sbin/ethtool -s $IFACE speed 10 duplex full autoneg off

пятница, 29 августа 2008 г.

Как увеличить размер раздела UFS

Небольшое отступление. В DomU на Ubuntu запущена FreeBSD с некими сервисами и которым стало не стало хватать свободного места, а ее файловая система размещена в логическом томе LVM «Xen_freebsd» из группы томов «Ubuntu».

  • Увеличим размер логического тома «Xen_freebsd»
    # lvresize -L +32G /dev/Ubuntu/Xen_freebsd
    Extending logical volume Xen_freebsd to 48,00 GB
    Logical volume Xen_freebsd successfully resized
  • Заходим по VNC на виртуальную машину и перезагружаем в однопользовательский режим.
  • Следующим шагом растягиваем слой (slice) на весь диск
    # fdisk -I /dev/ad0
  • Редактируем таблицу разделов и растягиваем [последний] раздел с данными на свободное место
    # disklabel -e /dev/ad0
    Вместо размера раздела «c» и раздела с данными (в моем случае это «h») ставим звездочку «*». Вместо звездочки будут подставлены нужные значения.
    # /dev/ad0s1:
    8 partitions:
    # size offset fstype [fsize bsize bps/cpg]
    a: 524288 0 4.2BSD 2048 16384 32776
    b: 2097152 524288 swap
    c: * 0 unused 0 0 # "raw" part, don't edit
    d: 524288 2621440 4.2BSD 2048 16384 32776
    e: 1048576 3145728 4.2BSD 2048 16384 8
    f: 1048576 4194304 4.2BSD 2048 16384 8
    g: 2097152 5242880 4.2BSD 2048 16384 28552
    h: * 7340032 4.2BSD 2048 16384 28552
    Сохраняем таблицу и выходим из программы.
  • Увеличиваем размер файловой системы
    # growfs /dev/ad0s1h
    На вопрос программы о бэкапе данных отвечаем утвердительно.
  • Проверяем файловую систему
    # fsck -y /dev/ad0s1h
  • Выходим из однопользовательского режима
    # exit