Як швидко скопіювати таблицю розділів диску в Linux

Типова ситуація — вилітає один з дисків на сервері. Однак ми зберігаємо дані в RAID з рівнем мінімум 1, чи не так 🙂 ?

Якщо так — то все добре! Проте однак постає задача: після заміни фізичного носія (вінчестера, так би мовити) швидко включити його назад в RAID для синхронізації. Тим паче, ящо зазвичай стоять однакові диски, то вихід з ладу одного зазвичай сигналізує, що й іншому гаплик не за горами 🙁 .

Тому швиденько приймаємося за справу! І тут виникає перший марудний момент — слід на новому вінчестері встановити таблицю розділів, таку, яка була на старому диску. Можна піти важким шляхом і зробити це вручну, проте істинний лінивий сисадмін ніколи не опуститься до такого, поки є в запасі тулзи, які зроблять це за нього 🙂 .

В моєму (дуже типовому, до речі) випадку, на сервері хостінгу стояли два ідентичні вінчестери, в яких були однакові таблиці розділів, тому справа була з тривіальних, як описано нижче. Якщо ж у Ваших конфігураціях щось не так, моя порада: зберігайте на бекапах таблицю розділів!

1. Уточнення ситуації.

Для чого потрібно? А тільки для того, щоб випадково не зробити все навпаки — на робочий вінчестер залити дамп з нового 🙂

ls -1 /dev/sd*
/dev/sda
/dev/sda1
/dev/sda2
/dev/sda3
/dev/sdb

Як бачимо, є новий диск sdb і основний вінчестерsda, на якому є 3 розділи:

#sfdisk -l /dev/sda

Disk /dev/sda: 38913 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

 Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sda1   *      0+     12      13-    104391   fd  Linux raid autodetect
/dev/sda2         13     770     758    6088635   82  Linux swap / Solaris
/dev/sda3        771   38912   38142  306375615   fd  Linux raid autodetect

маємо 1 і 3 розділ диску з типом Software RAID (md0 та md1 — відповідно) та 2 розділ під swap (який наразі уже і не використовується, проте живе з історичних причин).

Нагадую — зазначені тут імена дисків приведені під існуючу конфігурацію! Якщо у Вас інша — змініть, відповідно, назви пристроїв!

2. Зберігаємо таблицю розділів з живого диска

sfdisk -d /dev/sda >/root/sda.sfdisk.dump

3. Відновлюємо таблицю розділів на новий диск

sfdisk /dev/sdb </root/sda.sfdisk.dump

4. АБО п.п. 2 і 3 в одному флаконі!

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

У відповідь на це маємо щось на кшталт:

sfdisk -d /dev/sda |sfdisk /dev/sdb
Checking that no-one is using this disk right now ...
OK

Disk /dev/sdb: 38913 cylinders, 255 heads, 63 sectors/track

sfdisk: ERROR: sector 0 does not have an msdos signature
 /dev/sdb: 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/sdb1   *        63    208844     208782  fd  Linux raid autodetect
/dev/sdb2        208845  12386114   12177270  82  Linux swap / Solaris
/dev/sdb3      12386115 625137344  612751230  fd  Linux raid autodetect
/dev/sdb4             0         -          0   0  Empty
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).)

Хм… Начебто все добре, та щось нас добрий sfdisk попередив про перших 512 байт! Гаразд, відразу перевіримо, чи записалась нова таблиця на новий диск:

fdisk -l /dev/sdb

Disk /dev/sdb: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

 Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1          13      104391   fd  Linux raid autodetect
/dev/sdb2              14         771     6088635   82  Linux swap / Solaris
/dev/sdb3             772       38913   306375615   fd  Linux raid autodetec

Як бачимо — все на місці!

Залишилось:

  1. перезаписати MBR (тих самих 512 байт)
  2. за потреби створити swap
  3. включити новосторені розділи нового диску в старий RAID

5.1. Дублюємо MBR:

dd if=/dev/sda of=/dev/sdb bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000411 seconds, 1.2 MB/s

5.2. Створюємо swap в автоматичному режимі:

for i in `fdisk -l /dev/sdb|grep -F swap|cut -f1 -d' '`;\
do echo "Making swap in ${i}"; mkswap ${i};\
done

Making swap in /dev/sdb2
Setting up swapspace version 1, size = 6234755 kB

5.3. Включаємо нові розділи в старий RAID:

Що маємо спочатку:

# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[0]
 104320 blocks [2/1] [U_]

md1 : active raid1 sda3[0]
 306375488 blocks [2/1] [U_]

unused devices: <none>

Додаємо відповідні розділи до відповідних масивів:

mdadm --manage --add /dev/md0 /dev/sdb1
mdadm: added /dev/sdb2

mdadm --manage --add /dev/md1 /dev/sdb3
mdadm: added /dev/sdb3

Перевіряємо, чи все нормально в RAID’і:

cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
 104320 blocks [2/2] [UU]

md1 : active raid1 sdb3[2] sda3[0]
 306375488 blocks [2/1] [U_]
 [>....................]  recovery =  0.0% (2240/306375488) finish=2220.0min speed=2240K/sec

unused devices: <none>

Як бачимо, RAID-масив md0 вже відновлено (дуже швидко внаслідок малого розміру, а у Вас може бути довше), а масив md1 знаходиться в стані відновлення (синхронізації) recovery.
Після завершення процедури вивід /proc/mdstat буде на зразок:

cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
 104320 blocks [2/2] [UU]

md1 : active raid1 sdb3[2] sda3[0]
 306375488 blocks [2/2] [UU]

unused devices: <none>

Додатково (на всяк випадок скорше) перевіряємо, чи стали на нових розділах потрібні UUID (по яких власне і відбувається прив’язка цих розділів до певного RAID-масиву):

blkid /dev/sdb1
/dev/sdb1: UUID="33f6d636-5155-4bf5-81c9-e01bbc6b701a" TYPE="ext3"

blkid /dev/sda1
/dev/sda1: UUID="33f6d636-5155-4bf5-81c9-e01bbc6b701a" TYPE="ext3"

Як бачимо, обидва розділи з різних дисків мають однаковий UUID, який відповідає UUID потрібного RAID-масиву (/dev/md0)!

 

Хай щастить в нелегкій адмінській справі та не губляться дані 🙂 !

Опубліковано у Linux, Tips&Tricks, Безпека, Всяка-всячина, Нотатки на колінці, Хостинг | Теґи: , , , , , , . | Додати в закладки: постійне посилання на публікацію.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *