Linux Software RAID
Linux Software RAID (häufig auch als mdraid oder MD/RAID bezeichnet) ermöglicht die Nutzung von RAID Funktionalität ohne Hardware RAID Controller. Die dazu verwendeten Datenträger (Festplatten, SSDs, ...) werden dabei einfach als einzelne Laufwerke am Rechner angeschlossen, etwa direkt an den SATA Ports des Mainboards.
Hardware RAID Controller haben im Gegensatz zu Software RAID meistens einen eingebauten Cache (häufig 512 MB), der mit einer BBU oder ZMCP geschützt werden kann. Sowohl bei Hardware RAID als auch bei Software RAID empfiehlt es sich den Schreibcache von Festplatten zu deaktivieren, um bei einem Stromausfall keinen Datenverlust zu erleiden. Ausnahme sind dabei SSDs mit integrierten Kondensatoren, die den Cacheinhalt bei einem Stromausfall noch auf den Flash Speicher schreiben (z.B. Intel 320 Series SSDs).
Inhaltsverzeichnis |
Funktionsweise
- RAID 0
- RAID 1
- RAID 4
- RAID 5
- RAID 6
- RAID 10
RAID Superblock
Linux Software RAID speichert alle notwendigen Informationen zu einem RAID Array in einem Superblock. Je nach Metadaten-Version liegt dieser an unterschiedlichen Stellen.
Superblock Metadaten-Version 0.90
Der version-0.90 Superblock ist 4.096 Byte groß und liegt in einem 64 KiB aligned block am Ende eines Devices. Der Superblock beginnt ja nach Devicegröße frühestens 128 KiB vor dem Ende des Devices, bzw. spätestens 64 KiB vor dem Ende des Devices. Um die Adresse des Superblocks zu berechnen wird die Device-Größe auf ein vielfaches von 64 KiB abgerundet und dann 64 KiB vom Ergebnis abgezogen.[2]
Einschränkungen der Metadaten-Version 0.90:
- maximal 28 Devices in einem Array
- jedes Device kann maximal 2 TiB groß sein
- keine Unterstützung des Bad-Block-Managements[3]
Superblock Metadaten-Version 1.*
Die Position des Superblock hängt von der Version der Metadaten ab:[4]
- Version 1.0: Der Superblock liegt am Ende des Devices.
- Version 1.1: Der Superblock liegt am Anfang des Devices.
- Version 1.2: Der Superblock liegt 4 KiB nach dem Beginn des Devices.
RAID erstellen
Das folgende Beispiel zeigt die Erstellung eines RAID 1. Im Beispiel wird ein Fedora 15 Live System verwendet.
Partitionen vorbereiten
Das Software RAID wird über /dev/sda1 und /dev/sdb1 gelegt. Diese Partitionen haben den Typ Linux raid autodetect (fd):
[root@localhost ~]# fdisk -l /dev/sda Disk /dev/sda: 120.0 GB, 120034123776 bytes 139 heads, 49 sectors/track, 34421 cylinders, total 234441648 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: 0x2d0f2eb3 Device Boot Start End Blocks Id System /dev/sda1 2048 20973567 10485760 fd Linux raid autodetect [root@localhost ~]# fdisk -l /dev/sdb Disk /dev/sdb: 120.0 GB, 120034123776 bytes 139 heads, 49 sectors/track, 34421 cylinders, total 234441648 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: 0xe69ef1f5 Device Boot Start End Blocks Id System /dev/sdb1 2048 20973567 10485760 fd Linux raid autodetect [root@localhost ~]#
RAID 1 erstellen
[root@localhost ~]# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@localhost ~]#
Der Fortschritt der Initialisierung wird über das proc-Dateisystem oder mdadm abgefragt:
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
10484664 blocks super 1.2 [2/2] [UU]
[========>............] resync = 42.3% (4440832/10484664) finish=0.4min speed=201856K/sec
unused devices: <none>
[root@localhost ~]#
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Jul 26 07:49:50 2011
Raid Level : raid1
Array Size : 10484664 (10.00 GiB 10.74 GB)
Used Dev Size : 10484664 (10.00 GiB 10.74 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Tue Jul 26 07:50:23 2011
State : active, resyncing
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Rebuild Status : 62% complete
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 3a8605c3:bf0bc5b3:823c9212:7b935117
Events : 11
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
[root@localhost ~]#
Alignment überprüfen
Im Beispiel wird die Metadaten-Version 1.2 verwendet. Die Metadaten liegen also ziemlich am Anfang der Devices, die tatsächlichen Daten dahinter sind aber auf 1 MiB (Data Offset : 2048 sectors, ein Sektor hat 512 Byte) aligned:
[root@localhost ~]# mdadm -E /dev/sda1
/dev/sda1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 3a8605c3:bf0bc5b3:823c9212:7b935117
Name : localhost.localdomain:0 (local to host localhost.localdomain)
Creation Time : Tue Jul 26 07:49:50 2011
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 20969472 (10.00 GiB 10.74 GB)
Array Size : 20969328 (10.00 GiB 10.74 GB)
Used Dev Size : 20969328 (10.00 GiB 10.74 GB)
Data Offset : 2048 sectors
Super Offset : 8 sectors
State : active
Device UUID : 10384215:18a75991:4f09b97b:1960b8cd
Update Time : Tue Jul 26 07:50:43 2011
Checksum : ea435554 - correct
Events : 18
Device Role : Active device 0
Array State : AA ('A' == active, '.' == missing)
[root@localhost ~]#
Sync Rate anpassen
Ein RAID Volume kann direkt nach der Erstellung schon während der Synchronisation genutzt werden. Das vermindert aber die Sync Rate.
In diesem Beispiel mit einem RAID 1 direkt über zwei SSDs (ohne Partitionen auf /dev/sda und /dev/sdb) beginnt die Synchronisation mit ca. 200 MB/s und fällt auf 2,5 MB/s zurück sobald Daten auf das Dateisystem des RAID 1 geschrieben werden:
[root@localhost ~]# dd if=/dev/urandom of=/mnt/testfile-1-1G bs=1G count=1 oflag=dsync
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 115.365 s, 9.3 MB/s
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb[1] sda[0]
117219728 blocks super 1.2 [2/2] [UU]
[============>........] resync = 63.3% (74208384/117219728) finish=279.5min speed=2564K/sec
unused devices: <none>
[root@localhost ~]#
Durch eine manuelle Erhöhung der Sync Rate lässt sich die Synchronisation wieder beschleunigen:[5]
[root@localhost ~]# cat /proc/sys/dev/raid/speed_limit_max
200000
[root@localhost ~]# cat /proc/sys/dev/raid/speed_limit_min
1000
[root@localhost ~]# echo 100000 > /proc/sys/dev/raid/speed_limit_min
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb[1] sda[0]
117219728 blocks super 1.2 [2/2] [UU]
[============>........] resync = 64.2% (75326528/117219728) finish=41.9min speed=16623K/sec
unused devices: <none>
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb[1] sda[0]
117219728 blocks super 1.2 [2/2] [UU]
[=============>.......] resync = 66.3% (77803456/117219728) finish=7.4min speed=88551K/sec
unused devices: <none>
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb[1] sda[0]
117219728 blocks super 1.2 [2/2] [UU]
[=============>.......] resync = 66.4% (77938688/117219728) finish=6.4min speed=101045K/sec
unused devices: <none>
[root@localhost ~]#
RAID löschen
Wird ein RAID Volume nicht mehr benötigt, kann es mit dem folgenden Kommando deaktiviert werden:
[root@localhost ~]# mdadm --stop /dev/md0 mdadm: stopped /dev/md0 [root@localhost ~]#
Der Superblock der einzelnen Devices (in diesem Fall /dev/sda1 und /dev/sdb1 vom obigen Beispiel) wird mit folgenden Kommandos gelöscht - damit können Sie diese Partitionen wieder für neue RAID Verbünde nützen.
[root@localhost ~]# mdadm --zero-superblock /dev/sda1 [root@localhost ~]# mdadm --zero-superblock /dev/sdb1
Roadmap
Neil Brown hat eine Roadmap für MD/RAID für 2011 in seinem Blog veröffentlicht:
- MD/RAID road-map 2011 (neil.brown.name)
Die Unterstützung von ATA Trim für SSDs (discard-support von Linux Software RAID) wird regelmäßig diskutiert, steht Ende Juni 2011 aber noch am Ende der Liste für künftige Features:
- Re: Software RAID and TRIM (Neil Brown, linux-raid Mailing List), siehe auch gesamte Diskussion zu Software RAID and TRIM vom Juni/Juli 2011
Einzelnachweise
- ↑ mdadm (en.wikipedia.org)
- ↑ RAID superblock formats - The version-0.90 Superblock Format (Linux Raid Wiki)
- ↑ 3.1 bringt (2): Storage und Dateisysteme: Software-RAID und Device Mapper (heise Open Kernel Log)
- ↑ RAID superblock formats - Sub-versions of the version-1 superblock (Linux Raid Wiki)
- ↑ SSDs vs. md/sync_speed_(min|max) (Lutz Vieweg, linux-raid mailing list, 18.07.2011)
Weitere Informationen
- The Software-RAID HOWTO
- Linux Raid Wiki (raid.wiki.kernel.org)
- RAID Setup (raid.wiki.kernel.org)
- Workshop - Software-RAID unter Linux einrichten (tecchannel.de, 17.04.2011)
- Quick HOWTO : Ch26 : Linux Software RAID (linuxhomenetworking.com)
- linux-raid Mailing List
- Ubuntu-Server-Installation mit Software-RAID
