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

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

Дані я не втратив, тому настрій в мене відмінний. Але треба відновити роботу системи так, щоб все було зручно і без несподіванок. А наразі в мене є такі претензії:

  • під час завантаження доводиться завжди редагувати Grub вказуючи вірний розділ root
  • не завантажується з меню Grub щойно-встановлена Windows XP
  • система працює без swap-розділу

Перші 2 проблеми пов’язані з Grub, тому час відредагувати меню завантажувача. Це файл /boot/grub/menu.lst.

В мене він такого змісту (тільки важливе):

# menu.lst - See: grub(8), info grub, update-grub(8)
...

title       Debian GNU/Linux, kernel 2.6.26-2-amd64
root        (hd0,1)
kernel      /vmlinuz-2.6.26-2-amd64 root=/dev/md2 ro quiet
initrd      /initrd.img-2.6.26-2-amd64

title       Debian GNU/Linux, kernel 2.6.26-2-amd64 (single-user mode)
root        (hd0,1)
kernel      /vmlinuz-2.6.26-2-amd64 root=/dev/md2 ro single
initrd      /initrd.img-2.6.26-2-amd64

# This is a divider, added to separate the menu items below from the
# Debian ones.
title        Other operating systems:
root

# This entry automatically added by the Debian installer for
# a non-linux OS on /dev/sda1
title        Microsoft Windows XP Professional RU
root        (hd0,0)
savedefault
makeactive
chainloader    +1

Гадаю root (hd0,1) треба замінити на root (hd0,2), адже саме розділ /dev/sda3 – в нас входить у RAID пристрій завантаження.

Для Windows XP параметри (hd0,0) виглядають правильними, тому проблем із завантаженням не має бути.

Але слід перезапустити комп’ютер та пересвідчитись. Перезапуск пройшов на ура, тому перші два пункти виправлені. Та все ж зауважу, що у разі проблем з першим диском мені знову прийдеться правити у ручну меню Grub-завантажувача :( тому що розподіл розділів першого диску відрізняється від 3-х інший. Зараз бачу тільки один спосіб запобігти цьому – додати 3-й пункт меню Grub для завантаження Лінукс з резервних дисків (2-го, 3-го чи 4-го). Виглядати у файлі grub/menu.lst він буде приблизно так:

title       Rescue (if RAID master boot disk failed)
root        (hd0,0)
kernel      /vmlinuz-2.6.26-2-amd64 root=/dev/md2 ro single
initrd      /initrd.img-2.6.26-2-amd64

Переходимо до роботи зі свопом (swap розділ).

Якщо пам’ятаєте, розділ RAID-0 повністю зруйновано, але це не страшно, адже він використовувався як область підкачки (swap). Треба відтворити його та задіяти у системі. За нього відповідає RAID пристрій /dev/md0. Ось які відомості є у системи при цей RAID:

# mdadm --detail /dev/md1
/dev/md1:
Version : 00.90
Creation Time : Sun Jan 31 16:13:45 2010
Raid Level : raid0
Raid Devices : 2
Total Devices : 1
Preferred Minor : 1
Persistence : Superblock is persistent

Update Time : Sun Jan 31 16:13:45 2010
State : active, degraded, Not Started
Active Devices : 1
Working Devices : 1
Failed Devices : 0
Spare Devices : 0
Chunk Size : 64K
UUID : c77a68cb:56309d8e:84c426df:55d8644d (local to host c2d)
Events : 0.1

Number   Major   Minor   RaidDevice State
0       0        0        0      removed
1       8       21        1      active sync   /dev/sdb5

Було б непогано створити його не з 2-х розділів, а з 4-х. Тоді теоретично швидкість роботи зі swap підвищилась би у 4 рази.

Спроба збільшити кількість активних пристроїв закінчилась невдачею:

# mdadm --grow /dev/md1 -n 4
mdadm: raid0 array /dev/md1 cannot be reshaped.

Мабуть треба створити цей пристрій з нуля. В нього слід додати пристрої /dev/sdb5 (він єдиний там), /dev/sda6, /dev/sdc5 та /dev/sdd5.

Видаляємо /dev/sdb5 зі старого масиву:

# mdadm /dev/md1 -f /dev/sb5
# mdadm /dev/md1 -r /dev/sb5

Але ці команди закінчуються невдачею. Пристрій зайнятий.

Не слід забувати, що справу маємо з RAID-0, тобто режимом, в якому дискові пристрою чергуються, а тому він не призначений для “гарячої” заміни пристроїв. Система програмного RAID Лінукса  наче чекає, коли ми “знайдемо” та додамо справжній робочий розділ. При додаванні порожніх розділів, система їх приймає – але помічає як “запасні” (spare).

Для того, щоб мати змогу створити з нуля RAID-0, треба смусити систему забути про розділи які до нього колись входили. Для цього слід стерти на цих розділах так звані “супер-блоки”. Для цього можна використати команду:

# mdadm /dev/md1 --zero-superblock /dev/sdb5

Але коли RAID масив хоча б частково ініціалізовано, вона (команда) закінчується помилкою, бо пристрій зайнято. Тобто треба або зупинити роботу демона підтримки програмного RAID у Лінукс (mdadm), або завантажити комп’ютер з “живого” DVD. Другий спосіб простіший, тому я перегрузив комп’ютер з DVD та у консолі виконав такі команди (супер-блоки дисків sdc5, sdd5 та sda6 прийшлось також обнуляти, тому що я їх помилково додав у “запас” підчас спроб оживити цей RAID):

# mdadm --zero-superblock /dev/sdb5
# mdadm --zero-superblock /dev/sdc5
# mdadm --zero-superblock /dev/sdd5
# mdadm --zero-superblock /dev/sda6

Потім, перегрузивши комп’ютер, я виявив, що список RAID-пристроїв скоротився (/dev/md1 – зник!). Це добрий знак:

md3 : active raid5 sda8[0] sdc7[2] sdb7[1]
md2 : active raid1 sdd6[0] sdc6[2](S) sdb6[3](S) sda7[1]
md0 : active raid1 sdd1[0] sdc1[2](S) sdb1[3](S) sda3[1]

Спробуємо створити знову RAID-0. Але цього разу не з 2-х, а вже одразу з 4-х пристроїв. Резервні диски використовувати не будемо, бо як показав практичний досвід, на рівні RAID-0 від них ніякої користі.

# mdadm --create /dev/md1 --raid-devices=4 --level=raid0 /dev/sda6
 /dev/sdb5 /dev/sdc5 /dev/sdd5
mdadm: array /dev/md1 started.

# cat /proc/mdstat
...
md1 : active raid0 sdd5[3] sdc5[2] sdb5[1] sda6[0]
 7839232 blocks 64k chunks

Наче все добре, але тепер /dev/md1 слід спробувати задіяти як розід підкачки. За інформаціює з файлу /etc/fstab він і так використовується як swap:

# cat /etc/fstab
# /etc/fstab: static file system information.
# <file system> <mount point>   <type>  <options>    <dump>  <pass>
/dev/md1        none            swap    sw           0       0

Та він не задіяний:

$ free -m
        total       used       free     shared    buffers     cached
Mem:     3968       1590       2377          0        216        469
-/+ buffers/cache:        903       3064
Swap:            0          0          0

Так не виходить:

# swapon -a
swapon: /dev/md1: Invalid argument

Мабуть це тому, що на пристрої /dev/md1 не створено відповідну файлову систему. Але команда mkswap /dev/md1 теж повернула негативну відповідь. Чому – незнаю. Може для правильної роботи нового пристрою RAID слід повністю перезапустити його демон, або просто рестартанути комп’ютер. Але наступного разу, коли я завантажив Лінукс, ця команда спрацювала значно краще:

# mkswap /dev/md1
Setting up swapspace version 1, size = 8027369 kB
no label, UUID=0c1e26c3-8f75-4ab9-b08d-874694d33138

# swapon -a

# free -m
             total     used     free    shared   buffers    cached
Mem:          3968     3936       31         0       544      1027
-/+ buffers/cache:     2364     1603
Swap:         7655        0     7655

Заради чистого сумління треба ще раз перезавантажити Лінукс і на власні очі пересвідчитись, що помилки ініціалізації своп-розділу на програмному RAID-0 під час завантаження щезли.

Є ще одна задача, про яку часто забувають: це оновлення конфігураційного файлу /etc/mdadm/mdadm.conf. Зараз він містить точно не правдиві відомості про наш RAID-0 swap-розділ:

# definitions of existing MD arrays
ARRAY /dev/md1 level=raid0 num-devices=2
 UUID=c77a68cb:56309d8e:84c426df:55d8644d
...

А ми пам’ятаємо, що в нас він з 4-х пристроїв. Для того, щоб оновити цей файл достатньо виконати команду:

# mdadm --detail --scan
ARRAY /dev/md1 level=raid0 num-devices=4 metadata=00.90
 UUID=80b00a54:db3afd7e:999f1de2:f9c3448a
ARRAY /dev/md0 level=raid1 num-devices=2 metadata=00.90 spares=2
 UUID=0707ba7a:8a57b581:999f1de2:f9c3448a
ARRAY /dev/md2 level=raid1 num-devices=2 metadata=00.90 spares=2
 UUID=8bc941a1:d84faa98:008d3785:384a6334
ARRAY /dev/md3 level=raid5 num-devices=3 metadata=00.90 spares=1
 UUID=f82eca2a:4dadcb8a:84c426df:55d8644d

І відповідно виводу на екран відредагувати файл /etc/mdadm/mdadm.conf

Відновлення програмного RAID в Лінукс. Робота з новим диском.

Як ви вже знаєте, першим на новий диск я встановив вінду, і вона зайняла 2 розділи. Для того, щоб підключити новий диск до програмного RAID треба спочатку розбити його на розділи, саме так як це зроблено на інших 3-х вінчестерах.

Для роботи з розділами дисків, мені подобається утиліта cfdisk. По-перше вона не така архаїчна як fdisk, а по-друге, в неї текстовий інтерфейс, що дозволяє її використовувати на віддалених серверах через ssh.

Для того, щоб не помилитись розміром я подивився як саме розбиті інші вінчестери у RAID:

cfdisk (util-linux-ng 2.13.1.1)

 Disk Drive: /dev/sdb
 Size: 320072933376 bytes, 320.0 GB
 Heads: 255   Sectors per Track: 63   Cylinders: 38913

 Name   Flags   Part Type  FS Type          [Label]      Size (MB)
 ------------------------------------------------------------------
 sdb1   Boot     Primary   Linux raid autodetect           1003,49
 sdb5            Logical   Linux raid autodetect           2006,97
 sdb6            Logical   Linux raid autodetect          20003,89
 sdb7            Logical   Linux raid autodetect         275004,02
 sdb8            Logical   Linux ext3                     22051,98

 [Bootable]  [ Delete ]  [  Help  ]  [Maximize]  [ Print  ]
 [  Quit  ]  [  Type  ]  [ Units  ]  [ Write  ]

 Toggle bootable flag of the current partition

Одиниці виміру при розбитті диску на розділи мене завжди дратували. Обираєш цілі числа, а в результаті маєш якість 1003,49 Мб та 2006,97 Мб. Хоча якщо поміняти представлення (кнопка Units), то з секторами та циліндрами справи значно кращі:

Sectors
 --------------
 sdb1                     1959930
 sdb5                     3919860
 sdb6                    39070080
 sdb7                   537117210
 sdb8                    43070265

Переходимо до створення розділів на новому диску. Команда, що запускає програму для роботи з дисковими розділами така:

# cfdisk /dev/sda

Бачимо, що встановлено лише 2 розділи та багато вільного місця:

sda1    Boot    Primary   NTFS             []             104855,87
sda5            Logical   W95 FAT16 (LBA)                  73402,40
Pri/Log   Free Space                      321846,99

От за що поважаю Лінукс, так це за зручність. Запустив у паралельному терміналі cfdisk /dev/sdb і дивлюсь собі на формат існуючих розділів. Спробуйте у вінді запустити 2 однакові утиліти роботи з дисками :)

Першим створив розділ sda (primary) розмір вказав 1004 Мб і на виході отримав бажані 1003,49 Мб. Коли всі розділи були створені виявилось, що 2 Гб зайві, але враховуючи екстреність ситуації – це навіть добре, бо якщо б їх не вистачило, то я був би змушений форматувати диск і встановлювати вінду ще раз.

Але придивившись уважно, я побачив що 5-й розділ кожного RAID диску на справді не тупу RAID, а звичайний ext3. Тому на 1-му диску він буде більшим за інші (може буду використовувати ці розділи для якихсь тестів).

Для RAID розділів слід обрати тип FD: Linux raid autodetect. Після всіх маніпуляцій маємо таку структуру розділів на новому диску:

cfdisk (util-linux-ng 2.13.1.1)

Disk Drive: /dev/sda
Size: 500107862016 bytes, 500.1 GB
Heads: 255   Sectors per Track: 63   Cylinders: 60801

Name   Flags   Part Type  FS Type          [Label]       Size (MB)
------------------------------------------------------------------
sda1   Boot     Primary   NTFS             []            104855,87
sda5            Logical   W95 FAT16 (LBA)                 73402,40
sda3   Boot     Primary   Linux raid autodetect            1003,49
sda6            Logical   Linux raid autodetect            2006,97
sda7            Logical   Linux raid autodetect           20003,89
sda8            Logical   Linux raid autodetect          275004,02
sda9            Logical   Linux                           23828,64

Створити файлову систему ext3 для не RAID розділу /dev/sda9 простіше за все, тому з цього розділу і почну:

# mke2fs -j /dev/sda9
mke2fs 1.41.3 (12-Oct-2008)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1455328 inodes, 5817530 blocks
290876 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
178 block groups
32768 blocks per group, 32768 fragments per group
8176 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632,
2654208, 4096000

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

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

Тепер час додати до RAID нові розділи. Спочатку зробимо це з розділом /boot і перенесемо на нього завантажувач Grub.

Пристрій RAID /dev/md0 який і є нашим розділом для завантаження складається з таких фізичних розділів:

md0 : active raid1 sdc1[0] sdd1[2](S) sdb1[1]

Нам треба додати до нього /dev/sda3:

# mdadm /dev/md0 -a /dev/sda3
mdadm: added /dev/sda3

Інформація з /proc/mdstat каже, що він доданий, але не задіяний:

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

Це не годиться. Скажемо масиву RAID, що пристрій /dev/sdb1 пошкоджено:

# mdadm /dev/md0 -f /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md0

Тепер задіяно /dev/sda3:

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

Видаляємо /dev/sdb1 і додаємо до масиву RAID знову:

# mdadm /dev/md0 -r /dev/sdb1
mdadm: hot removed /dev/sdb1
# mdadm /dev/md0 -a /dev/sdb1
mdadm: added /dev/sdb1

Тепер пристрій RAID /dev/md0 має таку конфігурацію:

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

Встановлюємо на нього Grub:

# 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> find /grub/stage2
find /grub/stage2
(hd0,2) <- це наш /dev/sda3 (перший пристрій, 3-й розділ, але
                        пам'ятаємо що у Grub відлік починається з 0)
(hd1,0)
(hd2,0)
grub> root (hd0,2)
root (hd0,2)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
setup (hd0)
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 (hd0)"...  17 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd0) (hd0)1+17 p (hd0,2)/grub/stage2
 /grub/menu.lst"... succeeded
Done.

grub> quit
quit

Тепер слід перевірити завантаження з першого диску. Не скажу, що воно пройшло успішно, адже на запинені VMWare демону комп’ютер зупинився і мені довелось використовувати кнопку Reset, але це може бути викликано тим, що я працюю без використання swap розділу, який був на RAID-0 пристрої. Та все ж в мене вийшло завантажити комп’ютер саме з першого диску: у параметрах Grub вручну вказав root (hd0,2).

Встановлення grub на перший диск показало, що в нас немає втановлювача на диску /dev/sdd. У іншому випадку, ми б бачили його через find /grub/stage2. Виправляємо це:

# mdadm /dev/md0 -f /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md0
root@c2d:/mnt/raid5/home/mikola# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]

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

md2 : active raid1 sdd6[0] sdc6[2](S) sdb6[1]
19534912 blocks [2/2] [UU]

md0 : active raid1 sdc1[2](F) sdd1[3] sdb1[4](S) sda3[1]
979840 blocks [2/1] [_U]
[===>.................]  recovery = 16.7% (164032/979840)
 finish=0.1min speed=82016K/sec

md1 : inactive sdb5[1]
1959808 blocks

unused devices: <none>

Ще кілька секунд і пристрій /dev/md0 знову готовий і зберігає свою цілісність:

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

Тепер інша справа:

# grub
Probing devices to guess BIOS drives. This may take a long time.
...
grub> find /grub/stage2
find /grub/stage2
(hd0,2)
(hd1,0)
(hd2,0)
(hd3,0)

grub> root (hd3,0)
root (hd3,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd3)
setup (hd3)
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 (hd3)"...  17 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd3) (hd3)1+17 p (hd3,0)/grub/stage2
 /grub/menu.lst"... succeeded
Done.
grub> quit

Не забуваємо повернути наш /dev/sdc1 у RAID:

# mdadm /dev/md0 -r /dev/sdc1
mdadm: hot removed /dev/sdc1
# mdadm /dev/md0 -a /dev/sdc1
mdadm: added /dev/sdc1
md0 : active raid1 sdc1[2](S) sdd1[0] sdb1[3](S) sda3[1]
979840 blocks [2/2] [UU]

З горем пополам ми вже завантажуємось без маніпуляцій з BIOS, тому давайте закінчимо з іншими пристроями RAID.

Коріневий розділ /dev/md2. Він складається з пристроїв: /dev/sdd6, /dev/sdc6, /dev/sdb6. За розміром їм підходить пристрій /dev/sda7, тож додаєм:

# mdadm /dev/md2 -a /dev/sda7
mdadm: added /dev/sda7

Він задіяний як запасний (spare):

md2 : active raid1 sda7[2](S) sdd6[0] sdc6[3](S) sdb6[1]
19534912 blocks [2/2] [UU]

Виправимо це. Нехай працює замість /dev/sdb6:

# mdadm /dev/md2 -f /dev/sdb6
mdadm: set /dev/sdb6 faulty in /dev/md2
root@c2d:/mnt/raid5/home/mikola# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]
md3 : active raid5 sdd7[0] sdc7[2] sdb7[1]
537116928 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

md2 : active raid1 sda7[2] sdd6[0] sdc6[3](S) sdb6[4](F)
19534912 blocks [2/1] [U_]
[>....................]  recovery =  1.7% (348672/19534912)
 finish=3.6min speed=87168K/sec

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

md1 : inactive sdb5[1]
1959808 blocks

unused devices: <none>
root@c2d:/mnt/raid5/home/mikola# mdadm /dev/md2 -r /dev/sdb6
mdadm: hot removed /dev/sdb6
root@c2d:/mnt/raid5/home/mikola# mdadm /dev/md2 -a /dev/sdb6
mdadm: re-added /dev/sdb6
root@c2d:/mnt/raid5/home/mikola# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]
md3 : active raid5 sdd7[0] sdc7[2] sdb7[1]
537116928 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

md2 : active raid1 sdb6[2](S) sda7[3] sdd6[0] sdc6[4](S)
19534912 blocks [2/1] [U_]
[==>..................]  recovery = 13.8% (2697856/19534912)
 finish=3.4min speed=80739K/sec

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

md1 : inactive sdb5[1]
1959808 blocks

unused devices: <none>

І через якихся 4 хвилини в нас вже відновлений /dev/md2 – коріневий RAID пристрій:

md2 : active raid1 sdb6[2](S) sda7[1] sdd6[0] sdc6[3](S)
19534912 blocks [2/2] [UU]

Основні дані зберігаются на RAID5 пристрої – /dev/md3. Додамо до нього самий великий розділ першого диску – /dev/sda8:

# mdadm /dev/md3 -a /dev/sda8
mdadm: added /dev/sda8

Він теж на “лавці запасних”:

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

Активуємо його замість /dev/sdd7:

# mdadm /dev/md3 -f /dev/sdd7
mdadm: set /dev/sdd7 faulty in /dev/md3
root@c2d:/mnt/raid5/home/mikola# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]
md3 : active raid5 sda8[3] sdd7[4](F) sdc7[2] sdb7[1]
537116928 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
[>....................]  recovery =  0.3% (885308/268558464)
 finish=60.4min speed=73775K/sec
...

На процес перебудови RAID-5 буде витрачено близько години. Треба почекати :) А поки видалимо та додамо знову /dev/sdd7 до пристрою RAID:

# mdadm /dev/md3 -r /dev/sdd7
mdadm: hot removed /dev/sdd7
# mdadm /dev/md3 -a /dev/sdd7
mdadm: re-added /dev/sdd7
md3 : active raid5 sdd7[3](S) sda8[4] sdc7[2] sdb7[1]
537116928 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
[>....................]  recovery =  4.2% (11533776/268558464)
 finish=63.9min speed=66987K/sec

Залишився один зруйнований RAID-0 розділ. Але його відновлення – це не тривіальна задача, залишу її на завтра.