Δημοσιεύτηκε: 20 Μάιος 2009, 23:44
από hoo2
Εισαγωγικά

Οι διαδικασίες εισαγωγής δίσκων, filesystem και swap partitions, είναι λίγο πολύ γνωστές. Ωστόσο το linux έχει μερικά τρίκ που πολλά λειτουργικά συστήματα θα ονειρεύονταν να έχουν. Ο λόγος για δύο τεχνολογίες, software RAID και Logical Volume Manager (LVM), οι οποίες προσφέρουν στο linux ευελιξία και αξιοπιστία.

Οι σκληροί δίσκοι παρουσιάζουν πολύ συχνά σφάλματα και ακόμα και με σωστά backups μια αποτυχία δίσκου μπορεί να είναι καταστροφική για ένα server. Η τεχνολογία RAID (Redundant Array of Independent(or Inexpensive) Disks), είναι ένα σύστημα που χρησιμοποιεί πολλούς δίσκους για αποθήκευση, και αντιγράφει ή διαμοιράζει τα δεδομένα σε αυτούς. Το RAID όχι μόνο βοηθάει στην αποφυγή απώλειας δεδομένων αλλά ακόμα μειώνει και τον χρόνο που ένας server είναι εκτός λειτουργίας(downtime) μερικές φορές στο μηδέν. Ακόμα σε μερικές περιπτώσεις αυξάνει και τις επιδώσεις του server. Αν και τα συστήματα RAID υλοποιούνται τις περισσότερες φορές ως hardware κάρτες και μάλιστα πολύ ακριβές, το linux προσφέρει μια πλήρη σουίτα εργαλείων με software.

Ένα δεύτερο εργαλείο το ίδιο χρήσιμο με το RAID είναι το lvm (Logical Volume Manager). Με αυτό μπορούμε να διαχειριζόμαστε αποδοτικά τον ελεύθερο χώρο μεταξύ των partitions. Φανταστείτε ένα κόσμο στον οποίο δεν ξέρετε από την αρχή πόσο χώρο χρειάζεται να δώσετε στα partitions ενός server και μερικούς μήνες μετά διαπιστώνετε ότι κάποιο partition είναι πολύ μεγάλο ενώ ένα άλλο δίπλα ασφυκτιά..... Σας φαίνεται οικείο όλο αυτό; Το LVM μας επιτρέπει να αλλάζουμε το μέγεθος των partition δυναμικά.

Αν και τα παραπάνω εργαλεία είναι πολύ ισχυρά ακόμα και όταν χρησιμοποιούνται μόνα τους, η πραγματική του δύναμη φαίνεται όταν χρησιμοποιούνται σε συνδυασμό. Παρακάτω θα δώσουμε μια σύντομη περιγραφή τους καθώς και ένα παράδειγμα που παρουσιάζει τις ακριβείς ρυθμίσεις.

Linux software RAID

Το RAID προσφέρει δύο πράγματα. Πρώτων μπορεί να αυξήσει τις επιδώσεις διαμοιράζοντας τα δεδομένα μας σε διαφορετικούς δίσκους, επιτρέποντας έτσι πολλούς δίσκους να λειτουργούν ταυτόχρονα για να γράψουν ή να ανακτήσουν δεδομένα. Δεύτερον μπορεί να κλωνοποιεί τα δεδομένα μας και να τα καταχωρεί σε πολλαπλούς δίσκους, μειώνοντας έτσι τον κίνδυνο απώλειας δεδομένων από καταστροφή κάποιου δίσκου. Το linux RAID έχει "κάποιες" μικρές διαφορές από τα εξω-linux RAID συστήματα, αλλά παρόλα αυτά χωρίζεται στα αντίστοιχα levels.

- Το Linear mode (μάλλον=Γραμμική λειτουργία), που δεν προσφέρει κάποια μέθοδο πλεονασμού δεδομένων(data redundancy), ή κάποια αύξηση στις επιδώσεις. Απλά οι δίσκοι συνενώνονται ο ένας πίσω από τον άλλο για να σχηματίζουν ένα μεγαλύτερο δίσκο.
- Το RAID level 0 stripe χρησιμοποιείται καθαρά για να αυξήσουμε τις επιδώσεις. Σε αυτό το mode γίνεται χρήση δύο ή περισσότερων δίσκων (ή partitions) ίσου μεγέθους για να μειωθούν οι χρόνοι εγγραφής και ανάκτησης δεδομένων. Τα δεδομένα που είναι για εγγραφή "σπάνε" σε ένα ή περισσότερα κομμάτια, ανάλογα με τον αριθμό των δίσκων και γράφονται ταυτόχρονα το καθένα σε κάθε δίσκο. Το αντίστοιχο συμβαίνει και κατά την ανάγνωση δεδομένων.
- Το RAID level 1 mirror είναι το πρώτο level που προσφέρει πλεόνασμα δεδομένων. Τα δεδομένα κλωνοποιούνται και γράφονται ταυτόχρονα σε ένα ή περισσότερους δίσκους. Η μέθοδος αυτή μειώνει την πιθανότητα απώλειας δεδομένων, αλλά μειώνει και τις επιδώσεις γιατί τα δεδομένα πρέπει να γραφτούν σε περισσότερους από ένα δίσκους.
- Το RAID level 4 κατακερματίζει τα δεδομένα(για την ακρίβεια block δεδομένων και όχι δεδομένα ανά byte/word. Αυτό το κάνει το RAID 3) σε περισσότερους του ενός δίσκους, όπως και το RAID 0, αλλά κρατάει και τα μπλόκ ισοτιμίας(parity blocks) σε ένα ξεχωριστό δίσκο. Έτσι αν κάποιος από τους δίσκους παρουσιάσει σφάλματα, μπορεί να αλλαχτεί και τα δεδομένα του θα ανακτηθούν από τους υπόλοιπους. Ενώ υπάρχει η δυνατότητα το συγκεκριμένο mode να παρουσιάζει αύξηση επιδόσεων, αυτές περιορίζονται από τον δίσκο που κρατά τα μπλοκ ισοτιμίας(parity disk). Αυτό γιατί όλες οι εγγραφές πρέπει να περιμένουν να γραφτεί το parity block δεδομένων στον δίσκο. Το RAID 4 απαιτεί τουλάχιστον 3 δίσκους.
- Το RAID level 5 είναι μια καλύτερη version του RAID 4. Κάνει την ίδια δουλειά με το παραπάνω αλλά αντί να έχει ένα συγκεκριμένο δίσκο για να κρατά το μπλοκ ισοτιμίας αντίθετα το μοιράζει σε ένα δίσκο την φορά σε κάθε μία εγγραφή. Για μια εγγραφή στον δίσκο 1, για την επόμενη στον δίσκο 2 κτλ. Το RAID 5 απαιτεί και αυτό τουλάχιστον 3 δίσκους.
Τα παραπάνω modes μπορούν να υπάρχουν και σε συνδυασμό.

Logical Volume Manager

Το lvm είναι ένα προαιρετικό σύστημα που μπορεί άνετα να θεωρηθεί ως μια full-extra έκδοση για partitioning δίσκων. Μας επιτρέπει να συναθροίσουμε δίσκους, partitions κτλ σε ομάδες τόμων (volume groups). Η συνολική χωρητικότητα του group μπορεί έπειτα να διαμεριστεί σε logical volumes(λογικούς τόμους), στους οποίους μπορούμε να έχουμε πρόσβαση όπως και στα υπόλοιπα block devices, μέσα στον κατάλογο /dev. O Logical Volume Manager μας επιτρέπει να κάνουμε τα παρακάτω:
- Να χρησιμοποιούμε και να δεσμεύουμε το χώρο των αποθηκευτικών μέσων ποιο αποδοτικά.
- Να μετακινούμε λογικούς τόμους σε διαφορετικές συσκευές (physical devices)
- Να μεγαλώνουμε και να μικραίνουμε το μέγεθος των λογικών τόμων on the fly
- Να παίρνουμε "snapshots" από ολόκληρο το filesystem μας(ποιος χρειάζεται zfs?)
- Να αλλάζουμε on-line δίσκους χωρίς να διακόπτουμε την λειτουργία του συστήματος.

Ένα παράδειγμα χρήσης RAID5 και LVM

Το συγκεκριμένο παράδειγμα εξηγεί πως να στήσουμε ένα σύστημα με RAID 5 και LVM μαζί. Αυτού του είδους το configuration είναι πολύ χρήσιμο για servers. Αυτά που θα χρειαστούμε είναι μια υπάρχουσα εγκατάσταση linux σε ένα δίσκο, υπομονή, όρεξη και φυσικά ένα Terminal. :D
Ο στόχος μας είναι να δημιουργήσουμε ένα RAID5 array από τρεις άδειους δίσκους. Πάνω σε αυτούς θα δημιουργήσουμε ένα LVM group με 3 partition(πχ για τους καταλόγους /home, /var και /usr). Αυτό μας δίνει τα εξής πλεονεκτήματα:
- Το RAID 5 παρέχει σημαντικό πλεόνασμα δεδομένων. Αν κάποιος δίσκος παρουσιάσει σφάλμα, τα δεδομένα μας θα παραμείνουν άθικτα και σε αντίθεση με το RAID4 δεν έχει σημασία ποιος δίσκος θα είναι αυτός.
- Χάρη στο LVM, τα partitions είναι μεταβλητού μεγέθους. Αν κάποιος ενθουσιώδεις web-master/designer γεμίσει το ένα, εμείς μπορούμε να "κλέψουμε" μέγεθος από τα άλλα και να του δώσουμε χώρο να "παίζει".
- Αν ακόμα χρειαστούμε παραπανίσιο χώρο μπορούμε να προσθέσουμε χώρο στο RAID5 προσθέτοντας ένα δίσκο στη συστοιχία και μετά να μεγαλώσουμε το LVM και τα partitions που αυτό περιέχει.

Μόλις δείξουμε το αρχικό configuration, θα περιγράψουμε πως να χειριστούμε δίσκους με σφάλματα και πως να αλλάξουμε μέγεθος σε LVM partitions.

Για το παράδειγμά μας έχουμε 4 sata δίσκους (αν και εικονικοί μέσα σε ένα VM)
Κώδικας: Επιλογή όλων
[root@host:~]# fdisk -l

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000326f1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1        1179     9470286   83  Linux
/dev/sda2            1180        1305     1012095   82  Linux swap / Solaris

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000


Disk /dev/sdc: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000


Disk /dev/sdd: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000


Configuring the mdadm

Ο πρώτος δίσκος περιέχει το λειτουργικό σύστημα (/, swap ). Οι άλλοι τρεις δίσκοι (sdb, sdc, sdd) δεν έχουν partition tables.
Πάμε λοιπόν να κάνουμε από ένα primary partition σε κάθε δίσκο που θα καταναλώσει όλο τον ελεύθερο χώρο.

Κώδικας: Επιλογή όλων
[root@host:~]# fdisk /dev/sdb
...
Command (m for help): new
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1305, default 1): <Enter>
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1305, default 1305): <Enter>
Using default value 1305

Command (m for help): type
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): write
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
...
[..ξεδιάντροπη λογοκρισία..]
...


Αφού ολοκληρωθεί αυτή η διαδικασία μπορούμε να μπούμε στα "βαθιά" και να φτιάξουμε το RAID array. Οι περισσότερες διανομές έχουν κάποια έκδοση του mdadm. Σε περίπτωση που αυτή λείπει από το σύστημά σας (κακώς) εγκαταστήστε την. Σε debian/ubuntu θα χρειαστείτε κάτι σαν το:
Κώδικας: Επιλογή όλων
[root@host:~]# aptitude install mdadm


Η παρακάτω εντολή δημιουργεί το array:
Κώδικας: Επιλογή όλων
[root@host:~]# mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

Όσο "χτίζεται" το array μπορούμε να δούμε την πρόοδό του κάπως στο αρχείο /proc/mdstat
Κώδικας: Επιλογή όλων
[root@host:~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[3] sdc1[1] sdb1[0]
      20964608 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
      [====>................]  recovery = 23.2% (2437632/10482304) finish=13.3min speed=10034K/sec
     
unused devices: <none>
...
[..some time..]
...
[root@host:~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[2] sdc1[1] sdb1[0]
      20964608 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
     
unused devices: <none>

Αυτό το αρχείο μας δείχνει την κατάσταση του RAID όπως την αντιλαμβάνεται ο πυρήνας μας. Είναι καλή τακτική να ρίχνουμε ένα μάτι σε αυτό το αρχείο αν αντικαταστήσουμε κάποιο δίσκο ή αν προσθέσουμε έναν.

Μόλις δημιουργηθεί το array "λογικά" θα έχει γίνει και active. Αυτό είναι κάτι που το πραγματοποιεί η εντολή δημιουργίας του array. Το mdadm δεν χρειάζεται configuration αρχείο. Παρόλα αυτά θα χρησιμοποιήσει ένα αν αυτό υπάρχει (/etc/mdadm/mdadm.conf). Προτείνεται ανεπιφύλαχτα να χρησιμοποιήσουμε ένα. Αυτό γιατί με αυτόν τον τρόπο καταγράφεται το RAID μας και οι administrators έχουν ένα μέρος να κοιτάξουν για πληροφορίες σχετικά με το array. Ένας τρόπος να δημιουργήσουμε το conf αρχείο είναι αφού έχουμε ενεργοποιήσει την συσκευή (/dev/md0). Το mdadm --detail --scan είναι κάτι που βοηθάει σε αυτήν την περίπτωση. πχ:
Κώδικας: Επιλογή όλων
[root@host:~]# echo DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 > /etc/mdadm/mdadm.conf
[root@host:~]# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
[root@host:~]# cat /etc/mdadm/mdadm.conf
DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1
ARRAY /dev/md0 level=raid5 num-devices=3 UUID=276e481c:f663bd22:1073651c:0c2a5fa7

Ένας άλλος τρόπος είναι να ανοίξουμε το αρχείο με έναν editor πχ το vi :D και να προσθέσουμε με το χέρι τις εγγραφές:
Κώδικας: Επιλογή όλων
DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1
ARRAY /dev/md0 level=raid5 num-devices=3 UUID=276e481c:f663bd22:1073651c:0c2a5fa7

To mdadm πλέον μπορεί να διαβάζει αυτό το αρχείο στο shutdown και στο startup για να διαχειρίζεται το array. Για να ενεργοποιήσουμε το array μπορούμε να δώσουμε
Κώδικας: Επιλογή όλων
[root@host:~]# mdadm -As /dev/md0

και για να το σταματήσουμε:
Κώδικας: Επιλογή όλων
mdadm -S /dev/md0


LVM setup

Μέχρι στιγμής έχουμε δημιουργήσει ένα array σε RAID5. Τώρα είναι καιρός να ορίσουμε πάνω του λογικά group τόμων (logical volume groups) τα οποία μπορούμε να μεγεθύνουμε και να συρρικνώνουμε κατά βούληση. Η δημιουργία LVM προϋποθέτει τα παρακάτω βήματα:
- Δημιουργία και αρχικοποίηση φυσικών τόμων (physical volumes)
- Προσθήκη φυσικών τόμων σε κάποιο group (volume group)
- Δημιουργία λογικών τόμων (logical volumes) μέσα στο group

Όλα τα παραπάνω μπορούμε να τα επιτύχουμε με το εργαλείο LVM2. Αν δεν είναι εγκατεστημένο σε debian/ubuntu μπορούμε να το εγκαταστήσουμε δίνοντας:
Κώδικας: Επιλογή όλων
[root@host:~]# aptitude install lvm2

Μόλις το εγκαταστήσετε ρίξτε μια ματιά (λέμε τώρα) στο man page (man lvm). Είναι μια πάρα πολύ καλή αρχή για να συνηθίσετε αυτά τα εργαλεία.

Για την ορολογία που χρησιμοποιεί το lvm "φυσικοί τόμοι"(physical volumes) είναι αυτό που συναθροίζεται για να σχηματίσει "ομάδες τόμων"(volume groups). Ο όρος "φυσικός τόμος" είναι κάπως παραπλανητικός γιατί οι φυσικοί τόμοι δεν έχουν άμεση σχέση σε το υλικό(hardware) και τις φυσικές-πραγματικές συσκευές. Μπορούν να είναι δίσκοι, partition δίσκων, ή, όπως και στο δικό μας παράδειγμα, υψηλού επιπέδου αντικείμενα πχ RAID arrays που έχουν τη δική τους δομή και λειτουργία.
Οι εντολές που χρησιμοποιούνται στα εργαλεία lvm αρχίζουν με γράμματα που "προδίδουν" το level στο οποίο αναφέρονται. Ποιο συγκεκριμένα εντολές που ξεκινάνε με pv αναφέρονται στο φυσικό επίπεδο και χειρίζονται φυσικούς τόμους (physical volumes). Οι εντολές που ξεκινούν με vg αναφέρονται στα volume groups και αυτές που ξεκινούν με lv αναφέρονται στα logical volumes.
Κάποιες παλιότερες εκδόσεις του lvm απαιτούσαν να τρέξουμε την εντολή vgscan σαν αρχικό στάδιο, αλλά αυτό δεν είναι πλέον αναγκαίο. Αντί για αυτό εμείς μπορούμε να αστικοποιήσουμε την φυσική μας συσκευή δίνοντας pvcreate. Για το συγκεκριμένο παράδειγμα θα χρησιμοποιήσουμε το array /dev/md0 που μόλις δημιουργήσαμε.

Κώδικας: Επιλογή όλων
[root@host:~]# pvcreate /dev/md0
  Physical volume "/dev/md0" successfully created

Αυτή η εντολή καταστρέφει όλα τα δεδομένα στις συσκευές και τα partitions οπότε πρέπει να είμαστε προσεκτικοί. Αν και το lvm μας επιτρέπει να δημιουργήσουμε παραπάνω από ένα physical device για κάποιο group, εμείς θα χρησιμοποιήσουμε μόνο ένα για το συγκεκριμένο παράδειγμα. Επομένως μπορούμε πλέον να δημιουργήσουμε και το group volume. Έστω ότι το "βαφτίζουμε" lvm_sys.
Κώδικας: Επιλογή όλων
[root@host:~]# vgcreate lvm_sys /dev/md0
  Volume group "lvm_sys" successfully created

Μπορούμε να δούμε λεπτομέρειες για το group που μόλις δημιουργήσαμε δίνοντας vgdisplay.
Κώδικας: Επιλογή όλων
[root@host:~]# vgdisplay lvm_sys
  --- Volume group ---
  VG Name               lvm_sys
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               19.99 GB
  PE Size               4.00 MB
  Total PE              5118
  Alloc PE / Size       0 / 0   
  Free  PE / Size       5118 / 19.99 GB
  VG UUID               iGo6D4-p2hT-P6Q1-Rql4-pFXe-MCt4-2px1V9


Το τελευταίο στάδιο είναι να δημιουργήσουμε λογικούς τόμους (logical volumes) μέσα στο group lvm_sys. Εδώ μπορούμε να διαλέξουμε τα partitions να έχουν όσο μέγεθος θέλουμε. Για το συγκεκριμένο παράδειγμα μια τιμή 6GB για /var και /usr είναι μια χαρά. Τον υπόλοιπο χώρο θα τον καλύψουμε με το /home. Για να το επιτύχουμε αυτό θα χρειαστούμε την εντολή lvcreate. Με -L περνάμε μέγεθος, με-n όνομα κτλ... Για το /home χρησιμοποιούμε σχετικό μέγεθος. σε κάθε περίπτωση man lvcreate. Για να δούμε τί κάναμε χρησιμοποιούμε την lvscan.
Σημείωση: Σε αυτό το παράδειγμα χρησιμοποιώ όλο το χώρο από το volume group, κάτι που ΔΕΝ προτείνεται. Αφήστε χώρο στο group για το ενδεχόμενο να αυξήσετε κάποιο λογικό τόμο πολύ πολύ εύκολα. Το συγκεκριμένο παράδειγμα ακολουθεί τον δύσκολο δρόμο καθαρά για λόγους επίδειξης(τσ,τσ,τσ....).
Κώδικας: Επιλογή όλων
[root@host:~]# lvcreate -L 6G -n lv_usr lvm_sys
  Logical volume "lv_usr" created
[root@host:~]# lvcreate -L 6G -n lv_var lvm_sys
  Logical volume "lv_var" created
[root@host:~]# lvcreate -l 100%FREE -n lv_home lvm_sys
  Logical volume "lv_home" created
[root@host:~]# lvscan
  ACTIVE            '/dev/lvm_sys/lv_usr' [6.00 GB] inherit
  ACTIVE            '/dev/lvm_sys/lv_var' [6.00 GB] inherit
  ACTIVE            '/dev/lvm_sys/lv_home' [7.99 GB] inherit


Μπορούμε τώρα να δημιουργήσουμε file systems μέσα στα νέα μας partitions και να τα κάνουμε mount στο σύστημά μας. Τα partition αυτά είναι διαθέσημα σε διάφορες τοποθεσίες όπως /dev/mapper/, /dev/lvm_sys/ και /dev/dm-*.
Κώδικας: Επιλογή όλων
[root@host:~]# mkfs.ext3 -L lv_usr /dev/mapper/lvm_sys-lv_usr
...snip
[root@host:~]# mkfs.ext3 -L lv_var /dev/mapper/lvm_sys-lv_var
...snip
[root@host:~]# mkfs.ext3 -L lv_home /dev/mapper/lvm_sys-lv_home
...snip

Να σημειώσουμε εδώ ότι μπορούμε να μεταβάλουμε το μέγεθος από αυτά τα partitions χωρίς να χάσουμε δεδομένα πολύ εύκολα.

Αυτό ήταν!!! Μπορούμε πλέον να δούμε τα partition μας και ακόμα να προσθέσουμε εγγραφές στο /etc/fstab ώστε να γίνετε αυτόματα το mount στην εκκίνηση του συστήματός μας. Ένα reboot θα μας πείσει ότι όλα δουλεύουν όπως πρέπει. Βέβαια μας έμεινε να μεταφέρουμε τα /var, /usr και /home σε ξεχωριστά partitions. O σκοπός αυτού του άρθρου δεν είναι να εξηγήσει πως θα γίνει αυτό και επομένως θα παραθέσω μονάχα τις εντολές (στα γρήγορα) και θα πάμε παρακάτω.
Κώδικας: Επιλογή όλων
[root@host:~]# mkdir /tmphome
[root@host:~]# mkdir /tmpusr
[root@host:~]# mkdir /tmpvar

[root@host:~]# mount /dev/mapper/lvm_sys-lv_home /tmphome/
[root@host:~]# mount /dev/mapper/lvm_sys-lv_usr /tmpusr/
[root@host:~]# mount /dev/mapper/lvm_sys-lv_var /tmpvar

[root@host:~]# cp -dpr /usr/* /tmpusr/
[root@host:~]# cp -dpr /home/* /tmphome/
[root@host:~]# cp -dpr -u /var/* /tmpvar/
[..soooome time to copy all these files..]

[root@host:~]# vi /etc/fstab
[..edit fstab..double check..OK]
[root@host:~]# cat /etc/fstab
...
/dev/mapper/lvm_sys-lv_usr   /usr   ext3   defaults   0   1
/dev/mapper/lvm_sys-lv_var   /var   ext3   defaults   0   1
/dev/mapper/lvm_sys-lv_home   /home   ext3   defaults   0   1
...
[root@host:~]# mv /home /old_home
[root@host:~]# mv /var /old_var
[root@host:~]# mv /usr /old_usr

[root@host:~]# mkdir /home
[root@host:~]# mkdir /var
[root@host:~]# mkdir /usr
[root@host:~]# reboot
[..pray..]
[..pray some more..]
[..booting...]
[root@host:~]# echo "Congratulations..."
[root@host:~]# rm -rf /old_*
[root@host:~]# rm -rf /tmphome /tmpusr /tmpvar
[root@host:~]# echo "Done"

Τελειώσαμε; Διπλοτσεκάρουμε το /etc/fstab και reboot στο νέο μας σύστημα...!!!!! Ταταααά!!!! :D. Είδατε δεν ήταν δύσκολο.

Αντιμετωπίζοντας προβληματικούς δίσκους

Καλά τα καταφέραμε μέχρι τώρα. Το σύστημα μας "λογικά" δουλεύει μια χαρά. Το configuration όμως αποτελείται από πολλά επίπεδα πράγμα που αυξάνει και τις πιθανότητες κάτι απ' όλα αυτά να πάει στραβά. Όταν ένας σκληρός δίσκος για παράδειγμα παρουσιάσει εσφαλμένη λειτουργία τότε πρέπει να είμαστε έτοιμοι να το διαγνώσουμε και να το αντιμετωπίσουμε αμέσως (κοινώς πρέπει να δράσουμε αστραπιαία;-).

Ας υποθέσουμε λοιπόν ότι ένας από τους δίσκους μας παρουσιάζει σφάλματα. Επειδή το RAID 5 που φτιάξαμε προηγουμένως προσφέρει πλεονασμό δεδομένων, η συστοιχία θα συνεχίσει να λειτουργεί απρόσκοπτα, ακόμα και αν ο δίσκος καταστραφεί τελείως. Οι χρήστες κατά πάσα πιθανότητα δεν θα αντιληφθούν το πρόβλημα και το ίδιο ίσως να γίνει και με μας(τους system administrators). Γιαυτό θα πρέπει να δίνουμε ιδιαίτερη προσοχή στις καταγραφές του συστήματος (system logs) ώστε να αντιληφθούμε το πρόβλημα έγκαιρα (ρίξτε μια ματιά και στα εργαλεία swatch και logcheck).

Το mdadm μας δίνει ένα εργαλείο για να testάρουμε τέτοιες καταστάσεις. (Δείτε στο man page στο section για manage mode --fail)
Κώδικας: Επιλογή όλων
[root@host:~]# mdadm /dev/md0 --fail /dev/sdd1
mdadm: set /dev/sdd1 faulty in /dev/md0
[root@host:~]# tail /var/log/messages
May 22 03:34:30 debian kernel: [ 1504.376717] raid5: Operation continuing on 2 devices.
May 22 03:34:30 debian kernel: [ 1504.408687] RAID5 conf printout:
May 22 03:34:30 debian kernel: [ 1504.408687]  --- rd:3 wd:2
May 22 03:34:30 debian kernel: [ 1504.408687]  disk 0, o:1, dev:sdb1
May 22 03:34:30 debian kernel: [ 1504.408687]  disk 1, o:1, dev:sdc1
May 22 03:34:30 debian kernel: [ 1504.408687]  disk 2, o:0, dev:sdd1
May 22 03:34:30 debian kernel: [ 1504.417281] RAID5 conf printout:
May 22 03:34:30 debian kernel: [ 1504.417290]  --- rd:3 wd:2
May 22 03:34:30 debian kernel: [ 1504.417294]  disk 0, o:1, dev:sdb1
May 22 03:34:30 debian kernel: [ 1504.417297]  disk 1, o:1, dev:sdc1


Όπως φαίνεται και από τις καταγραφές στο αρχείο /var/log/messages έχουν δημιουργηθεί εγγραφές που αφορούν το προβληματικό μας δίσκο. Αντίστοιχες πληροφορίες μπορούμε να πάρουμε και από το αρχείο /proc/mdstat.
Κώδικας: Επιλογή όλων
[root@host:~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdb1[0] sdd1[3](F) sdc1[1]
      20964608 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
     
unused devices: <none>

Σε κάθε περίπτωση αν υποπέσει κάτι τέτοιο στην αντίληψή μας πρέπει να ακολουθήσουμε την παρακάτω διαδικασία.
- Να αφαιρέσουμε τον δίσκο από τη συστοιχία.
- Να προγραμματίσουμε πότε θα τερματίσουμε τον server και πόσο χρόνο αυτό θα διαρκέσει(αν χρειάζεται).
- Να ενημερώσουμε τους χρήστες που είναι συνδεμένοι στον υπολογιστή ή έχουν λογαριασμό σε αυτόν, για τον επικείμενο τερματισμό λειτουργίας.
- Να αλλάξουμε τον δίσκο
- Να προσθέσουμε τον νέο δίσκο στη συστοιχία.

Για να αφαιρέσουμε τον δίσκο από την συστοιχία θα χρησιμοποιήσουμε το mdadm.
Κώδικας: Επιλογή όλων
[root@host:~]# mdadm /dev/md0 -r /dev/sdd1
mdadm: hot removed /dev/sdd1

Μόλις ο δίσκος αφαιρεθεί μπορεί να αλλαχθεί με τον νέο. Hot-swappable δίσκοι μπορούν να αφαιρούνται από το σύστημα χωρίς να είναι απαραίτητο να τερματίσουμε και να επανεκκινήσουμε.

Αν τα στοιχεία που απαρτίζουν τη συστοιχία μας είναι απλοί δίσκοι τότε πρέπει να αντικαταστήσουμε τον δίσκο με ένα ίδιο. Αν όμως η συστοιχία μας αποτελείται από partitions(όπως στο παράδειγμά μας) τότε μπορούμε να δημιουργήσουμε "κάπου" ένα partition ίδιου μεγέθους και να το "φυτέψουμε" στη συστοιχία μας. Βέβαια όμοιοι δίσκοι έχουν καλύτερα αποτελέσματα επιδόσεων(νομίζω δηλαδή ας με διορθώσει κανείς αν σφάλω...). Αν η συστοιχία σας αποτελείται από partitions πρέπει να τρέξετε fdisk για να ρυθμίσετε το μέγεθος προτού την αντικατάσταση.
Στο παράδειγμά μας, ο προβληματικός δίσκος ήταν εικονικός, επομένως μπορούμε να προσθέσουμε ξανά το partition στη συστοιχία χωρίς να αντικαταστήσουμε τον δίσκο(δείγμα απίστευτης οκνηρίας γραμμένη με κομψό τρόπο). Το linux θα ξαναχτίσει τη συστοιχία και εμείς μπορούμε να επιβλέπουμε την διαδικασία βλέποντας τα περιεχόμενα του /proc/mdstat. Έτσι:
Κώδικας: Επιλογή όλων
[root@host:~]# mdadm /dev/md0 -a /dev/sdd1
mdadm: re-added /dev/sdd1
[root@host:~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdd1[3] sdb1[0] sdc1[1]
      20964608 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
      [==>..................]  recovery = 14.8% (1556492/10482304) finish=41.1min speed=3614K/sec
     
unused devices: <none>

Ανακατανέμοντας χώρο στις κατατμήσεις

Ακόμα συχνότερα και από τις αστοχίες των δίσκων υπάρχουν περιπτώσεις που οι χρήστες ή οι καταγραφές του συστήματος(log files) γεμίζουν το χώρο στα partitions. Στο δικό μας παράδειγμα δημιουργήσαμε 3 τόμους και δεσμεύσαμε όλο το χώρο από το volume group lvm_sys. Θα πρέπει δηλαδή να πάρουμε τον δύσκολο δρόμο και να μικρύνουμε κάποιο τόμο για να μεγαλώσουμε κάποιον άλλο.
ΠΡΟΣΟΧΗ: Για να μικρύνουμε ένα τόμο πρέπει πρώτα να μικρύνουμε το filesystem που περιέχει. Αλλιώς υπάρχει κίνδυνος απώλειας δεδομένων(Τα data που βρίσκονται στην ακρίτσα...;-))
Για να μεγαλώσουμε ένα τόμο αρκεί να μεγαλώσουμε τον τόμο με την lvextend και μετά το filesystem που περιέχει με την resize2fs. Στην περίπτωση που το filesystem είναι ext3 αυτό μπορεί να γίνει και on-line(δίχως να κάνουμε umount το filesystem. Για το ReiserFS το εργαλείο που κάνει resize είναι το resize_reiserfs και για να χρησιμοποιηθεί θα πρέπει πρώτα το filesystem να γίνει unmount.

Ας υποθέσουμε πως "πρέπει" να μεγαλώσουμε το /usr. Τα βήματα που ακολουθούμε σε περιπτώσεις σαν και αυτή είναι:
- Μελετάμε την κατάσταση του LVM, μήπως υπάρχει ελεύθερος χώρος να δώσουμε στον λογικό τόμο (logical volume).
- Μελετάμε την κατάσταση των filesystem μας με την df πχ.
- Αποφασίζουμε τα καινούρια μεγέθη.
- Μικραίνουμε το filesystem από το "άτυχο" partition(Αν χρειάζεται).
- Μικραίνουμε τον λογικό τόμο του εν λόγο "άτυχου" partition(Αν χρειάζεται).
- Επανέλεγχος και αύξηση χώρου του "τυχερού" λογικού τόμου(logical volume).
- Επέκταση του "τυχερού" filesystem.
- Επαλήθευση των αλλαγών.
Αν είχατε αφήσει χώρο στο volume group lvm_sys τότε δεν χρειάζεται να τρέξετε τα επόμενα βήματα που μικραίνουν το /home. Στην δική μας περίπτωση όμως έχουμε:
Κώδικας: Επιλογή όλων
[root@host:~]# vgdisplay lvm_sys
  --- Volume group ---
  VG Name               lvm_sys
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               19.99 GB
  PE Size               4.00 MB
  Total PE              5118
  Alloc PE / Size       5118 / 19.99 GB
  Free  PE / Size       0 / 0   
  VG UUID               iGo6D4-p2hT-P6Q1-Rql4-pFXe-MCt4-2px1V9
[root@host:~]# df -h /dev/mapper/*
Filesystem            Size  Used Avail  Use%   Mounted on
udev               10M  116K  9.9M    2%   /dev
/dev/mapper/lvm_sys-lv_home      7.9G  148M  7.4G  2%   /home
/dev/mapper/lvm_sys-lv_usr      6.0G  2.1G  3.6G  37%   /usr       
/dev/mapper/lvm_sys-lv_var      6.0G  1.1G  4.6G  19%   /var       

Ας μικρύνουμε το /home στα 6GB και ας αυξήσουμε το /usr για να καλύψει κάποιο από τον έχτρα χώρο. Αν ο πυρήνας σας έχει δυνατότητα on-line resize τότε δεν χρειάζεται να κάνετε umount το /home.
Κώδικας: Επιλογή όλων
[root@host:~]# umount /home
[root@host:~]# e2fsck -f /dev/mapper/lvm_sys-lv_home
[root@host:~]# resize2fs /dev/mapper/lvm_sys-lv_home 6G
[root@host:~]# mount -a

[root@host:~]# lvreduce -L 6G /dev/lvm_sys/lv_home
  WARNING: Reducing active and open logical volume to 6.00 GB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv_home? [y/n]: y
  Reducing logical volume lv_home to 6.00 GB
  Logical volume lv_home successfully resized
[root@host:~]# vgdisplay lvm_sys
  --- Volume group ---
  VG Name               lvm_sys
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  7
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               19.99 GB
  PE Size               4.00 MB
  Total PE              5118
  Alloc PE / Size       4608 / 18.00 GB
  Free  PE / Size       510 / 1.99 GB
  VG UUID               iGo6D4-p2hT-P6Q1-Rql4-pFXe-MCt4-2px1V9

Μετά το resize βλέπουμε ότι το group έχει πλέον 1.99GB ελεύθερο χώρο ή 510 PE με μονάδες logical extend. Μπορούμε επομένως να μεγαλώσουμε και το περιεχόμενο στον λογικό τόμο lv_usr filesystem.
Κώδικας: Επιλογή όλων
[root@host:~]# resize2fs /dev/lvm_sys/lv_usr 7G
resize2fs 1.41.3 (12-Oct-2008)
Filesystem at /dev/lvm_sys/lv_usr is mounted on /usr; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/lvm_sys/lv_usr to 1835008 (4k) blocks.
The filesystem on /dev/lvm_sys/lv_usr is now 1835008 blocks long.

Μάλλον ταλειώσαμε. Για να δούμε:
Κώδικας: Επιλογή όλων
[root@host:~]# df -h
Filesystem                     Size  Used Avail Use% Mounted on
  /dev/sda1                      8.9G  245M  8.2G   3% /
  tmpfs                          379M     0  379M   0% /lib/init/rw
  udev                            10M  116K  9.9M   2% /dev
  tmpfs                          379M     0  379M   0% /dev/shm
  /dev/mapper/lvm_sys-lv_usr      6.9G  2.1G  4.6G  32% /usr
  /dev/mapper/lvm_sys-lv_var      6.0G  1.1G  4.6G  19% /var
  /dev/mapper/lvm_sys-lv_home      6.0G  146M  5.5G   3% /home
[root@host:~]# lvscan
  ACTIVE            '/dev/lvm_sys/lv_usr' [7.00 GB] inherit
  ACTIVE            '/dev/lvm_sys/lv_var' [6.00 GB] inherit
  ACTIVE            '/dev/lvm_sys/lv_home' [6.00 GB] inherit


Επιτέλους ΤΕΛΟΣ
Αυτό ήταν.!!! Συγχαρητήρια. :D Δεν ήταν δύσκολο;!;!.... Έχουμε πλέον έναν server με LVM πάνω σε RAID 5 και έχουμε κάνει και resize "κάποια" partition για.....να περάσει η ώρα.