Устанавливаем гипервизор lguest

Материал из Gentoo Linux Wiki

Перейти к: навигация, поиск
Вернуться в раздел советов

Содержание

[править] Введение

Начиная с версии 2.6.23 в ядре появился новый гипервизор lguest. В отличие от KVM он не требует поддержки аппаратной виртуализации (VT от Intel или SVM от AMD). Установка производилась на системе с ядром 2.6.24-gentoo-r3. Подход, который использует lguest, состоит в том, чтобы превратить ядро Linux в гипервизор простой загрузкой модуля ядра. Модуль ядра экспортирует устройство, называемое /dev/lguest, которое делает возможным гостевой режим ядра (вдобавок к обычным режимам ядра и пользователей). С dev/lguest VM имеет свое собственное адресное пространство, отдельное от адресного пространства ядра или любых других работающих VM. lguest просто превращает ядро Linux в гипервизор (когда вы инсталлируете модуль ядра lg). Так как гипервизор является стандартным ядром Linux, он получает преимущества от изменений в стандартном ядре (поддержка памяти, планировщик и т.д.). Оптимизация этих компонент Linux дает преимущества как гипервизору (базовая операционная система), так и гостевой операционной системе Linux. Но lguest – не первая машина, которая делает это. UML уже ранее трансформировал ядро Linux в гипервизор.

[править] Настройка ядра

Проверяем опции загруженного ядра $ zgrep <опция> /proc/config.gz

Code: Проверяем следующие опции
CONFIG_EXPERIMENTAL=y
CONFIG_PARAVIRT=y
CONFIG_LGUEST_GUEST=y 
CONFIG_HIGHMEM64G=n 
CONFIG_PHYSICAL_ALIGN=0x100000
CONFIG_TUN=m или y
CONFIG_LGUEST=m или y
CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_NET=y
CONFIG_EXT2_FS=y  если ФС образа диска VM - ext2

Если результат отличается то вам придется пересобрать ядро.

[править] Собираем "lguest"

Code: Сборка lguest
cd /usr/src/linux/Documentation/lguest/
make
ln -s /usr/src/linux/Documentation/lguest/lguest /bin/lguest

Linux Kernel Configuration:
General setup:
  Prompt for development and/or incomplete code/drivers = Y

Linux Kernel Configuration:
Processor type and features:
   Paravirtualized guest support = Y
    Lguest guest support = Y
  High Memory Support = off/4GB
  Alignment value to which kernel should be aligned = 0x100000

Linux Kernel Configuration:
Device Drivers:
  Network device support
   Universal TUN/TAP device driver support = M/Y  
  Virtualization
   Linux hypervisor example code = M/Y

[править] Запуск/останов lguest

Создаем файлы запуска/останова виртуальной машины далее VM.

File: /bin/lgueststart                    
#!/bin/bash
modprobe lg
modprobe tun
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 >  /proc/sys/net/ipv4/ip_forward
/bin/lguest 64m /boot/vmlinuz --tunnet=192.168.19.1 \
--block=/home/<user>/rootfile  root /dev/vda rw

Пдгружаем модули lg (гипервизор) и tun. Далее настраиваем маскарадинг. У VM будет доступ по сети к хост машине но не во внешнюю сеть. Параметры запуска lguest:

64m  - выделяем VM 64M памяти
/boot/vmlinuz - для VM используем то же ядро, что и для хост машины
--tunnet=192.168.19.1 адрес интерфейса tun на хост машине
--block=/home/<user>/rootfile образ диска VM
root=/dev/vda rw  устройство /dev/vda для VM соответствует образу диска rootfile на хост машине.
Файл: /bin/lgueststop
#!/bin/bash
killall lguest
ifconfig tap0 down
tunctl -d tap0
modprobe -r tun
iptables -t nat -F POSTROUTING
echo 0 >  /proc/sys/net/ipv4/ip_forward
modprobe -r ipt_MASQUERADE
modprobe -r iptable_nat   
modprobe -r nf_nat
modprobe -r lg

Убиваем процесс lguest, гасим интерфейс tap и отключаем маскарадинг.

[править] Создаем образ диска VM

[править] Использование готового образа

По адресу [1] забираем образ диска и сохраняем его под именем /home/<user>/rootfile. Монтируем образ диска:

# mount /home/<user>/rootfile /mnt/vm -o loop

и создаем устройство:

# mknod /mnt/vm/dev/hvc0 c 229 0

Этому устройству будет соответствовать первый терминал VM. Можно поправить /mnt/vm/etc/fstab, сказав, что корневое устройство у нас теперь /dev/vda. После размонтирования:

# umount /mnt/vm

можем запускать VM:

# lgueststart
+-----+  +----------------+  +---------------+
| LAN |--|eth0  HOST  tap0|--|eth0  VM lguest|
+-----+  +----------------+  +---------------+

К сожалению в версии 2.6.24 есть баг: tap0 и eth0 VM lguest имеют одинаковый MAC адрес и без рестарта tap0 не увидят друг друга. Поэтому на HOST:

# ifconfig tap0  down
# ifconfig tap0 hw ether 00:FF:91:46:D5:EB 192.168.19.1 up

MAC адрес можно взять любой главное он должен отличаиться от eth0 VM lguest. Теперь на VM можем поднять eth0

# ifconfig eth0 192.168.19.5

[править] Создаем Gentoo VM

Теперь создадим образ диска на базе stage3. Создаем файл образа размером 300M

dd if=/dev/zero of=rootfile bs=1M count=300

Создаем файловую систему (использовал reiserfs у вас будет ext2)

# mkreiserfs -f -s 600 /home/<user>/rootfile 

монтируем ее:

# mount /home/<user>/rootfile /mnt/vm -o loop
# cd /mnt/vm

и распаковываем stage3

# tar xvjpf /home/<user>/stage3-x86-2007.0.tar.bz2

создаем hvc0

# mknod /mnt/vm/dev/hvc0 c 229 0

Добавляем hvc0 в файл /mnt/vm/etc/securetty Как и ранее правим /mnt/vm/etc/fstab В файле /mnt/vm/etc/inittab секцию

# TERMINALS
c1:12345:respawn:/sbin/agetty 38400 tty1 linux
c2:2345:respawn:/sbin/agetty 38400 tty2 linux
c3:2345:respawn:/sbin/agetty 38400 tty3 linux
c4:2345:respawn:/sbin/agetty 38400 tty4 linux
c5:2345:respawn:/sbin/agetty 38400 tty5 linux
c6:2345:respawn:/sbin/agetty 38400 tty6 linux

меняем на:

# TERMINALS
c1:12345:respawn:/sbin/agetty 38400 hvc0 linux
#c2:2345:respawn:/sbin/agetty 38400 tty2 linux
#c3:2345:respawn:/sbin/agetty 38400 tty3 linux
#c4:2345:respawn:/sbin/agetty 38400 tty4 linux
#c5:2345:respawn:/sbin/agetty 38400 tty5 linux
#c6:2345:respawn:/sbin/agetty 38400 tty6 linux

правим /mnt/vm/etc/conf.d/net. Как и ранее статический адрес 192.168.19.5 В файл /mnt/vm/etc/udev/rules.d/70-persistent-net.rules добавляем строку:

SUBSYSTEM=="net", DRIVERS=="?*", NAME="eth0"

Иначе при каждом следующем старте VM номер eth будет увеличиваться поскольку каждый раз MAC адрес новый. Копируем модули нашего ядра из /lib/modules в /mnt/vm/lib/modules. Меняем конфигурационные файлы в соответствии с Руководством по установке Gentoo. Не забываем сделать chroot и поменять пароль. Размонтируем образ:

# umount /mnt/vm

[править] Запуск VM

Запуск VM производим как описано выше:

1. lgueststart
2. Рестартуем tap на хосте
3. Поднимаем eth0 на VM
4. На VM по комбинации <Ctrl-o> доступно следующее меню управления:


SysRq : HELP : loglevel0-8 reBoot tErm Full kIll saK showMem
Nice powerOff showPc show-all-timers(Q) unRaw Sync showTasks
Unmount shoW-blocked-taskshardware virtualization extensions - Intel's

Например при нажатии <Ctrl-o> <m> получаем


SysRq : Show Memory
Mem-info:
DMA per-cpu:
CPU    0: Hot: hi:    0, btch:   1 usd:   0   Cold: hi:    0,    btch:   1
usd:   0
Normal per-cpu:
CPU    0: Hot: hi:    6, btch:   1 usd:   4   Cold: hi:    2, btch:   1
usd:   0
Active:1556 inactive:1284 dirty:0 writeback:0 unstable:0
free:11604 slab:738 mapped:396 pagetables:9 bounce:0
DMA free:12856kB min:252kB low:312kB high:376kB active:0kB inactive:0kB
present:16256kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 47 47
CPU    0: Hot: hi:    0, btch:   1 usd:   0   Cold: hi:    0, btch:   1
usd:   0
Normal per-cpu:
CPU    0: Hot: hi:    6, btch:   1 usd:   4   Cold: hi:    2,   btch:   1
usd:   0
Active:1556 inactive:1284 dirty:0 writeback:0 unstable:0
free:11604 slab:738 mapped:396 pagetables:9 bounce:0
DMA free:12856kB min:252kB low:312kB high:376kB active:0kB   inactive:0kB
present:16256kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 47 47
Normal free:33560kB min:760kB low:948kB high:1140kB active:6224kB
inactive:5136kB present:48768kB pages_scanned:0  all_unreclaimable? no
lowmem_reserve[]: 0 0 0
DMA: 4*4kB 3*8kB 5*16kB 2*32kB 2*64kB 4*128kB 3*256kB 0*512kB 1*1024kB
1*2048kB 2*4096kB = 12856kB
Normal: 10*4kB 38*8kB 44*16kB 8*32kB 2*64kB 1*128kB 3*256kB 3*512kB
1*1024kB 2*2048kB 6*4096kB = 33560kB
Swap cache: add 0, delete 0, find 0/0, race 0+0
Free swap  = 0kB
Total swap = 0kB
Free swap:            0kB
16384 pages of RAM
0 pages of HIGHMEM
1026 reserved pages
1131 pages shared
0 pages swap cached
0 pages dirty
0 pages writeback

[править] Примечание

Примечание: При использовании tap VM из внешней сети не видна. Если нужен доступ к VM из внешней сети используем --tunnet bridge:<bridgename>. Подробно о том как настроить bridge читаем Альтернативная настройка с помощью Bridge

[править] Достоинства и недостатки

+ Не требует накладывать патчи на ядро.
+ Использует ядро как гипервизор.
+ Не требует поддержки аппаратной виртуализации. 
+ Компактный код 5000 строк.
- ОС для VM только Linux.
- Не использует аппаратные средства виртуализации.
- Нет динамического распеределения ресурсов для VM. 
- Нет поддержки кластеров.
- В коде пока много багов.

[править] Ссылки по теме

Домашняя страница lguest
Здесь можно задать вопрос автору lguest
Kernel hacking hacking on lguest media1
Kernel hacking hacking on lguest media2
lguest64 - a new breed of puppies
Личные инструменты