mirror of the now-defunct rocklinux.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

182 lines
6.8 KiB

#!/bin/bash
# --- ROCK-COPYRIGHT-NOTE-BEGIN ---
#
# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
# Please add additional copyright information _after_ the line containing
# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by
# the ./scripts/Create-CopyPatch script. Do not edit this copyright text!
#
# ROCK Linux: rock-src/package/base/mdadm/stone_mod_install_mdadm.sh
# ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. A copy of the GNU General Public
# License can be found at Documentation/COPYING.
#
# Many people helped and are helping developing ROCK Linux. Please
# have a look at http://www.rocklinux.org/ and the Documentation/TEAM
# file for details.
#
# --- ROCK-COPYRIGHT-NOTE-END ---
#
# [INSTALLER] 10 mdadm ROCK Linux Operation System Installer V2 - mdadm RAID module
DISKS_MENU="${DISKS_MENU} 'Setup Software-RAID' 'mdadm_setup_software_raid'"
ADDITIONAL_DISK_DETECTOR="${ADDITIONAL_DISK_DETECTOR} mdadm_disk_detector"
mdadm_setup_software_raid_new(){ # {{{
local level=""
local menu=""
for x in 1 2 3 4 5 6 0 ; do
menu="${menu} 'Level ${x}' 'level=${x}'"
done
eval gui_menu MENU_mdadm_setup_software_raid_new "'Select RAID Level'" ${menu}
[ -z "${level}" ] && return
local selected=""
local all=""
local oldselected=""
while : ; do
local end=0
menu=""
read selected < <( sed -e 's,^ *,,g' -e 's, *$,,g' -e 's, *, ,g' <<< "${selected}" )
while read major minor blocks name ; do
# TODO XXX This really needs different handling, eg everything on the DEVICES line of /etc/mdadm.conf, but this will suffice for the time being
[ "${name}" == "name" ] && continue
[ -z "${name}" ] && continue
if [[ ${selected} = ${name} || ${selected} = *\ ${name}\ * || ${selected} = *\ ${name} || ${selected} = ${name}\ * ]] ; then
menu="${menu} '[X] ${name} ($((${blocks}/1024)) MB)'"
menu="${menu} 'selected=\"\$( sed -e \"s,${name} , ,g\" -e \"s,${name}\$,,g\" <<< \"${selected}\" )\"'"
else
menu="${menu} '[ ] ${name} ($((${blocks}/1024)) MB)'"
menu="${menu} 'selected=\"${selected} ${name}\"'"
fi
done < /proc/partitions
eval gui_menu MENU_mdadm_setup_software_raid_new "'Select Partitions to use in the array'" ${menu} "'Build Array!' 'end=1'"
[ "${end}" == "1" ] && break
[ "${selected}" == "${oldselected}" ] && return # indicates 'Cancel'
oldselected="${selected}"
done
tmp="$(mktemp)"
mdadm -Ebsc partitions > "${tmp}"
for x in `seq 0 255` none ; do
grep -q 'md/\?'"${x}" "${tmp}" || break
done
rm -f "${tmp}"
if [ "${x}" == "none" ] ; then
gui_message "There is no free RAID device available!"
return
fi
gui_yesno "Really create /dev/md/${x} from disks ${selected}? All data on the disks will be deleted!"
rval=${?}
if [ ${rval} -eq 0 ] ; then
mdadm -C /dev/md/${x} -l ${level} -n $( wc -w <<< "${selected}" ) \
--auto=yes --symlink=yes $(
for x in ${selected} ; do
find /dev -name ${x} -type b
done )
echo "Remember to recreate /etc/mdadm.conf!"
read -p "Press enter to continue"
fi
} # }}}
mdadm_setup_software_raid(){
#/etc/mdadm.conf:
#DEVICE partitions
#MAIL root@localhost
#
#ARRAY /dev/md0 level=raid1 num-devices=4 UUID=3559ffcf:14eb9889:3826d6c2:c13731d7
#ARRAY /dev/md1 level=raid5 num-devices=4 UUID=649fc7cc:d4b52c31:240fce2c:c64686e7
#ARRAY /dev/md2 level=raid5 num-devices=4 UUID=9a3bf634:58f39e44:27ba8087:d5189766
#ARRAY /dev/md3 level=raid5 num-devices=4 UUID=719401e0:65d2e3bf:aabaa5cd:79bdde46
#ARRAY /dev/md4 level=raid5 num-devices=4 UUID=d4799be3:5b157884:e38718c2:c05ab840
#ARRAY /dev/md5 level=raid5 num-devices=4 UUID=ca4a6110:4533d8d5:0e2ed4e1:2f5805b2
local menu
while : ; do
menu="'Recreate /etc/mdadm.conf' 'echo DEVICE partitions > /etc/mdadm.conf; mdadm -Ebs >> /etc/mdadm.conf; REREAD_INFORMATION=1'"
menu="${menu} 'Start all RAIDs in /etc/mdadm.conf' 'mdadm -As --auto=yes --symlink=yes; REREAD_INFORMATION=1'"
menu="${menu} 'Create a new RAID' 'mdadm_setup_software_raid_new'"
menu="${menu} 'Existing Arrays in /etc/mdadm.conf:' ''"
while read ARRAY dev rest ; do
level="${rest#*level=}"
level="${level%% *}"
level="${level:-unknown}"
menu="${menu} '${dev} (RAID level ${level})' ''"
#md5 : active raid5 hdb8[0] hdf8[3] hdc8[2] hda8[1]
read line < <( grep '^md/\?'"${dev##*md}" /proc/mdstat )
line="${line#*:}"
read status level devices <<< "${line}"
menu="${menu} ' Devices: ${devices}' ''"
done < <( grep ^ARRAY /etc/mdadm.conf )
eval gui_menu MENU_mdadm_setup_software_raid "'RAID Configuration (mdadm)'" ${menu}
[ "${?}" == "1" ] && break # Cancel was pressed
done
}
mdadm_disk_detector(){
export DISKS="${DISKS} '' '' 'Software RAID Devices' ''"
tmp="$( mktemp )"
[ -e /etc/mdadm.conf ] || return
cat /etc/mdadm.conf > "${tmp}"
# ARRAY /dev/md1 level=raid5 num-devices=4 UUID=649fc7cc:d4b52c31:240fce2c:c64686e7
while read ARRAY md level numdev uuid ; do
[ "${ARRAY}" != "ARRAY" ] && continue
level="${level#*=}"
numdev="${numdev#*=}"
uuid="${uuid#*=}"
active=""
size=0
fstype="Unknown"
tmp2="$(mktemp)"
mdadm -Q --detail "${md}" > "${tmp2}"
if grep -q "${uuid}" "${tmp2}" ; then
active="(active)"
tmp3="$(mktemp)"
disktype "${md}" > "${tmp3}"
read fstype rest < <( grep " file system" "${tmp3}" )
grep -q "^Linux swap" "${tmp3}" && fstype="Swap"
fstype="${fstype:-Unknown}"
size="$(blockdev --getsize64 ${md})"
rm -f "${tmp3}"
fi
rm -f "${tmp2}"
export DISKS="${DISKS} '${md}${active:+ }${active} RAID Level ${level#raid}, ${numdev} devices, $(( ${size} / 1024 / 1024 )) MB' 'mdadm_edit_raid ${uuid}'"
export DISKS="${DISKS} ' ${fstype} Filesystem' 'main_edit_part ${md}'"
mountpoint="$( mount | grep ^${md} | cut -f3 -d' ')"
[ -n "${mountpoint}" ] && mountpoint="${mountpoint}/";
mountpoint="${mountpoint#/mnt/target}"
[ -n "${mountpoint}" ] && mountpoint="/${mountpoint#/}" # necessary to do this way because rootfs will be "/mnt/target"
if [ -L "${md}" ] ; then
realdisk="$( readlink -f ${md} )"
else
realdisk="${md}"
fi
swapon -s | grep -q ^${realdisk} && mountpoint="SWAP"
if [ -z "${mountpoint}" ] ; then
if [ "${fstype}" == "Swap" ] ; then
export DISKS="${DISKS} ' Inactive Swap'"
elif [ "${fstype}" == "RAID" ] ; then
export DISKS="${DISKS} ' Part of a RAID'"
else
export DISKS="${DISKS} ' Not mounted'"
fi
elif [ "${mountpoint}" == "SWAP" ] ; then
export DISKS="${DISKS} ' Active Swapspace'"
else
export DISKS="${DISKS} ' Mounted on ${mountpoint}'"
fi
export DISKS="${DISKS} 'main_mount_partition \"${md}\" \"${mountpoint:-nowhere}\" \"${fstype}\"'"
done < "${tmp}"
rm -f "${tmp}"
}