Dieser Artikel wurde von Andi (quattro) als Gastartikel eingereicht!

Diese Anleitung beschreibt wie man ein RAID1 auf die neue Festplattensektorgröße von 4K (welche bei einigen Herstellern als Standardsektorgröße für neue Festplatten festgelegt wurde) genau einstellen kann. Für linear und RAID0 sollte aber kein Unterschied bestehen. Die größere Sektorengröße führt zu einer höheren Netto-Kapazität, da pro neuem 4096-Byte-Sektor acht Sync/DAM-Abschnitte, acht Toleranzbereiche sowie acht ECC-Bereiche eingespart werden (Quelle Whitepaper WD ). Laut Western Digital  führt die Vergrößerung von 512 Bytes auf 4 KB zu einem Anstieg der Netto-Kapazität zwischen 7% und 11%. An sich könnte dies dem Anwender egal sein, jedoch richtet sich das OS bei Schreibzugriffen nicht nach der physikalischen Sektorgröße. In der Praxis kann dies dazu führen, dass Daten mit einer Dateigröße von mehr als 512 Byte und weniger als 4k so ungünstig auf die Festplatte geschrieben werden, dass diese über zwei 4K-Blöcke verteilt werden. Hierbei kann es zu Performanceproblemen kommen, da die Festplatten die beiden 4K-Blöcke erst lesen und dann beide wieder schreiben muss. Das führt zu einer “Strafrunde” (Read-Modify-Write – RMW), welche durch höhere Zugriffszeiten die Geschwindigkeit erheblich bremst. Für diese Anleitung wurden 2 gleich große Western Digital EARS* Platten und ein Conceptronic CH3MNAS* mit der (zur Zeit aktuellen) Firmware 1.02b2 verwendet.

Warnhinweis: Diese Anleitung ist für fortgeschrittene Besucher geschrieben, die einzelnen Schritte sollten nur durchgeführt werden, wenn man sich ganz sicher ist. Jeder verwendet diese Anleitung auf eigenes Risiko. Die Daten auf den Festplatten sind nach Befolgen dieser Anleitung weg, erstellt daher ein Backup!

“~#” bezeichnet im folgenden Konsoleneingaben.

FFP auf einem USB-Stick installieren Das ffp muss laut Anleitung installiert werden. Dieses ist nur für das Geraderichten der Partitionen notwendig und kann danach auch wieder entfernt werden.

Erstmal den Ist-Zustand ansehen und notieren Partitionen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
~# fdisk -lu

Disk /dev/sda: 1500.3 GB, 1500301910016 bytes
255 heads, 63 sectors/track, 182401 cylinders, total 2930277168 sectors
Units = sectors of 1 * 512 = 512 bytes

 Device Boot Start End Blocks Id System
/dev/sda1 63 1060289 530113+ 82 Linux swap
/dev/sda2 2088450 2927621339 1462766445 83 Linux
/dev/sda4 1060290 2088449 514080 83 Linux

Partition table entries are not in disk order

Disk /dev/sdb: 1500.3 GB, 1500301910016 bytes
255 heads, 63 sectors/track, 182401 cylinders, total 2930277168 sectors
Units = sectors of 1 * 512 = 512 bytes

 Device Boot Start End Blocks Id System
/dev/sdb1 63 1060289 530113+ 82 Linux swap
/dev/sdb2 2088450 2927621339 1462766445 83 Linux
/dev/sdb4 1060290 2088449 514080 83 Linux

Partition table entries are not in disk order

Disk /dev/sdc: 2019 MB, 2019557376 bytes
255 heads, 63 sectors/track, 245 cylinders, total 3944448 sectors
Units = sectors of 1 * 512 = 512 bytes

 Device Boot Start End Blocks Id System
/dev/sdc1 63 3935924 1967931 83 Linux

Wie geht es dem RAID?

1
2
3
4
5
6
~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1]
md0 : active raid1 sda2[0] sdb2[1]
 1462766336 blocks [2/2] [UU]

unused devices:

Bitte die Anzahl der blocks (Hier 1462766336) notieren. Nun nachsehen, welche Einstellungen das Filesystem hat:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
~# tune2fs -l /dev/md0
tune2fs 1.41.0 (10-Jul-2008)
Filesystem volume name:
Last mounted on:
Filesystem UUID: 5523dde6-1b52-4607-b598-d1dba439de65
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags: unsigned_directory_hash
Default mount options: (none)
Filesystem state: not clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 357152
Block count: 365691584
Reserved block count: 0
Free blocks: 365627444
Free inodes: 357138
First block: 0
Block size: 4096
Fragment size: 4096
Reserved GDT blocks: 936
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 32
Inode blocks per group: 2
Filesystem created: Wed Sep 29 21:29:15 2010
Last mount time: Thu Sep 30 08:01:01 2010
Last write time: Thu Sep 30 17:49:18 2010
Mount count: 5
Maximum mount count: -1
Last checked: Wed Sep 29 21:29:15 2010
Check interval: 0 ()
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Default directory hash: tea
Directory Hash Seed: 64fff61f-6680-4632-8912-1e5d68ed2924

Bitte notieren, diese Daten sind wichtig. Am einfachsten grad lokal in einer Textdatei unterbringen.

Vorbereitung fun_plug wegsichern:

1
2
~# mkdir /mnt/usbstorage/fun_plug_backup
~# cp -a /mnt/HD_a2/fun_plug /mnt/HD_a2/.bootstrap /mnt/usbstorage/fun_plug_backup/

Nun müssen wir die Prozesse beenden, welche viel Arbeitsspeicher brauchen und/oder offene Files auf dem Dateisystem des RAID haben könnten. Ich hatte ftp, den streaming server und itunes nie aktiviert. Es ist wohl klug, diese Sachen zuvor zu deaktivieren (kann man genau an dieser Stelle tun). Samba dreht man so ab:

1
2
3
~# smb stop
$Shutting down SMB services:
$Shutting down NMB services:

RAID abdrehen:

1
2
~# raidstop md0
mdadm: stopped /dev/md0

Hats geklappt?

1
2
3
~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1]
unused devices:

-> Ja.

Swap abdrehen:

1
2
~# swapoff /dev/sda1
~# swapoff /dev/sdb1

Hat funktioniert:

1
2
3
4
5
~# free
 total used free shared buffers
 Mem: 61860 43828 18032 0 14704
 Swap: 0 0 0
Total: 61860 43828 18032

Jetzt wirds erst Ab hier beginnt der Teil mit den permanenten Veränderungen. Wer Angst bekommen hat, schaltet das NAS jetzt ab, zieht den USB-Stick und alles ist wieder beim alten.

Ich habe zum partitionieren parted verwendet. Man kann auch fdisk verwenden, dann allerdings so starten, da es einen Bug gibt:

1
~# cat|fdisk -u /dev/sda

Diesen Teil hier machen wir einmal mit sda und dann mit sdb.

Hier wird parted aufgerufen, die Einheit auf ‘Sektoren’ umgestellt und die aktuelle Partitionstabelle angezeigt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
~# parted /dev/sda
GNU Parted 1.8.8
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) print
Model: WDC WD15EARS-00Z5B1 (scsi)
Disk /dev/sda: 2930277168s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number Start End Size Type File system Flags
 1 63s 1060289s 1060227s primary linux-swap
 4 1060290s 2088449s 1028160s primary ext3
 2 2088450s 2927621339s 2925532890s primary ext2

(parted)

Was wir hier brauchen sind die Start- und Endsektoren der Partitionen 1 und 2. Start und Ende von #1 sollten überall gleich sein. Wir verändern folgende Werte:

#1 Start: 63 -> 64 #1 Ende: 1060289 (bleibt gleich) #2 Start: 2088450 (+6) -> 2088456 (2088456 ist durch 8 ganzzahlig teilbar) #2 Ende: 2927621339 (ebenfalls +6) -> 2927621345 (das ist von der verbauten Platte abhängig)

Vermutlich ist der letzte Sektor beliebig, aber ich hatte keine Lust aus zu probieren was passiert, wenn sich die Größe des RAIDs ändert. Also einfach an das vorhandene Ende eben so viele Sektoren anhängen wie beim Start, dann ist man auf der sicheren Seite. Weg mit den ersten beiden Partitionen:

1
2
(parted) rm 1
(parted) rm 2

Die vierte verschieben wir nicht, da hier ohnehin nur ein paar Configfiles des NAS rumliegen und hier nicht so viele Zugriffe sind, als dass man die Western Digital Bremse spüren würde. Wir bauen uns eine neue swap Partition genau an der richtigen stelle:

1
2
3
4
5
6
(parted) mkpart
Partition type? primary/extended? primary
File system type? [ext2]? linux-swap
Start? 64
End? 1060289
(parted)

Der Startsektor hat sich von 63 auf 64 geändert. Der Endsektor bleibt gleich. Und nun noch die große für die Daten: (Achtung! wenn man ext3 verwendet, gibt man natürlich ext3 an dieser Stelle an)

1
2
3
4
5
6
(parted) mkpart
Partition type? primary/extended? primary
File system type? [ext2]? ext2
Start? 2088456
End? 2927621345
(parted)

Exakt das selben machen wir nun noch einmal mit sdb. Nun drehen wir den swapspace wieder auf:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
~# mkswap /dev/sda1
Setting up swapspace version 1, size = 542831616 bytes
~# mkswap /dev/sdb1
Setting up swapspace version 1, size = 542831616 bytes
~# swapon /dev/sda1
~# swapon /dev/sdb1
~# free
 total used free shared buffers
 Mem: 61860 44308 17552 0 14680
 Swap: 1060208 0 1060208
Total: 1122068 44308 1077760

Nun ist es an der Zeit ein neues RAID zu erstellen:

1
2
3
4
5
6
7
8
9
~# mdadm --create /dev/md0 --level=1 --raid-devices=2 --spare-devices=0 /dev/sd[ab]2
mdadm: array /dev/md0 started.
~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1]
md0 : active raid1 sdb2[1] sda2[0]
 1462766336 blocks [2/2] [UU]
 [>....................] resync = 0.1% (2097280/1462766336) finish=243.7min speed=99870K/sec

unused devices:

Nun erstellen wir ein neues Dateisystem darauf. (bei ext3 braucht man noch den Parameter -j dazu). Möchte man das NAS nur zum speichern von großen Dateien (Filme usw.) verwenden, kann man auch noch den Parameter: “-T largefile4” dazunehmen. Das bewirkt, daß weniger Dateien auf dem NAS gespeichert werden können (nur etwa 200.000 pro Terabyte). Möchte man zb. Backups darauf speichern, läßt man das besser weg. Achtung: dies kann nachträglich nicht mehr geändert werden!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
~# mke2fs -m 0 /dev/md0
mke2fs 1.41.0 (10-Jul-2008)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
357152 inodes, 365691584 blocks
0 blocks (0.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
11161 block groups
32768 blocks per group, 32768 fragments per group
32 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
Writing superblocks and filesystem accounting information: done

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

Nun habe ich ein wenig gepatzt und vorher nicht nachgesehen, ob diese automatischen Checks aufgedreht waren. Ich habe sie dann abgedreht, weil das nas möglicherweise nicht mehr fertig bootet, wenn es beim booten einen Check machen will.

1
2
3
4
~# tune2fs -c 0 -i 0 /dev/md0
tune2fs 1.41.0 (10-Jul-2008)
Setting maximal mount count to -1
Setting interval between checks to 0 seconds

Man kann das Filesystem natürlich jederzeit manuell prüfen. Eine kleine Bitte: Mag bitte jemand seine Dateisystemeinstellungen von vor der Änderung posten? (ich hab leider vergessen mir das an zu sehen)

Nun warten wir, bis das RAID fertig ist. d.h. 3 bis 4 stunden:

1
2
3
4
5
6
7
~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1]
md0 : active raid1 sdb2[1] sda2[0]
 1462766336 blocks [2/2] [UU]
 [=====>...............] resync = 27.8% (407175232/1462766336) finish=195.5min speed=89949K/sec

unused devices:

Jetzt ist es fertig:

1
2
3
4
5
6
~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1]
md0 : active raid1 sdb2[1] sda2[0]
 1462766336 blocks [2/2] [UU]

unused devices:

Nun kommt der große Moment in dem wir sehen werden ob das nas sein neues untergejubeltes raid akzeptiert:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
~# raidstop md0
mdadm: stopped /dev/md0
~# raidstart md0
Raid Table Parser version v1.10
Assemble the previously created Raid array.
/tmp/spare_dsk not exist!!!
/tmp/std_raid1 not exist!!!
mdadm: /dev/md0 has been started with 2 drives.
Raid Level Parser version v1.01
mount: wrong fs type, bad option, bad superblock on /dev/md0,
 missing codepage or other error
 In some cases useful info is found in syslog - try
 dmesg | tail or so

Schaut gut aus. Und schon haben wir ein raid in dem die 4k Blöcke des Dateisystems exakt auf den Sektoren liegen.

Dieses HOWTO basiert auf diesem Artikel