[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