This is an old revision of the document!


Laborator 4. Gestiunea scalabilă a dispozitivelor de stocare

Cunoștințe și abilități ce vor fi dobândite

  • Dispozitive, discuri și volume în Linux
  • Administrarea LVM (Logical Volume Manager)
  • Administrarea software RAID în Linux
  • Criptarea volumelor în Linux

Pregătire infrastructură de laborator

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:~/saisp$ wget http://elf.cs.pub.ro/saisp/res/laboratoare/lab-04.zip
student@mjolnir:~/saisp$ unzip lab-04.zip

În urma dezarhivării rezultă mai multe fișiere imagine KVM și scripturi de pornire a mașinilor virtuale:

  • Imaginea de bază base.qcow2 este deja în directorul saisp/ și este baza pentru celelalte.
  • Fișierul lvm-main.qcow2 este obținut din base.qcow2 și este folosit pentru pornirea unei configurații pentru LVM.
  • Fișierele lvm-disk1.img și lvm-disk2 sunt fișiere ce reprezintă discuri suplimentare folosite în configurația pentru LVM.
  • Fișierul lvm-start-kvm este un script care va porni mașina virtuală KVM pentru configurația LVM.
  • Fișierul raid-main.qcow2 este obținut din base.qcow2 și este folosit pentru pornirea unei configurații pentru software RAID.
  • Fișierele raid-disk1.img, raid-disk2 și raid-disk3 sunt fișiere ce reprezintă discuri suplimentare folosite în configurația pentru LVM.
  • Fișierul raid-start-kvm este un script care va porni mașina virtuală KVM pentru configurația software RAID.

Vom porni după cum este necesar câte una dintre cele două mașini virtuale KVM. Pentru a porni mașina virtuală pentru LVM vom folosi comanda

student@mjolnir:~/saisp$ ./lvm-start-kvm

La fel, pentru a porni mașina virtuală pentru software RAID vom folosi comanda

student@mjolnir:~/saisp$ ./raid-start-kvm

După pornirea mașinii virtuale KVM, o accesa prin folosirea SSH către adresa IP aferentă. Vom folosi comanda

student@mjolnir:~/saisp$ ssh -l root 192.168.0.2

Exerciții

01. [10p] Investigare LVM

Dorim să investigăm o configurație existentă LVM. Pentru aceasta pornim mașina virtuală aferentă KVM:

student@mjolnir:~/saisp$ ./lvm-start-kvm

și ne conectăm peste SSH pentru a lucra în mașina virtuală:

student@mjolnir:~/saisp$ ssh -l root 192.168.0.2

Mașina virtuală conține o configurație LVM; pachetul lvm2, necesar configurării, este instalat. Pentru a o investiga listăm volumele fizice, grupurile de volume și volumele logice folosind, respectiv comenzile pvs, vgs, lvs:

root@lvm:~# pvs
  PV         VG      Fmt  Attr PSize    PFree
  /dev/sdb1  azeroth lvm2 a--  1020.00m    0
  /dev/sdc1  azeroth lvm2 a--  1020.00m    0
root@lvm:~# vgs
  VG      #PV #LV #SN Attr   VSize VFree
  azeroth   2   3   0 wz--n- 1.99g    0
root@lvm:~# lvs
  LV        VG      Attr       LSize   Pool Origin Data%  Move Log Cpy%Sync Convert
  arathor   azeroth -wi-a----- 700.00m
  dalaran   azeroth -wi-a----- 840.00m
  lordaeron azeroth -wi-a----- 500.00m

Detalii aflăm folosind comenzile pvdisplay, vgdisplay și lvdisplay:

root@lvm:~# pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sdb1
  [...]
  --- Physical volume ---
  PV Name               /dev/sdc1
  [...]
root@lvm:~# vgdisplay
  --- Volume group ---
  VG Name               azeroth
  [...]
root@lvm:~# lvdisplay
  --- Logical volume ---
  LV Path                /dev/azeroth/lordaeron
  [...]
 
  --- Logical volume ---
  LV Path                /dev/azeroth/arathor
  [...]
 
  --- Logical volume ---
  LV Path                /dev/azeroth/dalaran
  [...]

Observăm că în cadrul infrastructurii LVM există două volume fizice (physical volumes): /dev/sdb1 și /dev/sdc1. Aceste două volume fizice sunt angrenate într-un grup de volume denumit azeroth, care este partiționat în trei volume logice denumite arathor, dalaran și lordaeron.

Căile către volumele logice sunt, respectiv /dev/azeroth/arathor, /dev/azeroth/dalaran și /dev/azeroth/lordaeron. Calea către fiecare volum cuprinde numele grupului de volume și apoi numele volumului logic. Acestea sunt, de fapt, link-uri simbolice către fișiere de tip dispozitiv direct din /dev:

root@lvm:~# ls -l /dev/azeroth/lordaeron
lrwxrwxrwx 1 root root 7 Mar 16 16:57 /dev/azeroth/lordaeron -> ../dm-0

02. [10p] Creare entități LVM

Mai avem încă două partiții fizice pe care le putem folosi: /dev/sdb2 și /dev/sdc2. Le vom folosi pentru a crea un nou grup de volum și apoi noi volume logice.

Vom crea grupul de volume kalimdor și volumele logice durotar, ashenvale și tanaris cu dimensiunile respectiv de 1G, 500M, 500M.

Pentru început marcăm volumele fizice ca viitoare componente LVM:

root@lvm:~# pvcreate /dev/sdb2
  Physical volume "/dev/sdb2" successfully created
root@lvm:~# pvcreate /dev/sdc2
  Physical volume "/dev/sdc2" successfully created

Investigăm crearea acestora folosind comenzile pvs și pvdisplay:

root@lvm:~# pvs
  PV         VG      Fmt  Attr PSize    PFree
  /dev/sdb1  azeroth lvm2 a--  1020.00m    0 
  /dev/sdb2          lvm2 a--     1.00g 1.00g
  /dev/sdc1  azeroth lvm2 a--  1020.00m    0 
  /dev/sdc2          lvm2 a--     1.00g 1.00g
root@lvm:~# pvdisplay
  [...]

Observăm că, pe moment, volumele logice /dev/sdb2 și /dev/sdc2 nu fac parte din nici un volum.

Acum creăm volumul kalimdor din cele două volume fizice:

root@lvm:~# vgcreate kalimdor /dev/sdb2 /dev/sdc2
  Volume group "kalimdor" successfully created

Urmărim configurația grupului de volume nou creat folosind comenzile vgs, respectiv vgdisplay:

root@lvm:~# vgs kalimdor
  VG       #PV #LV #SN Attr   VSize VFree
  kalimdor   2   0   0 wz--n- 1.99g 1.99g
root@lvm:~# vgdisplay kalimdor
  --- Volume group ---
  VG Name               kalimdor

Ulterior creăm și cele trei volume logice:

root@lvm:~# lvcreate -n durotar -L 1G kalimdor 
  Logical volume "durotar" created
root@lvm:~# lvcreate -n ashenvale -L 500m kalimdor 
  Logical volume "ashenvale" created
root@lvm:~# lvcreate -n tanaris -L 500m kalimdor 
  Logical volume "tanaris" created

Apoi folosim comenzile lvs și lvdisplay pentru a afișa informații despre volumele logice create:

root@lvm:~# lvs
  LV        VG       Attr       LSize   Pool Origin Data%  Move Log Cpy%Sync Convert
  arathor   azeroth  -wi-a----- 700.00m
  dalaran   azeroth  -wi-a----- 840.00m
  lordaeron azeroth  -wi-a----- 500.00m
  ashenvale kalimdor -wi-a----- 500.00m
  durotar   kalimdor -wi-a-----   1.00g
  tanaris   kalimdor -wi-a----- 500.00m
root@lvm:~# lvdisplay
  [...]

În final am folosit patru partiții fizice (/dev/sdb1, /dev/sdc1, /dev/sdb2, /dev/sdc2) pentru a crea două grupuri de volume (azeroth și kalimdor) și trei volume logice pe fiecare grup de volume.

03. [15p] Actualizare volume

Dorim să renunțăm la al doilea grup de volume (kalimdor). Ștergeți acest grup de volume și apoi extindeți grupul de volume azeroth pentru a cuprinde parțiile fizice /dev/sdb2 și /dev/sdc2.

Pentru a extinde un grup de volume folosiți comanda vgextend.

Extindeți dimensiunile volumelor logice de pe grupul azeroth pentru a acoperi întreaga dimensiune a acestuia.

Pentru a extinde un volum logic folosiți comanda lvextend.

Afișează rezolvarea
Ascunde rezolvarea
Afișează rezolvarea
Pentru început ștergem volumele logice și apoi grupul de volume kalimdor:
root@lvm:~# lvremove /dev/kalimdor/ashenvale
Do you really want to remove active logical volume ashenvale? [y/n]: y
  Logical volume "ashenvale" successfully removed
root@lvm:~# lvremove /dev/kalimdor/tanaris
Do you really want to remove active logical volume tanaris? [y/n]: y
  Logical volume "tanaris" successfully removed
root@lvm:~# lvremove /dev/kalimdor/durotar
Do you really want to remove active logical volume durotar? [y/n]: y
  Logical volume "durotar" successfully removed
root@lvm:~# vgremove kalimdor
  Volume group "kalimdor" successfully removed

Validăm ștergerea grupului de volume:

root@lvm:~# vgs
  VG      #PV #LV #SN Attr   VSize VFree
  azeroth   2   3   0 wz--n- 1.99g    0

Extindem acum grupul azeroth cu volumele fizice /dev/sdb2 și /dev/sdc2:

root@lvm:~# vgextend azeroth /dev/sdb2
  Volume group "azeroth" successfully extended
root@lvm:~# vgextend azeroth /dev/sdc2
  Volume group "azeroth" successfully extended

și verificăm componeța grupului (patru volume fizice):

root@lvm:~# vgs
  VG      #PV #LV #SN Attr   VSize VFree
  azeroth   4   3   0 wz--n- 3.98g 1.99g
root@lvm:~# pvs
  PV         VG      Fmt  Attr PSize    PFree
  /dev/sdb1  azeroth lvm2 a--  1020.00m       0
  /dev/sdb2  azeroth lvm2 a--  1020.00m 1020.00m
  /dev/sdc1  azeroth lvm2 a--  1020.00m       0
  /dev/sdc2  azeroth lvm2 a--  1020.00m 1020.00m

Dispunem de 1.99GB liberi în grupul azeroth. Dublăm spațiul fiecărui volum logic ca să ne acoperim spațiul liber:

root@lvm:~# lvextend -L +700 /dev/azeroth/arathor
  Extending logical volume arathor to 1.37 GiB
  Logical volume arathor successfully resized
root@lvm:~# lvextend -L +840 /dev/azeroth/dalaran
  Extending logical volume dalaran to 1.64 GiB
  Logical volume dalaran successfully resized
root@lvm:~# lvextend -L +500 /dev/azeroth/lordaeron
  Extending logical volume lordaeron to 1000.00 MiB
  Logical volume lordaeron successfully resized

Apoi afișăm informații despre aceste partiții:

root@lvm:~# lvs
  LV        VG      Attr       LSize    Pool Origin Data%  Move Log Cpy%Sync Convert
  arathor   azeroth -wi-a-----    1.37g
  dalaran   azeroth -wi-a-----    1.64g
  lordaeron azeroth -wi-a----- 1000.00m
root@lvm:~# vgs
  VG      #PV #LV #SN Attr   VSize VFree
  azeroth   4   3   0 wz--n- 3.98g    0

04. [10p] Investigare RAID

Dorim să investigăm o configurație existentă RAID. Pentru aceasta pornim mașina virtuală aferentă KVM:

student@mjolnir:~/saisp$ ./raid-start-kvm

și ne conectăm peste SSH pentru a lucra în mașina virtuală:

student@mjolnir:~/saisp$ ssh -l root 192.168.0.2

Mașina virtuală conține o configurație RAID; pachetul mdadm, necesar configurării, este instalat. Pentru a o investiga listăm partițiile RAID aferente urmărim fișierul /proc/mdstat:

root@raid:~# cat /proc/mdstat 
Personalities : [raid0] 
md0 : active raid0 sdd1[2] sdc1[1] sdb1[0]
      3139584 blocks super 1.2 512k chunks
 
unused devices: <none>

Apoi folosimd comanda mdadm cu opțiunile aferent:

root@raid:~# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Sun Mar 16 19:40:32 2014
     Raid Level : raid0
     Array Size : 3139584 (2.99 GiB 3.21 GB)
   Raid Devices : 3
  Total Devices : 3
 
    [...]
    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1
 
root@raid:~# mdadm --examine /dev/sdb1
[...]
root@raid:~# mdadm --examine /dev/sdc1
[...]
root@raid:~# mdadm --examine /dev/sdd1
[...]

Avem așadar în array-ul software RAID (/dev/md0) care se bazează pe o trei partiții fizice (/dev/sdb1, /dev/sdc1, /dev/sdd1). Tipul RAID folosit este raid0.

05. [10p] Creare array RAID0

Ne propunem să mai facem, temporar, un array RAID0 care conține două partiții fizice; array-ul se va numi /dev/md1 și va conține partițiile /dev/sdb2 și /dev/sdc2. Ulterior vom șterge configurația.

Creăm array-ul de tip RAID0 conținând cele două partiții:

root@raid:~# mdadm --create /dev/md1 --level=0 --raid-devices=2 /dev/sdb2 /dev/sdc2
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.

Urmărim configurația creată prin intermediul fișierului /proc/mdstat:

root@raid:~# cat /proc/mdstat
Personalities : [raid0]
md1 : active raid0 sdc2[1] sdb2[0]
      2095104 blocks super 1.2 512k chunks
 
md0 : active raid0 sdb1[0] sdd1[2] sdc1[1]
      3139584 blocks super 1.2 512k chunks
 
unused devices: <none>

Array-ul /dev/md1 este un array de tip RAID0.

Ca să revenim în configurația inițială, vom șterge array-ul și vom anula configurația de pe cele două partiții folosind comenzile de mai jos:

root@raid:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@raid:~# mdadm --zero-superblock /dev/sdb2
root@raid:~# mdadm --zero-superblock /dev/sdc2

În acest moment array-ul a fost dezactivat și putem folosi partițiile /dev/sdb2 și /dev/sdc2.

06. [5p] Creare array RAID5

Ne propunem să creăm un array RAID5 numit /dev/md2. Folosiți partițiile /dev/sdb2, /dev/sdc2 și /dev/sdd2 pentru a realiza acest lucru.

La crearea array-ului RAID5 va dura ceva până când vor fi sincronizate cele trei partiții. Puteți urmări acest lucru prin intermediul comenzi:

root@raid:~# cat /proc/mdstat

Afișează rezolvarea
Ascunde rezolvarea
Afișează rezolvarea
Creăm array-ul RAID5:
root@raid:~# mdadm --create /dev/md2 --level=5 --raid-devices=3 /dev/sdb2 /dev/sdc2 /dev/sdd2
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md2 started.

Apoi verificăm configurația aferentă dispozitivului /dev/md2 și cofnirmăm că este un array RAID5:

root@raid:~# mdadm --detail /dev/md2
/dev/md2:
     Raid Level : raid5
   Raid Devices : 3
  Total Devices : 3
  [...]
    Number   Major   Minor   RaidDevice State
       0       8       18        0      active sync   /dev/sdb2
       1       8       34        1      active sync   /dev/sdc2
       3       8       50        2      active sync   /dev/sdd2

07. [10p] Refacere array RAID5

Simulați căderea partiției /dev/sdb2 din array-ul RAID5 /dev/md2. Apoi refaceți array-ul.

Folosiți opțiunile --fail și --remove pentru a dezactiva o partiție. Apoi folosiți opțiunea -add pentru a readăuga partiția în array.

Afișează rezolvarea
Ascunde rezolvarea
Afișează rezolvarea
Pentru început marcăm partiția /dev/sdb2 ca fiind faulty:
root@raid:~# mdadm --fail /dev/md2 /dev/sdb2
mdadm: set /dev/sdb2 faulty in /dev/md2

apoi o eliminăm din array-ul /dev/md2:

root@raid:~# mdadm --remove /dev/md2 /dev/sdb2
mdadm: hot removed /dev/sdb2 from /dev/md2

Apoi o readăugăm și putem urmări resincronizarea acesteia:

root@raid:~# mdadm --add /dev/md2 /dev/sdb2
mdadm: added /dev/sdb
root@raid:~# mdadm --detail /dev/md2
/dev/md2:
     Raid Level : raid5
   Raid Devices : 3
  Total Devices : 3
    [...]
    Number   Major   Minor   RaidDevice State
       4       8       18        0      spare rebuilding   /dev/sdb2
       1       8       34        1      active sync   /dev/sdc2
       3       8       50        2      active sync   /dev/sdd2

08. [15p] Construire LVM peste RAID

Peste cele două array-uri RAID /dev/md0 și /dev/md2 contruiți un grup de volume LVM. Peste grupul de volume construiți patru volume logice. Formatați primele două volum logice create cu ext4 și montați-le în subdirectoare din /mnt.

Pachetul lvm2 este instalat, necesar pentru configurarea LVM.

Afișează rezolvarea
Ascunde rezolvarea
Afișează rezolvarea
Marcăm partițiile /dev/md0 și /dev/md2 ca volume fizice în LVM:
root@raid:~# pvcreate /dev/md0
  Physical volume "/dev/md0" successfully created
root@raid:~# pvcreate /dev/md2
  Physical volume "/dev/md2" successfully created

Apoi creăm volumul LVM numit antagarich:

root@raid:~# vgcreate antagarich /dev/md0 /dev/md2
  /proc/devices: No entry for device-mapper found
  /proc/devices: No entry for device-mapper found
  Volume group "antagarich" successfully created
root@raid:~# vgs
  VG         #PV #LV #SN Attr   VSize VFree
  antagarich   2   0   0 wz--n- 4.99g 4.99g

În continuare creăm cele două partiții:

root@raid:~# lvcreate -n deyja -L 1G antagarich
  Logical volume "deyja" created
root@raid:~# lvcreate -n bracada -L 1G antagarich
  Logical volume "bracada" created
root@raid:~# lvcreate -n tatalia -L 1G antagarich
  Logical volume "tatalia" created
root@raid:~# lvcreate -n avlee -L 1G antagarich
  Logical volume "avlee" created
 
root@raid:~# lvs
  LV      VG         Attr       LSize Pool Origin Data%  Move Log Cpy%Sync Convert
  avlee   antagarich -wi-a----- 1.00g
  bracada antagarich -wi-a----- 1.00g
  deyja   antagarich -wi-a----- 1.00g
  tatalia antagarich -wi-a----- 1.00g

Apoi formatăm primele două partiții cu ext4:

root@raid:~# mkfs.ext4 /dev/antagarich/deyja
[...]
root@raid:~# mkfs.ext4 /dev/antagarich/bracada
[...]

și în final montăm partițiile și verificăm faptul că au fost montate corespunzător

root@raid:~# mkdir /mnt/deyja
root@raid:~# mkdir /mnt/bracada
root@raid:~# mount /dev/antagarich/deyja /mnt/deyja
root@raid:~# mount /dev/antagarich/bracada /mnt/bracada
root@raid:~# mount
[...]
/dev/mapper/antagarich-deyja on /mnt/deyja type ext4 (rw,relatime,stripe=384,data=ordered)
/dev/mapper/antagarich-bracada on /mnt/bracada type ext4 (rw,relatime,stripe=768,data=ordered)

09. [15p] Criptare volum LVM

Vrem să criptăm un modul LVM folosind LUKS (Linux Unified Key System). Vom folosi al treilea volum logic creat anterior.

Pachetul cryptsetup, necesar acestui exercițiu este instalat.

Puteți urmări pașii de aici.

Pentru început formatăm volumele cu suport de criptare:

root@raid:~# cryptsetup -v luksFormat /dev/antagarich/tatalia
 
WARNING!
========
This will overwrite data on /dev/antagarich/tatalia irrevocably.
 
Are you sure? (Type uppercase yes): YES
Enter passphrase:
Verify passphrase:
Command successful.

Acolo unde se cere parolă introduceți parola corespunzătoare.

Apoi “deschidem” partiția și furnizăm parola:

root@raid:~# cryptsetup luksOpen /dev/antagarich/tatalia crypto-tatalia
Enter passphrase for /dev/antagarich/tatalia:

Acum avem creat dispozitivul /dev/mapper/crypto-tatalia pe care îl putem folosi. Formatăm dispozitivul cu ext4:

root@raid:~# mkfs.ext4 /dev/mapper/crypto-tatalia

Montăm dispozitivul în /mnt/crypto-tatalia:

root@raid:~# mkdir /mnt/crypto-tatalia
root@raid:~# mount /dev/mapper/crypto-tatalia /mnt/crypto-tatalia
root@raid:~# ls /mnt/crypto-tatalia
lost+found

Ca să încheiem folosirea dispozitivului, întâi îl vom demonta:

root@raid:~# umount /mnt/crypto-tatalia

iar apoi vom “închide” partiția. O nouă deschidere va necesita reintroducerea parolei:

root@raid:~# cryptsetup luksClose crypto-tatalia

Aplicați pașii de mai sus pentru a cripta în mod similar al patrulea volum logic.

Afișează rezolvarea
Ascunde rezolvarea
Afișează rezolvarea
Pașii sunt similari celor de mai sus:
root@raid:~# cryptsetup luksFormat /dev/antagarich/avlee
 
WARNING!
========
This will overwrite data on /dev/antagarich/avlee irrevocably.
 
Are you sure? (Type uppercase yes): YES
Enter passphrase:
Verify passphrase:
root@raid:~# cryptsetup luksOpen /dev/antagarich/avlee crypt-avlee
Enter passphrase for /dev/antagarich/avlee: Error reading passphrase from terminal.
root@raid:~# cryptsetup luksOpen /dev/antagarich/avlee crypto-avlee
[...]
root@raid:~# mkdir /mnt/crypto-avlee
root@raid:~# mount /dev/mapper/crypto-avlee /mnt/crypto-avlee
root@raid:~# ls /mnt/crypto-avlee
lost+found
root@raid:~# umount /mnt/crypto-avlee
root@raid:~# cryptsetup luksClose crypto-avlee

10. [BONUS - 10p] Montare automată volum LVM criptat

Configurați fișierele /etc/fstab și /etc/crypttab astfel încât cele două volume logice LVM criptate anterior să fie montate la pornirea sistemului.

Urmăriți indicațiile de aici.

Al patrulea (ultimul) argument din fișierul /etc/crypttab trebuie să fie șirul luks.

Afișează rezolvarea
Ascunde rezolvarea
Afișează rezolvarea
Generăm chei pentru fiecare dintre cele două volume logice și le stocăm în fișierele aferente:
root@raid:~# dd if=/dev/urandom of=/root/tatalia-luks.key bs=32 count=1
1+0 records in
1+0 records out
32 bytes (32 B) copied, 0.00219603 s, 14.6 kB/s
root@raid:~# dd if=/dev/urandom of=/root/avlee-luks.key bs=32 count=1
1+0 records in
1+0 records out
32 bytes (32 B) copied, 0.00128575 s, 24.9 kB/s
root@raid:~# cryptsetup luksAddKey /dev/antagarich/tatalia /root/tatalia-luks.key
Enter any passphrase:
root@raid:~# cryptsetup luksAddKey /dev/antagarich/avlee /root/avlee-luks.key
Enter any passphrase:
root@raid:~# chmod 600 avlee-luks.key
root@raid:~# chmod 600 tatalia-luks.key

Trebuie să configurăm fișierele /etc/fstab și /etc/crypttab. În fișierul /etc/fstab adăugăm intrări de forma celor de mai jos. Pentru /etc/fstab:

/dev/mapper/crypto-tatalia /mnt/crypto-tatalia ext4 defaults 0 0
/dev/mapper/crypto-avlee /mnt/crypto-avlee ext4 defaults 0 0

iar pentru /etc/crypttab:

crypto-avlee  /dev/antagarich/avlee /root/avlee-luks.key luks
crypto-tatalia  /dev/antagarich/tatalia /root/tatalia-luks.key luks
saisp/labs/04.1427979479.txt.gz · Last modified: 2015/04/02 15:57 by alexandru.carp
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