Pentru a pregăti configurația de laborator va trebui să descărcați pe mașina fizică (mjolnir
), în directorul saisp/
, arhiva laboratorului:
student@mjolnir:~$ cd saisp/ student@mjolnir:~/saisp$ wget --user=user-curs --ask-password http://repository.grid.pub.ro/cs/saisp/laboratoare/lab-07.zip student@mjolnir:~/saisp$ unzip lab-07.zip
În urma dezarhivării rezultă mai multe fișiere imagine KVM și un script de pornire a mașinilor virtuale:
base.qcow2
este deja în directorul saisp/
și este baza pentru celelalte.saisp-vm-1.qcow2
este obținut din base.qcow2
și este folosit pentru pornirea masinii virtuale.Pentru a porni mașina virtuala, vom folosi comanda:
student@mjolnir:~/saisp$ ./lab07-start-kvm
După pornirea mașinii virtuale KVM, o putem accesa prin folosirea SSH către adresa IP aferenta. Vom folosi comanda:
student@mjolnir:~/saisp$ ssh root@10.0.0.10
LXC este o implementare pentru Linux a virtualizarii la nivelul sistemului de operare. Incepand cu versiunea 2.6.29 a nucleului Linux, este integrata in mainline, ceea ce inseamna ca orice imagine de nucleu Linux poate oferi suport pentru LXC.
Cele mai importante aspecte legate de LXC si virtualizarea la nivelul sistemului de operare sunt:
Verificati daca nucleul din masina gazda (saisp-vm-1) suporta LXC, folosind comanda lxc-checkconfig
.
Apoi, verificati daca sistemul de fisiere virtual de tip “cgroup” este montat.
Masina virtuala saisp-vm-1 contine un container deja creat, cu numele ct1
.
Folosind comanda lxc-start
, vom porni containerul:
root@saisp-vm-1:~# lxc-start -n ct1 INIT: version 2.88 booting Using makefile-style concurrent boot in runlevel S. Cleaning up ifupdown.... Setting up networking.... Activating lvm and md swap...done. Checking file systems...fsck from util-linux-ng 2.17.2 done. Mounting local filesystems...done. Activating swapfile swap...done. Cleaning up temporary files.... Setting kernel variables ...done. ... Cleaning up temporary files.... INIT: Entering runlevel: 3 Using makefile-style concurrent boot in runlevel 3. Starting OpenBSD Secure Shell server: sshd. Debian GNU/Linux 6.0 ct1 console ct1 login:
Observam ca terminalul este atasat la container, acesta fiind pornit in foreground.
Pentru a va loga in container, folositi credentialele root / root.
Vom opri containerul din interiorul acestuia, ca pe orice statie Linux, folosind halt
:
root@ct1:~# halt Broadcast message from root@ct1 (console) (Sun Apr 13 18:22:16 2014): The system is going down for system halt NOW! INIT: Switching to runlevel: 0 INIT: Sending processes the TERM signal root@ct1:~# Using makefile-style concurrent boot in runlevel 0. mount: / is busy root@saisp-vm-1:~#
O varianta mai comoda este pornirea containerului in background. Vom adauga parametrul -d
la comanda lxc-start
:
root@saisp-vm-1:~# lxc-start -n ct1 -d
Verificam starea containerului folosind lxc-info
:
root@saisp-vm-1:~# lxc-info -n ct1 state: RUNNING pid: 8269
Pentru a putea interactiona cu un container pornit in background, trebuie sa ne conectam la consola acestuia. Folosim comanda lxc-console
:
root@saisp-vm-1:~# lxc-console -n ct1 Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself Debian GNU/Linux 6.0 ct1 tty1 ct1 login:
Apoi, ne putem deconecta, fara a opri containerul, folosind combinatie de taste CTRL+A, Q.
Folositi comanda lxc-info
pentru a afla PID-ul containerului ct1
. Acest PID este al procesului init
corespunzator containerului. Restul proceselor din container vor fi copii ai acestui proces init
.
Atasati-va la consola containerului, logati-va, apoi detasati-va de la consola.
Pe saisp-vm-1, afisati intreaga ierarhie de procese:
root@saisp-vm-1:~# pstree -p init(1)─┬─acpid(1542) ├─atd(1565) ├─cron(1652) ├─dbus-daemon(1602) ├─exim4(1902) ├─getty(1959) ├─getty(1960) ├─getty(1961) ├─getty(1962) ├─getty(1963) ├─getty(1964) ├─lxc-start(8267)───init(8269)─┬─getty(8508) │ ├─getty(8510) │ ├─getty(8511) │ ├─getty(8512) │ ├─login(8509)───bash(8751) │ └─sshd(8478) ├─rpc.idmapd(1237) ├─rpc.statd(1223) ├─rpcbind(1195) ├─rsyslogd(1480)─┬─{rsyslogd}(1485) │ ├─{rsyslogd}(1486) │ └─{rsyslogd}(1487) ├─sshd(1935)───sshd(1965)───bash(1967)───pstree(8762) └─udevd(280)
Observati ca procesul init
corespunzator containerului este copil al procesului lxc-start
.
Putem afisa ierarhia de procese pentru un container si folosind comanda lxc-ps
:
root@saisp-vm-1:~# lxc-ps -n ct1 --forest CONTAINER PID TTY TIME CMD ct1 8269 ? 00:00:00 \_ init ct1 8478 ? 00:00:00 \_ sshd ct1 8508 pts/5 00:00:00 \_ getty ct1 8509 pts/1 00:00:00 \_ login ct1 8751 pts/1 00:00:00 | \_ bash ct1 8510 pts/2 00:00:00 \_ getty ct1 8511 pts/3 00:00:00 \_ getty ct1 8512 pts/4 00:00:00 \_ getty
Apoi, conectati-va la consola containerului si afisati procesele din interiorul acestuia:
root@ct1:~# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 18:34 ? 00:00:00 init [3] root 182 1 0 18:34 ? 00:00:00 /usr/sbin/sshd root 212 1 0 18:34 console 00:00:00 /sbin/getty 38400 console root 213 1 0 18:34 tty1 00:00:00 /bin/login -- root 214 1 0 18:34 tty2 00:00:00 /sbin/getty 38400 tty2 linux root 215 1 0 18:34 tty3 00:00:00 /sbin/getty 38400 tty3 linux root 216 1 0 18:34 tty4 00:00:00 /sbin/getty 38400 tty4 linux root 217 213 0 18:53 tty1 00:00:00 -bash root 228 217 0 19:00 tty1 00:00:00 ps -ef
Observati ca desi apar aceleasi procese, valorile PID-urilor difera in interiorul containerului si in exteriorul acestuia. Practic, se produce o translatie la nivelul spatiului de procese.
Sistemul de fisiere al unui container se gaseste stocat pe masina gazda sub calea:
/var/lib/lxc/NUME/rootfs/
Astfel se pot partaja foarte usor fisiere intre containere si masina gazda:
/root/
.Pentru a crea in mod facil un container, exista comanda lxc-create. Aceasta:
Sintaxa comenzii este:
lxc-create -n NUME -t TIP
unde TIP
poate fi ales dintre busybox
, debian
, fedora
, sshd
etc.
In urma crearii containerului, va rezulta directorul cu numele /var/lib/lxc/NUME
, ce contine:
config
rootfs/
Creati un nou container, de tip debian
, cu numele ct2
.
Verificati ca a fost creat, folosind lxc-ls
:
root@saisp-vm-1:~# lxc-ls
ct1 ct2
Inspectati fisierul de configurare creat:
root@saisp-vm-1:~# cat /var/lib/lxc/ct2/config
Apoi:
lxc-stop
.In mod implicit, un container are doar o interfata de loopback. Daca dorim sa il conectam cu “exteriorul”, trebuie sa ii adaugam o interfata Ethernet.
Vom adauga urmatoarele linii in fisierul de configurare al containerului ct1
:
lxc.network.type = veth # Virtual ethernet - virtualizare la nivel 2 lxc.network.flags = up # Interfata va fi "up" lxc.network.link = br0 # Containerul va fi legat intr-un "bridge" din masina gazda. lxc.network.name = eth0 # Numele interfetei "vazut" in container. lxc.network.veth.pair = veth0-ct1 # Numele interfetei "vazut" pe masina fizica.
Analog, editati fisierul de configurare al containerului ct2
. Pentru atributul lxc.network.veth.pair
specificati valoarea veth0-ct2
.
In prealabil, bridge-ul br0 trebuie creat pe masina gazda, folosind comanda brctl:
root@saisp-vm-1:~# brctl addbr br0 root@saisp-vm-1:~# ifconfig br0 up
Porniti cele doua containere in background, apoi verificati ca intefetele virtuale au fost adaugate in bridge:
root@saisp-vm-1:~# brctl show bridge name bridge id STP enabled interfaces br0 8000.fe6d63702103 no veth0-ct1 veth0-ct2
Alocati adrese IP din spatiul 192.168.1.0/24
pentru:
br0
de pe masina gazdaeth0
de pe containerul ct1
eth0
de pe containerul ct2
Apoi, testati conectivitatea prin ping
de pe masina gazda catre cele 2 containere.
Pentru a avea conectivitate din containere catre Internet, trebuie sa configuram NAT si sa activam rutarea pe masina gazda:
root@saisp-vm-1:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE root@saisp-vm-1:~# echo 1 > /proc/sys/net/ipv4/ip_forward
Apoi, pe cele doua containere adaugati ruta default si testati conectivitatea.
Virsh este capabil sa gestioneze si containere LXC. Deosebirea este ca nu tine seama de fisierul de configurare creat de lxc-create, ci foloseste propriul fisier de configurare, in format XML.
Creati un nou container, de tip debian
, cu numele ct3
. Nu porniti containerul.
Creati un fisier XML ce va fi folosit in Virsh, dupa modelul de mai jos:
<domain type='lxc'> <name>NUME_CONTAINER</name> <memory>500000</memory> <os> <type>exe</type> <init>/sbin/init</init> </os> <vcpu>1</vcpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <interface type='network'> <source network='default'/> </interface> <console type='pty' /> <filesystem type='mount'> <source dir='CALE_CATRE_ROOTFS'/> <target dir='/'/> </filesystem> </devices> </domain>
Porniti virsh, conectandu-va la URI-ul corespunzator LXC:
root@saisp-vm-1:~# virsh -c lxc:/// Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands 'quit' to quit virsh #
In Virsh, efectuati urmatoarele operatii:
virsh # define ct3.xml
Domain ct3 defined from ct3.xml
net-start default
virsh # start ct3
Domain ct3 started
virsh # console ct3 Connected to domain ct3 Escape character is ^]
Ctrl+]
virsh # dominfo ct3 Id: 2603 Name: ct3 UUID: 27f50e10-99dc-44ce-827d-ed8888115eb4 OS Type: exe State: running CPU(s): 1 CPU time: 0.5s Max memory: 500000 KiB Used memory: 12564 KiB Persistent: yes Autostart: disable Managed save: unknown Security model: none Security DOI: 0
virsh # shutdown ct3 virsh # undefine ct3
Creati un script care primeste 2 parametri:
Daca actiunea este start:
Daca actiunea este stop:
Hint: Folositi lxc-monitor
in timp ce porniti un container pentru a vedea prin ce stari trece.