Unterabschnitte

Software-RAID mit fdisk

Die Voraussetzung

In dieser Anleitung wird fdisk für die Einteilung der Festplatten benutzt. fdisk war bis zum Erscheinen von 2TB-Festplatten das Tool der Wahl.

Um ein RAID einzurichten, benutzen wir in dieser Beschreibung das Programm 'mdadm'.

Diese Anleitung wurde speziell auf eisfair-Systeme abgestimmt, auf deren Besonderheiten zu gegebener Zeit hingewiesen wird.
Es werden alle Arten von Festplatten (IDE, SATA, SCSI) unterstützt. Die Festplattenbezeichnung (hd[a-f] oder sd[a-f]) muss jeweils den eigenen Gegebenheiten angepasst werden, unabängig davon, welche Werte in dieser Anleitung verwendet wurden.

eisfair-1  
  Das Program 'mdadm' ist ab der base 1.8.0 im Basis-System enthalten und muss deshalb nicht explizit installiert werden.
   
  Die notwendigen Kernelmodule sind im Kernel integriert und müssen nicht zusätzlich geladen werden.
   
  Wenn das bisherige System auf einer IDE-Festplatte installiert ist, müssen für SCSI- oder SATA-Festplatten noch die entsprechenden Kernelmodule geladen werden.
   
  Durch Ausführen des Befehls 'modprobe $modul' wird das Modul geladen.
   
  ($modul muss in diesem Fall durch den zu ladenden Modulnamen ersetzt werden, z.B. 'ahci')






 eis #  modprobe ahci
 eis #
            





  Sollte der zu ladenden Treiber nicht bekannt sein, dann nutzt man den Befehl
   
  lspci -v
   
  ,um diesen zu ermitteln.





eisfair-2  
  Das Program 'mdadm' ist bereits im Basissystem enthalten und muss deshalb nicht explizit installiert werden.
   
  Die RAID-Kernelmodule müssen geladen werden, wenn bisher noch kein RAID-System installiert worden ist.






 eis #  modprobe raid1
 eis #
            





Zusätzliches RAID zu einer Systemplatte einrichten

Ausgangssituation

Ein eisfair-System wurde bereits auf einer IDE-Festplatte installiert und soll um zwei zusätzliche SATA II-Festplatten in einem RAID-1-Verbund ergänzt werden. Damit ergibt sich beispielsweise folgendes Bild:






 eis #  fdisk -l 
 Disk /dev/hda: 2111 MB, 2111864832 bytes
 16 heads, 63 sectors/track, 4092 cylinders, total 4124736 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0xcec8ed6a

    Device Boot      Start         End      Blocks   Id  System
 /dev/hda1   *          63       98783       49360+  83  Linux
 /dev/hda2           98784      361871      131544   82  Linux swap / Solaris
 /dev/hda3          361872     4124735     1881432   83  Linux

 Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
 255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x00000000

 Disk /dev/sda doesn't contain a valid partition table

 Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
 255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x4136b680

    Device Boot      Start         End      Blocks   Id  System
 /dev/sdb1   *          64      112454       56195+  83  Linux
 /dev/sdb2          112456      385559      136552   82  Linux swap / Solaris
 /dev/sdb3          385560     4482134     2048287+  83  Linux
 /dev/sdb4         4482136  1953520064   974518964+  83  Linux
 eis #
            





Das Basis-System liegt in diesem Beispiel auf der Festplatte /dev/hda.

Die zu einem Software-RAID zusammenzufassenden Festplatten sind

/dev/sda: hat bisher keine Formatierung - ist also neu
/dev/sdb: wurde schon einmal benutzt und muss nun für
den Einsatz fit gemacht werden. Erreicht wird dies
durch das Löschen der vorhandenen Datenstruktur:



 eis # dd if=/dev/zero of=/dev/sdb bs=512 count=1 
  1+0 records in
  1+0 records out
  512 bytes (512 B) copied, 0.000447 s, 1.1 MB/s
 eis #
            





Beim Ausführen des Befehls 'fdisk -l' ergibt sich somit folgendes Bild:






 eis #  fdisk -l 
 Disk /dev/hda: 2111 MB, 2111864832 bytes
 16 heads, 63 sectors/track, 4092 cylinders, total 4124736 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0xcec8ed6a

    Device Boot      Start         End      Blocks   Id  System
 /dev/hda1   *          63       98783       49360+  83  Linux
 /dev/hda2           98784      361871      131544   82  Linux swap / Solaris
 /dev/hda3          361872     4124735     1881432   83  Linux

 Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
 255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x00000000

 Disk /dev/sda doesn't contain a valid partition table

 Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
 255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x00000000

 Disk /dev/sdb doesn't contain a valid partition table
 eis #
            


Einrichten der ersten Festplatte

Auf der ersten Festplatte wird eine Partition angelegt und deren Typ festgelegt. Mittels des fdisk-Befehls werden folgende Schritte ausgeführt:

- Partition anlegen (hier wird eine primäre Partition angelegt
welche die ganze Grösse der Festplatte einnimmt)
- Typ der Partition auf 'Linux raid auto' ändern
- Partitionstabelle schreiben






 eis # fdisk /dev/sda 
 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
 Building a new DOS disklabel with disk identifier 0xd7bfe3c2.
 Changes will remain in memory only, until you decide to write them.
 After that, of course, the previous content won't be recoverable.

 Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

 Command (m for help): p

 Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
 255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0xd7bfe3c2

    Device Boot      Start         End      Blocks   Id  System

 Command (m for help): n

 Command action
    e   extended
    p   primary partition (1-4)
 p

 Partition number (1-4, default 1): 1
 First sector (63-1953525167, default 63): <Return>
 Using default value 2048
 Last sector, +sectors or +size{K,M,G} (63-1953525167, default 1953525167): <Return> 
 Using default value 1953525167

 Command (m for help): p

 Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
 255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0xd7bfe3c2

    Device Boot      Start         End      Blocks   Id  System
 /dev/sda1            63    1953525167   976761560   83  Linux

 Command (m for help): t
  Selected partition 1
 Hex code (type L to list codes): L

  0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris
  1  FAT12           39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-
  2  XENIX root      3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-
  3  XENIX usr       40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
  4  FAT16 <32M      41  PPC PReP Boot   85  Linux extended  c7  Syrinx
  5  Extended        42  SFS             86  NTFS volume set da  Non-FS data
  6  FAT16           4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .
  7  HPFS/NTFS       4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility
  8  AIX             4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt
  9  AIX bootable    50  OnTrack DM      93  Amoeba          e1  DOS access
  a  OS/2 Boot Manag 51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O
  b  W95 FAT32       52  CP/M            9f  BSD/OS          e4  SpeedStor
  c  W95 FAT32 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs
  e  W95 FAT16 (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  GPT
  f  W95 Ext'd (LBA) 55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/
 10  OPUS            56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b
 11  Hidden FAT12    5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor
 12  Compaq diagnost 61  SpeedStor       a9  NetBSD          f4  SpeedStor
 14  Hidden FAT16 <3 63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary
 16  Hidden FAT16    64  Novell Netware  af  HFS / HFS+      fb  VMware VMFS
 17  Hidden HPFS/NTF 65  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
 18  AST SmartSleep  70  DiskSecure Mult b8  BSDI swap       fd  Linux raid auto
 1b  Hidden W95 FAT3 75  PC/IX           bb  Boot Wizard hid fe  LANstep
 1c  Hidden W95 FAT3 80  Old Minix       be  Solaris boot    ff  BBT
 1e  Hidden W95 FAT1
 Hex code (type L to list codes): fd

 Changed system type of partition 1 to fd (Linux raid autodetect)

 Command (m for help) p

    Device Boot      Start         End      Blocks   Id  System
 /dev/sda1            63    1953525167   976761560   fd  Linux raid autodetect

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

 Calling ioctl() to re-read partition table.
 Syncing disks.
 eis #
            


Sektorgrößen anpassen (optional)

Wenn die verwendeten Festplatten 4k-Sektorgrößen unterstützen, sollten diese auch verwendet werden. Dafür ist eine Verschiebung des Startpunktes der Daten auf einen durch acht teilbaren Wert notwendig. Dies wird ebenfalls mit Hilfe des fdisk-Befehls durch Ausführen folgender Schritte erreicht:

- Expertenmodus aktivieren
- Beginn der Daten in der Partition auf durch 8 teilbaren Wert
setzen (hier vom Default-Wert 63 auf 64)
- Partitionstabelle schreiben






 eis # fdisk /dev/sda1 
 The number of cylinders for this disk is set to 243201.
 There is nothing wrong with that, but this is larger than 1024,
 and could in certain setups cause problems with:
 1) software that runs at boot time (e.g., old versions of LILO)
 2) booting and partitioning software from other OSs
    (e.g., DOS FDISK, OS/2 FDISK)

 Command (m for help): p

 Disk /dev/sda: 2000.3 GB, 2000398934016 bytes
 255 heads, 63 sectors/track, 243201 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes
 Disk identifier: 0x1361d2f0

    Device Boot Start End Blocks Id System
 /dev/sda1 1 243201 1953512001 fd Linux raid autodetect

 Command (m for help): x

 Expert command (m for help): m
 Command action
    b move beginning of data in a partition
    c change number of cylinders
    d print the raw data in the partition table
    e list extended partitions
    f fix partition order
    g create an IRIX (SGI) partition table
    h change number of heads
    i change the disk identifier
    m print this menu
    p print the partition table
    q quit without saving changes
    r return to main menu
    s change number of sectors/track
    v verify the partition table
    w write table to disk and exit

 Expert command (m for help): b
 Partition number (1-4): 1
 New beginning of data (63-3907024064, default 63): 64

 Expert command (m for help): w
 The partition table has been altered!

 Calling ioctl() to re-read partition table.
 Syncing disks.
 eis #
            


Für die, die es kurz mögen, die vorherigen Schritte als Einzeiler mit sfdisk: Die '0' lässt sich auch durch einen durch 8 teilbaren Wert ersetzen z.B. '64'



 eis # echo '0,,fd' | sfdisk -q -D -uM --no-reread /dev/sda
 eis #
            


Einrichten der zweiten Festplatte

Nachdem die erste Festplatte komplett eingerichtet wurde, überträgt man deren Partitions-Layout auf die zweite Festplatte und begutachtet das Ergebnis:






 eis # sfdisk -d /dev/sda | sfdisk -f /dev/sdb
 eis #
 eis # fdisk -l 
 Disk /dev/hda: 2111 MB, 2111864832 bytes
 16 heads, 63 sectors/track, 4092 cylinders, total 4124736 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0xcec8ed6a

    Device Boot      Start         End      Blocks   Id  System
 /dev/hda1   *          63       98783       49360+  83  Linux
 /dev/hda2           98784      361871      131544   82  Linux swap / Solaris
 /dev/hda3          361872     4124735     1881432   83  Linux

 Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
 81 heads, 63 sectors/track, 382818 cylinders, total 1953525168 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0xd7bfe3c2

    Device Boot      Start         End      Blocks   Id  System
 /dev/sda1            64    1953525167   976761560   fd  Linux raid autodetect

 Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
 255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x00000000

    Device Boot      Start         End      Blocks   Id  System
 /dev/sdb1            64    1953525167   976761560   fd  Linux raid autodetect
 eis #
            


Reste eines alten RAID-Verbundes löschen

Falls die Festplatten bereits einmal in einem RAID-Verbund verwendet wurden, muss sichergestellt werden, dass keine Reste der alten RAID-Konfiguration mehr vorhanden sind. Hierzu wird einfach der alte Superblock gelöscht:






 eis # mdadm --zero-superblock /dev/sda1 
 mdadm: Unrecognised md component device - /dev/sda1
 eis # mdadm --zero-superblock /dev/sdb1
 mdadm: Unrecognised md component device - /dev/sdb1
 eis #
            





Falls keine Reste eines früheren RAID-Verbundes gefunden werden, wird von mdadm die oben zu sehende Meldung ausgegeben. Dies ist an dieser Stelle kein Problem und bei neuen Festplatten absolut normal.

RAID-Verbund anlegen

Die Festplatten sind nun soweit vorbereitet, um sie zu einem RAID-Verbund zusammenzuführen. Der RAID-Verbund wird im nächsten Schritt mit Hilfe von mdadm angelegt:






 eis # mdadm --create /dev/md0 --bitmap=internal --level=1 --raid-disks=2 /dev/sda1 /dev/sdb1 
 mdadm: array /dev/md0 started.
 eis #
            


RAID Synchronisation

Jetzt beginnt die Synchronisation der RAID-Festplatten, welche man unbedingt bis zum Ende abwarten sollte. Dieser Vorgang kann, abhängig von der Größe der Festplatten, mehrere Stunden dauern. Den aktuellen Status der Synchronisation kann man sich wie folgt anzeigen lassen:






 eis # cat /proc/mdstat 
 Personalities : [raid1]
 md0 : active raid1 sdc[1] sdb[0]
       1953514496 blocks [2/2] [UU]
       [>....................] resync = 0.0% (491072/1953514496) finish=397.6min
 speed=81845K/sec

 unused devices: <none>
 eis #
            





Beim Aufruf des Befehls 'watch cat /proc/mdstat' erhält man eine alle zwei Sekunden aktualisierte Statusausgabe und kann den Synchronisationsprozess so nebenher im Auge behalten. Zurück auf die Konsole gelangt man mit 'Strg+C':






 eis # watch cat /proc/mdstat 
 Every 2.0s: cat /proc/mdstat                            Thu Sep  8 17:44:42 2011

 Personalities : [raid1]
 md0 : active raid1 sdc[1] sdb[0]
       1953514496 blocks [2/2] [UU]
       [>....................] resync = 0.0% (491072/1953514496) finish=397.6min
 speed=81845K/sec

 unused devices: <none>
 eis #
            


Anlegen des Dateisystems

Nach Abschluss der Synchronisation legt man das Dateisystem an, was üblicherweise einige Minuten dauert. Das Standard-Dateisystem vieler Linux-Systeme ist auch heute noch 'ext3 - mkfs.ext3', auch wenn es diverse Alternativen gibt. 'Wer die Wahl hat, hat die Qual' ;-)

eisfair-1  
  Neu für eisfair hinzugekommene Dateisysteme sind 'ext4 - mkfs.ext4' und 'xfs - mkfs.xfs'. Zum Einrichten eines 'xfs'-Dateisystems müssen zusätzlich die 'xfs-tools' von Pack-Eis installiert werden.







 eis # mkfs.etx4 /dev/md0 
 mke2fs 1.41.14 (22-Dec-2010)
 Filesystem label=
 OS type: Linux
 Block size=1024 (log=0)
 Fragment size=1024 (log=0)
 Stride=0 blocks, Stripe width=0 blocks
 2336 inodes, 9344 blocks
 467 blocks (5.00%) reserved for the super user
 First data block=1
 Maximum filesystem blocks=9699328
 2 block groups
 8192 blocks per group, 8192 fragments per group
 1168 inodes per group
 Superblock backups stored on blocks:
         8193

 Writing inode tables: done
 Creating journal (1024 blocks): done
 Writing superblocks and filesystem accounting information: done

 This filesystem will be automatically checked every 29 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.
 eis #
            


Bestehendes RAID (auf fremdem System erstellt) integrieren

Dieses Szenario setzt voraus, dass auf einem anderen System ein RAID-Verbund auf einer oder mehreren Platten bereits angelegt wurde und die beinhaltenden Platten in den eisfair-1-Server eingebaut und elektrisch angeschlossen wurden.

RAID starten

Um den existierenden RAID-Verbund mounten zu können, muss dieser zuerst gestartet werden. Dies geht mit folgendem Befehl; ggf. /dev/mdX-Device und die einzelnen Partitionen /dev/hdX bzw. /dev/sdX anpassen.

Beispiel für ein RAID-1 auf zwei Festplatten:



 eis # mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1
 mdadm: /dev/md0 has been started with 2 drives (out of 2)
 eis #
            


Beispiel für ein RAID-1 auf zwei Festplatten, wobei gerade nur eine Festplatte angeschlossen ist:



 eis #  mdadm --assemble /dev/md0 /dev/sdb1
 mdadm: /dev/md0 has been started with 1 drive (out of 2)
 eis #
            


Die fehlende Festplatte/Partition kann später mit folgendem Befehl hinzugefügt werden:



 eis # mdadm /dev/md0 -a /dev/sdc1
 eis #
            


RAID mounten

Der RAID-Verbund ist nun eingerichtet und kann gemountet werden. Im Beispiel wird als Mountpoint das Verzeichnis /data/backup verwendet:






 eis # mkdir -p /data/backup
 eis # ls -l /data/ 
 total 8
 drwxr-xr-x 2 root root 4096 Aug 28 16:45 backup
 drwxr-xr-x 2 root root 4096 Jun 14 15:22 packages
 eis # mount -t ext4 /dev/md0 /data/backup
 eis #
            





Die neue Partition im RAID-Verbund ist dem System nun bis zum nächsten Reboot bekannt:






 eis # mount 
 /dev/hda3 on / type ext3 (rw,errors=remount-ro,acl,user_xattr)
 /dev/hda1 on /boot type ext3 (rw,errors=remount-ro)
 devpts on /dev/pts type devpts (rw)
 usbfs on /proc/bus/usb type usbfs (rw)
 /sys on /sys type sysfs (rw)
 /dev/md0 on /data/backup type ext4 (rw,acl,user_xattr)
 eis #
            


Systemintegration

Um den RAID-Verbund dauerhaft zu aktivieren, damit er auch einen Neustart übersteht, sind folgende Schritte durchzuführen:

eisfair-1

fstab-Datei bearbeiten

Mit Hilfe des Editors 'joe' öffnet man die Datei /etc/fstab und fügt eine zusätzliche Zeile, beginnend mit /dev/md0, hinzu. Bitte eine Leerzeile am Dateiende nicht vergessen:

joe /etc/fstab


  /dev/hda3 / ext3 defaults,errors=remount-ro 0 1
  /dev/hda1 /boot ext3 defaults,errors=remount-ro 0 1
  /dev/hda2 none swap sw 0 0
  proc        /proc          proc      defaults                 0 0
  /dev/fd0    /floppy        auto      defaults,user,noauto     0 0
  /dev/cdrom  /cdrom         iso9660   defaults,ro,user,noauto  0 0
  devpts      /dev/pts       devpts    defaults                 0 0
  usbfs       /proc/bus/usb  usbfs     defaults                 0 0
  /sys        /sys           sysfs     defaults                 0 0
  /dev/md0    /data/backup   ext4      defaults                 0 0




Um eventuell fehlende Kernelmodule und das Starten des RAID-Verbundes in die initrd zu bekommen, empfiehlt es sich an dieser Stelle ein Kernelupdate durchzuführen. Auch wenn der Kernel bereits auf dem aktuellen Stand sein sollte, wird durch ein Kernelupdate sicher gestellt, dass eine korrekte initrd-Datei erzeugt wird.

Initrd bearbeiten

Natürlich ist es auch möglich, die initrd manuell zu bearbeiten und die notwendigen Angaben mit dem Editor 'joe' einzufügen. Vor eiskernel mit der Version 2.11.0 wird eine normale initrd verwendet, die wie folgt entpackt und gemountet wird:






 eis # mkdir -p /tmp/initrd/init
 eis # cd /tmp/initrd
 eis # cp -a /boot/initrd.gz .
 eis # gzip -d initrd.gz
 eis # modprobe loop
 eis # mount -o loop initrd init
 eis #
            


joe init/linuxrc




Ab eiskernel 2.11.0 wird eine initramfs verwendet und das oben beschriebene Verfahren funktioniert so nicht mehr. Ein Beispiel für die notwendigen Befehle findet Ihr unter 'Software-RAID - GPT-fdisk'. Vor eiskernel 2.7.1 wird das Raid mit dem Befehl raidautorun der busybox gestartet. Am Dateiende die folgende Zeile hinzufügen (Leerzeile am Ende nicht vergessen):

  /sbin/raidautorun /dev/md0

Nach eiskernel 2.7.1 und wenn Raids mit Meta-Data 1.2 existieren, wird das Raid immer mit mdadm in der initrd assembliert. Ein Beispiel für die notwendigen Befehle findet Ihr unter 'Software-RAID - GPT-fdisk'. Nun wird die initrd wieder zusammengepackt und zurückkopiert:






 eis # umount init
 eis # gzip -9 initrd
 eis # cp initrd.gz /boot
 eis # reboot
 eis #
            





Reboot und Check

Nach dem Neustart des Servers prüfen wir noch einmal, ob die neue Partition im RAID-Verbund korrekt eingebunden wurde.






 Welcome to eisfair! 
 base     : 2.7.11
 eiskernel: 2.32.1 (3.2.87-eisfair-1-SMP)
 eis #
 eis # mount
 /dev/hda3 on / type ext3 (rw,errors=remount-ro,acl,user_xattr)
 /dev/hda1 on /boot type ext3 (rw,errors=remount-ro)
 devpts on /dev/pts type devpts (rw)
 usbfs on /proc/bus/usb type usbfs (rw)
 /sys on /sys type sysfs (rw)
 /dev/md0 on /data/backup type ext4 (rw,acl,user_xattr)
 eis #
            





An dieser Stelle ist die Konfiguration des RAID-Verbundes und dessen dauerhafte Einbindung in das eisfair-System abgeschlossen.

eisfair-2

mdadm-Konfiguration aktualisieren

Zunächst muss die mdadm-Konfigurationsdatei aktualisiert werden:






 eis # mdadm --examine --scan >> /etc/mdadm/mdadm.conf 
 mdadm: excess address on MAIL line: mdadm/mail_to - ignored
 mdadm: excess address on MAIL line: doesnt exist - ignored
 eis #
            





Die Konfiguration sollte nun in etwa wie folgt aussehen:






 eis # cat /etc/mdadm/mdadm.conf 
 # mdadm.conf
 #
 # Please refer to mdadm.conf(5) for information about this file.
 #

 # by default, scan all partitions (/proc/partitions) for MD superblocks.
 # alternatively, specify devices to scan, using wildcards if desired.
 DEVICE partitions

 # auto-create devices with Debian standard permissions
 CREATE owner=root group=disk mode=0660 auto=yes

 # automatically tag new arrays as belonging to the local system
 HOMEHOST 

 # instruct the monitoring daemon where to send mail alerts
 MAILADDR 10 mdadm/mail_to doesn't exist

 # This file was auto-generated on Mon, 14 Jun 2010 13:02:32 +0000
 # by mkconf $Id$
 ARRAY /dev/md0 level=raid1 num-devices=2 UUID=5048f0d3:e561afa8:36b8364f:ac71c0cc
 eis #
            





Nachdem die Array-Zeile eingefügt wurde, müssen noch die folgenden Anpassungen in der mdadm.config-Datei vorgenommen werden:

1. Eintragen der zu verwendenden Festplatten unter DEVICE:

  Eintrag alt:

    DEVICE partitions

  Eintrag neu:

    DEVICE /dev/sdb[0-9] /dev/sdc[0-9]

2. Erweitern der ARRAY-Zeile um die metadata-Angabe nach folgendem Schema:

  Eintrag alt:

    ARRAY /dev/md0 level=raid1 num-devices=2 UUID=8f00...

  Eintrag neu:

    ARRAY /dev/md0 level=raid1 num-devices=2 metadata=00.90 UUID=8f00...

3. Prüfen der eingetragenen UUID und gegebenenfalls deren Korrektur. In der Ausgabe von 'blkid' ist die UUID der beiden Festplatten im RAID-Verbund zu sehen. Diese ist für beide Festplatten identisch und muss sich ebenfalls in der mdadm.config-Datei befinden. Achtung, die Schreibweise unterscheidet sich geringfügig. Bei der Ausgabe von blkid werden die UUIDs mit '-' getrennt, in der mdadm.config-Datei mit ':' und noch dazu an anderer Stelle angezeigt. Hier ein korrektes Beispiel:






 eis # blkid 
 ...
 /dev/sdb1: UUID="f728db1b-06e6-0380-36b8-364fac71c0cc" TYPE="linux_raid_member"
 /dev/sdc1: UUID="f728db1b-06e6-0380-36b8-364fac71c0cc" TYPE="linux_raid_member"
 ...
 eis # grep ARRAY /etc/mdadm/mdadm.conf} 
 ARRAY /dev/md0 level=raid1 num-devices=2 metadata=00.90
 UUID=f728db1b:06e60380:36b8364f:ac71c0cc
 eis #
            





fstab-Datei bearbeiten

Nun muss der RAID-Verbund noch in die fstab-Datei eingetragen werden. Bei einer Standardinstallation von eisfair-2 ohne separate Datenpartition sieht die fstab beispielsweise wie folgt aus:

  /etc/fstab           #(Ausgabe fuer das HowTo formatiert)

  proc         /proc         proc defaults 0 0
  UUID=41b0... /             ext3 defaults,errors=remount-ro,acl,user_xattr 0 1
  UUID=c99e... /boot         ext3 defaults,errors=remount-ro,acl,user_xattr 0 1
  UUID=a101... none          swap sw 0 0
  /dev/cdrom   /media/cdrom  udf,iso9660 user,noauto,exec,utf8 0 0
  /dev/fd0     /media/floppy auto rw,user,noauto,exec,utf8 0 0




Um nun den RAID-Verbund in die fstab einzutragen, wird die UUID benötigt. Diese wird entweder wieder mit 'blkid' oder mit 'vol_id' wie folgt ermittelt:






 eis # vol_id /dev/md0 
 d2dcb1cd-2ba4-4f89-8bee-8c44213b2848
 eis #
            





Mit dieser UUID wir nun der entsprechende Eintrag in die fstab-Datei, nach folgendem Schema, vorgenommen (Leerzeile am Zeilenende nicht vergessen):

  vi /etc/fstab

UUID=<hier-UUID-eintragen> /data/backup ext3  defaults,errors=remount-ro,acl,user_xattr 0 2

GRUB-Konfiguration aktualisieren

Im letzten Schritt muss in der Grub-Konfiguration das Laden der RAID-Module aktiviert werden. Dazu wird die Datei /boot/grub/menu.lst im Editor geöffnet:

  vi /boot/grub/menu.lst

und die Kernel-Zeile um die Angabe 'raid=1' ergänzt werden:

  Eintrag alt:

    kernel /boot/vmlinux root=UUID=41b0... ro quiet console=tty7 kmapger

  Eintrag neu:

    kernel /boot/vmlinux root=UUID=41b0... ro quiet console=tty7 kmapger raid=1

Reboot und Check

An dieser Stelle ist die Konfiguration des RAID-Verbundes und dessen dauerhafte Einbindung in das eisfair-System abgeschlossen. Dies sollte noch durch einen Neustart des Servers überprüft werden:






 eis # reboot
 eis #
 eis # df -h 
 Filesystem Size Used Avail Use% Mounted on
 /dev/sda3 35G 408M 33G 2% /
 varrun 1010M 32K 1010M 1% /var/run
 udev 1010M 48K 1010M 1% /dev
 devshm 1010M 0 1010M 0% /dev/shm
 /dev/sda1 69M 14M 51M 22% /boot
 /dev/md0 1.9T 196M 1.8T 1% /data/backup
 eis #
            





An dieser Stelle ist die Konfiguration des RAID-Verbundes und dessen dauerhafte Einbindung in das eisfair-System abgeschlossen.




Den Server komplett auf einem RAID-1 einrichten

Ausgangssituation

Ein eisfair-System wurde bereits mit 4 Partitionen auf einer Festplatte installiert, d.h. es wurde dabei auch eine zusätzliche /data-Partition angelegt. Dieses eisfair-System soll nun komplett auf einen RAID-1-Verbund umziehen. Damit ergibt sich folgendes Bild:

/dev/sda Erste Festplatte mit dem vorhandenen eisfair-System
/dev/sda1 /boot
/dev/sda2 swap-Partition
/dev/sda3 /
/dev/sda4 /data
/dev/sdb Zweite 'leere' Festplatte






 eis # fdisk -l

 Disk /dev/sda: 160.0 GB, 160041885696 bytes
 255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x2fa4f6c3

    Device Boot      Start         End      Blocks   Id  System
 /dev/sda1   *          63      112454       56196   83  Linux
 /dev/sda2          112455      385559      136552+  82  Linux swap / Solaris
 /dev/sda3          385560    21366449    10490445   83  Linux
 /dev/sda4        21366450   312576704   145605127+  83  Linux

 Disk /dev/sdb: 160.0 GB, 160040803840 bytes
 255 heads, 63 sectors/track, 19457 cylinders, total 312579695 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x00000000

 Disk /dev/sdb doesn't contain a valid partition table
 eis #
            





Auf der ersten Festplatte ändert man nun die Partitions-Ids aller vorhandenen Partitionen nach 'fd' 'Linux raid autodetect':






 eis #  sfdisk --change-id /dev/sda 1 fd 
 Done
 eis #  sfdisk --change-id /dev/sda 2 fd 
 Done
 eis #  sfdisk --change-id /dev/sda 3 fd 
 Done
 eis #  sfdisk --change-id /dev/sda 4 fd 
 Done
 eis #
            




Für die, die es kurz mögen, gibt es diese Befehle noch einmal als Einzeiler mit sfdisk:





 eis # for i in 1 2 3 4; do sfdisk --change-id /dev/sda $i fd ; done 
 Done

 Done

 Done

 Done
 eis #
            




Die Partitionen stellen sich nun wie folgt dar:





 eis # fdisk -l 
 Disk /dev/sda: 160.0 GB, 160041885696 bytes
 255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x2fa4f6c3

    Device Boot      Start         End      Blocks   Id  System
 /dev/sda1   *          63      112454       56196   fd  Linux raid autodetect
 /dev/sda2          112455      385559      136552+  fd  Linux raid autodetect
 /dev/sda3          385560    21366449    10490445   fd  Linux raid autodetect
 /dev/sda4        21366450   312576704   145605127+  fd  Linux raid autodetect

 Disk /dev/sdb: 160.0 GB, 160040803840 bytes
 255 heads, 63 sectors/track, 19457 cylinders, total 312579695 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x00000000

 Disk /dev/sdb doesn't contain a valid partition table
 eis #
            





Einrichten der zweiten Festplatte

Nachdem die erste Festplatte komplett eingerichtet wurde, überträgt man deren Partitions-Layout auf die zweite Festplatte und begutachtet das Ergebnis:





 eis # sfdisk -d /dev/sda | sfdisk -f /dev/sdb 
 Checking that no-one is using this disk right now ...
 OK

 Disk /dev/sdb: 19457 cylinders, 255 heads, 63 sectors/track

 sfdisk: ERROR: sector 0 does not have an msdos signature
  /dev/sdb: unrecognized partition table type
 Old situation:
 No partitions found
 New situation:
 Units = sectors of 512 bytes, counting from 0

    Device Boot    Start       End   #sectors  Id  System
 /dev/sdb1   *        63    112454     112392  fd  Linux raid autodetect
 /dev/sdb2        112455    385559     273105  fd  Linux raid autodetect
 /dev/sdb3        385560  21366449   20980890  fd  Linux raid autodetect
 /dev/sdb4      21366450 312576704  291210255  fd  Linux raid autodetect
 Successfully wrote the new partition table

 Re-reading the partition table ...

 If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
 to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
 (See fdisk(8).)
 eis #
            






 eis # sfdisk -luS 
 Disk /dev/sda: 19457 cylinders, 255 heads, 63 sectors/track
 Units = sectors of 512 bytes, counting from 0

    Device Boot    Start       End   #sectors  Id  System
 /dev/sda1   *        63    112454     112392  fd  Linux raid autodetect
 /dev/sda2        112455    385559     273105  fd  Linux raid autodetect
 /dev/sda3        385560  21366449   20980890  fd  Linux raid autodetect
 /dev/sda4      21366450 312576704  291210255  fd  Linux raid autodetect

 Disk /dev/sdb: 19457 cylinders, 255 heads, 63 sectors/track
 Units = sectors of 512 bytes, counting from 0

    Device Boot    Start       End   #sectors  Id  System
 /dev/sdb1   *        63    112454     112392  fd  Linux raid autodetect
 /dev/sdb2        112455    385559     273105  fd  Linux raid autodetect
 /dev/sdb3        385560  21366449   20980890  fd  Linux raid autodetect
 /dev/sdb4      21366450 312576704  291210255  fd  Linux raid autodetect
 eis #
            





Reste eines alten RAID-Verbundes löschen

Falls die Festplatten bereits einmal in einem RAID-Verbund verwendet wurden, muss sichergestellt werden, dass keine Reste der alten RAID-Konfiguration mehr vorhanden sind. Hierzu wird einfach der alte Superblock gelöscht.






 eis # mdadm --zero-superblock /dev/sdb1 
 mdadm: Unrecognised md component device - /dev/sdb1
 eis # mdadm --zero-superblock /dev/sdb2
 mdadm: Unrecognised md component device - /dev/sdb2
 eis # mdadm --zero-superblock /dev/sdb3 
 mdadm: Unrecognised md component device - /dev/sdb3
 eis # mdadm --zero-superblock /dev/sdb4
 mdadm: Unrecognised md component device - /dev/sdb4
 eis #
            





Falls keine Reste eines früheren RAID-Verbundes gefunden werden, wird die oben zu sehende Meldung ausgegeben. Das ist an dieser Stelle kein Problem und bei neuen Festplatten absolut normal.




RAID-Verbund anlegen

Die Festplatten sind nun soweit vorbereitet, dass ein RAID-Verbund angelegt werden kann. Hierzu verwendet man den mdadm. Zur besseren Orientierung wird empfohlen, die Bezeichnungen der 'md'-Devices an die der vorherigen Partitionen anzulehnen:

/dev/sda1 /dev/md1
/dev/sda2 /dev/md2
/dev/sda3 /dev/md3
/dev/sda4 /dev/md4

Da die erste Festplatte die zu kopierenden Daten enthält, wird sie beim Anlegen des RAID-Verbundes als 'missing' deklariert. Das Schlüsselwort 'missing' sagt lediglich aus, dass noch Devices fehlen und bezieht sich nicht auf das danach angegebene Device.






 eis # mdadm --create /dev/md1 --bitmap=internal --level=1 --raid-disks=2 missing /dev/sdb1 
 mdadm: /dev/sdb1 appears to contain an ext2fs file system
     size=56128K  mtime=Tue Sep 20 20:13:39 2011
 Continue creating array? y 
 mdadm: array /dev/md1 started.
 eis #
 eis # mdadm --create /dev/md2 --bitmap=internal --level=1 --raid-disks=2 missing /dev/sdb2 
 mdadm: array /dev/md2 started.
 eis #
 eis # mdadm --create /dev/md3 --bitmap=internal --level=1 --raid-disks=2 missing /dev/sdb3 
 mdadm: /dev/sdb3 appears to contain an ext2fs file system
     size=1052160K  mtime=Thu Sep  8 11:39:23 2011
 Continue creating array? y 
 mdadm: array /dev/md3 started.
 eis #
 eis # mdadm --create /dev/md4 --bitmap=internal --level=1 --raid-disks=2 missing /dev/sdb4 
 mdadm: array /dev/md4 started.
 eis #
            





Das Ergebnis lässt man sich zur Kontrolle anzeigen:






 eis # cat /proc/mdstat 
 Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
 md4 : active raid1 sdb4[1]
       145605056 blocks [2/1] [_U]

 md3 : active raid1 sdb3[1]
       10490368 blocks [2/1] [_U]

 md2 : active raid1 sdb2[1]
       136448 blocks [2/1] [_U]

 md1 : active raid1 sdb1[1]
       56128 blocks [2/1] [_U]

 unused devices: 
 eis #
            





Anlegen des Dateisystems

Nun legt man das Dateisystem an, was üblicherweise einige Minuten dauert. Das Standard-Dateisystem vieler Linux-Systeme ist auch heute noch 'ext3 - mkfs.ext3', auch wenn es diverse Alternativen gibt. 'Wer die Wahl hat, hat die Qual' ;-)

eisfair-1  
  Neu für eisfair hinzugekommene Dateisysteme sind 'ext4 - mkfs.ext4' und 'xfs - mkfs.xfs'. Zum Einrichten eines 'xfs'-Dateisystems müssen zusätzlich die 'xfs-tools' von Pack-Eis installiert werden.
   




mkfs.ext4 /dev/md1
mkfs.ext4 /dev/md3
mkfs.ext4 /dev/md4
mkswap /dev/md2






 eis # mkfs.etx4 /dev/md1 
 mke2fs 1.41.14 (22-Dec-2010)
 Filesystem label=
 OS type: Linux
 Block size=1024 (log=0)
 Fragment size=1024 (log=0)
 Stride=0 blocks, Stripe width=0 blocks
 14056 inodes, 56128 blocks
 2806 blocks (5.00%) reserved for the super user
 First data block=1
 Maximum filesystem blocks=57671680
 7 block groups
 8192 blocks per group, 8192 fragments per group
 2008 inodes per group
 Superblock backups stored on blocks:
         8193, 24577, 40961

 Writing inode tables: done
 Creating journal (4096 blocks): done
 Writing superblocks and filesystem accounting information: done

 This filesystem will be automatically checked every 20 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.
 eis #
 eis # mkfs.etx4 /dev/md3 
 mke2fs 1.41.14 (22-Dec-2010)
 Filesystem label=
 OS type: Linux
 Block size=4096 (log=2)
 Fragment size=4096 (log=2)
 Stride=0 blocks, Stripe width=0 blocks
 655776 inodes, 2622592 blocks
 131129 blocks (5.00%) reserved for the super user
 First data block=0
 Maximum filesystem blocks=2688548864
 81 block groups
 32768 blocks per group, 32768 fragments per group
 8096 inodes per group
 Superblock backups stored on blocks:
         32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

 Writing inode tables: done
 Creating journal (32768 blocks): done
 Writing superblocks and filesystem accounting information: done

 This filesystem will be automatically checked every 20 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.
 eis #
 eis # mkfs.etx4 /dev/md4 
 mke2fs 1.41.14 (22-Dec-2010)
 Filesystem label=
 OS type: Linux
 Block size=4096 (log=2)
 Fragment size=4096 (log=2)
 Stride=0 blocks, Stripe width=0 blocks
 9101312 inodes, 36401264 blocks
 1820063 blocks (5.00%) reserved for the super user
 First data block=0
 Maximum filesystem blocks=0
 1111 block groups
 32768 blocks per group, 32768 fragments per group
 8192 inodes per group
 Superblock backups stored on blocks:
         32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
         4096000, 7962624, 11239424, 20480000, 23887872

 Writing inode tables: done
 Creating journal (32768 blocks): done
 Writing superblocks and filesystem accounting information: done

 This filesystem will be automatically checked every 32 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.
 eis #
 eis # mkswap /dev/md2 
 mkswap: /dev/md2: warning: don't erase bootbits sectors
         on whole disk. Use -f to force.
 Setting up swapspace version 1, size = 136444 KiB
 no label, UUID=0d01a7f7-ae3a-4d99-834e-a5805bb10231
 eis #
            


Filesystemcheck abschalten

Wenn das komplette RAID-Setup über eine Secure-Shell durchgeführt wird, sollte man vor dem ersten Reboot die Überprüfung des Root-Datei-Systems unterbinden. Dazu ist in der Datei /etc/init.d/checkfs die Zeile '/sbin/fsck -A -p 2>/dev/null' auszukommentieren und diese dann zu speichern:

joe /etc/init.d/checkfs


  # Ist:
  ...
  echo "Checking file systems..."
  /sbin/fsck $FSCK_PROGRESS -A -p $FSCK_FORCE 2>/dev/null
  fsck_ret=$?


  # Soll:
  ...
  echo "Checking file systems..."
#  /sbin/fsck $FSCK_PROGRESS -A -p $FSCK_FORCE 2>/dev/null
  fsck_ret=0 #$?




Einbinden der RAID-Festplatte

Das Root-Device (/dev/md3) mountet man nach /mnt und legt dort ein neues boot-Verzeichnis an. Dieses boot-Verzeichnis verwendet man nun als Mountpoint für das Boot-Device (/dev/md1):






 eis # mount -t ext4 /dev/md3 /mnt
 eis # mkdir -p /mnt/boot
 eis # mount -t ext4 /dev/md1 /mnt/boot
 eis #
            





Übertragen der Daten

Die Partitionen mit dem Root-Verzeichnis sowie dem Boot-Verzeichnis werden auf die neu erstellten Multiple-Devices kopiert.

Da der Kopiervorgang selbst einige Minuten dauern kann, wartet man so lange, bis der Eingabe-Prompt wieder erscheint:






 eis #  cd /
 eis #  find . -xdev | cpio -pmv /mnt
 eis #
 eis #  cd /boot
 eis #  find . -xdev | cpio -pmv /mnt/boot
 eis #
            


ACHTUNG
Änderung ab base 2.7.7 mit UDEV


Im Anschluss müssen nun noch im /dev Verzeichnis die Devices console und null angelegt werden. Diese Devices müssen beim boot vorhanden sein.

Dazu wechselt man in das Verzeichnis:

cd /mnt/dev

mknod -m 0660 console c 5 1
mknod -m 0660 null c 1 3




fstab-Datei bearbeiten

Mit Hilfe des Editors 'joe' öffnet man die Datei /mnt/etc/fstab und passt sie an die neuen Multiple-Device-Namen an. Bitte eine Leerzeile am Dateiende nicht vergessen:

joe /mnt/etc/fstab


  /dev/md3 / ext4 defaults,errors=remount-ro 0 1
  /dev/md1 /boot ext4 defaults,errors=remount-ro 0 1
  /dev/md2 none swap sw 0 0
  /dev/md4 /data ext4 defaults 0 0
  proc        /proc          proc      defaults                 0 0
  /dev/fd0    /floppy        auto      defaults,user,noauto     0 0
  /dev/cdrom  /cdrom         iso9660   defaults,ro,user,noauto  0 0
  devpts      /dev/pts       devpts    defaults                 0 0
  usbfs       /proc/bus/usb  usbfs     defaults                 0 0
  /sys        /sys           sysfs     defaults                 0 0



lilo.conf-Datei bearbeiten

Jetzt kann die aktuelle /boot-Partition ausgehängt und stattdessen /dev/sda1 nach /mnt/boot eingehängt werden. Dies ist notwendig, um die korrekte Installation des Bootloaders Lilo zu gewährleisten:






 eis #  cd /
 eis #  umount /boot
 eis #  mount /dev/sda1 /mnt/boot
 eis #
            





Im nächsten Schritt wird die Datei /mnt/etc/lilo.conf so modifiziert, dass das Boot-Device immer noch ein herkömmliches Laufwerk /dev/sda bleibt, das Root-Datei-System sich jedoch bereits auf einem Multiple-Device befindet:

joe /mnt/etc/lilo.conf


  lba32
  disk = /dev/sda
    bios = 0x80
  boot = /dev/sda
  read-only
  prompt
  timeout = 50
  vga = normal

  image = /boot/kernel
  root = /dev/md3
  label = eis
  initrd = /boot/initrd.gz
  vga = 773




Initrd bearbeiten

Damit das zukünftige RAID auch startet, muss die initrd geöffnet und das Skript 'linuxrc' manipuliert werden. Vor eiskernel mit der Version 2.11.0 wird eine normale initrd verwendet, die wie folgt entpackt und gemountet wird:






 eis # mkdir -p /tmp/initrd/init
 eis # cd /tmp/initrd
 eis # cp -a /mnt/boot/initrd.gz .
 eis # gzip -d initrd.gz
 eis # modprobe loop
 eis # mount -o loop initrd init
 eis #
            





joe init/linuxrc

Ab eiskernel 2.11.0 wird eine initramfs verwendet und das oben beschriebene Verfahren funktioniert so nicht mehr. Ein Beispiel für die notwendigen Befehle findet Ihr unter 'Software-RAID - GPT-fdisk'. Vor eiskernel 2.7.1 wird das Raid mit dem Befehl raidautorun der busybox gestartet. Am Dateiende die folgende Zeile hinzufügen (Leerzeile am Ende nicht vergessen):

  /sbin/raidautorun /dev/md1

Nach eiskernel 2.7.1 und wenn Raids mit Meta-Data 1.2 existieren, wird das Raid immer mit mdadm in der initrd assembliert. Ein Beispiel für die notwendigen Befehle findet Ihr unter 'Software-RAID - GPT-fdisk'. Nun wird die initrd wieder zusammengepackt und zurückkopiert:






 eis # umount init
 eis # gzip -9 initrd
 eis # cp initrd.gz /mnt/boot
 eis #
            





lilo ausführen

Um die Voraussetzung für einen fehlerfreien Neustart des Servers zu schaffen, ist es notwendig, die zuvor genannten Anpassungen an der Datei /mnt/etc/lilo.conf vorzunehmen. Danach kann der lilo-Befehl auf dem Verzeichnis /mnt ausgeführt werden:






 eis #  cd /
 eis #  lilo -r /mnt 
 Added eis  *
 eis #
            





Abschließend sind noch folgende Schritte auszuführen, um einer Kernelpanik beim Systemstart vorzubeugen. Die Partition /dev/sda1 ist noch nach /mnt/boot eingehängt und muss nun wieder nach /boot eingehängt werden. Anschließend wird das System neu gestartet:



 eis # umount /dev/sda1
 eis # mount /dev/sda1 /boot
 eis #
 eis # cp -a /boot/initrd.gz /mnt/boot
 eis # 
 eis # reboot
 eis #
            





RAID zusammenführen

Wenn alle bisherigen Schritte ohne Probleme durchgeführt wurden, läuft der RAID-Verbund zwar bereits, jedoch ohne aktive Redundanz, da die Festplatte /dev/sda noch nicht Teil des RAID-Verbundes ist:






 eis # mount 
 /dev/md3 on / type ext4 (rw,errors=remount-ro,acl,user_xattr)
 /dev/md1 on /boot type ext4 (rw,errors=remount-ro)
 /dev/md4 on /data type ext4 (rw,acl,user_xattr)
 devpts on /dev/pts type devpts (rw)
 usbfs on /proc/bus/usb type usbfs (rw)
 /sys on /sys type sysfs (rw)
 eis #
            





Die Festplatte /dev/sda wird nun in den RAID-Verbund integriert:






 eis # mdadm /dev/md1 --add  /dev/sda1 
 mdadm: added /dev/sda1
 eis # mdadm /dev/md2 --add  /dev/sda2 
 mdadm: added /dev/sda2
 eis # mdadm /dev/md3 --add  /dev/sda3 
 mdadm: added /dev/sda3
 eis # mdadm /dev/md4 --add  /dev/sda4 
 mdadm: added /dev/sda4
 eis #
            


RAID-Synchronisation

Jetzt beginnt die Synchronisation der RAID-Festplatten, welche man unbedingt bis zum Ende abwarten sollte. Dieser Vorgang kann, abhängig von der Größe der Festplatten, mehrere Stunden dauern. Den aktuellen Status der Synchronisation kann man sich wie folgt anzeigen lassen:



 eis # cat /proc/mdstat 
 Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
 md2 : active raid1 sda2[0] sdb2[1]
       136448 blocks [2/2] [UU]

 md3 : active raid1 sda3[2] sdb3[1]
       10490368 blocks [2/1] [_U]
       [=========>...........]  recovery = 48.0% (5042688/10490368) finish=1.8min speed=48404K/sec

 md4 : active raid1 sda4[2] sdb4[1]
       145605056 blocks [2/1] [_U]
         resync=DELAYED

 md1 : active raid1 sda1[0] sdb1[1]
       56128 blocks [2/2] [UU]

 unused devices: <none>
 eis #
            




Beim Aufruf des Befehls 'watch cat /proc/mdstat' erhält man eine alle zwei Sekunden aktualisierte Statusausgabe und kann den Synchronisationsprozess so nebenher im Auge behalten. Zurück auf die Konsole gelangt man mit 'Strg+C':



 eis # watch cat /proc/mdstat 
 Every 2.0s: cat /proc/mdstat                            Thu Sep  8 17:44:42 2011

 Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
 md2 : active raid1 sda2[0] sdb2[1]
       136448 blocks [2/2] [UU]

 md3 : active raid1 sda3[2] sdb3[1]
       10490368 blocks [2/1] [_U]
       [=========>...........]  recovery = 48.0% (5042688/10490368) finish=1.8min speed=48404K/sec

 md4 : active raid1 sda4[2] sdb4[1]
       145605056 blocks [2/1] [_U]
         resync=DELAYED

 md1 : active raid1 sda1[0] sdb1[1]
       56128 blocks [2/2] [UU]

 unused devices: <none>
 eis #
            


Abschlußarbeiten

Filesystemcheck einschalten

Damit bei jedem Systemstart wieder eine Überprüfung des Dateisystems angestoßen wird, muss die in einem vorherigen Schritt auskommentierte Zeile '#/sbin/fsck -A -p 2>/dev/null' wieder aktiviert werden:

joe /etc/init.d/checkfs


  Ist:
  ...
  echo "Checking file systems..."
# /sbin/fsck $FSCK_PROGRESS -A -p $FSCK_FORCE 2>/dev/null
  fsck_ret=0 #$?

  Soll:
  ...
  echo "Checking file systems..."
  /sbin/fsck $FSCK_PROGRESS -A -p $FSCK_FORCE 2>/dev/null
  fsck_ret=$?

lilo.conf-Datei anpassen

Auch die lilo-Konfiguration muss nun noch an die veränderten Rahmenbedingungen angepasst werden, um den Start von allen Laufwerken des RAID-Verbundes zu ermöglichen:

joe /etc/lilo.conf


  [...ist
  lba32
  disk = /dev/sda
    bios = 0x80
  boot = /dev/sda
  read-only
  prompt
  timeout = 50
  vga = normal

  image = /boot/kernel
  root = /dev/md3
  label = eis
  initrd = /boot/initrd.gz

  [...soll
  lba32
  disk = /dev/sda
    bios = 0x80
  boot = /dev/md1
  raid-extra-boot = /dev/sda,/dev/sdb
  read-only
  prompt
  timeout = 50
  vga = normal

  image = /boot/kernel
  root = /dev/md3
  label = eis
  initrd = /boot/initrd.gz
  vga = 773




Zum Abschluss wird noch einmal der lilo-Befehl ausgeführt und das eisfair-System neu gestartet.






 eis # lilo 
 Added eis  *
 The boot record of  /dev/md1  has been updated.
 The boot record of  /dev/sda  has been updated.
 Warning: /dev/sdb is not on the first disk
 The boot record of  /dev/sdb  has been updated.
 One warning was issued.
 eis #
 eis # reboot
 eis #
            




Reboot und Check

An dieser Stelle ist die Konfiguration des RAID-Verbundes und dessen dauerhafte Einbindung in das eisfair-System abgeschlossen. Dies sollte noch durch einen Neustart des Servers überprüft werden:



 eis # Welcome to eisfair! 
 base     : 2.7.11
 eiskernel: 2.32.1 (3.2.87-eisfair-1-SMP)
 eis #
 eis # mount
 
 /dev/md3 on / type ext4 (rw,errors=remount-ro,acl,user_xattr)
 /dev/md1 on /boot type ext4 (rw,errors=remount-ro)
 /dev/md4 on /data type ext4 (rw,acl,user_xattr)
 devpts on /dev/pts type devpts (rw)
 usbfs on /proc/bus/usb type usbfs (rw)
 /sys on /sys type sysfs (rw)
 eis #
            





Den Server komplett auf einem RAID-5 einrichten




Die Installation eines RAID-5 erfolgt analog eines RAID-1 mit einer dritten Festplatte.

Der wesentlichste und wichtigste Unterschied ist, dass ein Linux-System nicht von einem Software-RAID-5 booten kann. Das heisst nun aber nicht, dass sich ein System mit Software-RAID-5 nicht einrichten und betreiben lässt. Es benötigt dafür nur eine Boot-Partition, die kein RAID-5 enthält. Dafür ist ein RAID-1 genau richtig.

In der /etc/lilo.conf ist dafür der Wert

raid-extra-boot = /dev/sda,/dev/sdb,/dev/sdc

zu setzen. Dann wird von ``lilo`` der Bootloader auf alle 3 Festplatten geschrieben. Dieses Vorgehen wird von lilo dabei auch entsprechend kommentiert.

Ein Software-RAID wird vom Kernel bereit gestellt. Das bedeutet, der Kernel muss selbst erst einmal geladen sein, um dieses Software-RAID zu initalisieren. Wenn nun /boot mit dem zu ladenen Kernel aber auf einem RAID-5 liegen würde, bei dem die Daten über 3 Festplatten verteilt sind, müßte der Kernel von einem Array geladen werden, welches nur der Kernel selber initialisieren kann ...

Test

Weitere Tests lassen sich realisieren, indem man einzelne Festplatten nacheinander hardwareseitig abklemmt. Es ist darauf zu achten, dass die Synchronisation immer vollständig erfolgt ist, bevor ein Reboot ausgeführt wird. Ist alles korrekt konfiguriert, muss das System von jedem Laufwerk ohne Fehlermeldungen hochfahren.

Desaster recovery

Bei Ausfall einer Festplatte in einem Software-RAID-Verbund sind im Wesentlichen die gleichen Schritte wie bei dem Hinzufügen der 2. Festplatte, weiter vorne beschrieben, auszuführen.






 eis # hdparm -i /dev/hdb 

 /dev/hdb:

  Model=WDC WD3200AAJB-00J3A0, FwRev=01.03E01, SerialNo=WD-WCAV2AV04526
  Config={ HardSect NotMFM HdSw>15uSec SpinMotCtl Fixed DTR>5Mbs FmtGapReq }
  RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=50
  BuffType=unknown, BuffSize=8192kB, MaxMultSect=16, MultSect=16
  CurCHS=65535/1/63, CurSects=4128705, LBA=yes, LBAsects=625142448
  IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
  PIO modes:  pio0 pio3 pio4
  DMA modes:  mdma0 mdma1 mdma2
  UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6
  AdvancedPM=no WriteCache=enabled
  Drive conforms to: Unspecified:  ATA/ATAPI-1,2,3,4,5,6,7

  * signifies the current active mode
 eis #
            










 eis # mdadm /dev/md1 --fail /dev/hdb1 
 mdadm: set /dev/hdb1 faulty in /dev/md1
 eis # mdadm /dev/md2 --fail /dev/hdb2 
 mdadm: set /dev/hdb2 faulty in /dev/md2
 eis # mdadm /dev/md3 --fail /dev/hdb3 
 mdadm: set /dev/hdb3 faulty in /dev/md3
 eis # mdadm /dev/md4 --fail /dev/hdb4 
 mdadm: set /dev/hdb4 faulty in /dev/md4
 eis #
            










 eis # mdadm /dev/md1 --remove /dev/hdb1 
 mdadm: hot removed /dev/hdb1
 eis # mdadm /dev/md2 --remove /dev/hdb2 
 mdadm: hot removed /dev/hdb2
 eis # mdadm /dev/md3 --remove /dev/hdb3 
 mdadm: hot removed /dev/hdb3
 eis # mdadm /dev/md4 --remove /dev/hdb4 
 mdadm: hot removed /dev/hdb4
 eis #
            










 eis # sfdisk -d /dev/sda | sfdisk -f /dev/sdb 
 Checking that no-one is using this disk right now ...
 OK

 Disk /dev/sdb: 19457 cylinders, 255 heads, 63 sectors/track

 sfdisk: ERROR: sector 0 does not have an msdos signature
  /dev/sdb: unrecognized partition table type
 Old situation:
 No partitions found
 New situation:
 Units = sectors of 512 bytes, counting from 0

    Device Boot    Start       End   #sectors  Id  System
 /dev/sdb1   *        63    112454     112392  fd  Linux raid autodetect
 /dev/sdb2        112455    385559     273105  fd  Linux raid autodetect
 /dev/sdb3        385560  21366449   20980890  fd  Linux raid autodetect
 /dev/sdb4      21366450 312576704  291210255  fd  Linux raid autodetect
 Successfully wrote the new partition table

 Re-reading the partition table ...

 If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
 to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
 (See fdisk(8).)
 eis #
            







 eis # sfdisk -luS 
 Disk /dev/sda: 19457 cylinders, 255 heads, 63 sectors/track
 Units = sectors of 512 bytes, counting from 0

    Device Boot    Start       End   #sectors  Id  System
 /dev/sda1   *        63    112454     112392  fd  Linux raid autodetect
 /dev/sda2        112455    385559     273105  fd  Linux raid autodetect
 /dev/sda3        385560  21366449   20980890  fd  Linux raid autodetect
 /dev/sda4      21366450 312576704  291210255  fd  Linux raid autodetect

 Disk /dev/sdb: 19457 cylinders, 255 heads, 63 sectors/track
 Units = sectors of 512 bytes, counting from 0

    Device Boot    Start       End   #sectors  Id  System
 /dev/sdb1   *        63    112454     112392  fd  Linux raid autodetect
 /dev/sdb2        112455    385559     273105  fd  Linux raid autodetect
 /dev/sdb3        385560  21366449   20980890  fd  Linux raid autodetect
 /dev/sdb4      21366450 312576704  291210255  fd  Linux raid autodetect
 eis #
            










 eis # mdadm /dev/md1 --add  /dev/sda1 
 mdadm: added /dev/sda1
 eis # mdadm /dev/md2 --add  /dev/sda2 
 mdadm: added /dev/sda2
 eis # mdadm /dev/md3 --add  /dev/sda3 
 mdadm: added /dev/sda3
 eis # mdadm /dev/md4 --add  /dev/sda4 
 mdadm: added /dev/sda4
 eis #
            




Nach der Synchronisation ist der RAID-Verbund wieder vollständig.

Endbemerkungen

Es ist unbedingt zu beachten, dass ein RAID-Verbund kein Backup ersetzt. Aus diesem Grund wird empfohlen, eine verlässliche Sicherungsstrategie zu erstellen.
Darüberhinaus sollte vor der Überführung eines bestehenden eisfair-Systems in einen RAID-Verbund, wie vor allen großen Änderungen an der Hard- oder Software, eine Datensicherung auf einen externen Datenträger durchgeführt werden.
Für die Erstellung dieser Anleitung wurde u.a. auf die auf eisfair.org abgelegten Anleitungen von Jürgen Witt und Manfred Reiland zurückgegriffen.

eis 2017-05-03