mirror of
https://gitlab.archlinux.org/tpowa/archboot.git
synced 2024-09-19 19:40:37 +02:00
'finally got a working raid dialog :D"
This commit is contained in:
parent
c328f06099
commit
7ca0863631
1 changed files with 84 additions and 24 deletions
|
@ -482,13 +482,45 @@ _stoplvm()
|
||||||
# Creates software raid devices
|
# Creates software raid devices
|
||||||
_createmd()
|
_createmd()
|
||||||
{
|
{
|
||||||
|
### TODO:
|
||||||
|
### - add raid partitions too!
|
||||||
MDFINISH=""
|
MDFINISH=""
|
||||||
|
DIALOG --msgbox "LINUX SOFTWARE RAID SUMMARY:\n
|
||||||
|
-------------------\n\n
|
||||||
|
Linear mode:\n
|
||||||
|
You have two or more partitions which are not necessarily the same size\n
|
||||||
|
(but of course can be), which you want to append to each other.\n
|
||||||
|
Spare-disks are not supported here. If a disk dies, the array dies with\n
|
||||||
|
it.\n\n
|
||||||
|
RAID-0:\n
|
||||||
|
You have two or more devices, of approximately the same size, and you want\n
|
||||||
|
to combine their storage capacity and also combine their performance by\n
|
||||||
|
accessing them in parallel. Like in Linear mode, spare disks are not\n
|
||||||
|
supported here either. RAID-0 has no redundancy, so when a disk dies, the\n
|
||||||
|
array goes with it.\n\n
|
||||||
|
RAID-1:\n
|
||||||
|
You have two devices of approximately same size, and you want the two to\n
|
||||||
|
be mirrors of each other. Eventually you have more devices, which you\n
|
||||||
|
want to keep as stand-by spare-disks, that will automatically become a\n
|
||||||
|
part of the mirror if one of the active devices break.\n\n
|
||||||
|
RAID-5:\n
|
||||||
|
You have three or more devices of roughly the same size, you want to\n
|
||||||
|
combine them into a larger device, but still to maintain a degree of\n
|
||||||
|
redundancy fordata safety. Eventually you have a number of devices to use\n
|
||||||
|
as spare-disks, that will not take part in the array before another device\n
|
||||||
|
fails. If you use N devices where the smallest has size S, the size of the\n
|
||||||
|
entire array will be (N-1)*S. This \"missing\" space is used for parity\n
|
||||||
|
(redundancy) information. Thus, if any disk fails, all data stay intact.\n
|
||||||
|
But if two disks fail, all data is lost.\n\n
|
||||||
|
RAID-10:\n
|
||||||
|
Shorthand for RAID1+0, a mirrored striped array and needs a minimum of\n
|
||||||
|
two disks. It provides superior data security and can survive multiple\n
|
||||||
|
disk failures. The main disadvantage is cost, because 50% of your\n
|
||||||
|
storage is duplication." 0 0
|
||||||
while [ "$MDFINISH" != "DONE" ]; do
|
while [ "$MDFINISH" != "DONE" ]; do
|
||||||
: >/tmp/.raid
|
: >/tmp/.raid
|
||||||
: >/tmp/.raid-spare
|
: >/tmp/.raid-spare
|
||||||
#
|
# enter raid device name
|
||||||
# Select raid devices
|
|
||||||
#
|
|
||||||
while [ "${RAIDDEVICE}" = "" ]; do
|
while [ "${RAIDDEVICE}" = "" ]; do
|
||||||
DIALOG --inputbox "Enter the node name for the raiddevice, eg:\n/dev/md0\n/dev/md1\n" 8 65 "/dev/md0" 2>$ANSWER || return 1
|
DIALOG --inputbox "Enter the node name for the raiddevice, eg:\n/dev/md0\n/dev/md1\n" 8 65 "/dev/md0" 2>$ANSWER || return 1
|
||||||
RAIDDEVICE=$(cat $ANSWER)
|
RAIDDEVICE=$(cat $ANSWER)
|
||||||
|
@ -497,53 +529,81 @@ _createmd()
|
||||||
RAIDDEVICE=""
|
RAIDDEVICE=""
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
# select raid mode
|
||||||
|
RAIDLEVELS="linear - raid0 - raid1 - raid5 - raid10 -"
|
||||||
|
DIALOG --menu "Select the raid level you want to use" 21 50 13 $RAIDLEVELS 2>$ANSWER || return 1
|
||||||
|
LEVEL=$(cat $ANSWER)
|
||||||
|
# raid5 and raid10 support parity parameter
|
||||||
|
PARITY=""
|
||||||
|
if [ "$LEVEL" = "raid5" -o "$LEVEL" = "raid10" ]; then
|
||||||
|
PARITYLEVELS="left-asymmetric - left-symmetric - right-asymmetric - right-symmetric -"
|
||||||
|
DIALOG --menu "Select the parity layout you want to use (default is left-symmetric)" 21 50 13 $PARITYLEVELS 2>$ANSWER || return 1
|
||||||
|
PARTIY=$(cat $ANSWER)
|
||||||
|
fi
|
||||||
|
# show available partitions with sizes
|
||||||
DIALOG --msgbox "Available partitions:\n\n$(_getavailpartitions)\n" 0 0
|
DIALOG --msgbox "Available partitions:\n\n$(_getavailpartitions)\n" 0 0
|
||||||
PARTS=$(findpartitions _)
|
PARTS=$(findpartitions _)
|
||||||
|
# select the first device to use, no missing option available!
|
||||||
DIALOG --menu "Select the partition to use as first device" 21 50 13 $PARTS 2>$ANSWER || return 1
|
DIALOG --menu "Select the partition to use as first device" 21 50 13 $PARTS 2>$ANSWER || return 1
|
||||||
PART=$(cat $ANSWER)
|
PART=$(cat $ANSWER)
|
||||||
echo "$PART" >>/tmp/.raid
|
echo "$PART" >>/tmp/.raid
|
||||||
while [ "$PART" != "DONE" ]; do
|
while [ "$PART" != "DONE" ]; do
|
||||||
PARTS="$(echo $PARTS | sed -e "s#${PART}\ _##g")"
|
# clean loop from used partition and options
|
||||||
DIALOG --menu "Select the partition to use as additional device" 21 50 13 $PARTS SPARE - MISSING - DONE _ 2>$ANSWER || return 1
|
PARTS="$(echo $PARTS | sed -e "s#${PART}\ _##g" -e 's#MISSING\ _##g' -e 's#SPARE\ _##g')"
|
||||||
|
# raid0 doesn't support missing devices
|
||||||
|
! [ "$LEVEL" = "raid0" -o "$LEVEL" = "linear" ] && MDEXTRA="MISSING _"
|
||||||
|
# add more devices
|
||||||
|
DIALOG --menu "Select the partition to use as additional device" 21 50 13 $PARTS $MDEXTRA DONE _ 2>$ANSWER || return 1
|
||||||
PART=$(cat $ANSWER)
|
PART=$(cat $ANSWER)
|
||||||
|
SPARE=""
|
||||||
|
! [ "$LEVEL" = "raid0" -o "$LEVEL" = "linear" ] && DIALOG --yesno --defaultno "Would you like to use $PART as spare device?" 0 0 && SPARE="1"
|
||||||
[ "$PART" = "DONE" ] && break
|
[ "$PART" = "DONE" ] && break
|
||||||
if [ "$PART" = "MISSING" ]; then
|
if [ "$PART" = "MISSING" ]; then
|
||||||
DIALOG --yesno "Would you like to create a degraded raid on $RAIDDEVICE?" 0 0 && DEGRADED="missing"
|
DIALOG --yesno "Would you like to create a degraded raid on $RAIDDEVICE?" 0 0 && DEGRADED="missing"
|
||||||
echo "$DEGRADED" >>/tmp/.raid
|
echo "$DEGRADED" >>/tmp/.raid
|
||||||
else
|
else
|
||||||
if [ "$PART" = "SPARE" ]; then
|
if [ "$SPARE" = "1" ]; then
|
||||||
echo "$PART" >>/tmp/.raid-spare
|
echo "$PART" >>/tmp/.raid-spare
|
||||||
else
|
else
|
||||||
echo "$PART" >>/tmp/.raid
|
echo "$PART" >>/tmp/.raid
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
if [ "$(cat /tmp/.raid | grep -v missing | wc -l)" -gt 1 ]; then
|
# final step ask if everything is ok?
|
||||||
DIALOG --menu "Select the raid level you want to use" 21 50 13 raid0 - raid1 - raid5 - 2>$ANSWER || return 1
|
DIALOG --yesno "Would you like to create $RAIDDEVICE like this?\n\nLEVEL:\n$LEVEL\n\nDEVICES:\n$(for i in $(cat /tmp/.raid); do echo "$i\n";done)\nSPARES:\n$(for i in $(cat /tmp/.raid-spare); do echo "$i\n";done)" 0 0 && MDFINISH="DONE"
|
||||||
LEVEL=$(cat $ANSWER)
|
|
||||||
else
|
|
||||||
DIALOG --menu "Only raid1 level available, too many missing devices." 21 50 13 raid1 - 2>$ANSWER || return 1
|
|
||||||
LEVEL=$(cat $ANSWER)
|
|
||||||
fi
|
|
||||||
DIALOG --yesno "Would you like to create $RAIDDEVICE like this?\n\nLEVEL:$LEVEL\n\nDEVICES:\n$(for i in $(cat /tmp/.raid); do echo "$i\n";done)" 0 0 && MDFINISH="DONE"
|
|
||||||
done
|
done
|
||||||
# writing correct raid information to partition table
|
# writing raid information to partition table
|
||||||
for i in $(cat /tmp/.raid | grep -v missing); do
|
for i in $(cat /tmp/.raid | grep -v missing); do
|
||||||
|
# get device name
|
||||||
k=$(echo $i | sed -e 's#[0-9]##g')
|
k=$(echo $i | sed -e 's#[0-9]##g')
|
||||||
|
# get partition number of device
|
||||||
l=$(echo $i | sed -e 's#.*[a-z]##g')
|
l=$(echo $i | sed -e 's#.*[a-z]##g')
|
||||||
sfdisk --change-id $k $l fd
|
DIALOG --infobox "Changing partition $k$l to raid..." 0 0
|
||||||
|
sfdisk --change-id $k $l fd >$LOG 2>&1
|
||||||
|
if [ $? -gt 0 ]; then
|
||||||
|
DIALOG --msgbox "Error changing partition $k$l to raid (see $LOG for details)." 0 0
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
# create raid device
|
# create raid device
|
||||||
for DEVICES in $(cat /tmp/.raid); do
|
DEVICES="$(echo -n $(cat /tmp/.raid))"
|
||||||
DEVICES=$(echo -n "$DEVICES ")
|
SPARES="$(echo -n $(cat /tmp/.raid-spare))"
|
||||||
done
|
# combine both if spares are available, spares at the end!
|
||||||
for SPARES in $(cat /tmp/.raid-spare); do
|
[ -n $SPARES ] && DEVICES="$DEVICES $SPARES"
|
||||||
SPARES=$(echo -n "$SPARES ")
|
# get number of devices
|
||||||
done
|
|
||||||
RAID_DEVICES="$(cat /tmp/.raid | wc -l)"
|
RAID_DEVICES="$(cat /tmp/.raid | wc -l)"
|
||||||
SPARE_DEVICES="$(cat /tmp/.raid-spare | wc -l)"
|
SPARE_DEVICES="$(cat /tmp/.raid-spare | wc -l)"
|
||||||
### TODO parity in raid5 mode
|
# generate options for mdadm
|
||||||
mdadm --create $RAIDDEVICE --force --run --level=$LEVEL --raid-devices=$RAID_DEVICES --spare-devices=$SPARE_DEVICES $DEVICES
|
RAIDOPTIONS="--force --run --level=$LEVEL"
|
||||||
|
! [ "$RAID_DEVICES" = "0" ] && RAIDOPTIONS="$RAIDOPTIONS --raid-devices=$RAID_DEVICES"
|
||||||
|
! [ "$SPARE_DEVICES" = "0" ] && RAIDOPTIONS="$RAIDOPTIONS --spare-devices=$SPARE_DEVICES"
|
||||||
|
! [ "$PARITY" = "" ] && RAIDOPTIONS="$RAIDOPTIONS --layout=$PARITY"
|
||||||
|
DIALOG --infobox "Creating $RAIDDEVICE..." 0 0
|
||||||
|
mdadm --create $RAIDDEVICE $RAIDOPTIONS $DEVICES >$LOG 2>&1
|
||||||
|
if [ $? -gt 0 ]; then
|
||||||
|
DIALOG --msgbox "Error creating $RAIDDEVICE (see $LOG for details)." 0 0
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Creates software lvm devices
|
# Creates software lvm devices
|
||||||
|
|
Loading…
Reference in a new issue