This is an old revision of the document!


Laboratorul 07. Lorem ipsum

Introducere

Laborator

01. [5p] Introducere

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:

  • “masina fizica” se numeste hardware node;
  • “masinile virtuale” se numesc containere;
  • nucleul este partajat intre hardware node si containere;
  • fiecare container poseda:
    • ierarhie de fisiere izolata;
    • spatiu de procese izolat;
    • fisier de configurare (in care se specifica parametrii specifici - retea, consola etc.).

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.

2013/11/11 00:49

02. [20p] Interactiunea cu containerele

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.

2013/11/11 00:49

03. [10p] Spatiul de procese

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.

2013/11/11 00:49

04. [10p] Sistemul de fisiere

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:

  • In container, creati un fisier in directorul /root/.
  • In masina gazda (statia saisp-vm-1), accesati fisierul folosind calea descrisa mai sus.
  • Modificati fisierul si salvati-l.
  • In container, deschideti fisierul si observati modificarile.
2013/11/11 00:49

05. [10p] Crearea containerelor

Pentru a crea in mod facil un container, exista comanda lxc-create. Aceasta:

  • creaza un fisier de configurare minimal;
  • creaza sistemul de fisiere al containerului, descarcand pachetele corespunzatoare din repository.

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:

  • fisierul de configurare - config
  • sistemul de fisiere - 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:

  • porniti containerul in background
  • afisati, pe statia saisp-vm-1, ierarhia de procese si observati procesele corespunzatoare celor 2 containere.
  • opriti cele doua containere, folosind comanda lxc-stop.
2013/11/11 00:49

06. [25p] Networking

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.

Nu adaugati si comentariile de la sfarsitul liniilor, deoarece nu sunt permise de sintaxa lxc.

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:

  • interfata br0 de pe masina gazda
  • interfata eth0 de pe containerul ct1
  • interfata 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.

2013/11/11 00:49
saisp/labs/07.1384123598.txt.gz · Last modified: 2014/01/26 00:19 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0