RAID1 array’i yeniden yapılandırma.

Önceki yazımızda RAID arrayde bulunan bozuk diskin nasıl tespit edileceğini görmüştük. Bu yazımızda bozuk diskin yerine takılan yeni diskin array’e nasıl ekleneceğini göreceğiz. Normalde ubuntu sunucular bu işi yeni disk takılıp sistem açıldıktan sonra otomatik olarak yapmaya başlayabiliyor, ancak zaman zaman sorunlar ile karşılaşmak mümkün oluyor. Örneğin benim vereceğim örnekte md1 array’i nedense inactive durumda. Bu sorunla yüzleştiğimizde neler yapılabilir beraber bakalım:

(Not: bu işlemleri yaparken, herhangi bir veri kaybı yaşamanızdan sorumlu olmadığımı tekrar belirtmek isterim. Önceki yazıda bulunan kurallar aynen bu yazı için de geçerli.)

Öncelikle yeni diskte eş bölümleri oluşturmamız gerekmekte. Bunun için elimizde bulunan ikinci diskin bölümlerini ve Boot kaydını aynen yeni diske geçirmemiz gerekiyor. Bu işlemler için sırası ile şunları yapacağız:

Öncelikle ikinci diskin bölümleme tablosunun bir kopyasını yeni diske çıkartalım.

Hatırlayacağınız üzere bozulan diskimiz “sda” sağlam olan diskimiz de “sdb” idi. Ancak yanlış işlem yapmamanız için öncelikle dolu ve boş diskin hangisi olduğuna sisteminizden bakın:

# fdisk -l

Disk /dev/sda: 750.2 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x55555555

Disk /dev/sda doesn’t contain a valid partition table

Disk /dev/sdb: 750.2 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00088969

Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2102562 fd Linux raid autodetect
/dev/sdb2 263 295 265072+ fd Linux raid autodetect
/dev/sdb3 296 91201 730202445 fd Linux raid autodetect

Disk /dev/md0: 2152 MB, 2152923136 bytes
2 heads, 4 sectors/track, 525616 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/md0 doesn’t contain a valid partition table

Disk /dev/md2: 747.7 GB, 747727224832 bytes
2 heads, 4 sectors/track, 182550592 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/md2 doesn’t contain a valid partition table

Benim sistemimde dolu olan disk “/dev/sdb” boş olan yeni disk ise “/dev/sda” olarak görünmekte. Buna göre sdb’deki bölümleme tablosunu aşağıdaki komut ile “sda”ya kopyalayacağız:

# sfdisk -d /dev/sdb | sfdisk /dev/sda

Checking that no-one is using this disk right now …
OK

Disk /dev/sda: 91201 cylinders, 255 heads, 63 sectors/track

sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/sda: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0

Device Boot Start End #sectors Id System
/dev/sda1 3906 4209029 4205124 fd Linux raid autodetect
/dev/sda2 4209030 4739174 530145 fd Linux raid autodetect
/dev/sda3 4739175 1465144064 1460404890 fd Linux raid autodetect
/dev/sda4 0 – 0 0 Empty
Warning: no primary partition is marked bootable (active)
This does not matter for LILO, but the DOS MBR will not boot this disk.
Successfully wrote the new partition table

Re-reading the partition table …

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)

İşlemin başarılı olup olmadığını tekrar “fdisk -l” komutu vererek çıktıdan görebilirsiniz. Eğer şöyle bir çıktı ile karşıltıysanız işlem başarılı demektir:

# fdisk -l

Disk /dev/sda: 750.2 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x55555555

Device Boot Start End Blocks Id System
/dev/sda1 1 262 2102562 fd Linux raid autodetect
/dev/sda2 263 295 265072+ fd Linux raid autodetect
/dev/sda3 296 91201 730202445 fd Linux raid autodetect

Disk /dev/sdb: 750.2 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00088969

Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2102562 fd Linux raid autodetect
/dev/sdb2 263 295 265072+ fd Linux raid autodetect
/dev/sdb3 296 91201 730202445 fd Linux raid autodetect

Disk /dev/md0: 2152 MB, 2152923136 bytes
2 heads, 4 sectors/track, 525616 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/md0 doesn’t contain a valid partition table

Disk /dev/md2: 747.7 GB, 747727224832 bytes
2 heads, 4 sectors/track, 182550592 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/md2 doesn’t contain a valid partition table

 Bu işlemden sonra Boot record’u kopyalayacağız, önce boot recordun kopyasını dosyaya yazıyoruz:

# dd if=/dev/sdb of=sdb.part bs=1024k count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0249217 s, 42.1 MB/s

# dd if=sdb.part of=/dev/sda bs=1024k count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00123787 s, 847 MB/s

Bölümleme işlemleri bittikten sonra sda arrayleri sdb’den geri alma işlemine başlayabiliriz:

# mdadm –manage /dev/md0 –add /dev/sda1
mdadm: added /dev/sda1

# mdadm –manage /dev/md1 –add /dev/sda2
mdadm: added /dev/sda2

# mdadm –manage /dev/md2 –add /dev/sda3
mdadm: added /dev/sda3

 Bu mirrorlama işlemleri arka planda devam etmektedir. Durumu görmek için “cat /proc/mdstat” komutunu verebilirsiniz. An be an takip etmek isterseniz şu komut ile konsolun birisinde monitörleme yapabilirsiniz:

# watch -n .5 cat /proc/mdstat

.5 rakamı güncellenme sıklığını saniye cinsinden belirtir 0.5 saniye anlamındadır değer 1 yaparak saniyede bir güncellenmesini sağlayabilirsiniz. Mirrorlama işlemi süresi diskin boyutu ve makinenin gücüne ayrıca başka işlem yapılıp yapılmadığına göre değişiklik göstermektedir.

Every 0.5s: cat /proc/mdstat Tue Jul 23 13:42:47 2013

Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] [linear] [multipath]
md1 : active raid1 sda2[0] sdb2[1]
264960 blocks [2/2] [_U]
resync=DELAYED

md2 : active raid1 sda3[2] sdb3[1]
730202368 blocks [2/1] [_U]
[=====>……………] recovery = 2.2% (16135936/730202368) finish=151.9min speed=78334K/sec

md0 : active raid1 sda1[0] sdb1[1]
2102464 blocks [2/2] [UU]

unused devices: <none>

Yukarıdaki görüntüde arrayler görünmekte ve bunların bazılarında ufak tefek farklar bulunmakta, bunları açıklamak gerekirse;

  • [2/2] [2/1] gibi ibareler md arrayine bağlı bölümlerin kaç tanesinin çalışır durumda olduğunu göstermektedir. md0 arrayinde 2 bölümde çalışır durumda.
  • [UU] [_U] gibi ibarelerde ise “U” harfi kullanımda olan bölümlemeleri göstermektedir. “_” ise kullanımda olmayan bölümlemeyi işaret eder.
  • md0 cihazı aktif ve sda1 bölümünün kopyası oluşturulmuş. Şu an sorunsuz bir şekilde çalışmakta.
  • md1 cihazı resync için “DELAYED” durumunda sıra beklemekte. ikinci bölümleme arraye eklenmiş ancak kullanıma açılmamış
  • md2 cihazında şu an resync yapılmakta bu yüzden henüz o da kullanıma açılmamış durumda.

Sonraki yazımız karşılaşılan sorunlar ile nasıl başa çıkılacağına dair olacak.