Linux: Linuxový softwarový raid (RAID 1)

Pro zvýšení bezpečnosti uložených dat na disku budeme používat linuxový softwarový RAID, který je v linuxu představován např. aplikací mdadm. Jelikož se zatím budu věnovat pouze konfiguraci s dvěma pevnými disky, a tedy zrcadlení v podobě RAID 1, bude se tento návod věnovat především příkladům odkazující se právě na tuto konfiguraci.

RAID 1 představuje nejstarší metodu zabezpečení dat. Na dva stejně velké (nemusí nutně být stejně velké) disky se provádějí požadované operace. Rychlost zápisu je přibližně rovna rychlosti zápisu jednoho disku (tedy poloviční), neboť je třeba data zapsat na oba disky. U čtení je možné se dostat až na dvojnásobek rychlosti (data se mohou číst z obou disků zároveň). V případě výpadku jednoho disku se stává pole degradovaným, je potřeba vadný disk odebrat z pole, odpojit, vyměnit za nový a pole synchronizovat. V případě výpadku obou disků přicházíme o data.

Máme-li před sebou připravený operační systém s dvěma stejnými disky pro RAID1, bude potřeba nejdříve připravit oddíly.

Konfigurace:

  • hlavní disk s operačním systémem a swapovacím oddílem
  • RAID 1 pole připojené jako složka v adresáři home/Pole

Disky k dispozici (sdg, sdh) o velikosti cca 1GB. Je třeba připravit oddíly např. pomocí fdisku.
root@test:/# fdisk -l /dev/sdg
Disk /dev/sdg: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders, total 2097152 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/sdg doesn't contain a valid partition table

root@test:/# fdisk -l /dev/sdh
Disk /dev/sdh: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders, total 2097152 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/sdh doesn't contain a valid partition table

Následně vytvoříme oddíl na disku /dev/sdg (nevytváříme swap, neboť ten bude v režii hlavního disku s operačním systémem).
root@test:/# fdisk /dev/sdg
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x80f8159c.
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): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-2097151, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151):
Using default value 2097151
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

Výsledek vypadá nějak takto:
root@test:/# fdisk -l /dev/sdg /dev/sdh
Disk /dev/sdg: 1073 MB, 1073741824 bytes
139 heads, 8 sectors/track, 1885 cylinders, total 2097152 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: 0x80f8159c

Device Boot Start End Blocks Id System
/dev/sdg1 2048 2097151 1047552 fd Linux raid autodetect

Disk /dev/sdh: 1073 MB, 1073741824 bytes
139 heads, 8 sectors/track, 1885 cylinders, total 2097152 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: 0x2f169f60

Device Boot Start End Blocks Id System
/dev/sdh1 2048 2097151 1047552 fd Linux raid autodetect

Nyní přikročíme k vytvoření pole RAID
root@test:/# mdadm -C /dev/md1 -l1 -n2 /dev/sdg /dev/sdh

$ watch cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdh[1] sdg[0]
1048000 blocks super 1.2 [2/2] [UU]

K vytvoření souborového systému použijeme utilitu mkfsk, pomocí které zformátujeme oddíl na ext4 souborový systém.
root@gtest1:/# mkfs.ext4 /dev/md1
mke2fs 1.42.9 (4-Feb-2014)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262000 blocks
13100 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

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

A dále upravíme soubor mdadm.conf (v tomto případě /etc/mdadm/mdadm.conf)
root@gtest1:/# cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig
root@gtest1:/# mdadm --examine --scan >> /etc/mdadm/mdadm.conf

Dále si můžeme zobrazit detailní informace o stavu pole:
root@test:/# mdadm -D /dev/md1
/dev/md1:
Version : 1.2
Creation Time : Mon Oct 27 14:03:13 2014
Raid Level : raid1
Array Size : 1048000 (1023.61 MiB 1073.15 MB)
Used Dev Size : 1048000 (1023.61 MiB 1073.15 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent

Update Time : Mon Oct 27 14:19:47 2014
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Name : gtest1:1 (local to host gtest1)
UUID : 4c4126aa:d0347dcb:b9944f9a:dbcf706d
Events : 17

Number Major Minor RaidDevice State
0 8 96 0 active sync /dev/sdg
1 8 112 1 active sync /dev/sdh

Nyní si v našem /home vytvoříme složku s názvem „Pole“
root@test:/home/gigi# mkdir Pole
root@test:/home/gigi# chown -R gigi:root /home/gigi/Pole

a zkusíme si ručně nově přidané pole připojit, tedy:
root@test:/# mount /dev/md1 /home/gigi/Pole

Nyní editujeme soubor /etc/fstab pro připojení pole i po restartu:
root@test:/# blkid
...
/dev/md1: UUID="41686879-6143-46fe-9c80-c41d617789fd" TYPE="ext4"
...

A přidáme
UUID=41686879-6143-46fe-9c80-c41d617789fd /home/gigi/PoleN ext4 defaults 0 2

Nakonec bychom měli updatovat ramdisk pro nově vzniklou situaci:
root@test:/# update-initramfs -u

Comments are closed.