Архів мітки: Debian

Відновлення програмного RAID в Лінукс. Початок.

Коли я остаточно переконався, що головний вінчестер не працює (переставив його з SATA1 на SATA5 конектор, а потім для перевірки підключив інший прилад hdd), то зрозумів, що треба купувати новий.

Стара модель була WD5000AAKS, тому нову я теж взяв такого ж розміру 500 Гб. Навіть виробника Western Digital залишив. Відрізнялась у назві лише одна літера: WD5000AAKX. До тепер у мене не було нарікань на жорсткі диски WD. Подарую їм нагоду себе реабілітувати.

Структуру RAID, що залишилась на 3-х дисках я не дуже пам’ятав. Там точно було декілька розділів, причому один RAID-0 для swap, пара RAID-1 для /boot та кореневого каталогу та великий RAID-5 для зберігання основних робочих даних.

Ситуацію ускладнювало те, що на поламаному вінчестері було дві системи: Linux та Window XP. Від віндовс я відмовитись не можу, тому що люблю грати у комп’ютерні ігри, тому її на новий вінчестер я встановив у першу чергу.

Інсталятор Windows XP показав мені як були розбиті 3 робочі жорсткі диски:

957 Мб / 1914 Мб / 19077 Мб / 262264 Мб / 21030 Мб

Сумарно там було біля 305 Гб (диски на 320 Гб), тому для “вінди” я зробив два розділи на 100 та 70 Гб відповідно. Для відновлення RAID залишилось 306929 Мб. Сподіваюсь цього вистачить.

Щоб почати лагодити RAID треба отримати доступ до системи Лінукс, а зробити це можна лише використавши так званий Rescue диск. В мене його не було, тому довелось качати з офіційного дзеркала Debian.org “живий” ISO-образ. За цією адресою http://ftp.debian.org.ua/debian-cd/6.0.1-live/amd64/iso-hybrid/  я знайшов debian-live-6.0.1-amd64-gnome-desktop.iso

Записав образ на DVD я зміг завантажити свій комп’ютер. Був приємно вражений тим, що одразу мав графічне середовище, деякі програми та саме головне доступ до Інтернет та браузер.

Першим кроком я запустив термінал та перейшов у режим користувача root.

user@debian:~$ sudo -s
root@debian:/home/user#

Від рута вивів на екран таблицю розділів жорстких дисків:

root@debian:/home/user# /sbin/fdisk -l

Disk /dev/sdb: 320.1 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 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: 0x000821a8

 Device Boot   Start     End      Blocks   Id  System
/dev/sdb1   *      1     122      979933+  fd  Linux raid autodetect
/dev/sdb2        123   38913   311588707+   5  Extended
/dev/sdb5        123     366     1959898+  fd  Linux raid autodetect
/dev/sdb6        367    2798    19535008+  fd  Linux raid autodetect
/dev/sdb7       2799   36232   268558573+  fd  Linux raid autodetect
/dev/sdb8      36233   38913    21535101   83  Linux

Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 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: 0xd732d732

 Device Boot   Start      End      Blocks   Id  System
/dev/sda1  *       1    12748   102398278+   7  HPFS/NTFS
/dev/sda2      12749    60800   385977690    f  W95 Ext'd (LBA)
/dev/sda5      12749    21672    71681998+   e  W95 FAT16 (LBA)

Тут показую лише розподіл /dev/sdb, тому що /dev/sdc та /dev/sdd розбиті аналогічно.

Для початку я вирішив перевірити, а чи все гаразд з трьома “робочими” вінчестерами. Адже в деградуючому режимі вони повинні відновити RAID. Але отримав:

# cat /proc/mdstat
cat: /proc/mdstat: No such file or directory

Почитавши інтернет зрозумів, що відповідні модулі ядра не завантажені. Це й не дивно, адже Live DVD не має підтримувати RAID. Тому виконав команду:

# modprobe raid1

І вуаля:

# cat /proc/mdstat
Personalities : [raid1]
unused devices: <none>

Але мені потрібні ще інші режими RAID, тому:

# modprobe raid0
# modprobe raid5
# cat /proc/mdstat
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4]
unused devices: <none>

Визначивши, що в Live Debian немає навіть команди mdadm, я вирішив її доставити. Треба зазначити, що попре свій “живий” режим, інсталятор apt-get працює наче це звичайна система. Це реально круто!

# whereis mdadm
mdadm:
root@debian:/home/user# apt-get install mdadm
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
mdadm
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 464 kB of archives.
After this operation, 1,167 kB of additional disk space will be used.
Get:1 http://cdn.debian.net/debian/ squeeze/main mdadm amd64
 3.1.4-1+8efb9d1 [464 kB]
Fetched 464 kB in 1s (343 kB/s)
Preconfiguring packages ...
Selecting previously deselected package mdadm.
(Reading database ... 117590 files and directories currently
 installed.)
Unpacking mdadm (from .../mdadm_3.1.4-1+8efb9d1_amd64.deb) ...
Processing triggers for man-db ...
Setting up mdadm (3.1.4-1+8efb9d1) ...
Generating array device nodes... done.
Generating mdadm.conf... done.
I: update-initramfs is disabled (live system is running on
 read-only media).
Starting MD monitoring service: mdadm --monitor.
Assembling MD array md1...failed (not enough devices).
Assembling MD array md0...done (initialising [1/2)]).
Assembling MD array md2...done (initialising [1/2)]).
Assembling MD array md3...done (initialising [2/3)]).
Generating udev events for MD arrays...done.

При налагоджені, вона мене щось запитала, я відповів те що було вказано за умовчанням. І через декілька секунд … О! Що я бачу! Невже система помітила мій RAID?

# cat /proc/mdstat
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4]
md3 : active raid5 sdb7[1] sdd7[3] sdc7[2]
537116928 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
[=>...................]  recovery =  6.0% (16285312/268558464)
 finish=51.6min speed=81340K/sec

md2 : active raid1 sdb6[1] sdd6[3] sdc6[2](S)
19534912 blocks [2/1] [_U]
resync=DELAYED

md0 : active raid1 sdb1[1] sdc1[0] sdd1[2](S)
979840 blocks [2/2] [UU]

md1 : inactive sdb5[1](S)
1959808 blocks

unused devices: <none>

Наче так. Більше того, система автоматично почала його перебудовувати. Я забув сказати, що в мене був RAID-5 та RAID-1 зі запасом, тобто вони мали розділи у резерві (є такий термін як “spare”).

Очевидно, що конфігурування mdadm призвело до формування і конфігураційного файлу /etc/mdadm/mdadm.conf. В мене він виявився такого змісту:

# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#
# by default, scan all partitions (/proc/partitions) for MD
# superblocks.
# alternatively, specify devices to scan, using wildcards if desired.
DEVICE partitions

# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays
ARRAY /dev/md1 UUID=c77a68cb:56309d8e:84c426df:55d8644d
ARRAY /dev/md0 UUID=0707ba7a:8a57b581:999f1de2:f9c3448a
spares=2
ARRAY /dev/md2 UUID=8bc941a1:d84faa98:008d3785:384a6334
spares=2
ARRAY /dev/md3 UUID=f82eca2a:4dadcb8a:84c426df:55d8644d
spares=1

# This file was auto-generated on Fri, 25 Mar 2011 17:45:27 +0000
# by mkconf 3.1.4-1+8efb9d1

Пристрій RAID-1 /dev/md0 виглядає справним, слід його перевірити.

# cd /mnt/
# mkdir test
# mount /dev/md0 test
# ls test
config-2.6.26-2-amd64           lost+found
grub                   System.map-2.6.26-2-amd64
initrd.img-2.6.26-2-amd64      vmlinuz-2.6.26-2-amd64
initrd.img-2.6.26-2-amd64.bak

Це явно розділ /boot. Саме він буде використовуваться під час завантаження комп’ютера. Є один момент, який слід пам’ятати, коли використовуєш програмний RAID у Лінукс. Важливо розуміти, що система не може завантажитись з RAID розділу! Завантажує ядро системи BIOS (базова система вводу та виводу), а вона не має підтримки програмних RAID пристроїв. Якще комп’ютер тоді завантажуеться?

Для завантаження програмних RAID використовується прямий доступ до одного з томів RAID пристрою /boot. Розділ /boot – завжди є пристроєм типу RAID-1, і за програмною реалізацією кожен з його розділів (у моєму випадку це /dev/sdb1, /dev/sdc1 чи /dev/sdd1) це звичайний розділ ext3 (чи іншої прийнятної файлової системи). Тобто до ініціалізації модуля підтримки RAID пристроїв у ядрі BIOS обирає розділ /boot з головного диску пристрою RAID. Коли ядро буде завантажено, воно відмонтує /boot розділ і перемонтує його вже у вигляді RAID-1 – /dev/md0.

Теорії досить. Продовжуємо процес відновлення. Підключення інших розділів виявило, що /dev/md2 – це коріневій каталог, а /dev/md3 – це /home та /spool – основний RAID пристрій зберігання робочих даних.

Треба почекати, доки система відсинхронізує диски масивів RAID і можна приступати до модифікації MBR з використанням завантажувача Grub. Реалізація програмного RAID у Лінукс досить надійна, і можна не чекачи доки закінчиться синхронізація та відбудова, але інтенсивне використання дисків на запис значно уповільнить цей процес. Слідкувати за відбудовою RAID можна переглядаючи файл /proc/mdstat

До речі, є така корисна утиліта, яка дозволяє переглядати файл через рівні проміжки часу. Тоді процес спостереження стає динамічним. Називається вона watch. Наступний прикад буде показувати в терміналі процес перебудови RAID масиву з інтервалом у 5 секунд:

# watch --interval=5 cat /proc/mdstat

Про відновлення простою /dev/md3 свідчить такий вміст /proc/mdstat:

# cat /proc/mdstat
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4]

md3 : active raid5 sdb7[1] sdd7[0] sdc7[2]
537116928 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

md2 : active raid1 sdb6[1] sdd6[2] sdc6[3](S)
19534912 blocks [2/1] [_U]
[===================>.]  recovery = 99.3% (19407680/19534912)
 finish=0.0min speed=92519K/sec

md0 : active raid1 sdb1[1] sdc1[0] sdd1[2](S)
979840 blocks [2/2] [UU]

md1 : inactive sdb5[1](S)
1959808 blocks

unused devices: <none>

 

Для відновлення MBR та завантажувача Grub монтуємо кореневий розділ у /mnt/test, а потім ще і /boot розділ.

# mount /dev/md2 /mnt/test/
# mount /dev/md0 /mnt/test/boot/

Тепер слід встановити завантажувач Grub, але при зміненому коріневому розділі. Робимо це такими командами:

# chroot /mnt/test/
# grub
Probing devices to guess BIOS drives. This may take a long time.
GNU GRUB  version 0.97  (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported.   For
the   first   word,  TAB  lists  possible  command
completions.  Anywhere else TAB lists the possible
completions of a device/filename. ]
grub>

Ви побачили консоль програми Grub.

grub> root(hd0,0)
root(hd0,0)
Error 27: Unrecognized command
grub> root (hd0,0)
root (hd0,0)
Error 21: Selected disk does not exist
grub>

Перший раз я забув вставити пробіл між командою та опціями, а других раз помилився, тому що взяв параметри з прикладу в інтернеті, а не ті що потрібні на моїй системі. Щукаємо на якому пристрої знаходиться образ для Grub, він має назву stage2:

grub> find /boot/grub/stage2
find /boot/grub/stage2

Error 15: File not found

Наче роблю все як написано у інтернеті, а воно не працює. Хм, може щось не так з chroot-ом. Почитав ще трохи і зрозумів, що перед chroot треба також перекинути файлові системи /proc, /sys та /dev.

root@debian:/# mount --bind /proc /mnt/test/proc
root@debian:/# mount --bind /sys /mnt/test/sys
root@debian:/# mount --bind /dev/ /mnt/test/dev/
root@debian:/# chroot /mnt/test/
debian:/#

Знову запускаємо grub:

grub> root (hd1,0)
root (hd1,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)
setup (hd1)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd1)"...  17 sectors are
 embedded.
succeeded
Running "install /grub/stage1 (hd1) (hd1)1+17 p (hd1,0)/grub/stage2
 /grub/menu.lst"... succeeded
Done.

Команда “root (hd1,0)” вказує де знаходиться розділ для завантаження (в нас це 2-й диск та перший розділ на ньому /boot), а команда “setup (hd1)” встановлює MBR з посиланням на Grub завантажувач на диск 2. Нумерація пристроїв та розділів у Grub починається від нуля, тому (hd0) – перший диск, а (hd1,0) – перший розділ на другому диску.

Цей приклад виявив, що я не правильно шукав образ. Треба було так:

grub> find /grub/stage2
find /grub/stage2
(hd1,0)
(hd2,0)

Що показала ця команда? Вона знайшла придатні для завантаження розділи на 2-му та 3-му диску. Але ж в мене 4 диска? Щоб остаточно зрозуміти що відбувається давайте згадаємо що за диски є у нашому розпоряджені. Номер 1 – це новий диск, там не може бути розділу для завантаження, адже це там зараз тільки Window XP. Диски 2, 3 та 4 – це працюючий RAID. Так чому ж завантаження можливе лише з дисків 2 та 3?

Дивимось як саме описаний RAID пристрій /dev/md0:

md0 : active raid1 sdb1[1] sdc1[0] sdd1[2](S)
979840 blocks [2/2] [UU]

Все вірно, 4-й диск (його розділ /dev/sdd1) знаходиться у “запасному” стані (spare), фактично на ньому не має робочих даних. Вони з’являться тільки після виходу з ладу одного з активних розділів: /dev/sdb1 чи /dev/sdc1.

Добре, як пам’ятаєте, ми встановили на другий диск у MBR завантажувач Grub, але треба спочатку це перевірити.

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

root (hd0,0)

Чому саме такі – не розумію. Адже за логікою перший диск в мене – це новий з віндою. На всякий випадок додав grub і на 3-й та 4-й диск масиву RAID. Протестував завантаження. Для 3-го диску допоміг теж root (hd0,0), а для 4-го – чомусь root (hd2,0). Тут я не впевнений, але можливо при виборі пристрою для завантаження самі він стає першим номером для Grub. Тобто в стандартному наборі з 4-з дисків маємо такі номери:

  1. /dev/sda (hd0)
  2. /dev/sdb (hd1)
  3. /dev/sdc (hd2)
  4. /dev/sdd (hd3)

Але коли обираємо пристрій для завантаження, наприклад, /dev/sdc – то саме він стає першим, а інші шикуються у чергу за ним:

  1. /dev/sdc (hd0) – обрали його при завантаженні комп’ютеру
  2. /dev/sda (hd1)
  3. /dev/sdb (hd2)
  4. /dev/sdd (hd3)

Принаймні, це пояснює чому 2-й та 3-й диски завантажились з  “root (hd0,0)”, а четвертий – лише з “root (hd2,0)”. Подивіться, що за порядок дисків утворюється при виборі 4-го диску для завантаження:

  1. /dev/sdd (hd0) – але як пам’ятаєте, його розділ /boot не існує, бо він “запасний” у /dev/md0
  2. /dev/sda (hd1) – це вінда, завантаження не можливе
  3. /dev/sdb (hd2) – тут все гаразд, тому і завантажились
  4. /dev/sdc (hd3) – тут теж можна завантажитись

Отже свою стару систему я успішно завантажив. Всі данні намісці, але вона заводиться тільки після копняка (ручна правка grub і вибір диску для завантаження) і новий диск не містить розділів програмного RAID Лінукс.

Треба довести справу до кінця.