syslog.warten.de

Aufbau Eines Fileservers Mit RAID-5 (Mdadm)

Der Aufbau des Fileserver geschah mit der Zielsetzung, Daten ausfallsicher verfügbar zu machen und zu lagern. Beim Ausfall einer Festplatte sollte es nicht zu einem Datenverlust kommen und das System sollte weiterhin einsatzfähig sein. Eine leichte Erweiterbarkeit war gewünscht. Zudem sollte der Preis pro nutzbarem GB günstig sein.

Zum Einsatz kommen vier 1000 GB Festplatten, auf denen je identische Partitionen für /boot, /, /data und swap angelegt wurden.

# fdisk -l
Disk /dev/sda: 1000 GB, 1000202273280 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          32      257008   83  Linux
/dev/sda2              33      121601   976494960    f  Extended LBA
/dev/sda5              33          64      249007   82  Linux swap
/dev/sda6              65        1088     8217247   83  Linux
/dev/sda7            1089      121601   968012640   83  Linux
Disk /dev/sdb: 1000 GB, 1000202273280 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          32      257008   83  Linux
/dev/sdb2              33      121601   976494960    f  Extended LBA
/dev/sdb5              33          64      249007   82  Linux swap
/dev/sdb6              65        1088     8217247   83  Linux
/dev/sdb7            1089      121601   968012640   83  Linux
Disk /dev/sdc: 1000 GB, 1000202273280 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1          32      257008   83  Linux
/dev/sdc2              33      121601   976494960    f  Extended LBA
/dev/sdc5              33          64      249007   82  Linux swap
/dev/sdc6              65        1088     8217247   83  Linux
/dev/sdc7            1089      121601   968012640   83  Linux
Disk /dev/sdd: 1000 GB, 1000202273280 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/sdd1               1          32      257008   83  Linux
/dev/sdd2              33      121601   976494960    f  Extended LBA
/dev/sdd5              33          64      249007   82  Linux swap
/dev/sdd6              65        1088     8217247   83  Linux
/dev/sdd7            1089      121601   968012640   83  Linux

Die identischen Partitionen der verschiedenen Festplatten wurden dann mittels Software-RAID verknüpft. Wegen der oben beschriebenen Zielsetzung wurde ein RAID-5 zur Datenhaltung ausgewählt. Es bietet die geforderte Redundanz, die den Ausfall einer Festplatte unbeschadet übersteht sowie eine gute Ausnutzung der Speicherkapazität und Leistung. Allein aus technischen Gründen musste für die Boot-Partition auf ein anderes RAID-Level zurückgegriffen werden: Weil kein Bootloader auf ein Software-RAID-5-Device zugreifen kann, wurde ein RAID-1 ausgewählt. Hier werden die Daten in lesbarer Form auf alle Partitionen gespiegelt.

# mdadm --create --verbose /dev/md0 --level=1 --raid-device=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
# mdadm --create --verbose /dev/md1 --level=5 --raid-device=4 /dev/sda5 /dev/sdb5 /dev/sdc5 /dev/sdd5
# mdadm --create --verbose /dev/md2 --level=5 --raid-device=4 /dev/sda6 /dev/sdb6 /dev/sdc6 /dev/sdd6
# mdadm --create --verbose /dev/md3 --level=5 --raid-device=4 /dev/sda7 /dev/sdb7 /dev/sdc7 /dev/sdd7

Die Herstellung des RAIDs läuft im Hintergrund und dauert eine Weile. Nutzbar ist es schon.

# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [multipath] [raid6] [raid5] [raid4]
md3 : active raid5 sdd7[4] sdc7[2] sdb7[1] sda7[0]
2904061824 blocks level 5, 64k chunk, algorithm 2 [4/3] [UUU_]
[=>...................]  recovery =  5.7% (55536696/968020608) finish=202.3min speed=75137K/sec
md2 : active raid5 sdd6[3] sdc6[2] sdb6[1] sda6[0]
24675456 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
md1 : active raid5 sdd5[3] sdc5[2] sdb5[1] sda5[0]
770688 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
md0 : active raid1 sdd1[3] sdc1[2] sdb1[1] sda1[0]
256896 blocks [4/4] [UUUU]
unused devices: 

Danach kann mit der Installation des Betriebssystems begonnen werden. Auf Details soll hier nicht näher eingegangen werden; es wird auf die Dokumenationen verwiesen.

# mke2fs -j /dev/md0
# mkswap /dev/md1
# mke2fs -j /dev/md2
# mke2fs -j /dev/md3
# sync
# swapon /dev/md1
# mkdir /mnt/debinst
# mount /dev/md2 /mnt/debinst
# mkdir /mnt/debinst/boot
# mkdir /mnt/debinst/proc
# mkdir /mnt/debinst/dev
# mount /dev/md0 /mnt/debinst/boot
# mount --bind /dev /mnt/debinst/dev
# mount --bind /proc /mnt/debinst/proc
# debootstrap --arch amd64 lenny /mnt/debinst http://ftp.de.debian.org/debian

Zum Abschluss wurde der Bootloader in den MBR aller Festplatten installiert, damit beim Ausfall der ersten Festplatte gegebenenfalls von einer anderen gebootet werden kann.

# /usr/sbin/grub-install /dev/sda
# /usr/sbin/grub-install /dev/sdb
# /usr/sbin/grub-install /dev/sdc
# /usr/sbin/grub-install /dev/sdd
Searching for GRUB installation directory ... found: /boot/grub
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(hd0)   /dev/sda
(hd1)   /dev/sdb
(hd2)   /dev/sdc
(hd3)   /dev/sdd
# update-grub
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ...
Generating /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /vmlinuz-2.6.25-2-amd64
Updating /boot/grub/menu.lst ... done

Sollte der verfügbare Speicher knapp werden, kann das hier vorgestellt System leicht erweitert werden. Durch den Einbau einer oder mehrerer Festplatten gleicher Kapazität und bei identischer Partitionierung können die einzelnen RAIDs jeweils wie folgt vergrößert werden. Der obligatorische Hinweis zur Datensicherung vor solchen Änderungen sei hiermit erfolgt.

mdadm --add /dev/md3 /dev/sde7
mdadm --grow /dev/md3 --raid-devices=5
fsck.ext3 /dev/md3
resize2fs /dev/md3