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<[email protected]>
---
  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

_______________________________________________
Ovirt-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/ovirt-devel

Reply via email to