Wirtualizacja

Przygotował Łukasz Jarosz

Pojęcia podstawowe

Host, a Hypervisor

Guest

Rodzaje wirtualizacji

  • Emulacja API (np. Wine)
  • Pełna wirtualizacja (np. QEMU, Virtualbox, Hyper-V, VMWare)
  • Parawirtualizacja (np. LXC, Jails, OpenVZ)

Pełna wirtualizacja

Instacja systemu gościa (łącznie z kernelem) zostaje uruchomiona w pamięci i przez specjalne oprogramowanie uzyskuje dostęp do fizycznych zasobów hosta (takich jak procesor, karta graficzna, karty sieciowa)

Ale czy to nie jest przypadkiem wolne?

Intel VT to the rescue!

No, ale gdzie niby ten zysk?

Przecież pewnie potrzeba kolejnych sterowników!

KVM (Kernel Virtualization Manager) - moduł kernela pozwalający korzystać ze sprzętowego wsparcia wirtualizacji na poziomie systemu hosta

Parawirtualizacja

Polega na utworzeniu instacji systemu gościa tzw. kontenera, który uruchamia własne procesy korzystając wciąż z tego samego jądra co host

Opss...

namespaces i pivot root

Obydwa zapewniaja rozdział kontenerów od systemu hosta

Czas na konkrety...

W przypadku pełnej wirtualizacji

QEMU+KVM czy VMware czy też może coś innego?


Natomiast przy parawirtualizacji

LXC czy OpenVZ? A może Jails?

Czemu tandem KVM+QEMU?

Bogate wsparcie i szeroko używany w środowiskach produkcyjnych

LXC vs OpenVZ

OpenVZ LXC
  • Dużo materiałów i użytkowników produkcyjnych
  • Szeroki zestaw opcji
  • Względnie bezpieczny
  • Wymaga użycia patchowanego kernela (stare jądro)
  • Skąpa dokumentacja na dodatek częste zmiany API
  • Problemy z bezpieczeństwem
  • Rozwijany przez twórców Linuxa, czyli dostępny w niezmodyfikowanym jądrze

No to może w końcu coś zrobimy?

Wysokopoziomowy interfejs zarządzania wirtualnymi instancjami

Podstawy użytkowania libvirt

						
#!/bin/bash
# otwarcie interaktywnego shell'a
virsh;
virsh qemu:///system;

virsh list --all; # wywołanie listy instancji
virsh nodeinfo; # informacje o hoście

						
					

Ubuntu Cloud Images

cloud-images.ubuntu.com

Przykładowa konfiguracja

<domain type="kvm">
	<name>dom0</name>
	<uuid>a4e195933a4fb0e8ba1dfc29df874de4</uuid>
	
	<os>
		<type arch="x86_64">hvm</type>
		<boot dev="hd" />
		<kernel>/mnt/images/0387162d08a5a81423e8e3c325fb6cd2/saucy-server-cloudimg-amd64-vmlinuz-generic</kernel>
		<cmdline>ro init=/usr/lib/cloud-init/uncloud-init root=/dev/vda ds=nocloud ubuntu-pass=ubuntu</cmdline>
	</os>
	
	<vcpu placement="static">2</vcpu>
	<memory unit="MB">512</memory>
	
	<on_poweroff>destroy</on_poweroff>
	<on_reboot>restart</on_reboot>
	<on_crash>destroy</on_crash>
	
	<devices>
		<emulator>/usr/bin/qemu-system-x86_64</emulator>
		
		<disk type="file" device="disk">
			<source file="/mnt/images/0387162d08a5a81423e8e3c325fb6cd2/saucy-server-cloudimg-amd64.img" />
			<target dev="vda" />
		</disk>
		
		<console type="pty">
			<target port="0" />
		</console>
		<graphics type="vnc" port="-1" autoport="yes" />
	</devices>
</domain>

Sieć dla wirtualizacji

Bridges

Konfiguracja w libvirt

<interface type="bridge">
	<source bridge="br10" />
	<mac address="00:16:3e:5d:c7:9e" />
	<model type="virtio" />
</interface>

Gotowa konfiguracja do pobrania z http://lectures.jarosz.in/wirtualizacja/dom.xml

Pierwsza wirtualka

#!/bin/bash
virsh define dom.xml;
virsh start dom0;
						

Sposób na dostęp

  • VNC
  • virsh console
  • ssh

Sprzątanie

#!/bin/bash
virsh destroy dom0;
virsh undefine dom0;

LXC (LinuX Containers)

Szybkie wprowadzenie

#!/bin/bash
lxc-create -n container -B lvm --fssize 1G --vgname storage-vg -t ubuntu -- -b user;
lxc-start -n container -d;
lxc-ls --fancy;
					

Pliki konfiguracyjne LXC

Znajdują się w /var/lib/lxc/nazwa_kontenera/


lxc.network.type = veth
lxc.network.hwaddr = 00:16:3e:8b:5c:0a
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.rootfs = /var/lib/lxc/test/rootfs
lxc.mount = /var/lib/lxc/test/fstab
lxc.pivotdir = lxc_putold

lxc.devttydir = lxc
lxc.tty = 4
lxc.pts = 1024

lxc.utsname = test
lxc.arch = amd64
lxc.cap.drop = sys_module mac_admin mac_override sys_time

# When using LXC with apparmor, uncomment the next line to run unconfined:
#lxc.aa_profile = unconfined

# To support container nesting on an Ubuntu host, uncomment next two lines:
#lxc.aa_profile = lxc-container-default-with-nesting
#lxc.hook.mount = /usr/share/lxc/hooks/mountcgroups

lxc.cgroup.devices.deny = a
# Allow any mknod (but not using the node)
lxc.cgroup.devices.allow = c *:* m
lxc.cgroup.devices.allow = b *:* m
# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rm
# fuse
lxc.cgroup.devices.allow = c 10:229 rwm
# tun
lxc.cgroup.devices.allow = c 10:200 rwm
# full
lxc.cgroup.devices.allow = c 1:7 rwm
# hpet
lxc.cgroup.devices.allow = c 10:228 rwm
# kvm
lxc.cgroup.devices.allow = c 10:232 rwm		

Ale co zrobić jak ktoś puści mi forka w pętli while 1?

cgroups

lxc-cgroup -n kontener nazwa.cgroup

Ale skąd wziąć nazwę cgroup?

Prosty przepis

#!/bin/bash
mount; #szukamy cgroups
ls /katalog_z_mount/; # i to wszystko

Przykład rozwiązania

#!/bin/bash
lxc-cgroup -n kontener memory.limit_in_bytes `expr 256 \* 1024 \* 1024`;
lxc-cgroup -n kontener cpu.shares 256;

Na koniec mały projekt :)

Akamai wannabe

Wirtualizacja dla mas

Co dalej?

Propozycje tematów kolejnych prezentacji i warsztatów

Budowanie klastrów

Zaawansowane sieci dla maszyn wirtualnych

Dziękuje za wysłuchanie!