Mdadm centos: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 271: Строка 271:
 
[root@50 ~]# mdadm --add /dev/md0 /dev/sda3
 
[root@50 ~]# mdadm --add /dev/md0 /dev/sda3
 
mdadm: re-added /dev/sda3</pre>
 
mdadm: re-added /dev/sda3</pre>
  +
  +
=mdadm=
  +
==raid tuning==
  +
Информация из raid superblock
  +
mdadm -E /dev/sda1
  +
Создание write intend bitmap(встроенного в метаданные raid) для быстрой ресинхронизации с размером минимально синхронизируемой области 128M
  +
mdadm --grow /dev/md0 -b internal --bitmap-chunk=131072
  +
Удаление write intend bitmap
  +
mdadm --grow /dev/md0 -b none
  +
Информация про битмап - запускать на компоненте рейда а не самом рейде
  +
mdadm -X /dev/sda1
  +
Включение/выключение writemostly - этот компонент рейда не будет использоваться для чтения. Внезапно во writebehind есть [http://comments.gmane.org/gmane.linux.raid/36708 баг] когда остаётся только он один в рейде.
  +
echo writemostly > /sys/block/md5/md/dev-sdc5/state
  +
echo -writemostly > /sys/block/md5/md/dev-sdc5/state
  +
Включение отложенной записи в 1024 (чего? операции?)
  +
*При создании
  +
mdadm --create /dev/md5 --level 1 -n 2 /dev/sdd5 missing -b internal --write-behind=1024
  +
*На готовом разделе - только при одновременном создании bitmap
  +
mdadm --grow /dev/md1 -b internal --write-behind=1024
  +
Успешность проверяем в mdadm -X/dev/sdXY|grep Write
  +
==Скрипт сетапа Software RAID1 c дефолтной разбирвкой==
  +
===CentOS 7===
  +
# boot 256M(bootable)
  +
# swap 2G
  +
# root 2G
  +
# (extented)
  +
# tmp 2G
  +
# usr 20G
  +
# var 30G
  +
# home rest space
  +
<pre>
  +
swapoff -a
  +
umount /dev/sdb*
  +
sed -i"" -e "s/SELINUX=enforcing/SELINUX=disabled/" /etc/sysconfig/selinux
  +
yum -y install mdadm
  +
sfdisk /dev/sdb --in-order -L --force -uM << EOF
  +
1,512,fd,*
  +
,2048,S
  +
,2048,fd
  +
,,E
  +
,2048,fd
  +
,30720,fd
  +
,20480,fd
  +
,,fd
  +
EOF
  +
sleep 5
  +
echo "y \n"|mdadm --create /dev/md0 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb3
  +
echo "y \n"|mdadm --create /dev/md1 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 --metadata=1.0 missing /dev/sdb1
  +
echo "y \n"|mdadm --create /dev/md2 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb5
  +
echo "y \n"|mdadm --create /dev/md3 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb6
  +
echo "y \n"|mdadm --create /dev/md4 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb7
  +
echo "y \n"|mdadm --create /dev/md5 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb8
  +
mkswap /dev/sdb2
  +
for i in `seq 0 5`; do mkfs.xfs /dev/md$i; done
  +
mount /dev/md0 /mnt
  +
mkdir /mnt/{tmp,var,usr,home}
  +
mount /dev/md2 /mnt/tmp
  +
mount /dev/md3 /mnt/var
  +
mount /dev/md4 /mnt/usr
  +
mount /dev/md5 /mnt/home
  +
chmod 1777 /mnt/tmp
  +
cp /etc/fstab /etc/fstab.old
  +
cat > /etc/fstab <<EOF
  +
/dev/md0 / xfs defaults,usrquota,grpquota 1 1
  +
/dev/md1 /boot xfs defaults 1 2
  +
/dev/md2 /tmp xfs defaults,nodev,nosuid,noexec,usrquota,grpquota,noatime 1 2
  +
/dev/md3 /var xfs defaults,nodev,nosuid,noexec,usrquota,grpquota,noatime 1 2
  +
/dev/md4 /usr xfs defaults,nodev,usrquota,grpquota,noatime 1 2
  +
/dev/md5 /home xfs defaults,nodev,nosuid,usrquota,grpquota,noatime 1 2
  +
devpts /dev/pts devpts gid=5,mode=620 0 0
  +
tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec,size=256m 0 0
  +
proc /proc proc defaults 0 0
  +
sysfs /sys sysfs defaults 0 0
  +
/dev/sdb2 swap swap defaults 0 0
  +
EOF
  +
echo "DEVICE /dev/hd*[0-9] /dev/sd*[0-9]" > /etc/mdadm.conf
  +
mdadm --detail --scan >> /etc/mdadm.conf
  +
MDUIDS=`grep -o 'UUID=[a-z0-9:]*' /etc/mdadm.conf | sed 's/UUID=/rd.md.uuid=/' | tr '\n' ' '`
  +
sed -i 's/^GRUB_CMDLINE_LINUX=.*$/GRUB_CMDLINE_LINUX="rd.md=1 rd.auto selinux=0 crashkernel=auto vconsole.font=latarcyrheb-sun16 vconsole.keymap=us MDUIDS"/g' /etc/default/grub
  +
sed -i "s/MDUIDS/$MDUIDS/" /etc/default/grub
  +
cp -dpRx / /mnt
  +
mount /dev/md1 /mnt/boot
  +
cp -dpRx /boot /mnt
  +
mount --bind /proc /mnt/proc ; mount --bind /sys /mnt/sys ; mount --bind /dev /mnt/dev ;
  +
#chroot /mnt /bin/bash -c "dracut -f -v"
  +
for i in `ls -d /lib/modules/3.*|xargs -n1 basename`;do echo -e "\E[01;32m $i\E[0m"; \
  +
#chroot /mnt /bin/bash -c "dracut --mdadmconf --fstab --force --add="mdraid" --add-drivers="raid1" /boot/initramfs-$i.img $i";
  +
chroot /mnt /bin/bash -c "dracut -f -v /boot/initramfs-$i.img $i"
  +
done
  +
chroot /mnt /bin/bash -c "grub2-mkconfig -o /boot/grub2/grub.cfg"
  +
chroot /mnt /bin/bash -c "grub2-install /dev/sda"
  +
chroot /mnt /bin/bash -c "grub2-install /dev/sdb"
  +
rm -rf /boot/*
  +
cp -dpRx /mnt/boot/* /boot/
  +
umount /mnt/{proc,sys,dev}
  +
umount /mnt/{boot,tmp,var,usr,home}
  +
umount /mnt
  +
#
  +
history -c
  +
#
  +
  +
reboot
  +
  +
sfdisk -d /dev/sdb| sfdisk --force /dev/sda
  +
sleep 5
  +
mkswap /dev/sda2
  +
mdadm --add /dev/md0 /dev/sda3
  +
mdadm --add /dev/md1 /dev/sda1
  +
mdadm --add /dev/md2 /dev/sda5
  +
mdadm --add /dev/md3 /dev/sda6
  +
mdadm --add /dev/md4 /dev/sda7
  +
mdadm --add /dev/md5 /dev/sda8
  +
COUNTER=`egrep -c '(U_|_U)' /proc/mdstat`
  +
while [ "$COUNTER" -gt "0" ]; do
  +
sleep 60
  +
COUNTER=`egrep -c '(U_|_U)' /proc/mdstat`
  +
done
  +
echo -e "\E[01;32mSync done\E[0m"
  +
grub2-install /dev/sda
  +
#
  +
history -c
  +
#
  +
  +
#RAID10
  +
mdadm -G /dev/md0 -n 4
  +
mdadm -G /dev/md1 -n 4
  +
mdadm --add /dev/md0 /dev/sdc3 /dev/sdd3
  +
mdadm --add /dev/md1 /dev/sdc1 /dev/sdd1
  +
mdadm --create /dev/md2 --level=10 --raid-devices=4 /dev/sda5 /dev/sdb5 /dev/sdc5 /dev/sdd5
  +
</pre>
  +
  +
===CentOS 6===
  +
# boot 256M(bootable)
  +
# swap 2G
  +
# root 2G
  +
# (extented)
  +
# tmp 2G
  +
# usr 20G
  +
# var 15G
  +
# home rest space
  +
  +
<pre>
  +
swapoff -a
  +
umount /dev/sdb*
  +
sed -i"" -e "s/SELINUX=enforcing/SELINUX=disabled/" /etc/sysconfig/selinux
  +
yum -y install mdadm
  +
sfdisk /dev/sdb --force -uM << EOF
  +
,256,fd,*
  +
,2048,S
  +
,2048,fd
  +
,,E
  +
,2048,fd
  +
,15360,fd
  +
,20480,fd
  +
,,fd
  +
EOF
  +
sleep 5
  +
echo "y \n"|mdadm --create /dev/md0 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb3
  +
echo "y \n"|mdadm --create /dev/md1 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 --metadata=0.90 missing /dev/sdb1
  +
echo "y \n"|mdadm --create /dev/md2 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb5
  +
echo "y \n"|mdadm --create /dev/md3 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb6
  +
echo "y \n"|mdadm --create /dev/md4 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb7
  +
echo "y \n"|mdadm --create /dev/md5 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb8
  +
mkswap /dev/sdb2
  +
for i in `seq 0 5`; do mkfs.ext4 -m1 -O dir_index /dev/md$i; done
  +
mount /dev/md0 /mnt
  +
mkdir /mnt/{tmp,var,usr,home}
  +
mount /dev/md2 /mnt/tmp
  +
mount /dev/md3 /mnt/var
  +
mount /dev/md4 /mnt/usr
  +
mount /dev/md5 /mnt/home
  +
chmod 1777 /mnt/tmp
  +
cp /etc/fstab /etc/fstab.old
  +
cat > /etc/fstab <<EOF
  +
/dev/md0 / ext4 defaults,usrquota,grpquota 1 1
  +
/dev/md1 /boot ext4 defaults 1 2
  +
/dev/md2 /tmp ext4 defaults,nodev,nosuid,noexec,usrquota,grpquota,noatime 1 2
  +
/dev/md3 /var ext4 defaults,nodev,nosuid,noexec,usrquota,grpquota,noatime 1 2
  +
/dev/md4 /usr ext4 defaults,nodev,usrquota,grpquota,noatime 1 2
  +
/dev/md5 /home ext4 defaults,nodev,nosuid,usrquota,grpquota,noatime 1 2
  +
devpts /dev/pts devpts gid=5,mode=620 0 0
  +
tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec,size=256m 0 0
  +
proc /proc proc defaults 0 0
  +
sysfs /sys sysfs defaults 0 0
  +
/dev/sdb2 swap swap defaults 0 0
  +
EOF
  +
echo "DEVICE /dev/hd*[0-9] /dev/sd*[0-9]" > /etc/mdadm.conf
  +
mdadm --detail --scan >> /etc/mdadm.conf
  +
for i in `ls -d /lib/modules/2.*|xargs -n1 basename`;do echo -e "\E[01;32m $i\E[0m"; \
  +
mkinitrd -f --with=raid1 --with=ext4 /boot/initramfs-$i.img $i;done
  +
cp /boot/grub/grub.conf /boot/grub/grub.conf.old
  +
sed -i"" -re's#root=([^[:space:]]*)#root=/dev/md0#' /boot/grub/grub.conf
  +
sed -i"" -re's# rd_LVM_LV=([^[:space:]]*)##' /boot/grub/grub.conf
  +
sed -i"" -e "s/ rd_NO_MD//" /boot/grub/grub.conf
  +
cp -dpRx / /mnt
  +
mount /dev/md1 /mnt/boot
  +
cp -dpRx /boot /mnt
  +
echo -e "device (hd0) /dev/sdb \n root (hd0,0) \n setup (hd0)" | grub --batch
  +
#
  +
history -c
  +
#
  +
</pre>
  +
Ребут
  +
<pre>
  +
sfdisk -d /dev/sdb| sfdisk --force /dev/sda
  +
sleep 5
  +
mkswap /dev/sda2
  +
mdadm --add /dev/md0 /dev/sda3
  +
mdadm --add /dev/md1 /dev/sda1
  +
mdadm --add /dev/md2 /dev/sda5
  +
mdadm --add /dev/md3 /dev/sda6
  +
mdadm --add /dev/md4 /dev/sda7
  +
mdadm --add /dev/md5 /dev/sda8
  +
COUNTER=`egrep -c '(U_|_U)' /proc/mdstat`
  +
while [ "$COUNTER" -gt "0" ]; do
  +
sleep 60
  +
COUNTER=`egrep -c '(U_|_U)' /proc/mdstat`
  +
done
  +
echo -e "\E[01;32mSync done\E[0m"
  +
echo -e "device (hd0) /dev/sda \n root (hd0,0) \n setup (hd0)" | grub --batch
  +
#
  +
history -c
  +
#
  +
</pre>
  +
  +
===CentOS 5===
  +
<pre>
  +
swapoff -a
  +
umount /dev/sdb*
  +
sfdisk --force /dev/sdb -uM << EOF
  +
,100,fd,*
  +
,2048,S
  +
,2048,fd
  +
,,E
  +
,2048,fd
  +
,15360,fd
  +
,20480,fd
  +
,,fd
  +
EOF
  +
sleep 5
  +
echo "y \n"|mdadm --create /dev/md0 --level 1 --raid-devices=2 missing /dev/sdb3
  +
echo "y \n"|mdadm --create /dev/md1 --level 1 --raid-devices=2 missing /dev/sdb1
  +
echo "y \n"|mdadm --create /dev/md2 --level 1 --raid-devices=2 missing /dev/sdb5
  +
echo "y \n"|mdadm --create /dev/md3 --level 1 --raid-devices=2 missing /dev/sdb6
  +
echo "y \n"|mdadm --create /dev/md4 --level 1 --raid-devices=2 missing /dev/sdb7
  +
echo "y \n"|mdadm --create /dev/md5 --level 1 --raid-devices=2 missing /dev/sdb8
  +
mkswap /dev/sdb2
  +
for i in `seq 0 5`; do mkfs.ext3 -m1 -O dir_index /dev/md$i; done
  +
mount /dev/md0 /mnt
  +
mkdir /mnt/{tmp,var,usr,home}
  +
mount /dev/md2 /mnt/tmp
  +
mount /dev/md3 /mnt/var
  +
mount /dev/md4 /mnt/usr
  +
mount /dev/md5 /mnt/home
  +
chmod 1777 /mnt/tmp
  +
cp /etc/fstab /etc/fstab.old
  +
cat > /etc/fstab <<EOF
  +
/dev/md0 / ext3 defaults,usrquota,grpquota 1 1
  +
/dev/md1 /boot ext3 defaults 1 2
  +
/dev/md2 /tmp ext3 defaults,nodev,nosuid,noexec,usrquota,grpquota,noatime 1 2
  +
/dev/md3 /var ext3 defaults,nodev,nosuid,noexec,usrquota,grpquota,noatime 1 2
  +
/dev/md4 /usr ext3 defaults,nodev,usrquota,grpquota,noatime 1 2
  +
/dev/md5 /home ext3 defaults,nodev,nosuid,usrquota,grpquota,noatime 1 2
  +
devpts /dev/pts devpts gid=5,mode=620 0 0
  +
tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec,size=256m 0 0
  +
proc /proc proc defaults 0 0
  +
sysfs /sys sysfs defaults 0 0
  +
/dev/sdb2 swap swap defaults 0 0
  +
EOF
  +
echo "DEVICE /dev/hd*[0-9] /dev/sd*[0-9]" > /etc/mdadm.conf
  +
mdadm --detail --scan >> /etc/mdadm.conf
  +
for i in `ls -d /lib/modules/2.*|xargs -n1 basename`;do echo -e "\E[01;32m $i\E[0m"; \
  +
mkinitrd -f --with=raid1 /boot/initrd-$i.img $i; \
  +
gunzip -dc /boot/initrd-$i.img|grep -a "raidauto\|/dev/md0";done
  +
cp /boot/grub/grub.conf /boot/grub/grub.conf.old
  +
sed -i"" -e "s#root\=LABEL\=\/#root=/dev/md0#" /boot/grub/grub.conf
  +
cp -dpRx / /mnt
  +
mount /dev/md1 /mnt/boot
  +
cp -dpRx /boot /mnt
  +
echo -e "device (hd0) /dev/sdb \n root (hd0,0) \n setup (hd0)" | grub --batch
  +
#
  +
</pre>
  +
  +
Ребут
  +
  +
<pre>
  +
sfdisk -d /dev/sdb| sfdisk --force /dev/sda
  +
sleep 5
  +
mkswap /dev/sda2
  +
mdadm --add /dev/md0 /dev/sda3
  +
mdadm --add /dev/md1 /dev/sda1
  +
mdadm --add /dev/md2 /dev/sda5
  +
mdadm --add /dev/md3 /dev/sda6
  +
mdadm --add /dev/md4 /dev/sda7
  +
mdadm --add /dev/md5 /dev/sda8
  +
COUNTER=`egrep -c '(U_|_U)' /proc/mdstat`
  +
while [ "$COUNTER" -gt "0" ]; do
  +
sleep 60
  +
COUNTER=`egrep -c '(U_|_U)' /proc/mdstat`
  +
done
  +
echo -e "\E[01;32mSync done\E[0m"
  +
echo -e "device (hd0) /dev/sda \n root (hd0,0) \n setup (hd0)" | grub --batch
  +
#
  +
</pre>
  +
  +
==RAID10==
  +
<pre>
  +
mdadm -G /dev/md0 -n 4 --force
  +
mdadm -G /dev/md1 -n 4 --force
  +
mdadm --add /dev/md0 /dev/sdc3 /dev/sdd3
  +
mdadm --add /dev/md1 /dev/sdc1 /dev/sdd1
  +
mdadm --create /dev/md2 --level=10 --raid-devices=4 /dev/sda5 /dev/sdb5 /dev/sdc5 /dev/sdd5
  +
</pre>
  +
  +
==GPT gdisk==
  +
Подключаем [[epel]]
  +
yum -y install gdisk
  +
Клонируем таблицу разделов:
  +
sgdisk --replicate=/dev/sdb /dev/sda
  +
После чего '''обязательно''' меняем UUID'ы в новой таблице разделов
  +
sgdisk -G /dev/sdb

Версия 14:53, 8 сентября 2019

mdadm centos

Задача - добавили новый винт и надо переехать на рейд
Размечаем так как есть:

sfdisk -d /dev/sda | sfdisk /dev/sdb --force
Checking that no-one is using this disk right now ...
OK

Disk /dev/sdb: 38913 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sdb1          0       -       0          0    0  Empty
/dev/sdb2          0       -       0          0    0  Empty
/dev/sdb3          0       -       0          0    0  Empty
/dev/sdb4          0       -       0          0    0  Empty
New situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sdb1   *      2048    411647     409600  83  Linux
/dev/sdb2        411648  12699647   12288000  82  Linux swap / Solaris
/dev/sdb3      12699648 625141759  612442112  83  Linux
/dev/sdb4             0         -          0   0  Empty


mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sdb1 missing
mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sdb3 missing
mkfs.ext4 /dev/md0
mkfs.ext4 /dev/md1

Не забыть установить тип партиции fd для всех разделов в рейде

fdisk /dev/sdb
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)
blkid
/dev/sda1: UUID="dc25921e-8263-4347-8b4e-f7e1e49d9bf5" TYPE="ext4"
/dev/sda2: UUID="a01dd47f-5c61-4770-a4f0-0f8e19c068b5" TYPE="swap"
/dev/sda3: UUID="102984a0-3cd6-43ab-b4bf-47029828a7cb" TYPE="ext4"
/dev/sdb1: UUID="58fb76b9-0552-8a81-31d6-4d7265470739" TYPE="linux_raid_member"
/dev/sdb3: UUID="cf3c8070-443d-8937-6cc8-3ea9197c784a" UUID_SUB="0425635a-21d3-7eae-3015-066254fca5fb" LABEL="impexmedia.net:1" TYPE="linux_raid_member"
/dev/md127: UUID="ad41081b-3dab-458c-bbe1-b1895365d1a4" TYPE="ext4"
/dev/md126: UUID="35036373-4d27-492c-8753-9c62bbd2f789" TYPE="ext4"







Отличия

  • --metadata=0.90 только для /boot-содержащего раздела
  • mkfs.ext4 вместо mkfs.ext3(ОС уже должна быть на ext4)
  • имя файлов initrd- теперь initramfs-
  • убрать из параметров ядра отключение автодетекта рейдов rd_NO_MD
  • при создании рейда добавляем bitmap --bitmap=internal --bitmap-chunk=131072. В 5-м CentOS он тоже работает, но может приводить к паникам(5.7 подвержен)
  • leaseweb(GPT)-specific
    • сетапает на ext3, поэтому добавляем --with=ext4 при mkinitrd и правим фстаб ext3->ext4
    • копируем и рандомайзим gpt-разделы

В случае переразбивки словесный алгоритм

  • скопировать таблицу разделов sda->sdb : sfdisk (gpt only : sfdisk --force, sgdisk -R , sgdisk -G)
  • удалить все разделы на sdb кроме первого /boot-содержащего и создать новые разделы с типом fd(gpt only: с типом fd00, тип /boot-содержащего не меняется и остаётся EF00). Если /boot-содержащий раздел - не первый, то нормальной переразбивки не будет :)
  • создать рейды из sdb (/boot-содержащий с --metadata=0.90), создать в них фс, смонтировать в /mnt
  • подправить /etc/fstab
  • наполнить mdadm.conf
  • пересобрать все initramfs c raid1 и ext4
  • подправить grub.conf (root=/dev/mdX, selinux=0, убрать no_md_)
  • скопировать данные в /mnt, по 1 команде для каждого раздела.
  • установить grub на sdb
  • ребутнуться
  • освободить таблицу разделов sda(выключить своп) и скопировать таблицу разделов sdb->sda : sfdisk (gpt only : sfdisk не нужен уже, тк таблицу mbr мы не меняли после копирования sda->sdb, sgdisk -R , sgdisk -G)
  • запустить синхронизацию /boot-содержащего рейда, дождаться завершения
  • установить grub на sda
  • запустить синхронизацию остальных рейдов. Рейды с metadata 1.2 умеют продолжать синхронизацию после ребута.
  • ребутнуться, настроить свопы в /etc/fstab

Не забыть включить Write cache:

[root@localhost ~]# hdparm -I /dev/sda|egrep 'Write cache'
           *    Write cache
/sbin/hdparm -W 0 /dev/sda 0 Disable write caching
/sbin/hdparm -W 1 /dev/sda 1 Enable write caching


Если не нужна переразбивка, можно воспользоваться скриптом hop-a:

mkdir /root/linux_raid1/
cd /root/linux_raid1/
wget http://setup.amhost.net/linux_raid1.py
chmod 777 ./linux_raid1.py
./linux_raid1.py
reboot
cd /root/linux_raid1/
./linux_raid1.py
reboot
rm -f /tmp/linux_raid1*
rm -rf /root/linux_raid1/

Или же:

[root@centos ~]# sfdisk -d /dev/sda| sfdisk /dev/sdb
[root@centos ~]# 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): p

Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1         117      939771   fd  Linux raid autodetect
/dev/sdb2             118         130      104422+  82  Linux swap

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

Calling ioctl() to re-read partition table.
Syncing disks.

Если sfdisk и fdisk отругались на GPT - не отчаиваемся

начало GPT-части

yum -y install libicu

И ставим для i386

#rpm -ih http://download.fedora.redhat.com/pub/epel/testing/6/i386/gdisk-0.7.2-1.el6.i686.rpm
yum install http://download.fedora.redhat.com/pub/epel/6/i386/gdisk-0.8.1-2.el6.i686.rpm

или для x86_64

#rpm -ih http://download.fedora.redhat.com/pub/epel/testing/6/x86_64/gdisk-0.7.2-1.el6.x86_64.rpm
yum install http://download.fedora.redhat.com/pub/epel/6/x86_64/gdisk-0.8.1-2.el6.x86_64.rpm

Копируем таблицу разделов MBR через sfdisk с --force - только один раздел GPT :)

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

Копируем таблицу GPT через sgdisk

sgdisk -R /dev/sdb /dev/sda

Меняем UUID'ы на скопированной таблице

sgdisk -G /dev/sdb

Меняем тип разделов (кроме boot) на fd00 через gdisk. В примере меняется тип 2-го раздела. У boot должен быть тип EF00 и та же геометрия что и у boot на sda

[root@localhost ~]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.7.2

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): t
Partition number (1-3): 2
Current type is 'Linux RAID'
Hex code or GUID (L to show codes, Enter = 8300): FD00
Changed type of partition to 'Linux RAID'

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT).
The operation has completed successfully.
[root@localhost ~]# 

конец GPT-части

#для /boot-содержащего раздела нужно делать рейд с --metadata=0.90)
#bitmap на centos 5 делает панику.
[root@centos ~]# mdadm --create /dev/md0 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb1
[root@centos ~]# mkfs.ext4 -m1 -O dir_index /dev/md0
[root@centos ~]# mount /dev/md0 /mnt
[root@centos ~]# cp /etc/fstab /etc/fstab.old
[root@centos ~]# vi /etc/fstab #меняем устройство на /dev/md0 и тип фс на ext4
[root@centos ~]# echo "DEVICE /dev/hd*[0-9] /dev/sd*[0-9]" > /etc/mdadm.conf
[root@centos ~]# mdadm --detail --scan >> /etc/mdadm.conf
[root@centos ~]# for i in `ls -d /lib/modules/2.*|xargs -n1 basename`;do echo -e "\E[01;32m $i\E[0m"; \
mkinitrd -f --with=raid1 --with=ext4 /boot/initramfs-$i.img $i;done
[root@centos ~]# cp /boot/grub/grub.conf /boot/grub/grub.conf.old
[root@centos ~]# vi /boot/grub/grub.conf
#меняем root на /dev/md0, удаляем rd_NO_MD, добавляем на всякий случай selinux=0 в параметрах ядра
[root@centos ~]# cp -dpRx / /mnt 
#для других разделов  cp -dpRx /boot /mnt , cp -dpRx /var /mnt и тп
#альтернатива(UNTESTED!!!) rsync -av --bwlimit=5000 --delete --progress --stats --exclude "/mnt" / /mnt
[root@centos ~]# grub # device (hd0) /dev/sdb ; root (hd0,0) ; setup (hd0) ; quit
[root@centos ~]# reboot


[root@centos ~]# mdadm --add /dev/md0 /dev/sda1
[root@centos ~]# fdisk /dev/sda

Command (m for help): p

Disk /dev/sda: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         117      939771   83  Linux
/dev/sda2             118         130      104422+  82  Linux swap

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): 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 отругался - берём в руки gdisk и меняем тип раздела на FD00, пример работы - в начале статьи.
[root@centos ~]# grub # device (hd0) /dev/sda ; root (hd0,0) ; setup (hd0)

в тестовой конфигурации наступил на багу - делал mkinitrd не для того ядра, с которого грузилось :)
ещё одна бага - не забыть сменить тип разделов на первичном винте и после завершения клонирования /boot-содержащего раздела переставить grub на первичный винт
ещё одна бага - selinux нужно выключать через параметр ядра selinux=0, когда ядро грузится с одного диска, а монтируется на другом.
--voron 18:07, 28 апреля 2007 (UTC)

для запуска созданного неполного массива используем

mdadm --assemble /dev/md0 /dev/sdb1

если нет устройства md1, то создаём руками

mknod /dev/md1 b 9 1

Если ошиблись с порядком вставки дисков в рейды, то, чтобы не ждать пока синкнется / и только потом /boot, можно оборвать синк /.

#ошибочное добавление /, удобнее начинать с /boot
[root@50 ~]# mdadm --add /dev/md0 /dev/sda3
mdadm: added /dev/sda3
#пытаемся удалить из рейда - не даёт.
[root@50 ~]# mdadm --remove /dev/md0 /dev/sda3
mdadm: hot remove failed for /dev/sda3: Device or resource busy
#отмечаем как failed
[root@50 ~]# mdadm --fail /dev/md0 /dev/sda3
mdadm: set /dev/sda3 faulty in /dev/md0
#даёт удалить
[root@50 ~]# mdadm --remove /dev/md0 /dev/sda3
mdadm: hot removed /dev/sda3
#добавляем /boot - синкается моментально.
[root@50 ~]# mdadm --add /dev/md1 /dev/sda1
mdadm: added /dev/sda1
#добавляем /
[root@50 ~]# mdadm --add /dev/md0 /dev/sda3
mdadm: re-added /dev/sda3

mdadm

raid tuning

Информация из raid superblock

mdadm -E /dev/sda1

Создание write intend bitmap(встроенного в метаданные raid) для быстрой ресинхронизации с размером минимально синхронизируемой области 128M

mdadm --grow /dev/md0 -b internal --bitmap-chunk=131072

Удаление write intend bitmap

mdadm --grow /dev/md0 -b none

Информация про битмап - запускать на компоненте рейда а не самом рейде

mdadm -X /dev/sda1

Включение/выключение writemostly - этот компонент рейда не будет использоваться для чтения. Внезапно во writebehind есть баг когда остаётся только он один в рейде.

echo writemostly > /sys/block/md5/md/dev-sdc5/state
echo -writemostly > /sys/block/md5/md/dev-sdc5/state

Включение отложенной записи в 1024 (чего? операции?)

  • При создании
mdadm --create /dev/md5 --level 1 -n 2 /dev/sdd5 missing -b internal --write-behind=1024
  • На готовом разделе - только при одновременном создании bitmap
mdadm --grow /dev/md1 -b internal --write-behind=1024

Успешность проверяем в mdadm -X/dev/sdXY|grep Write

Скрипт сетапа Software RAID1 c дефолтной разбирвкой

CentOS 7

  1. boot 256M(bootable)
  2. swap 2G
  3. root 2G
  4. (extented)
  5. tmp 2G
  6. usr 20G
  7. var 30G
  8. home rest space
swapoff -a
umount /dev/sdb*
sed -i"" -e "s/SELINUX=enforcing/SELINUX=disabled/" /etc/sysconfig/selinux
yum -y install mdadm
sfdisk /dev/sdb --in-order -L --force -uM << EOF
1,512,fd,*
,2048,S
,2048,fd
,,E
,2048,fd
,30720,fd
,20480,fd
,,fd
EOF
sleep 5
echo "y \n"|mdadm --create /dev/md0 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb3
echo "y \n"|mdadm --create /dev/md1 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 --metadata=1.0 missing /dev/sdb1
echo "y \n"|mdadm --create /dev/md2 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb5
echo "y \n"|mdadm --create /dev/md3 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb6
echo "y \n"|mdadm --create /dev/md4 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb7
echo "y \n"|mdadm --create /dev/md5 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb8
mkswap /dev/sdb2
for i in `seq 0 5`; do mkfs.xfs /dev/md$i; done
mount /dev/md0 /mnt
mkdir /mnt/{tmp,var,usr,home}
mount /dev/md2 /mnt/tmp
mount /dev/md3 /mnt/var
mount /dev/md4 /mnt/usr
mount /dev/md5 /mnt/home
chmod 1777 /mnt/tmp
cp /etc/fstab /etc/fstab.old
cat > /etc/fstab <<EOF
/dev/md0                /                       xfs    defaults,usrquota,grpquota       1 1
/dev/md1                /boot                   xfs    defaults        1 2
/dev/md2                /tmp                    xfs    defaults,nodev,nosuid,noexec,usrquota,grpquota,noatime        1 2
/dev/md3                /var                    xfs    defaults,nodev,nosuid,noexec,usrquota,grpquota,noatime        1 2
/dev/md4                /usr                    xfs    defaults,nodev,usrquota,grpquota,noatime                      1 2
/dev/md5                /home                   xfs    defaults,nodev,nosuid,usrquota,grpquota,noatime        1 2
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
tmpfs                   /dev/shm                tmpfs   defaults,nodev,nosuid,noexec,size=256m       0 0
proc                    /proc                   proc    defaults        0 0
sysfs                   /sys                    sysfs   defaults        0 0
/dev/sdb2               swap                    swap    defaults        0 0
EOF
echo "DEVICE /dev/hd*[0-9] /dev/sd*[0-9]" > /etc/mdadm.conf
mdadm --detail --scan >> /etc/mdadm.conf
MDUIDS=`grep -o 'UUID=[a-z0-9:]*' /etc/mdadm.conf | sed 's/UUID=/rd.md.uuid=/' | tr '\n' ' '`
sed -i 's/^GRUB_CMDLINE_LINUX=.*$/GRUB_CMDLINE_LINUX="rd.md=1 rd.auto selinux=0 crashkernel=auto vconsole.font=latarcyrheb-sun16 vconsole.keymap=us MDUIDS"/g' /etc/default/grub
sed -i "s/MDUIDS/$MDUIDS/" /etc/default/grub
cp -dpRx / /mnt
mount /dev/md1 /mnt/boot
cp -dpRx  /boot /mnt
mount --bind /proc /mnt/proc ; mount --bind /sys /mnt/sys ; mount --bind /dev /mnt/dev ;
#chroot /mnt /bin/bash -c "dracut -f -v"
for i in `ls -d /lib/modules/3.*|xargs -n1 basename`;do echo -e "\E[01;32m $i\E[0m"; \
#chroot /mnt /bin/bash -c "dracut --mdadmconf --fstab --force --add="mdraid" --add-drivers="raid1" /boot/initramfs-$i.img $i";
chroot /mnt /bin/bash -c "dracut -f -v /boot/initramfs-$i.img $i"
done
chroot /mnt /bin/bash -c "grub2-mkconfig -o /boot/grub2/grub.cfg"
chroot /mnt /bin/bash -c "grub2-install /dev/sda"
chroot /mnt /bin/bash -c "grub2-install /dev/sdb"
rm -rf /boot/*
cp -dpRx  /mnt/boot/*  /boot/
umount /mnt/{proc,sys,dev}
umount /mnt/{boot,tmp,var,usr,home}
umount /mnt
#
history -c
#

reboot

sfdisk -d /dev/sdb| sfdisk --force /dev/sda
sleep 5
mkswap /dev/sda2
mdadm --add /dev/md0 /dev/sda3
mdadm --add /dev/md1 /dev/sda1
mdadm --add /dev/md2 /dev/sda5
mdadm --add /dev/md3 /dev/sda6
mdadm --add /dev/md4 /dev/sda7
mdadm --add /dev/md5 /dev/sda8
COUNTER=`egrep -c '(U_|_U)' /proc/mdstat`
while [  "$COUNTER" -gt "0" ]; do
sleep 60
COUNTER=`egrep -c '(U_|_U)' /proc/mdstat`
done
echo -e "\E[01;32mSync done\E[0m" 
grub2-install /dev/sda
#
history -c
#

#RAID10
mdadm -G /dev/md0 -n 4
mdadm -G /dev/md1 -n 4
mdadm --add /dev/md0 /dev/sdc3 /dev/sdd3
mdadm --add /dev/md1 /dev/sdc1 /dev/sdd1
mdadm --create /dev/md2 --level=10 --raid-devices=4 /dev/sda5 /dev/sdb5 /dev/sdc5 /dev/sdd5

CentOS 6

  1. boot 256M(bootable)
  2. swap 2G
  3. root 2G
  4. (extented)
  5. tmp 2G
  6. usr 20G
  7. var 15G
  8. home rest space
swapoff -a
umount /dev/sdb*
sed -i"" -e "s/SELINUX=enforcing/SELINUX=disabled/" /etc/sysconfig/selinux
yum -y install mdadm
sfdisk /dev/sdb --force -uM << EOF
,256,fd,*
,2048,S
,2048,fd
,,E
,2048,fd
,15360,fd
,20480,fd
,,fd
EOF
sleep 5
echo "y \n"|mdadm --create /dev/md0 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb3
echo "y \n"|mdadm --create /dev/md1 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 --metadata=0.90 missing /dev/sdb1
echo "y \n"|mdadm --create /dev/md2 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb5
echo "y \n"|mdadm --create /dev/md3 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb6
echo "y \n"|mdadm --create /dev/md4 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb7
echo "y \n"|mdadm --create /dev/md5 --level 1 --bitmap=internal --bitmap-chunk=131072 --raid-devices=2 missing /dev/sdb8
mkswap /dev/sdb2
for i in `seq 0 5`; do mkfs.ext4 -m1 -O dir_index /dev/md$i; done
mount /dev/md0 /mnt
mkdir /mnt/{tmp,var,usr,home}
mount /dev/md2 /mnt/tmp
mount /dev/md3 /mnt/var
mount /dev/md4 /mnt/usr
mount /dev/md5 /mnt/home
chmod 1777 /mnt/tmp
cp /etc/fstab /etc/fstab.old
cat > /etc/fstab <<EOF
/dev/md0                /                       ext4    defaults,usrquota,grpquota       1 1
/dev/md1                /boot                   ext4    defaults        1 2
/dev/md2                /tmp                    ext4    defaults,nodev,nosuid,noexec,usrquota,grpquota,noatime        1 2
/dev/md3                /var                    ext4    defaults,nodev,nosuid,noexec,usrquota,grpquota,noatime        1 2
/dev/md4                /usr                    ext4    defaults,nodev,usrquota,grpquota,noatime                      1 2
/dev/md5                /home                   ext4    defaults,nodev,nosuid,usrquota,grpquota,noatime        1 2
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
tmpfs                   /dev/shm                tmpfs   defaults,nodev,nosuid,noexec,size=256m       0 0
proc                    /proc                   proc    defaults        0 0
sysfs                   /sys                    sysfs   defaults        0 0
/dev/sdb2               swap                    swap    defaults        0 0
EOF
echo "DEVICE /dev/hd*[0-9] /dev/sd*[0-9]" > /etc/mdadm.conf
mdadm --detail --scan >> /etc/mdadm.conf
for i in `ls -d /lib/modules/2.*|xargs -n1 basename`;do echo -e "\E[01;32m $i\E[0m"; \
mkinitrd -f --with=raid1 --with=ext4 /boot/initramfs-$i.img $i;done
cp /boot/grub/grub.conf /boot/grub/grub.conf.old
sed -i"" -re's#root=([^[:space:]]*)#root=/dev/md0#' /boot/grub/grub.conf
sed -i"" -re's# rd_LVM_LV=([^[:space:]]*)##' /boot/grub/grub.conf
sed -i"" -e "s/ rd_NO_MD//" /boot/grub/grub.conf
cp -dpRx / /mnt
mount /dev/md1 /mnt/boot
cp -dpRx /boot /mnt
echo -e "device (hd0) /dev/sdb \n root (hd0,0) \n setup (hd0)" | grub --batch
#
history -c
#

Ребут

sfdisk -d /dev/sdb| sfdisk --force /dev/sda
sleep 5
mkswap /dev/sda2
mdadm --add /dev/md0 /dev/sda3
mdadm --add /dev/md1 /dev/sda1
mdadm --add /dev/md2 /dev/sda5
mdadm --add /dev/md3 /dev/sda6
mdadm --add /dev/md4 /dev/sda7
mdadm --add /dev/md5 /dev/sda8
COUNTER=`egrep -c '(U_|_U)' /proc/mdstat`
while [  "$COUNTER" -gt "0" ]; do
sleep 60
COUNTER=`egrep -c '(U_|_U)' /proc/mdstat`
done
echo -e "\E[01;32mSync done\E[0m" 
echo -e "device (hd0) /dev/sda \n root (hd0,0) \n setup (hd0)" | grub --batch
#
history -c
#

CentOS 5

swapoff -a
umount /dev/sdb*
sfdisk --force /dev/sdb -uM << EOF
,100,fd,*
,2048,S
,2048,fd
,,E
,2048,fd
,15360,fd
,20480,fd
,,fd
EOF
sleep 5
echo "y \n"|mdadm --create /dev/md0 --level 1 --raid-devices=2 missing /dev/sdb3
echo "y \n"|mdadm --create /dev/md1 --level 1 --raid-devices=2 missing /dev/sdb1
echo "y \n"|mdadm --create /dev/md2 --level 1 --raid-devices=2 missing /dev/sdb5
echo "y \n"|mdadm --create /dev/md3 --level 1 --raid-devices=2 missing /dev/sdb6
echo "y \n"|mdadm --create /dev/md4 --level 1 --raid-devices=2 missing /dev/sdb7
echo "y \n"|mdadm --create /dev/md5 --level 1 --raid-devices=2 missing /dev/sdb8
mkswap /dev/sdb2
for i in `seq 0 5`; do mkfs.ext3 -m1 -O dir_index /dev/md$i; done
mount /dev/md0 /mnt
mkdir /mnt/{tmp,var,usr,home}
mount /dev/md2 /mnt/tmp
mount /dev/md3 /mnt/var
mount /dev/md4 /mnt/usr
mount /dev/md5 /mnt/home
chmod 1777 /mnt/tmp
cp /etc/fstab /etc/fstab.old
cat > /etc/fstab <<EOF
/dev/md0                /                       ext3    defaults,usrquota,grpquota       1 1
/dev/md1                /boot                   ext3    defaults        1 2
/dev/md2                /tmp                    ext3    defaults,nodev,nosuid,noexec,usrquota,grpquota,noatime        1 2
/dev/md3                /var                    ext3    defaults,nodev,nosuid,noexec,usrquota,grpquota,noatime        1 2
/dev/md4                /usr                    ext3    defaults,nodev,usrquota,grpquota,noatime                      1 2
/dev/md5                /home                   ext3    defaults,nodev,nosuid,usrquota,grpquota,noatime               1 2
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
tmpfs                   /dev/shm                tmpfs   defaults,nodev,nosuid,noexec,size=256m       0 0
proc                    /proc                   proc    defaults        0 0
sysfs                   /sys                    sysfs   defaults        0 0
/dev/sdb2               swap                    swap    defaults        0 0
EOF
echo "DEVICE /dev/hd*[0-9] /dev/sd*[0-9]" > /etc/mdadm.conf
mdadm --detail --scan >> /etc/mdadm.conf
for i in `ls -d /lib/modules/2.*|xargs -n1 basename`;do echo -e "\E[01;32m $i\E[0m"; \
mkinitrd -f --with=raid1 /boot/initrd-$i.img $i; \
gunzip -dc /boot/initrd-$i.img|grep -a "raidauto\|/dev/md0";done
cp /boot/grub/grub.conf /boot/grub/grub.conf.old
sed -i"" -e "s#root\=LABEL\=\/#root=/dev/md0#" /boot/grub/grub.conf
cp -dpRx / /mnt
mount /dev/md1 /mnt/boot
cp -dpRx /boot /mnt
echo -e "device (hd0) /dev/sdb \n root (hd0,0) \n setup (hd0)" | grub --batch
#

Ребут

sfdisk -d /dev/sdb| sfdisk --force /dev/sda
sleep 5
mkswap /dev/sda2
mdadm --add /dev/md0 /dev/sda3
mdadm --add /dev/md1 /dev/sda1
mdadm --add /dev/md2 /dev/sda5
mdadm --add /dev/md3 /dev/sda6
mdadm --add /dev/md4 /dev/sda7
mdadm --add /dev/md5 /dev/sda8
COUNTER=`egrep -c '(U_|_U)' /proc/mdstat`
while [  "$COUNTER" -gt "0" ]; do
sleep 60
COUNTER=`egrep -c '(U_|_U)' /proc/mdstat`
done
echo -e "\E[01;32mSync done\E[0m" 
echo -e "device (hd0) /dev/sda \n root (hd0,0) \n setup (hd0)" | grub --batch
#

RAID10

mdadm -G /dev/md0 -n 4 --force
mdadm -G /dev/md1 -n 4 --force
mdadm --add /dev/md0 /dev/sdc3 /dev/sdd3
mdadm --add /dev/md1 /dev/sdc1 /dev/sdd1
mdadm --create /dev/md2 --level=10 --raid-devices=4 /dev/sda5 /dev/sdb5 /dev/sdc5 /dev/sdd5

GPT gdisk

Подключаем epel

yum  -y install gdisk

Клонируем таблицу разделов:

sgdisk --replicate=/dev/sdb /dev/sda

После чего обязательно меняем UUID'ы в новой таблице разделов

sgdisk -G /dev/sdb