Το Σενάριο
Έχετε ένα απομακρυσμένο υπολογιστή που έχει μέσα λειτουργικό, δεδομένα, χρήστες κλπ. σε ένα δίσκο. Ο υπολογιστής σας χρησιμοποιεί 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:
To κύριο πρόβλημα με τις οδηγίες σου είναι ότι σε οποιοδήποτε λάθος την έχεις πατήσει :)
Σε τέτοιες περιπτώσεις η πείρα έχει δείξει ότι οι server έχουν αρκετή μνήμη οπότε γιατί να μην τη χρησιμοποιήσει κανείς;
Μπορείς λοιπόν να φτιάξεις απλά ένα πολύ μεγάλο initramfs (έξτρα bonus αν είναι initrd) το οποίο θα είναι το root filesystem σου.
Κάνοντας boot σε αυτό έχεις μετά όλο το δίσκο δικό σου και μπορείς να διορθώσεις οτιδήποτε (ακόμα και repartitioning μπορείς να κάνεις από ssh έτσι).
Επίσης, έτσι δε χρειάζεται reboot για να δοκιμάσεις ότι δουλεύει αυτό που έφτιαξες :)
Just my 0.02 euro :)
Πράγματι το όλο εγχείρημα είναι επισφαλές. Γι'αυτό και έκανα τόσο αναλυτική καταγραφή από vmware. Ωστόσο δεν φαίνεται τελικά να γίνεται στο κανονικό μηχάνημα. Άσε που χάθηκε και ο admin του CentOS project ;)
Post a Comment