Показаны сообщения с ярлыком Linux Soft-Raid. Показать все сообщения
Показаны сообщения с ярлыком Linux Soft-Raid. Показать все сообщения

четверг, 19 мая 2011 г.

RHEL 6 + software RAID из SSD дисков

Такая связка крайне не рекомендуется. Так как программный RAID в Linux не поддерживает команду TRIM. Если же RAID требуется, то, например, для замены RAID-1 (зеркало) можно использовать LVM mirror, так как он поддерживает команду TRIM.

In addition, keep in mind that MD (software raid) does not support discards. In contrast, the logical volume manager (LVM) and the device-mapper (DM) targets that LVM uses do support discards. The only DM targets that do not support discards are dm-snapshot, dm-crypt, and dm-raid45. Discard support for the dm-mirror was added in Red Hat Enterprise Linux 6.1.
Red Hat also warns that software RAID levels 1, 4, 5, and 6 are not recommended for use on SSDs. During the initialization stage of these RAID levels, some RAID management utilities (such as mdadm) write to all of the blocks on the storage device to ensure that checksums operate properly. This will cause the performance of the SSD to degrade quickly.

Источник: RHEL 6 Storage Guide

суббота, 15 января 2011 г.

Linux RAID-10, какие диски в саб зеркалах?

Имеем следующую конфигурацию:

cat /proc/mdstat
Personalities : [raid10] [raid1] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdd1[3] sdc1[2] sdb1[1] sda1[0]
2102464 blocks [4/4] [UUUU]

md1 : active raid1 sdd2[3] sdc2[2] sdb2[1] sda2[0]
264960 blocks [4/4] [UUUU]

md2 : active raid10 sdd3[3] sdc3[2] sdb3[1] sda3[0]
1460404736 blocks 64K chunks 2 near-copies [4/4] [UUUU]
[=>...................] resync = 5.9% (86553984/1460404736) finish=324.5min speed=70551K/sec

unused devices:

mdadm --detail /dev/md2
/dev/md2:
Version : 0.90
Creation Time : Sat Jan 15 15:57:05 2011
Raid Level : raid10
Array Size : 1460404736 (1392.75 GiB 1495.45 GB)
Used Dev Size : 730202368 (696.38 GiB 747.73 GB)
Raid Devices : 4
Total Devices : 4
Preferred Minor : 2
Persistence : Superblock is persistent

Update Time : Sat Jan 15 16:09:38 2011
State : active, resyncing
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0

Layout : near=2
Chunk Size : 64K

Rebuild Status : 6% complete

UUID : 156658c3:7e3be92e:776c2c25:004bd7b2
Events : 0.7

Number Major Minor RaidDevice State
0 8 3 0 active sync /dev/sda3
1 8 19 1 active sync /dev/sdb3
2 8 35 2 active sync /dev/sdc3
3 8 51 3 active sync /dev/sdd3

И в упор не понятно, какие диски зазеркалены между собой, а какие нет.

пятница, 17 сентября 2010 г.

Ускорение ребилда Soft RAID в Linux

Имеем при ребилде RAID примерно вот такую картину:

cat /proc/mdstat
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
8393856 blocks [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
2104448 blocks [2/2] [UU]

md2 : active raid1 sdb3[1] sda3[0]
282535040 blocks [2/2] [UU]
[>....................] resync = 0.2% (674432/282535040) finish=5133.2min speed=913K/sec

unused devices:



Причем, скорость не растет со временем (возможно, тут я ошибаюсь, она повышается, но медленно) и перспектива ждать 5000 минут до окончания ребилда очень не радужная.


Для управления скоростью ребилда рейда есть два параметра:

cat /proc/sys/dev/raid/speed_limit_min
1000

cat /proc/sys/dev/raid/speed_limit_max
200000


То, что скорость фактически урезана на уровне 1 мегабайта секунду вполне оправданно на случай, если на сервере продолжает работать какой-либо софт. Но если все сервисы приостановлены на время ребилда, можно спокойно увеличить эту скорость мегабайт так до 50 в секунду посредством команды:

echo 50000 > /proc/sys/dev/raid/speed_limit_min


А теперь наблюдаем за результатом:

cat /proc/mdstat
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
8393856 blocks [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
2104448 blocks [2/2] [UU]

md2 : active raid1 sdb3[1] sda3[0]
282535040 blocks [2/2] [UU]
[>....................] resync = 1.1% (3379136/282535040) finish=129.8min speed=35831K/sec

unused devices:


Резюмируя все выше сказанное - если в системе есть активный ввод/вывод, то ребилд RAID ждет времени, когда ввод-вывод освобождается и только тогда может повышать скорость ребилда выше speed_limit_min. Если же требуется заставить приложения "подвинуться" и дать синхронизации массива повышенный приоритет, то необходимо повысить speed_limit_min до 10000 или выше (в зависимости от нагрузки на систему).

понедельник, 6 сентября 2010 г.

Linux Soft Raid: active (auto-read-only)

Иногда для массивов, доступ к которым осуществляется очень редко, можно наблюдать такую картину:
cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[0] sdb2[1]
2104448 blocks [2/2] [UU]

md0 : active (auto-read-only) raid1 sda1[0] sdb1[2](S)
4200896 blocks [2/1] [U_]

md2 : active raid1 sdb3[2] sda3[0]
306263040 blocks [2/1] [U_]
[>....................] recovery = 0.1% (475200/306263040) finish=225.1min speed=22628K/sec

unused devices:

То есть, по каким-то причинам массив /dev/md0 перешел в статус "только чтение".

Как же его вывести из этого статуса и заставить ребилдится? Очень легко:
mdadm -w /dev/md0

Вуаля, пошел ребилд:
cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[0] sdb2[1]
2104448 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[2]
4200896 blocks [2/1] [U_]
resync=DELAYED

md2 : active raid1 sdb3[2] sda3[0]
306263040 blocks [2/1] [U_]
[>....................] recovery = 0.6% (2013504/306263040) finish=531.5min speed=9537K/sec

unused devices:

воскресенье, 29 августа 2010 г.

RAID-5 write hole

Если система отказывает в тот момент, когда имеются активные операции записи на диск, то данные четности и непосредственно данные могут стать несовместимыми (неконсистентными) друг с другом. Если эта проблема не будет исправлена до отказа одного из жестких дисков массива или блока жесткого диска, то данные могут быть потеряны в следствие использования некорректных данных четности для восстановления потерянных блоков в массиве. Эта проблема часто называется "Write hole". Для избежания этой проблемы используется кэш-память с резервным питанием (батареей), которая минимизирует вероятность подобного развития событий. Аналогичной проблеме подвержены RAID-6 массивы.

Оригинал:
In the event of a system failure while there are active writes, the parity of a stripe may become inconsistent with the data. If this is not detected and repaired before a disk or block fails, data loss may ensue as incorrect parity will be used to reconstruct the missing block in that stripe. This potential vulnerability is sometimes known as the write hole. Battery-backed cache and similar techniques are commonly used to reduce the window of opportunity for this to occur. The same issue occurs for RAID-6.

Источник: http://en.wikipedia.org/wiki/Standard_RAID_levels

Можно ли выбросить активный диск из Linux Soft-Raid?

Под активным подразумевается диск, с которого сейчас идет синхронизация на второй диск либо последний оставшийся диск в массиве.

mdadm /dev/md2 -f /dev/sda3
mdadm: set /dev/sda3 faulty in /dev/md2
mdadm /dev/md2 -r /dev/sda3
mdadm: hot remove failed for /dev/sda3: Device or resource busy

Как видите, нельзя :)

пятница, 13 августа 2010 г.

Хм, как бы то ни было странно, но Linux Soft Raid-1 можно сделать на более чем двух дисках :)

Например, для трех все будет выглядеть так:
mdadm --detail /dev/md0
/dev/md0:
Version : 00.90
Creation Time : Thu Jan 14 10:02:29 2010
Raid Level : raid1
Array Size : 4200896 (4.01 GiB 4.30 GB)
Used Dev Size : 4200896 (4.01 GiB 4.30 GB)
Raid Devices : 3
Total Devices : 3
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Fri Aug 13 13:10:35 2010
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0

UUID : 277ac32f:2e3f0881:776c2c25:004bd7b2 (local to host rescue)
Events : 0.70

Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
2 8 33 2 active sync /dev/sdc1


Рекомендуется всем с врожденной боязнью за свои данные :)

суббота, 5 июня 2010 г.

Как правильно разбирать soft-raid на fastvps.ru?

Итак, допустим, мы имеем следующую картину raid массивов:

cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
4200896 blocks [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
2104448 blocks [2/2] [UU]

md2 : active raid1 sdb3[1] sda3[0]
306263040 blocks [2/2] [UU]
[==========>..........] resync = 51.7% (158425088/306263040) finish=51.3min speed=47962K/sec

unused devices:



Очевидно, у нас три массива - /dev/md0, /dev/md1, /dev/md2. Каждый из которых, соответственно, состоит из двух физических дисков - md0 из /dev/sda1, /dev/sdb1, md1 из /dev/sda2, /dev/sdb2, md2 из /dev/sda3, /dev/sdb3.

Допустим, у нас физически отказал диск /dev/sda и в результате этого сервер начинает работать крайне нестабильно (да, несмотря на raid), поэтому сбойный жесткий диск необходимо выбросить из массива и дождаться плановой его замены. Но как это сделать?

Разбор массива осуществляется двумя шагами - метим диск как faulty (отказ) ключом -f, а потом выбрасываем ключом -r. Например, для массива /dev/md0 это выглядит так:

mdadm /dev/md0 -f /dev/sda1
mdadm /dev/md0 -r /dev/sda1


После этого массив /dev/md0 перейдет в однодисковый (DEGRADED) режим:

cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1]
4200896 blocks [2/1] [_U]


Повторяем аналогичную операцию для других массивов (/dev/md1 и /dev/md2) и все, сбойный диск исключен из массива.

четверг, 20 мая 2010 г.

Linux Raid-1 / mirror - параллелит ли он чтение?

Нет, нет и еще раз НЕТ.

RAID1

A RAID1 array is also known as a mirrored set (though mirrors tend to provide reflected images, which RAID1 does not) or a plex.
Once initialised, each device in a RAID1 array contains exactly the same data. Changes are written to all devices in parallel. Data is read from any one device. The driver attempts to distribute read requests across all devices to maximise performance.

All devices in a RAID1 array should be the same size. If they are not, then only the amount of space available on the smallest device is used. Any extra space on other devices is wasted.


http://linux.die.net/man/4/md

вторник, 20 апреля 2010 г.

Сборка soft RAID5 после отказа диска

Имеем RAID-5
cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid5 sda3[0] sdb3[1]
2917660800 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]

md1 : active raid1 sda2[0] sdb2[1]
2104448 blocks [3/2] [UU_]

md0 : active (auto-read-only) raid1 sda1[0] sdb1[1]
4200896 blocks [3/2] [UU_]

unused devices:


А подробный статус RAID имеет вот такой вид:
mdadm --detail /dev/md0
/dev/md0:
Version : 00.90
Creation Time : Fri Mar 5 20:34:14 2010
Raid Level : raid1
Array Size : 4200896 (4.01 GiB 4.30 GB)
Used Dev Size : 4200896 (4.01 GiB 4.30 GB)
Raid Devices : 3
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Mon Apr 19 14:45:55 2010
State : clean, degraded
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

UUID : 4bc73b00:8e0c384f:776c2c25:004bd7b2
Events : 0.51384

Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
2 0 0 2 removed


То есть, заменен был /dev/sdc. И массив нужно перевести в штатный режим.

Изначально, диск /dev/sdc пуст:
fdisk -l /dev/sdc

Disk /dev/sdc: 1500.3 GB, 1500301910016 bytes
255 heads, 63 sectors/track, 182401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x55555555

Disk /dev/sdc doesn't contain a valid partition table


Копируем либо с /dev/sda либо с /dev/sdb таблицу разделов на /dev/sdc.

sfdisk -d /dev/sda | sfdisk /dev/sdc


Добавляем диски в массив:
mdadm /dev/md0 -a /dev/sdc1
mdadm /dev/md1 -a /dev/sdc2
mdadm /dev/md2 -a /dev/sdc3


После этого небольшие разделы соберутся быстро, а мелкие чуть дольше:
cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid5 sdc3[3] sda3[0] sdb3[1]
2917660800 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
[>....................] recovery = 0.1% (1990240/1458830400) finish=592.0min speed=41007K/sec

md1 : active raid1 sdc2[2] sda2[0] sdb2[1]
2104448 blocks [3/3] [UUU]

md0 : active raid1 sdc1[2] sda1[0] sdb1[1]
4200896 blocks [3/3] [UUU]

unused devices:


После того, как соберется массив, на котором расположен /boot ставим grub на диск:
grub-install /dev/sdc


Все :)

понедельник, 5 апреля 2010 г.

WARNING: mismatch_cnt is not 0 on /dev/md2

Это сообщение в CentOS посылает CRON задача /etc/cron.weekly/99-raid-check.

Внутри этого скрипта есть вызов, для проверки этого самого mismatch_cnt:
cat /sys/block/md2/md/mismatch_cnt
2048


Судя по интернетам, это число обозначает число не синхронизированных по какой причине секторов. Как я понимаю, это косвенно намекает на проблемы с винтом и необходимость его замены, так что обязательно проверьте все винты SMART. Если с ними все ок, то можно повторить CHECK (см. ниже) и счетчик ошибок обнулится.

Из документации ядра (Documentation/md.txt) следует следующее:
mismatch_count
When performing 'check' and 'repair', and possibly when
performing 'resync', md will count the number of errors that are
found. The count in 'mismatch_cnt' is the number of sectors
that were re-written, or (for 'check') would have been
re-written. As most raid levels work in units of pages rather
than sectors, this my be larger than the number of actual errors
by a factor of the number of sectors in a page.


Но из этого совершенно нихрена не понятно, что за ошибки-то эти и какова их природа. Комментарии в коде немного проливают свет на происходящее,

sector_t resync_mismatches; /* count of sectors where
* parity/replica mismatch found
*/


То есть, во время проверки могут быть найдены ошибки либо посредством данных о четности (если они есть) либо на основе соответствия (реплики, предполагаю, для RAID-1 это просто число отличающихся секторов на дисках).

Далее в коде ядра встречается следующее (в функции sync_request_write):
/* We have read all readable devices. If we haven't
* got the block, then there is no hope left.
* If we have, then we want to do a comparison
* and skip the write if everything is the same.
* If any blocks failed to read, then we need to
* attempt an over-write
*/


То есть, идет чтение с мастер-устройства и если даныне на слей-устройстве отличаются, они будут переписаны поверх. Обратите внимание, что это выполняется для уже синхронизированного рейда, то есть заведомо это уже плохо.

Далее в коде идет memcmp (сравнение участков памяти) всех секторов с первичного устройства со всеми соответствующими секторами на ведомом и если при этом найдены отличные сектора, идет инкремент mismatch_cnt :
mddev->resync_mismatches += r1_bio->sectors;


Но, судя по коду, с такими секторами ничего не делается. Отсюда мораль - большое значение mismatch_cnt означает проблемы с дисками. И по возможности диски надо побыстрее заменить.

Кстати, в папочке md есть еще много всяких интересностей:
ls /sys/block/md2/md/
array_state dev-sda3 level new_dev rd1 suspend_hi sync_completed sync_speed_min
chunk_size dev-sdb3 metadata_version raid_disks resync_start suspend_lo sync_speed
component_size layout mismatch_cnt rd0 safe_mode_delay sync_action sync_speed_max


Отсюда по Гуглу (http://www.linuxshare.ru/docs/admin/ud_sraid.html) находится ряд интересных фич:

Выполнить проверку целостности массива:
echo 'check' >/sys/block/md2/md/sync_action


Отменить запланированную проверку массива:
echo 'idle' >/sys/block/md2/md/sync_action


Выполнить ресинхронизацию массива:
echo 'repair' >/sys/block/md2/md/sync_action

Заключение
Вообще, по нашему опыту использования софт-рейдов (я сейчас только про SOFT RAID-1), значения mismatch_cnt в пределе нескольких тысяч можно игнорировать абсолютно без вреда для данных и стабильности систем. У нас таких массивов около 15 штук и никаких проблем с ними нету совершенно.

вторник, 16 марта 2010 г.

Производительность RAID10 в Linux

http://en.wikipedia.org/wiki/Non-standard_RAID_levels#Linux_MD_RAID_10

Похоже, это единственное место, где я нашел скорость random access.

Кратко по производительности выходит следующее:
линейное чтение как у stripe (raid0)
рандомное чтение иногда быстрее на 10-20% чем зеркальный рейд (raid1)
запись / рандомная запись аналогична по скорости другим зеркальным рейдам (raid1)

Так что профит фактически есть только при линейном чтении.

Вот еще обзор RAID1 vs RAID10: http://kendalvandyke.blogspot.com/2009/02/disk-performance-hands-on-part-6-raid.html

четверг, 4 марта 2010 г.

Как вернуть диск, помеченный как faulty в soft-raid массив?

Имеем массив, из которого был исключен диск /dev/sdb3 (посредством mdadm /dev/md2 -f /dev/sdb3):
mdadm --detail /dev/md2
/dev/md2:
Version : 0.90
Creation Time : Fri Jan 29 13:13:23 2010
Raid Level : raid1
Array Size : 1458830400 (1391.25 GiB 1493.84 GB)
Used Dev Size : 1458830400 (1391.25 GiB 1493.84 GB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 2
Persistence : Superblock is persistent

Update Time : Thu Mar 4 19:34:43 2010
State : active, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 1
Spare Devices : 0

UUID : c0a1931d:234b71b5:776c2c25:004bd7b2
Events : 0.918281

Number Major Minor RaidDevice State
0 8 3 0 active sync /dev/sda3
1 0 0 1 removed

2 8 19 - faulty spare /dev/sdb3


Фиксица легко, надо удалить этот раздел:
mdadm /dev/md2 -r /dev/sdb3


И добавить заново:
mdadm /dev/md2 -a /dev/sdb3


И все :)

понедельник, 4 января 2010 г.

Найти в системе все видимые RAID устройства

mdadm --detail --scan
ARRAY /dev/md0 level=raid1 num-devices=2 metadata=00.90 UUID=6410b370:1e44257d:776c2c25:004bd7b2
ARRAY /dev/md1 level=raid1 num-devices=2 metadata=00.90 UUID=dbb25c42:993025eb:776c2c25:004bd7b2
ARRAY /dev/md2 level=raid1 num-devices=2 metadata=00.90 UUID=6a5f392b:5baf6a98:776c2c25:004bd7b2

пятница, 1 января 2010 г.

Резервный диск для RAID-1 массива в Linux

Очень долгое время пытался нагуглить, как же сделать один диск в зеркальном массиве "резервным", поиски не давали никакого результата, но вот наткнулся на следующее в выдаче команды mdadm --detail:

mdadm --detail /dev/md0
/dev/md0:
Version : 00.90
Creation Time : Thu Dec 31 07:41:32 2009
Raid Level : raid1
Array Size : 4200896 (4.01 GiB 4.30 GB)
Used Dev Size : 4200896 (4.01 GiB 4.30 GB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Thu Dec 31 07:44:02 2009
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

UUID : 07422baa:e674c462:776c2c25:004bd7b2
Events : 0.13

Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1



Ключевое слово здесь: Spare Devices : 0, это и есть те самые "резервные диски" ! Как их добавлять, я пока не понял, но, уверен, добавление 3го диска в зеркало должно привести к тому, что он станет spare :)

воскресенье, 27 декабря 2009 г.

write cache и linux soft raid 1

Вот такой вопрос - при почти любом горячем ребуте RAID начинает ребилд, что очень сильно достает. Сегодня заметил, что у всех дисков массива включен write cache. Может его отрубить попробовать?

четверг, 24 декабря 2009 г.

Скорость ребилда soft-raid (soft raid rebuild speed)

Недавно Датацентр посоветовал очень эффективный метод ускорения пересборки RAID (система стоит на нем же) - на время ребилда переводить сервер в Rescue (для тех, кто не в курсе, что это - это своего рода Live CD). Эффект от того, что файловая система при этом отмонтирована и на нее никто ничего не пишет очень и очень существенен.

Так что предлагаю всем брать на вооружение :)

пятница, 27 ноября 2009 г.

суббота, 21 ноября 2009 г.

Linux, RAID-1 восстановление после сбоя, замена жесткого диска

Сейчас хочется рассмотреть случай, когда 1 диск зеркального RAID массива отказывает и отдается на замену. Мы будем экспериментировать с двумя дисками: /dev/sda и /dev/sdb.

Проверим статус RAID массива:

cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
4200896 blocks [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
2104448 blocks [2/2] [UU]

md2 : active raid1 sdb3[1] sda3[0]
286728000 blocks [2/2] [UU]

unused devices:


Эмуляция отказа диска

Эмулировать будем отказ диска /dev/sda, это делается следующим образом:


mdadm /dev/md0 --fail /dev/sda1
mdadm /dev/md1 --fail /dev/sda2
mdadm /dev/md2 --fail /dev/sda3


В итоге получаем ситуацию аналогичную выходу из строя диска /dev/sda:

cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[2](F)
4200896 blocks [2/1] [_U]

md1 : active raid1 sdb2[1] sda2[2](F)
2104448 blocks [2/1] [_U]

md2 : active raid1 sdb3[1] sda3[2](F)
286728000 blocks [2/1] [_U]

unused devices:


После этого попробуем перезагрузиться для чистоты эксперимента (но в случае "вылета" /dev/sda лучше этого не делать, будет не с чего грузиться, если он реально отказал).

Замена диска

Продолжаем, теперь нам нужно заменить отказавший диск, возможности это сделать у нас нету, так что обойдемся форматированием диска.

После перезагрузки RAID принял следующий вид:

cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1]
4200896 blocks [2/1] [_U]

md1 : active raid1 sdb2[1]
2104448 blocks [2/1] [_U]

md2 : active raid1 sdb3[1]
286728000 blocks [2/1] [_U]

unused devices:



Внимание! Прочиатйте следующий абзац прежде чем выполнять эти команды! Предварительно, необходимо /dev/sda выбросить из RAID а, это делается так:

mdadm /dev/md0 --remove /dev/sda1
mdadm /dev/md1 --remove /dev/sda2
mdadm /dev/md2 --remove /dev/sda3


Если RAID откажется выбрасывать раздел, то стоит заюзать флаг -f:


mdadm /dev/md0 --remove -f /dev/sda1
mdadm /dev/md1 --remove -f /dev/sda2
mdadm /dev/md2 --remove -f /dev/sda3



Но в моем случае, это не потребовалось, т.к. все упоминания о /dev/sda были выброшены автоматически после перезагрузки.

Форматирование диска для эмуляции "замены"

Теперь посредством fdisk отформатируем /dev/sda:
fdisk /dev/sda
и далее последовательно командой d удаляем все разделы

В итоге получаем следующую картину:

fdisk -l /dev/sda

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System


Все, еще раз перезагружаемся для честной симуляции процесса выемки диска из системного блока :)

Копируем таблицы разделов на новый диск

Теперь копируем таблицу разделов с /dev/sdb на /dev/sda:

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


В итоге получаем следующее:

fdisk /dev/sda -l

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 523 4200966 fd Linux raid autodetect
/dev/sda2 524 785 2104515 fd Linux raid autodetect
/dev/sda3 786 36481 286728120 fd Linux raid autodetect


Ставим GRUB на новый диск

grub-install /dev/sda

Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(hd0) /dev/sda
(hd1) /dev/sdb



Либо если вариант выше не помог пробуем ставить GRUB вручную:


grub /dev/sda
grub>
grub> root (hd0,0) # указать, где находится каталог /boot/grub на вторичном диске
grub> setup (hd0) # установить GRUB-загрузчик в MBR вторичного диска
grub> quit


Сборка RAID
Теперь дело за малым, снова добавить указанные разделы в RAID массив:


mdadm /dev/md0 -a /dev/sda1
mdadm /dev/md1 -a /dev/sda2
mdadm /dev/md2 -a /dev/sda3


Следим за сборкой RAID массива


cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sda1[0] sdb1[1]
4200896 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
2104448 blocks [2/1] [_U]
resync=DELAYED

md2 : active raid1 sda3[2] sdb3[1]
286728000 blocks [2/1] [_U]
[>....................] recovery = 0.0% (150592/286728000) finish=95.1min speed=50197K/sec

unused devices:



P.S. вообще, самый правильный путь следующий: сначала необходимо добавить в RAID раздел, на котором располагается /boot, дождаться, пока он соберется, после этого установить grub и уже самым последним шагом - собрать остальные разделы.

вторник, 17 ноября 2009 г.

Перенос Centos Linux 5 с одного диска на Soft Raid

Появилась следующая проблема, есть Centos Linux 5, установленный на один жесткий диск (/dev/sda) без рейда вообще, также в системе присутствует второй не размеченный жесткий диск (/dev/sdb). Из всего этого требуется собрать soft raid 1 (зеркало в народе) не потеряв при этом данные. Данный мануал почти без изменений применим для серверов на fastvps.ru

Вот как раз для этого есть отличный мануал от Red Hat: http://kbase.redhat.com/faq/docs/DOC-7355 и вот еще один мануал с Opennet и вот еще один.

Вот конфигурация винтов:
fdisk -l

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 523 4200966 82 Linux swap / Solaris
/dev/sda2 524 785 2104515 83 Linux
/dev/sda3 786 36481 286728120 83 Linux

Disk /dev/sdb: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn't contain a valid partition table



Создаем на втором диске (/dev/sdb) структуру разделов аналогичную /dev/sda

fdisk /dev/sdb
n
p
1
[enter]
523 # соответствует значению End напротив /dev/sda1 из таблицы выше
w


fdisk /dev/sdb
n
p
2
[enter]
785 # соответствует значению End напротив /dev/sda2 из таблицы выше




fdisk /dev/sdb
n
p
3
[enter]
[enter]
w


В итоге должна получиться следующая картина:

fdisk -l

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 523 4200966 82 Linux swap / Solaris
/dev/sda2 524 785 2104515 83 Linux
/dev/sda3 786 36481 286728120 83 Linux

Disk /dev/sdb: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 523 4200966 83 Linux
/dev/sdb2 524 785 2104515 83 Linux
/dev/sdb3 786 36481 286728120 83 Linux



Как легко заметить, структура размещения разделов на обоих дисках идентична.

Кстати говоря, на Opennet автор рекомендует использовать вот такую простую команду для копирования структуры разделов:
sfdisk -d /dev/sda | sfdisk /dev/sdb
она работает отлично, также рекомендую, как более простой путь :)

Меняем тип для всех вновь созданных разделов с Linux на Linux Raid


fdisk /dev/sdb

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): fd
Changed system type of partition 3 to fd (Linux raid autodetect)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.




Итого в результате у нас получается следующее:

fdisk -l

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 523 4200966 82 Linux swap / Solaris
/dev/sda2 524 785 2104515 83 Linux
/dev/sda3 786 36481 286728120 83 Linux

Disk /dev/sdb: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 523 4200966 fd Linux raid autodetect
/dev/sdb2 524 785 2104515 fd Linux raid autodetect
/dev/sdb3 786 36481 286728120 fd Linux raid autodetect





Создаем Raid на основе второго диска (/dev/sdb):

mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3


Слово missing означает, что создается degraded (разбитый) массив, т.е. массив, в котором один из дисков отсутствует.

Форматируем диски вновь созданного Raid


mkswap /dev/md0
mkfs.ext3 /dev/md1
mkfs.ext3 /dev/md2


Составляем конфиг RAID
Теперь нам необходимо составить конфиг нашего RAID массива (как я понял, он особо никому не нужен, но сделать его стоит хотя бы для удобства):

Генерируется он так:


mkdir -p /etc/mdadm
/sbin/mdadm --examine --scan > /etc/mdadm/mdadm.conf


Перенос данных


Теперь нам нужно перенести данные c /dev/sda2 и /dev/sda3 на соответственно /dev/md1 и /dev/md2

Данные на sda2 и sda3 у нас размещены в следующих точках мониторования:

/dev/sda2 on /boot type ext3 (rw)
/dev/sda3 on / type ext3 (rw)


Итак, копируем /dev/sda2:

mkdir /mnt/md1
mount /dev/md1 /mnt/md1
cp -axu /boot/* /mnt/md1
sync
umount /mnt/md1


В итоге получаем идентичное содержимое папок:

root@CentOS-54-32-minimal /etc # ls /mnt/md1
boot message
config-2.6.18-164.6.1.el5PAE symvers-2.6.18-164.6.1.el5PAE.gz
grub System.map-2.6.18-164.6.1.el5PAE
initrd-2.6.18-164.6.1.el5PAE.img vmlinuz-2.6.18-164.6.1.el5PAE
lost+found

root@CentOS-54-32-minimal /etc # ls /boot
boot message
config-2.6.18-164.6.1.el5PAE symvers-2.6.18-164.6.1.el5PAE.gz
grub System.map-2.6.18-164.6.1.el5PAE
initrd-2.6.18-164.6.1.el5PAE.img vmlinuz-2.6.18-164.6.1.el5PAE
lost+found



Следующая операция крайне длительна и не хотелось бы, чтобы она оборвалась по вине интернет-соединения, поэтому ставим и запускаем screen:
yum install -y screen
screen



Переносим /dev/sda3:

mkdir /mnt/md2
mount /dev/md2 /mnt/md2/
cp -axu / /mnt/md2


Также убеждаемся в идентичности содержимого папок:

root@CentOS-54-32-minimal /etc # ls /mnt/md2/
bin dev home lib media opt root selinux sys usr
boot etc installimage.conf lost+found mnt proc sbin srv tmp var
root@CentOS-54-32-minimal /etc # ls /
bin dev home lib media opt root selinux sys usr
boot etc installimage.conf lost+found mnt proc sbin srv tmp var



Корректирование /etc/fstab

Теперь на нашем примонтированном рейде нам нужно внести изменения в fstab чтобы система монтировала не старые разделы, а уже RAID. Для этого открываем файл:

vi /mnt/md2/etc/fstab


И строки:
/dev/sda1 none swap sw 0 0
/dev/sda2 /boot ext3 defaults 0 0
/dev/sda3 / ext3 defaults 0 0


Заменяем соотвественно на:

/dev/md0 none swap sw 0 0
/dev/md1 /boot ext3 defaults 0 0
/dev/md2 / ext3 defaults 0 0


Регенерируем Initrd ядра, включаем в него модули поддержки RAID

mkinitrd --fstab=/mnt/md2/etc/fstab -v -f /boot/initrd-`uname -r`.img `uname -r`


При этом в выдаче команды должны промелькнуть строки "raid-1". Только вот честно не понимаю, где он узнает, что на машинке теперь используется RAID. Как выяснилось после долгих изысканий, об использовании RAID на root разделе он узнает из fstab.

Теперь повторяем перенос /boot раздела, т.к. у нас новый initrd
Сейчас оптимизирую мануал. чтобы этого избежать.



mkdir -p /mnt/md1
mount /dev/md1 /mnt/md1
cp -axu /boot/* /mnt/md1
sync
umount /mnt/md1


Отмонитируем раздел

umount /mnt/md2/


Вносим коррективы в системный GRUB

Для этого открываем /etc/grub.conf и там

root=/dev/sda3


заменяем на:

root=/dev/md2


Тоже самое делаем для нового /boot (/dev/md1).


mount /dev/md1 /mnt/md1
vi /mnt/md1/grub/menu.lst
umount /mnt/md1


Перезагружаемся

shutdown -r now



Ставим GRUB на второй диск

grub-install /dev/sdb
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(hd0) /dev/sda
(hd1) /dev/sdb


Также я бы рекомендовал "освежить" инсталляцию grub на первом диск:
grub-install /dev/sda


Еще раз перезагружаемся

И ставим в BIOS загрузку со второго, нового жесткого диска ( Boot Sequecce ) и еще раз перзагружаемся, при этом уже загрузка пойдет со второго диска и первый не потребуется вообще.

Устанавливаем тип Linux Raid для разделов первого диска


fdisk /dev/sda

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): fd
Changed system type of partition 3 to fd (Linux raid autodetect)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.


Добавляем разделы с первого диска в RAID

mdadm /dev/md0 -a /dev/sda1
mdadm /dev/md1 -a /dev/sda2
mdadm /dev/md2 -a /dev/sda3


Дожидаемся окончания ребилда RAID

cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sda1[2] sdb1[1]
4200896 blocks [2/1] [_U]
[==========>..........] recovery = 52.7% (2215232/4200896) finish=0.5min speed=58454K/sec

md1 : active raid1 sda2[2] sdb2[1]
2104448 blocks [2/1] [_U]
resync=DELAYED

md2 : active raid1 sda3[2] sdb3[1]
286728000 blocks [2/1] [_U]
resync=DELAYED

unused devices:


Еще раз перезагружаемся

И Убеждаемся, что все окей :) Либо идем заказывать KVM