Это старая версия документа!
http://xgu.ru/wiki/Программный_RAID_в_Linux
Файловая система создается поверх рейд-массива.
Создать raid-1 с одним отсутствующим диском:
mdadm --create --verbose /dev/md0 --level=1 --bitmap=internal --raid-devices=2 /dev/xvdb1 missing mdadm --detail --scan >> /etc/mdadm/mdadm.conf
Недостающий диск можно подключить позднее:
mdadm /dev/md0 --add /dev/xvdc1
Пометить диск как сбойный и удалить его из массива:
mdadm /dev/md0 --fail /dev/sdb1 mdadm /dev/md0 --remove /dev/sdb1
Если диск уже пропал из системы, то mdadm откажется его удалять т.к. «no such file». В таком случае выполняем удаление всех отсоединенных дисков:
mdadm /dev/md0 -r detached
Создать raid-5 с тремя дисками и одним диском в горячем резерве (hot-spare), размер чанка 64КБ, bitmap хранится в файле /md2.bitmap:
mdadm --create --verbose /dev/md2 --level=5 --raid-devices=3 --spare-devices=1 /dev/sd{f,g,h,i}1 --chunk=512 --bitmap=/md2.bitmap mdadm --readwrite /dev/md2
Удаление суперблока:
mdadm --zero-superblock /dev/sdx
Известный баг Grub: если корневая система в raid, то при загрузке с одного из дисков reboot сразу после появления надписи «Welcome to Grub!».
Решение – раскомментировать строчку
GRUB_TERMINAL=console
в файле /etc/default/grub, и выполнить команду
update-grub
Для нормальной производительности и уменьшения износа диска важно выравнивать разделы по блокам/цилиндрам. Современные диски большого объема имеют увеличенный размер сектора в 4096 байт (вместо 512), что создает дополнительные сложности. Рекомендуется выравнивать всё по 1 МБ.
При создании LVM:
pvcreate --dataalignment=1M
SUBSYSTEM=="block", KERNEL=="md*", ACTION=="change", TEST=="md/stripe_cache_size", ATTR{md/stripe_cache_size}="8192"
udevadm trigger udevadm control --reload-rules
Чтобы сервер не «подвис» в момент ресинхронизации дисков, устанавливаем предел скорости.
dev.raid.speed_limit_max = 10240
sysctl -p /etc/sysctl.d/mdadm.conf
/dev/sdh1, /dev/sdi1, … .
mdadm --create /dev/mdX --raid-devices=4 --level=5 /dev/sd{h,i,j,k}1
dev.raid.speed_limit_max = 51200
Применить настройку без перезагрузки:
sysctl --system
Бывает полезно, когда нужно совместить resync с последующим копированием данных на свежесозданный массив.
echo frozen > /sys/block/md2/md/sync_action echo none > /sys/block/md2/md/resync_start echo idle > /sys/block/md2/md/sync_action echo repair > /sys/block/md2/md/sync_action
При создании этой файловой системы можно указать параметры нижележащего raid, чтобы метаданные файловой системы более равномерно распределялись между дисками. Программа mkfs подбирает оптимальные значения этих параметров, но при расширении raid (или конвертации raid5 в raid6) эти параметры следует изменить вручную.
stride=stride-size Configure the filesystem for a RAID array with stride-size filesystem blocks. This is the number of blocks read or written to disk before moving to next disk. This mostly affects placement of filesystem metadata like bitmaps at mke2fs(2) time to avoid placing them on a single disk, which can hurt the performance. It may also be used by block allocator.
stripe_width=stripe-width Configure the filesystem for a RAID array with stripe-width filesystem blocks per stripe. This is typically be stride-size * N, where N is the number of data disks in the RAID (e.g. RAID 5 N+1, RAID 6 N+2). This allows the block allocator to prevent read-modify-write of the parity in a RAID stripe if possible when the data is written.
Файловую систему перед этим рекомендуется отмонтировать.
chunk size = 512kB block size = 4kB (recommended for large files, and most of time) stride = chunk / block = 128 N = (n disks in raid6) - 2 #or N = (n disks in raid5) - 1 stripe-width = stride * N = 512 tune2fs -E stride=128,stripe-width=512 /dev/mdX
Пример: Массив создан на блочных устройствах:
md1 : active raid5 sdb[4] sde[2] sdc[0] sdd[1] 23435249664 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
Это доставляет неудобства, т.к. теперь в массив можно добавить только диски в точности такого же или большего размера (если новый диск на пару мегабайт меньше, он не добавится).
Чтобы исправить проблему, достаточно было бы уменьшить размер рейда на несколько мегабайт, а затем по очереди «вынуть» из массива по одному диску, создать на них partition и добавить его обратно в массив.
Сорян, но в mdraid это невозможно. Даже если уменьшить раздел командой mdadm --grow
, всё равно диск не добавится с ошибкой «not large enough to join array». И не важно, какая версия метаданных, 0.9 или 1.2. Единственный выход – перенести куда-то данные, создать партишены и пересоздать на них raid.
Допустим, у насть есть раздел /dev/md3 с именем computername:3
и мы хотим переименовать его в othername:1. Ситуация усложняется тем, что на разделе находится lvm-том vg
с разделом /home.
1. Выкидываем всех пользователей из системы и отмонтируем /home. umount /home 2. Останавливаем udev. service udev stop 3. Останавливаем lvm-том. dmsetup remove vg-home 4. Смотрим, на каких дисках собран md-раздел. Допустим это /dev/sdX3, /dev/sdY3 5. Останавливаем mdadm-диск. mdadm --stop /dev/md3 6. Запускаем диск со сменой имени. mdadm --assemble /dev/md1 --name othername:1 --update=name /dev/sd{X,Y}3 7. Обновляем имя в файле ''/etc/mdadm/mdadm.conf'' mdadm --detail --scan 8. Обновляем initramfs. update-initramfs -u
Основная идея (без подробностей): Если новый раздел меньшего размера, то не остается других выходов, кроме как:
Проверил – всё получилось.