Software-RAID unter eisfair-2
Einrichten eines Software-RAID unter eisfair-2
Yves Schumann
08/2010
1. Inhalt
2. Aufgabe
Gegeben ist ein auf einer Platte installiertes System, in welches zwei weitere Platten als RAIDVerbund integriert werden sollen. In diesem Fall ist das ein stromsparendes Atom-Board, welches mit einem IDE und zwei SATA-Anschlüssen ausgestattet ist. Am IDE-Port befindet sich eine kleine 2,5" Notebook-Platte mit dem System, an den beiden SATA-Anschlüssen jeweils eine grosse Platte für den RAID-Verbund.
2.1. Ausgangssituation
Es wurde eine Platte angeschlossen (hier eine 2,5" IDE-Platte) und das System komplett installiert. Dann wurden die beiden zusätzlichen Platten (hier 3,5" SATA-II) eingebaut. Damit ergibt sich bspw. folgendes Bild:
root@kessel:~# fdisk -l Disk /dev/sda: 40.0 GB, 40007761920 bytes 255 heads, 63 sectors/track, 4864 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sda1 * 1 9 72292 83 Linux /dev/sda2 10 267 2072385 82 Linux swap / Solaris /dev/sda3 268 4864 36925402+ 83 Linux Disk /dev/sdb: 2000.3 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x00000000 Disk /dev/sdb doesn't contain a valid partition table Disk /dev/sdc: 2000.3 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x00000000 Disk /dev/sdc doesn't contain a valid partition table root@kessel:~#
Die Platte sda ist die IDE-Systemplatte, sdb und sdc soll zum Software-RAID verbunden werden. Umsetzung (RAID-Setup):
2.2. Module laden
Da das System ohne RAID aufgesetzt wurde, müssen zunächst die entsprechenden Module geladen werden:
root@kessel:~# modprobe raid1
Nun sollten in der Ausgabe von lsmod die folgenden beiden Einträge zu finden sein:
root@kessel:~# lsmod ... raid1 25728 1 md_mod 81940 2 raid1 ...
2.3. Platten partitionieren
Nun wird auf den beiden SATA-Platten jeweils eine Partition angelegt und deren Typ gesetzt. Das wird mit fdisk erledigt. Folgende Schritte werden ausgeführt:
- Partition anlegen (hier eine primäre Partition voller Grösse der Platte)
- Typ der Partition auf "Linux raid auto" ändern
- Partitionstabelle schreiben
root@kessel:~# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x4e29a19c. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. 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) Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): p Disk /dev/sdb: 2000.3 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x4e29a19c 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): 1 First cylinder (1-243201, default 1): <Return> Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-243201, default 243201): <Return>Using default value 243201 Command (m for help): p Disk /dev/sdb: 2000.3 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x4e29a19c Device Boot Start End Blocks Id System /dev/sdb1 1 243201 1953512001 83 Linux Command (m for help): t Selected partition 1 Hex code (type L to list codes): L 0 Empty 1e Hidden W95 FAT1 80 Old Minix be Solaris boot 1 FAT12 24 NEC DOS 81 Minix / old Lin bf Solaris 2 XENIX root 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT- 5 Extended 41 PPC PReP Boot 85 Linux extended c7 Syrinx 6 FAT16 42 SFS 86 NTFS volume set da Non-FS data 7 HPFS/NTFS 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / . 8 AIX 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility 9 AIX bootable 4f QNX4.x 3rd part 8e Linux LVM df BootIt a OS/2 Boot Manag 50 OnTrack DM 93 Amoeba e1 DOS access b W95 FAT32 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O c W95 FAT32 (LBA) 52 CP/M 9f BSD/OS e4 SpeedStor e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs f W95 Ext'd (LBA) 54 OnTrackDM6 a5 FreeBSD ee EFI GPT 10 OPUS 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/ 11 Hidden FAT12 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b 12 Compaq diagnost 5c Priam Edisk a8 Darwin UFS f1 SpeedStor 14 Hidden FAT16 <3 61 SpeedStor a9 NetBSD f4 SpeedStor 16 Hidden FAT16 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary 17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fd Linux raid auto 18 AST SmartSleep 65 Novell Netware b8 BSDI swap fe LANstep 1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid ff BBT 1c Hidden W95 FAT3 75 PC/IX Hex code (type L to list codes): fd Changed system type of partition 1 to fd (Linux raid autodetect) Command (m for help): p Disk /dev/sdb: 2000.3 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x4e29a19c Device Boot Start End Blocks Id System /dev/sdb1 1 243201 1953512001 fd Linux raid autodetect Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. root@kessel:~#
Selbiges muss nun auch für /dev/sdc durchgespielt werden.
2.4. Sektorgrössen anpassen (optional)
Wenn die verwendeten Platten Sektorgrössen von 4k unterstützen, sollten diese auch verwendet werden. Dafür ist eine Verschiebung des Startpunktes der Daten auf einen durch acht teilbaren Wert notwendig. Das wird ebenfalls mit fdisk durch die folgenden 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
root@kessel:~# fdisk /dev/sdb 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/sdc: 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/sdc1 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. root@kessel:~#
Selbiges muss nun auch für /dev/sdc durchgespielt werden.
2.5. Reste eines eventuellen alten RAID-Verbundes löschen
Falls die Platten bereits in einem RAID-Verbund verwendet worden sind, muss sichergestellt werden, dass keine "Reste" der alten RAID-Konfiguration vorhanden sind:
root@kessel:~# mdadm --zero-superblock /dev/sdb1 mdadm: Unrecognised md component device - /dev/sdb1 root@kessel:~# mdadm --zero-superblock /dev/sdc1 mdadm: Unrecognised md component device - /dev/sdc1 root@kessel:~#
Wenn keine Reste eines früheren RAID-Verbundes vorhanden waren, wird die oben zu sehende Meldung ausgegeben. Das ist an dieser Stelle kein Problem und bei neuen Platten normal.
2.6. RAID-Verbund anlegen
Die SATA-Platten sind nun vorbereitet, um sie zu einem RAID-Verbund zusammenzuführen. Somit wird im nächsten Schritt das RAID mit mdadm wie folgt angelegt:
root@kessel:~# mdadm --create /dev/md0 --level=1 --raid-disks=2 /dev/sdb1 /dev/sdc1 mdadm: excess address on MAIL line: mdadm/mail_to - ignored mdadm: excess address on MAIL line: doesnt exist - ignored mdadm: array /dev/md0 started. root@kessel:~#
2.7. RAID Synchronisation
Jetzt beginnt die Synchronisation der RAID-Disks, welche man bis zum Ende abwarten sollte. Das wird je nach Grösse der Disks mehrere Stunden dauern. Den aktuellen Status der Synchronisation kann man wie folgt anzeigen lassen:
root@kessel:~# 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> root@kessel:~#
Beim Aufruf mit 'watch cat /proc/mdstat' erhält man eine alle zwei Sekunden aktualisierte Ausgabe und kann den Sync-Prozess somit nebenher laufen lassen und im Auge behalten:
Every 2.0s: cat /proc/mdstat Sat Aug 28 16:26:04 2010 Personalities : [raid1] md0 : active raid1 sdc[1] sdb[0] 1953514496 blocks [2/2] [UU] [=============>.......] resync = 66.1% (1293223040/1953514496) finish=152.6min speed=72102K/sec unused devices: <none>
Zurück auf die Konsole gelangt man mit Ctrl+C.
2.8. Dateisystem anlegen
Nachdem die Synchronisation abgeschlossen worden ist, wird das Dateisystem angelegt. Dieser Vorgang wird einige Minuten dauern:
root@kessel:~# mkfs.ext3 /dev/md0 mke2fs 1.40.8 (13-Mar-2008) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 122101760 inodes, 488377984 blocks 24418899 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=0 14905 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, 71663616, 78675968, 102400000, 214990848 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 24 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. root@kessel:~#
2.9. RAID mounten
Damit ist das RAID eingerichtet und kann gemountet werden. Hier in diesem HowTo soll der RAIDVerbund nach /data/backup gemountet werden:
root@kessel:~# mkdir /data/backup root@kessel:~# 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 root@kessel:~# mount /dev/md0 /data/backup root@kessel:~#
Nun ist der RAID-Verbund dem System bis zum nächsten Reboot bekannt:
root@kessel:~# mount #(Ausgabe für das HowTo formatiert) /dev/sda3 on / type ext3 (rw,errors=remount-ro,acl,user_xattr) proc on /proc type proc (rw,noexec,nosuid,nodev) /sys on /sys type sysfs (rw,noexec,nosuid,nodev) varrun on /var/run type tmpfs (rw,noexec,nosuid,nodev,mode=0755) udev on /dev type tmpfs (rw,mode=0755) devshm on /dev/shm type tmpfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/sda1 on /boot type ext3 (rw,errors=remount-ro,acl,user_xattr) /dev/md0 on /data/backup type ext3 (rw) root@kessel:~# root@kessel:~# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 35G 408M 33G 2% / varrun 1010M 36K 1010M 1% /var/run udev 1010M 40K 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 root@kessel:~#
2.10. Umsetzung (Dauerhafte Integration)
Natürlich soll der RAID-Verbund auch nach einem Reboot zur Verfügung stehen. Dafür sind die folgenden Schritte notwendig.
2.10.1. mdadm-Konfiguration aktualisieren
Zunächst muss die mdadm-Konfigurationsdatei aktualisiert werden:
root@kessel:~# 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 root@kessel:~#
Die Konfiguration sollte nun in etwa wie folgt aussehen:
root@kessel:~# 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 <system> # 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 root@kessel:~#
Nachdem die Array-Zeile eingefügt wurde, müssen noch die folgenden Anpassungen in der mdadm.config vorgenommen werden:
Eintragung der zu verwendenden Platten unter DEVICE:
Eintrag alt:
DEVICE partitions
Eintrag neu:
DEVICE /dev/sdb[0-9] /dev/sdc[0-9]
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...
Prüfen und ggf. korrigieren der eingetragenen UUID.
In der Ausgabe von 'blkid' ist die UUID der beiden Platten im RAID-Verbund zu sehen. Diese ist für beide Platten identisch und muss auch in der mdadm.config stehen. Achtung, die Schreibweise unterscheidet sich geringfügig, bei der Ausgabe von blkid werden die UUIDs mit "-" getrennt, in der mdadm.config mit ":" und noch dazu an anderer Stelle. Hier ein korrektes Beispiel:
root@kessel:~# 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" ... root@kessel:~# cat /etc/mdadm/mdadm.conf | grep ARRAY ARRAY /dev/md0 level=raid1 num-devices=2 metadata=00.90 UUID=f728db1b:06e60380:36b8364f:ac71c0cc root@kessel:~#
2.10.2. fstab aktualisieren
Nun muss der RAID-Verbund in die fstab eingetragen werden. Bei einer Standard-Installation von eisfair-2 ohne separate Datenpartition sieht die fstab bspw. wie folgt aus:
root@kessel:~# cat /etc/fstab # (Ausgabe für 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 root@kessel:~#
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:
root@kessel:~# vol_id -u /dev/md0 d2dcb1cd-2ba4-4f89-8bee-8c44213b2848 root@kessel:~#
Mit dieser UUID wir nun der entsprechende Eintrag in die fstab eingefügt:
root@kessel:~# vi /etc/fstab
und eine Zeile nach folgendem Schema eintragen:
UUID=<hier-UUID-eintragen> /data/backup ext3 defaults,errors=remount-ro,acl,user_xattr 0 2
2.10.3. GRUB-Konfiguration aktualisieren
Im letzten Schritt muss in der Grub-Konfig das Laden der RAID-Module aktiviert werden. Dafür die Datei /boot/grub/menu.lst im Editor geöffnet:
root@kessel:~# vi /boot/grub/menu.lst
und die Kernel-Zeile um die Angabe "raid=1" ergänzt werden:
Eintrag alt:
kernel /boot/vmlinuz root=UUID=41b0... ro quiet console=tty7 kmapger
Eintrag neu:
kernel /boot/vmlinuz root=UUID=41b0... ro quiet console=tty7 kmapger raid=1 Reboot & Check
An dieser Stelle ist das Setup des RAID-Verbund und dessen dauerhafte Integration abgeschlossen. Das sollte nun durch einen Reboot überprüft werden:
root@kessel:~# reboot ... root@kessel:~# 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 root@kessel:~#