Last active
October 14, 2019 19:17
-
-
Save kevinkreiser/307d2295de0121820bf2 to your computer and use it in GitHub Desktop.
Configuring Raid with mdadm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
if [ -z ${1} ]; then | |
chunk=1024 | |
else | |
chunk=${1} | |
fi | |
#entire drive ext4 partition on each | |
for i in a b c d; do | |
parted /dev/sd${i} --script mklabel gpt -- mkpart primary ext4 0% 100% | |
hdparm -z sd$i | |
#mkfs -t ext4 /dev/sd${i}1 | |
done | |
#make the array with a single ext4 parition | |
mdadm --create /dev/md0 --chunk=${chunk} --level=5 --raid-devices=4 /dev/sd[a-d]1 <<EOF | |
yes | |
EOF | |
parted /dev/md0 --script mklabel gpt -- mkpart primary ext4 0% 100% | |
hdparm -z /dev/md0 | |
#mkfs -t ext4 /dev/md0p1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
#no more raid | |
umount /dev/md0p1 | |
mdadm --stop /dev/md0 | |
mdadm --zero-superblock /dev/sd[a-d]1 | |
#no more partitions | |
for i in a b c d; do | |
parted -s /dev/sd${i} rm 1 | |
done |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
#run some tests | |
umount /dev/md0p1 | |
mkdir -p mount_test | |
mount -t ext4 /dev/md0p1 mount_test | |
dd bs=1M count=1024 if=/dev/zero of=mount_test/test_file conv=fdatasync | |
sync | |
echo 3 > /proc/sys/vm/drop_caches | |
dd bs=1M count=1024 if=mount_test/test_file of=/dev/null | |
umount /dev/md0p1 | |
rm -rf mount_test |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
need to edit /etd/mdadm/mdadm.conf remove --name from newly created array or do so when using mdadm --create? remove other raids listed there | |
sudo update-initramfs -u | |
that way when problem occurs it wont reassign to /dev/md127 | |
http://ubuntuforums.org/showthread.php?t=1764861 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
############################################################################### | |
# simple script to set some parameters to increase performance on a mdadm | |
# raid5 or raid6. Ajust the ## parameters ##-section to your system! | |
# | |
# WARNING: depending on stripesize and the number of devices the array might | |
# use QUITE a lot of memory after optimization! | |
# | |
# 27may2010 by Alexander Peganz | |
############################################################################### | |
## parameters ## | |
MDDEV=md0 # e.g. md51 for /dev/md51 | |
CHUNKSIZE=1024 # in kb | |
BLOCKSIZE=4 # of file system in kb | |
NCQ=disable # disable, enable. ath. else keeps current setting | |
NCQDEPTH=31 # 31 should work for almost anyone | |
FORCECHUNKSIZE=true # force max sectors kb to chunk size > 512 | |
DOTUNEFS=true # run tune2fs, ONLY SET TO true IF YOU USE EXT[34] | |
RAIDLEVEL=raid5 # raid5, raid6 | |
## code ## | |
# test for priviledges | |
if [ "$(whoami)" != 'root' ] | |
then | |
echo $(date): Need to be root | |
exit 1 | |
fi | |
# set number of parity devices | |
NUMPARITY=1 | |
if [[ $RAIDLEVEL == "raid6" ]] | |
then | |
NUMPARITY=2 | |
fi | |
# get all devices | |
DEVSTR="`grep \"^$MDDEV : \" /proc/mdstat` eol" | |
while \ | |
[ -z "`expr match \"$DEVSTR\" '\(\<sd[a-z]1\[[12]\?[0-9]\]\((S)\)\? \)'`" ] | |
do | |
DEVSTR="`echo $DEVSTR|cut -f 2- -d \ `" | |
done | |
# get active devices list and spares list | |
DEVS="" | |
SPAREDEVS="" | |
while [ "$DEVSTR" != "eol" ]; do | |
CURDEV="`echo $DEVSTR|cut -f -1 -d \ `" | |
if [ -n "`expr match \"$CURDEV\" '\(\<sd[a-z]1\[[12]\?[0-9]\]\((S)\)\)'`" ] | |
then | |
SPAREDEVS="$SPAREDEVS${CURDEV:2:1}" | |
elif [ -n "`expr match \"$CURDEV\" '\(\<sd[a-z]1\[[12]\?[0-9]\]\)'`" ] | |
then | |
DEVS="$DEVS${CURDEV:2:1}" | |
fi | |
DEVSTR="`echo $DEVSTR|cut -f 2- -d \ `" | |
done | |
NUMDEVS=${#DEVS} | |
NUMSPAREDEVS=${#SPAREDEVS} | |
# test if number of devices makes sense | |
if [ ${#DEVS} -lt $[1+$NUMPARITY] ] | |
then | |
echo $(date): Need more devices | |
exit 1 | |
fi | |
# set read ahead | |
RASIZE=$[$NUMDEVS*($NUMDEVS-$NUMPARITY)*2*$CHUNKSIZE] # in 512b blocks | |
echo read ahead size per device: $RASIZE blocks \($[$RASIZE/2]kb\) | |
MDRASIZE=$[$RASIZE*$NUMDEVS] | |
echo read ahead size of array: $MDRASIZE blocks \($[$MDRASIZE/2]kb\) | |
blockdev --setra $RASIZE /dev/sd[$DEVS] | |
blockdev --setra $RASIZE /dev/sd[$SPAREDEVS] | |
blockdev --setra $MDRASIZE /dev/$MDDEV | |
# set stripe cache size | |
STRCACHESIZE=$[$RASIZE/8] # in pages per device | |
echo stripe cache size of devices: $STRCACHESIZE pages \($[$STRCACHESIZE*4]kb\) | |
echo $STRCACHESIZE > /sys/block/$MDDEV/md/stripe_cache_size | |
# set max sectors kb | |
DEVINDEX=0 | |
MINMAXHWSECKB=$(cat /sys/block/sd${DEVS:0:1}/queue/max_hw_sectors_kb) | |
until [ $DEVINDEX -ge $NUMDEVS ] | |
do | |
DEVLETTER=${DEVS:$DEVINDEX:1} | |
MAXHWSECKB=$(cat /sys/block/sd$DEVLETTER/queue/max_hw_sectors_kb) | |
if [ $MAXHWSECKB -lt $MINMAXHWSECKB ] | |
then | |
MINMAXHWSECKB=$MAXHWSECKB | |
fi | |
DEVINDEX=$[$DEVINDEX+1] | |
done | |
if [ $CHUNKSIZE -le $MINMAXHWSECKB ] && | |
( [ $CHUNKSIZE -le 512 ] || [[ $FORCECHUNKSIZE == "true" ]] ) | |
then | |
echo setting max sectors kb to match chunk size | |
DEVINDEX=0 | |
until [ $DEVINDEX -ge $NUMDEVS ] | |
do | |
DEVLETTER=${DEVS:$DEVINDEX:1} | |
echo $CHUNKSIZE > /sys/block/sd$DEVLETTER/queue/max_sectors_kb | |
DEVINDEX=$[$DEVINDEX+1] | |
done | |
DEVINDEX=0 | |
until [ $DEVINDEX -ge $NUMSPAREDEVS ] | |
do | |
DEVLETTER=${SPAREDEVS:$DEVINDEX:1} | |
echo $CHUNKSIZE > /sys/block/sd$DEVLETTER/queue/max_sectors_kb | |
DEVINDEX=$[$DEVINDEX+1] | |
done | |
fi | |
# enable/disable NCQ | |
DEVINDEX=0 | |
if [[ $NCQ == "enable" ]] || [[ $NCQ == "disable" ]] | |
then | |
if [[ $NCQ == "disable" ]] | |
then | |
NCQDEPTH=1 | |
fi | |
echo setting NCQ queue depth to $NCQDEPTH | |
until [ $DEVINDEX -ge $NUMDEVS ] | |
do | |
DEVLETTER=${DEVS:$DEVINDEX:1} | |
echo $NCQDEPTH > /sys/block/sd$DEVLETTER/device/queue_depth | |
DEVINDEX=$[$DEVINDEX+1] | |
done | |
DEVINDEX=0 | |
until [ $DEVINDEX -ge $NUMSPAREDEVS ] | |
do | |
DEVLETTER=${SPAREDEVS:$DEVINDEX:1} | |
echo $NCQDEPTH > /sys/block/sd$DEVLETTER/device/queue_depth | |
DEVINDEX=$[$DEVINDEX+1] | |
done | |
fi | |
# tune2fs | |
if [[ $DOTUNEFS == "true" ]] | |
then | |
STRIDE=$[$CHUNKSIZE/$BLOCKSIZE] | |
STRWIDTH=$[$CHUNKSIZE/$BLOCKSIZE*($NUMDEVS-$NUMPARITY)] | |
echo setting stride to $STRIDE blocks \($CHUNKSIZEkb\) | |
echo setting stripe-width to $STRWIDTH blocks \($[$STRWIDTH*$BLOCKSIZE]kb\) | |
tune2fs -E stride=$STRIDE,stripe-width=$STRWIDTH /dev/${MDDEV}p1 | |
fi | |
# exit | |
echo $(date): Success | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment