[Ovirt-devel] [PATCH node 1/5] Initial multipath stuff

Joey Boggs jboggs at redhat.com
Thu Feb 25 15:03:29 UTC 2010


On 02/24/2010 12:47 PM, Mike Burns wrote:
> Includes choosing device to install to
> ovirt-node-image stuff
> fix autoinstall to translate ovirt_init param
> Add manual device option
>
> Signed-off-by: Mike Burns<mburns at redhat.com>
> ---
>   recipe/common-install.ks     |    4 +
>   recipe/common-post.ks        |   11 +++
>   scripts/ovirt-config-storage |  171 ++++++++++++++++++++++++++++++++++++++----
>   scripts/ovirt-functions      |    6 +-
>   4 files changed, 174 insertions(+), 18 deletions(-)
>
> diff --git a/recipe/common-install.ks b/recipe/common-install.ks
> index f3443b6..5c1e239 100644
> --- a/recipe/common-install.ks
> +++ b/recipe/common-install.ks
> @@ -18,3 +18,7 @@ device scsi_wait_scan
>   # multipath kmods
>   device dm-multipath
>   device dm-round-robin
> +device dm-emc
> +device dm-rdac
> +device dm-hp-sw
> +device scsi_dh_rdac
> diff --git a/recipe/common-post.ks b/recipe/common-post.ks
> index 0f09581..293c341 100644
> --- a/recipe/common-post.ks
> +++ b/recipe/common-post.ks
> @@ -152,6 +152,7 @@ rm -f /etc/cron.daily/logrotate
>   touch /var/lib/random-seed
>   mkdir /live
>   mkdir /boot
> +mkdir -p /var/cache/multipathd
>   sed -i '/^files	\/etc*/ s/^/#/' /etc/rwtab
>   cat>  /etc/rwtab.d/ovirt<<EOF
>   dirs	/var/lib/multipath
> @@ -162,7 +163,17 @@ files	/var/cache/hald
>   files	/var/empty/sshd/etc/localtime
>   files	/var/lib/dbus
>   files	/var/lib/libvirt
> +files   /var/lib/multipath
> +files   /var/cache/multipathd
>   empty	/mnt
>   empty	/live
>   empty	/boot
>   EOF
> +
> +
> +#use all hard-coded defaults for multipath
> +cat /dev/mull>  /etc/multipath.conf
> +
> +#lvm.conf should use /dev/mapper and /dev/sdX devices
> +# and not /dev/dm-X devices
> +sed -i 's/preferred_names = \[ \]/preferred_names = [ "^\/dev\/mapper", "^\/dev\/[hsv]d" ]/g' /etc/lvm/lvm.conf
> diff --git a/scripts/ovirt-config-storage b/scripts/ovirt-config-storage
> index be22ef6..c3715fb 100755
> --- a/scripts/ovirt-config-storage
> +++ b/scripts/ovirt-config-storage
> @@ -34,6 +34,68 @@ logging_min_size=5
>   data_min_size=5
>   swap_min_size=5
>
> +# return sd name for given #:# identifier
> +get_sd_name() {
> +    local id=$1
> +    local device_var=$2
> +    for device in $(ls /sys/block)
> +    do
> +        if [[ $id = $(cat /sys/block/$device/dev) ]]; then
> +            eval $device_var=$device
> +            return
> +        fi
> +    done
> +    eval $device_var=1
> +}
> +
> +# gets the dependent block devices for multipath devices
> +get_multipath_devices() {
> +    local mpath_device=mpath-$(basename $1)
> +    local deplist_var=$2
> +    local deplist=""
> +
> +    #get dependencies for multipath device
> +    local deps=$(dmsetup deps -u $mpath_device \
> +    | sed -r 's/\(([0-9]+), ([0-9]+)\)/\1:\2/g' \
> +    | sed 's/ /\n/g' | grep [0-9]:[0-9] )
> +
> +    local device=""
> +    for dep in $deps
> +    do
> +        local device=""
> +        get_sd_name $dep device
> +        if [[ ! $device = 1 ]]; then
> +            if [[ $deplist = "" ]]; then
> +                deplist=$device
> +            else
> +                deplist="$deplist $device"
> +            fi
> +        fi
> +    done
> +
> +    eval $deplist_var='$deplist'
> +}
> +
> +#get Multipath device for given /dev/sdX device
> +#return sdX device if no multipath device
> +translate_multipath_device() {
> +    #trim so that only sdX is stored, but support passing /dev/sdX
> +    local dev=$1
> +    local mpath_var=$2
> +
> +    local basedev=$(basename $dev)
> +
> +    local mpath_device=$(multipath -ll $dev |grep -n . | \
> +        grep "^1:" |awk '{print $1}' | sed 's/^1:/\/dev\/mapper\//g')
> +
> +    if [ -z "$mpath_device" ]; then
> +        mpath_device=$dev
> +    fi
> +
> +    eval $mpath_var=$mpath_device
> +}
> +
> +
>   get_drive_size()
>   {
>       local drive=$1
> @@ -53,8 +115,12 @@ get_drive_size()
>       fi
>       if [ -z "$udi" ]; then
>           # If hal didn't find the device, it could be a virtio block device
> +        # or a multipath device
>           # In this case, use sfdisk -s to get the size
> -        size=$(sfdisk -s $drive)
> +        size=$(sfdisk -s $drive 2>/dev/null)
> +        if [ -z "$size" ]; then
> +            size=0
> +        fi
>           size=$(echo "scale=0; $size * 1024" | bc -l)
>       else
>           size=$(hal-get-property --udi "$udi" --key storage.size)
> @@ -69,7 +135,7 @@ get_drive_size()
>
>       size=$(echo "scale=0; $size / (1024 * 1024)" | bc -l)
>       echo "$drive ($size MB)"
> -    echo "Disk Identifier: $(basename "$udi")"
> +    test -z "$udi" || echo "Disk Identifier: $(basename "$udi")"
>       if [ -n "$space_var" ]; then
>           eval $space_var=$size
>       fi
> @@ -151,6 +217,29 @@ check_partition_sizes()
>       return $rc
>   }
>
> +manual_input()
> +{
> +    local manual_device
> +    local return_var=$1
> +    while true; do
> +        read -rp "Enter disk device path: " manual_device
> +        if [ -z "$device" ]; then
> +            return 1
> +        fi
> +        translate_multipath_device $manual_device manual_device
> +        eval $return_var="$manual_device"
> +        if [ -n "$manual_device" ]; then
> +            if [ -b "$(readlink -f $device)" ]; then
> +                return 0
> +            fi
> +        else
> +            echo "Aborting."
> +            return 1
> +        fi
> +
> +    done
> +}
> +
>   # Find a usable/selected storage device.
>   # If there are none, give a diagnostic and return nonzero.
>   # If there is just one, e.g., /dev/sda, treat it as selected (see below).
> @@ -161,7 +250,7 @@ check_partition_sizes()
>   get_dev_name()
>   {
>       local udi_list=$(hal-find-by-capability --capability storage)
> -    local byid_list=$(find /dev/disk/by-id -mindepth 1 -not -name '*-part*')
> +    local byid_list=$(find /dev/disk/by-id -mindepth 1 -not -name '*-part*' 2>/dev/null)
>       if test -z "$udi_list" -a -z "$byid_list"; then
>           warn "ERROR: no usable storage devices detected"
>           return 1
> @@ -193,7 +282,33 @@ get_dev_name()
>
>       # FIXME: workaround for detecting virtio block devices
>       devices="$devices $(ls /dev/vd? 2>  /dev/null | xargs)"
> -    devices=$(echo $devices | tr ' ' '\n' | sort -u | xargs)
> +
> +    # FIXME: workaround for detecting cciss devices
> +    for dev in $(ls /dev/cciss 2>/dev/null); do
> +        if [[ ! $dev =~ p[0-9]+\$ ]]; then
> +            devices="$devices /dev/cciss/dev"
> +        fi
> +    done
> +
> +    # Include mulitpath devices
> +    local devs_to_remove
> +    for dev in $(dmsetup ls --target=multipath | awk '{print $1}'); do
> +        devices="$devices /dev/mapper/$dev"
> +        local sd_devs=""
> +        get_multipath_devices $dev sd_devs
> +        devs_to_remove="${devs_to_remove} ${sd_devs}"
> +    done
> +
> +    # Remove /dev/sd* devices that are part of a multipath device
> +    local dev_list
> +    for dev in $devices
> +    do
> +        if [[ ! "$devs_to_remove" =~ "$(basename $dev)" ]]; then
> +            dev_list="$dev_list $dev"
> +        fi
> +    done
> +
> +    devices=$(echo $dev_list | tr ' ' '\n' | sort -u | xargs)
>
>       local num_devices=$(echo "$devices" | wc -w)
>       # If there's only one device, use it.
> @@ -209,9 +324,10 @@ get_dev_name()
>           get_drive_size $d>&2
>       done
>       local choices="$devices Abort"
> -    select device in $choices
> +    select device in $choices "Manual Selection"
>       do
>           test "$device" = Abort&&  return 1
> +        test "$device" = "Manual selection"&&  manual_input device
>           test -z "$device"&&  continue
>           echo "$device"
>           return 0
> @@ -375,6 +491,17 @@ wipe_lvm_on_disk()
>       done
>   }
>
> +
> +reread_partitions()
> +{
> +    local drive=$1
> +    if [[ $drive =~ "^/dev/mapper" ]]; then
> +        kpartx -a -p p $drive
> +    else
> +        blockdev --rereadpt $drive
> +    fi
> +}
> +
>   perform_partitioning()
>   {
>       if [[ -z "$HOSTVGDRIVE"&&  "$OVIRT_ISCSI_ENABLED" != "y" ]]; then
> @@ -404,15 +531,20 @@ perform_partitioning()
>           log "Partitioning drive: $BOOTDRIVE"
>           log "Wiping old boot sector"
>           dd if=/dev/zero of=$BOOTDRIVE bs=1024K count=1
> -        blockdev --rereadpt $BOOTDRIVE
> +        reread_partitions $BOOTDRIVE
>           partprobe -s $BOOTDRIVE
>           log "Creating boot partition"
>           parted $BOOTDRIVE -s "mklabel ${LABEL_TYPE}"
>           parted $BOOTDRIVE -s "mkpartfs primary ext2 0M ${boot_size_si}M"
> +        reread_partitions $BOOTDRIVE
> +        partboot=$BOOTDRIVE1
> +        if [ ! -e $partboot ]; then
> +            partboot=${BOOTDRIVE}p1
> +        fi
>           # sleep to ensure filesystems are created before continuing
>           sleep 10
> -        mke2fs ${BOOTDRIVE}1 -L Boot
> -        tune2fs -c 0 -i 0 ${BOOTDRIVE}1
> +        mke2fs ${partboot} -L Boot
> +        tune2fs -c 0 -i 0 ${partboot}
>           log "Completed!"
>           return
>       fi
> @@ -422,7 +554,7 @@ perform_partitioning()
>    # FIXME: save a backup copy, just in case?
>       log "Wiping old boot sector"
>       dd if=/dev/zero of=$ROOTDRIVE bs=1024K count=1
> -    blockdev --rereadpt $ROOTDRIVE
> +    reread_partitions $ROOTDRIVE
>       partprobe -s $ROOTDRIVE
>       log "Labeling Drive: $ROOTDRIVE"
>       parted $ROOTDRIVE -s "mklabel ${LABEL_TYPE}"
> @@ -435,12 +567,19 @@ perform_partitioning()
>       let RootBackup_end=${ROOT_SIZE}*2
>       parted $ROOTDRIVE -s "mkpart primary ext2 0M ${ROOT_SIZE}M"
>       parted $ROOTDRIVE -s "mkpart primary ext2 ${ROOT_SIZE}M ${RootBackup_end}M"
> +    reread_partitions $ROOTDRIVE
> +    partroot=${ROOTDRIVE}1
> +    partrootbackup=${ROOTDRIVE}2
> +    if [ ! -e $partroot ]; then
> +        partroot=${ROOTDRIVE}p1
> +        partrootbackup=${ROOTDRIVE}p2
> +    fi
>       # sleep to ensure filesystems are created before continuing
>       sleep 10
> -    mke2fs ${ROOTDRIVE}1 -L Root
> -    mke2fs ${ROOTDRIVE}2 -L RootBackup
> -    tune2fs -c 0 -i 0 ${ROOTDRIVE}1
> -    tune2fs -c 0 -i 0 ${ROOTDRIVE}2
> +    mke2fs ${partroot} -L Root
> +    mke2fs ${partrootbackup} -L RootBackup
> +    tune2fs -c 0 -i 0 ${partroot}
> +    tune2fs -c 0 -i 0 ${partrootbackup}
>       log "Creating LVM partition"
>
>       if [ $ROOTDRIVE == $HOSTVGDRIVE ]; then
> @@ -454,6 +593,7 @@ perform_partitioning()
>       parted $HOSTVGDRIVE -s "set $hostvgpart lvm on"
>       parted $ROOTDRIVE -s "print"
>       udevadm settle 2>  /dev/null || udevsettle
> +    reread_partitions $HOSTVGDRIVE
>
>       # sync GPT to the legacy MBR partitions
>       if [ "gpt" == "$LABEL_TYPE" ]; then
> @@ -702,8 +842,9 @@ DATA_SIZE=${OVIRT_VOL_DATA_SIZE:-$default_data_size}
>   if [ -n "$OVIRT_INIT" ]; then
>       # if present, use the drive selected with 'ovirt_init' boot parameter
>       # setting these the same until kernel cmdline argument implemented
> -    ROOTDRIVE=$OVIRT_INIT
> -    HOSTVGDRIVE=$OVIRT_INIT
> +    translate_multipath_device $OVIRT_INIT DRIVE
> +    ROOTDRIVE=$DRIVE
> +    HOSTVGDRIVE=$DRIVE
>       get_drive_size $ROOTDRIVE ROOTDRIVESPACE
>   fi
>
> diff --git a/scripts/ovirt-functions b/scripts/ovirt-functions
> index ff2b016..4027613 100644
> --- a/scripts/ovirt-functions
> +++ b/scripts/ovirt-functions
> @@ -332,7 +332,7 @@ unmount_logging_services() {
>       cd /etc/init.d
>       for prg in $(lsof -Fc +D /var/log|grep ^c|sort -u); do
>           srv=$(grep -l ${prg#c}$ *)
> -        service $srv stop
> +        service $srv stop 6>&- 7>&-
>           services="$services $srv"
>       done
>       # debugging help
> @@ -364,7 +364,7 @@ mount_logging() {
>           rmdir $log2
>           restorecon -rv /var/log
>           for srv in $services; do
> -            service $srv start
> +            service $srv start 6>&- 7>&-
>           done
>
>           return 0
> @@ -392,7 +392,7 @@ unmount_logging() {
>           return $rc
>       fi
>       for srv in $services; do
> -        service $srv start
> +        service $srv start 6>&- 7>&-
>       done
>
>       return 0
>    
ACK




More information about the ovirt-devel mailing list