Архів за місяць: Березень 2011

Відновлення програмного 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

Встановлення SETGID для усіх директорій рекурсивно

Іноді треба встановити SETGID (sticky-біт каталогу) для усіх директорій та піддиректорій. Така ситуація може виникнути, якщо необхідно забезпечити спільний доступ до певної файлової структури групі користувачів.

Поясню на прикладі. Уявімо, що є необхідність у спільній праці над проектами, які знаходяться у каталозі /var/local/Share. Усі задіяні у проектах належать групі workers.  Для цього каталогу встановлена група ‘workers’ та права 775, які дозволяють членам групи читати та записувати дані. Але якщо будь-хто з членів групи створить у ній каталог, то він буде належати не групі ‘workers’, а групі користувача за умовчанням.

Звичайно можна примусити користувачів змінювати власника групи, на те і команда chgrp існує, але біт SETGID позбавляє нас від цієї рутини. Якщо ми створюємо каталог у директорії зі встановленим SETGID, то автоматично маємо того самого власника групи, що і для батьківського каталогу. Тобто всі підкаталоги Share будуть належати групі ‘workers’. Більше того, вони також унаслідують і SETGID-біт, тому їх підкаталогу теж будуть належати до цієї групи.

Гадаю, що з новим каталогом усе зрозуміло, а як встановити SETGID біт для вже існуючої ієрархії каталогів?

Перше, що спадає на думку, це рекурсивна заміна власників групи та встановлення SETGID:

# chgrp -R workers /var/local/Share
# chmod -R g+s /var/local/Share     <-- НЕВІРНО!

Але друга команда неправильна. Бо вона встановлює SETGID не тільки для каталогів, але і для файлів, що зовсім не бажане. Відміняємо наслідки цієї команди протилежною:

# chmod -R g-s /var/local/Share

Та встановлюємо SETGID лише для каталогів:

# find /var/local/Share -type d -exec chmod g+s {} ;

Для нових дистрибутивів команда закінчується на плюс (+) замість крапки з комою (;)

# find /var/local/Share -type d -exec chmod g+s {} +

Відновлення програмного 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 розділ. Але його відновлення – це не тривіальна задача, залишу її на завтра.

Відновлення програмного 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 Лінукс.

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

До побачення вінчестер

Я вже досить давно використовую програмний RAID в Лінукс.

Зараз здається вже його 3-тя модифікація. Проблем з ним ніяких не було. І от нарешті. Сьогодні з ранку він не включився :)

Спочатку я не зрозумів у чому справа, подумав на материнську плату, але у BIOS знайшов, що перший (головний) вінчестер не розпізнається. А саме він був у мене з MBR, тому зараз комп’ютер не включається.

Якщо вдасться відновити інформацію, то буде корисний досвід.

Наразі план такий:

  1. Завантажити комп з компакт-диску
  2. Спробувати відновити MBR на одному з 3-х вінчестерів, що залишились
  3. Підняти RAID у деградованому режимі
  4. Відновити розділи RAID на новому вінчестері

До речі, вінчестер що не включився – це Western Digital WD5000AAKS на 500Gb, SATA / 16Mb cache.

Лінукс назавжди

Я для себе обрав операційну систему, хоча розумію, що звучить це досить зухвало.

Не вважаю себе фанатом Лінукс, бо розумію її сильні та слабкі сторони. Досі не навчився користуватися vim-ом, графічний інтерфейс мені ближче ніж командна строка та і в консолі зручніше коли є Midnight Commander. Але вона мене влаштовує.

Є в Лінукс такі риси, що однозначно формують ваше відношення до неї. Особисто я поважаю її за:

  • відкритість
  • доступність
  • передбачуваність

І щиро вдячний за те, що:

  • знову користуюсь клавіатурою
  • зрозумів як працює мережа та сайти
  • став бачити програмування іншими очима

Досить диферамбів. Сподіваюсь, що всі наступні публікації будуть більш змістовними і за темою :)