Το Σενάριο
Έχετε ένα απομακρυσμένο υπολογιστή που έχει μέσα λειτουργικό, δεδομένα, χρήστες κλπ. σε ένα δίσκο. Ο υπολογιστής σας χρησιμοποιεί 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 ;)
 
