Saturday, July 25, 2009

Centos, RAID1, mdadm και Άλλες Ιστορίες...

Το πως ακριβώς βρέθηκα να ασχοληθώ με αυτό, είναι μεγάλη ιστορία. Αλλά για την ώρα ας πούμε ότι τα παρακάτω τα εφάρμοσα σε VMWare και πιθανόν να χρειαστεί να τα εφαρμόσω και σε απομακρυσμένο μηχάνημα. ΠΟΛΥ απομακρυσμένο (wish me luck).

Το Σενάριο


Έχετε ένα απομακρυσμένο υπολογιστή που έχει μέσα λειτουργικό, δεδομένα, χρήστες κλπ. σε ένα δίσκο. Ο υπολογιστής σας χρησιμοποιεί Centos. Θέλετε να δημιουργήσετε RAID1 προσθέτοντας ένα δίσκο. Προφανώς η εκκίνηση θα γίνεται πλέον από τη συστοιχία RAID.

Προβλήματα



  • Με ποιο τρόπο θα γίνει σε ένα μηχάνημα που δεν έχουμε console access, αλλά μόνο ssh

  • Πόση ώρα θα είναι το downtime

  • Πως θα αντιγραφούν τα δεδομένα και πως θα εξασφαλιστεί ότι μπορούμε να εκκινήσουμε από τη συστοιχία

  • Τι γίνεται σε περίπτωση προβλήματος


Από όλα τα παραπάνω, το μόνο που μπορώ να απαντήσω είναι το τελευταίο: με δεδομένο ότι δεν υπάρχει δυνατότητα console και single user, ένα λάθος θα είναι καταστροφικό. Και με δεδομένο ότι οι άνθρωποι στο remote site δεν ξέρουν και πολλά...


Αναφορές


Μεγάλη βοήθεια στην παραπάνω διαδικασία είχα από το άρθρο του falko στο HowToForge. Μπορείτε να το δείτε: How To Set Up Software RAID1 On A Running System (Incl. GRUB Configuration). Αν και το άρθρο αναφέρεται σε Debian, υπέθεσα ότι θα είναι πολύ κοντά και στο Centos και ευτυχώς, είχα δίκιο! Το παρακάτω είναι ουσιαστικά προσαρμογή του άρθρου στο Centos.


Η μόνη μάλλον διαφορά είναι στον τρόπο ανανεώσης του initrd image, αλλά βρήκα τι γίνεται σε ένα... forum. Δεν θέλω σχόλια παρακαλώ. Ελλείψη Handbook, η τεκμηρίωση είναι τα forums.


Αρχική Εγκατάσταση


Ξεκίνησα με μια βασική εγκατάσταση τύπου server για το Centos (vmware πάντα). Φτάνοντας στην κονσόλα, root login και ξεκινάμε.


To Centos 5.2 που χρησιμοποίησα έχει πυρήνα 2.6.18 και οι δίσκοι (IDE) έχουν ονόματα hda, hdb κλπ. Το σύστημα είναι εγκατεστημένο στον hda, σε τρία partitions: hda1 (/boot), hda2 (swap), hda3 (/). Δεν έχει χρησιμοποιηθεί LVM που κανονικά είναι το default στον installer.


Κλείστε το Selinux: Το πιθανότερο είναι να έχετε προβλήματα διαφορετικά. Τροποποιήστε το αρχείο /etc/selinux/config:

SELINUX=disabled

και κάντε reboot.


Πρώτη κίνηση είναι να δημιουργηθούν τα ίδια partitions στον hdb όπως και στον hda. Αυτό είναι απλό:



sfdisk -d /dev/hda | sfdisk /dev/hdb

Θα πρέπει να φορτωθεί το module RAID1 στον πυρήνα. Το βασικό πρόβλημα είναι ότι πρέπει να φορτώνεται νωρίς (πριν την προσάρτηση του root file system - vinum chapter dejavu) γιατί το ίδιο το root file system θα είναι πάνω στη συστοιχία. Τα modules αυτά θα πρέπει να μπουν στο initrd, κάτι που θα δούμε παρακάτω.



modprobe raid1

Χρησιμοποιώντας την fdisk, αλλάζουμε και τα τρία partitions του δεύτερου δίσκου σε τύπο fd, Linux Raid autodetect.


fdisk /dev/hdb

Είμαστε έτοιμοι να δημιουργήσουμε τις συσκευές:


mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/hdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/hdb2
mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/hdb3


Και μπορούμε να δημιουργήσουμε τα file systems και το swap space:


mkfs.ext3 /dev/md0
mkswap /dev/md1
mkfs.ext3 /dev/md2


Δημιουργούμε το /etc/mdadm.conf (στο Centos, είναι άδειο):
mdadm --examine --scan >> /etc/mdadm.conf

Δημιουργούμε δύο καταλόγους στο /mnt για να προσαρτήσουμε προσωρινά τις συσκευές και να αντιγράψουμε τα αρχεία:


mkdir /mnt/md0
mkdir /mnt/md2
mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2


Πριν αρχίσουμε την αντιγραφή, αλλάζουμε το /etc/fstab:



/dev/md2 / ext3 defaults 1 1
/dev/md0 /boot ext3 defaults 1 2
/dev/md1 swap swap defaults 0 0


Διορθώνουμε το /boot/grub/menu.lst ώστε να μοιάζει με το παρακάτω:


default=0
fallback=1
timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz
#hiddenmenu
title CentOS (2.6.18-92.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-92.el5 ro root=/dev/md2
initrd /initrd.raid

title CentOS (2.6.18-92.el5) - secondary plex
root (hd1,0)
kernel /vmlinuz-2.6.18-92.el5 ro root=/dev/md2
initrd /initrd.raid


Δεν έχουμε ακόμα δημιουργήσει το initrd.raid. Για το σκοπό αυτό, προσθέτουμε την παρακάτω γραμμή στο /etc/modprobe.conf:



alias md-personality-3 raid1

και:

cd /boot
mkinitrd --fstab=/etc/fstab --with=raid1 --preload=raid1 initrd.raid `uname -r`


Μπορούμε επιτέλους να αντιγράψουμε τα δεδομένα:



cp -dpRx / /mnt/md2
cd /boot
cp -dpRx . /mnt/md0


Φτιάχνουμε το grub και στους δύο δίσκους:
grub
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit


Στο σημείο, αυτό θεωρούμε τους εαυτούς μας τυχερούς, και κάνουμε:
reboot

Στο reboot, ο πυρήνας θα φορτώσει από τον δίσκο hda, και όχι από τον md. Ωστόσο αυτό δεν έχει σημασία, γιατί τα περιεχόμενα των δίσκων είναι ίδια. Αυτό που έχει σημασία είναι να γίνεί mount το root file system από το md2, όπως φαίνεται και στο menu.lst.

Μετά την επιτυχή (ελπίζουμε) επανεκκίνηση το root, boot και swap λειτουργούν πλέον από τις αντίστοιχες md κατατμήσεις. Δεν μένει παρά να αλλάξουμε τα partitions στον hda σε type fd (Raid autodetect) όπως και προηγουμένως χρησιμοποιώντας την fdisk. Τέλος μπορούμε να προσθέσουμε και αυτό το δίσκο στο RAID:

mdadm --add /dev/md0 /dev/hda1
mdadm --add /dev/md1 /dev/hda2
mdadm --add /dev/md2 /dev/hda3


Μπορούμε να δούμε την πρόοδο του συγχρονισμού:

cat /proc/mdstat

Δημιουργούμε το τελικό αρχείο /etc/mdadm.conf:

mdadm --examine --scan > /etc/mdadm.conf

Έχουμε τελειώσει. Μόλις τελειώσει ο συγχρονισμός του RAID κάνουμε reboot, και βλέπουμε το σύστημα να ξεκινάει κανονικά. Ανάβουμε ένα κεράκι στην εκκλησία του beastie και υποσχόμαστε από εδώ και μπρος μόνο FreeBSD και gmirror ;)

2 comments:

pkt said...

To κύριο πρόβλημα με τις οδηγίες σου είναι ότι σε οποιοδήποτε λάθος την έχεις πατήσει :)

Σε τέτοιες περιπτώσεις η πείρα έχει δείξει ότι οι server έχουν αρκετή μνήμη οπότε γιατί να μην τη χρησιμοποιήσει κανείς;

Μπορείς λοιπόν να φτιάξεις απλά ένα πολύ μεγάλο initramfs (έξτρα bonus αν είναι initrd) το οποίο θα είναι το root filesystem σου.

Κάνοντας boot σε αυτό έχεις μετά όλο το δίσκο δικό σου και μπορείς να διορθώσεις οτιδήποτε (ακόμα και repartitioning μπορείς να κάνεις από ssh έτσι).

Επίσης, έτσι δε χρειάζεται reboot για να δοκιμάσεις ότι δουλεύει αυτό που έφτιαξες :)

Just my 0.02 euro :)

Manolis Kiagias said...

Πράγματι το όλο εγχείρημα είναι επισφαλές. Γι'αυτό και έκανα τόσο αναλυτική καταγραφή από vmware. Ωστόσο δεν φαίνεται τελικά να γίνεται στο κανονικό μηχάνημα. Άσε που χάθηκε και ο admin του CentOS project ;)