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

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