#!/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}" }