[Ovirt-devel] Re: [PATCH node] iscsi remote root basework This lays most of the groundwork for iscsi installation and configuration. At this time configuring iscsi is disabled due to multiple issues with dependent pieces.

Joey Boggs jboggs at redhat.com
Tue Dec 8 20:44:19 UTC 2009


On 12/08/2009 03:41 PM, Joey Boggs wrote:
> - dracut does not currently support booting a dmsquash file system on an iscsiroot
> - can not be configured in standalone mode since networking is not up, although works fine if ovirt-config-setup is run once booted.
>
> Signed-off-by: Joey Boggs<jboggs at redhat.com>
> ---
>   recipe/common-pkgs.ks        |    1 +
>   scripts/ovirt-config-boot    |   67 ++++++++++++++++----
>   scripts/ovirt-config-storage |  142 +++++++++++++++++++++++++++++++++++++++--
>   scripts/ovirt-functions      |    8 +++
>   4 files changed, 199 insertions(+), 19 deletions(-)
>
> diff --git a/recipe/common-pkgs.ks b/recipe/common-pkgs.ks
> index daff195..9bd3b07 100644
> --- a/recipe/common-pkgs.ks
> +++ b/recipe/common-pkgs.ks
> @@ -73,3 +73,4 @@ kpartx
>   # workaround for gpxe issue with the virt-preview qemu on F11 host kernel
>   # https://bugzilla.redhat.com/show_bug.cgi?id=512358
>   etherboot-zroms-kvm
> +dracut-network
> diff --git a/scripts/ovirt-config-boot b/scripts/ovirt-config-boot
> index 470f57b..4c4e3d7 100755
> --- a/scripts/ovirt-config-boot
> +++ b/scripts/ovirt-config-boot
> @@ -29,9 +29,28 @@ ovirt_boot_setup() {
>       local disk2
>       local partN=-1
>       log "installing the image."
> +    if [ -h /dev/disk/by-label/Boot ]; then
> +        mount_boot
> +        mountpoint /boot
> +        if [ $? -ne 0 ] ; then
> +            log "Boot partition not available"
> +            return 1
> +        fi
> +        grub_dev_label="Boot"
> +        # Grab OVIRT_ISCSI VARIABLES from boot partition for upgrading
> +        # file created only if OVIRT_ISCSI_ENABLED=y
> +        if [ -f /boot/ovirt ]; then
> +            . /boot/ovirt
> +        iscsiadm -p $OVIRT_ISCSI_TARGET_IP:$OVIRT_ISCSI_TARGET_PORT -m discovery -t sendtargets
> +        log "Restarting iscsi service"
> +        service iscsi restart
> +        fi
> +    else
> +        grub_dev_label="RootBackup"
> +    fi
>       mount_liveos
>       # check that /boot mounted ok and find partition number for GRUB
> -    eval $(readlink -f /dev/disk/by-label/RootBackup|awk {'
> +    eval $(readlink -f /dev/disk/by-label/$grub_dev_label|awk {'
>           print "disk=" substr($1,1,length($1)-1);
>           print "disk2=" substr($1,1,length($1)-2);
>           partN=substr($1,length($1),1); partN--;
> @@ -75,9 +94,10 @@ ovirt_boot_setup() {
>       fi
>       if [ $rc -ne 0 ]; then
>         log "root partition not available."
> -      log "$(lvdisplay -c)"
> +      log "$(ls -al /dev/disk/by-label)"
>         return $rc
>       fi
> +
>       mount $candidate_dev /liveos
>       # install oVirt Node image for local boot
>       if [ -e "$live/syslinux" ]; then
> @@ -87,12 +107,25 @@ ovirt_boot_setup() {
>       else
>         syslinux=
>       fi
> -    rm -rf /liveos/boot/grub
> +
>       rm -rf /liveos/LiveOS
> -    mkdir -p /liveos/boot/grub
>       mkdir -p /liveos/LiveOS
> +
> +    if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then
> +        initrd_dest="/boot"
> +        grub_dir="/boot/grub"
> +        grub_prefix="/grub"
> +    else
> +        initrd_dest="/liveos"
> +        grub_dir="/liveos/boot/grub"
> +        grub_prefix="/boot/grub"
> +    fi
> +
> +    rm -rf  $grub_dir
> +    mkdir -p $grub_dir
> +
>       cp -p $live/LiveOS/squashfs.img /liveos/LiveOS \
> -&&  cp -p $live/$syslinux/vmlinuz0 /liveos
> +&&  cp -p $live/$syslinux/vmlinuz0 $initrd_dest
>       rc=$?
>       if [ $rc -ne 0 ]; then
>         log "image copy failed."
> @@ -139,17 +172,23 @@ set -e\
>           # lvm is not static in Fedora
>           cp /lib$bit/libreadline.so.5 /lib$bit/libncurses.so.5 lib$bit
>       fi
> +
>       find $init_script bin/lvm lib$bit -type f |
>           cpio -H newc --quiet -o |
>           gzip -9 |
> -        cat $live/$syslinux/initrd0.img ->  /liveos/initrd0.img
> +        cat $live/$syslinux/initrd0.img ->  $initrd_dest/initrd0.img
>
>       version=$(rpm -q --qf '%{version}' ovirt-node)
>       release=$(rpm -q --qf '%{release}' ovirt-node)
>       # reorder tty0 to allow both serial and phys console after installation
> -    bootparams="ro root=LABEL=Root roottypefs=ext3 console=tty0 \
> +    if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then
> +        bootparams="ro root=LABEL=live:Root roottypefs=ext3 console=tty0 \
> +                    netroot=iscsi:$OVIRT_ISCSI_TARGET_IP::$OVIRT_ISCSI_TARGET_PORT::$OVIRT_ISCSI_NODE_NAME ip=eth0:dhcp"
> +    else
> +        bootparams="ro root=LABEL=live:Root roottypefs=ext3 console=tty0 \
>                   $(echo $bootparams | sed s/console=tty0//g)"
> -    cat>  /liveos/boot/grub/grub.conf<<  EOF
> +    fi
> +    cat>  $grub_dir/grub.conf<<  EOF
>   default=0
>   timeout=5
>   hiddenmenu
> @@ -158,11 +197,11 @@ title oVirt Node (${version}-${release})
>       kernel /vmlinuz0 $bootparams
>       initrd /initrd0.img
>   EOF
> -    echo "(hd0) $disk">  /liveos/boot/grub/device.map
> -    ( cd /usr/share/grub/*; cp -p stage? e2fs_stage1_5 /liveos/boot/grub )
> -    grub --device-map=/liveos/boot/grub/device.map<<EOF
> +    echo "(hd0) $disk">  $grub_dir/device.map
> +    ( cd /usr/share/grub/*; cp -p stage? e2fs_stage1_5 $grub_dir )
> +    grub --device-map=$grub_dir/device.map<<EOF
>   root (hd0,$partN)
> -setup --prefix=/boot/grub (hd0)
> +setup --prefix=$grub_prefix (hd0)
>   EOF
>       rc=$?
>       if [ $rc -ne 0 ]; then
> @@ -175,6 +214,10 @@ EOF
>       e2label $candidate_dev RootUpdate
>
>       rm -rf $tmpdir
> +    if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then
> +        # copy default for when Root/HostVG is inaccessible(iscsi upgrade
> +        cp $OVIRT_DEFAULTS /boot
> +    fi
>       log "done."
>   }
>
> diff --git a/scripts/ovirt-config-storage b/scripts/ovirt-config-storage
> index 57aaebd..f9a5b41 100755
> --- a/scripts/ovirt-config-storage
> +++ b/scripts/ovirt-config-storage
> @@ -21,13 +21,13 @@ if is_booted_from_local_disk; then
>   fi
>
>   default_overcommit=0.5
> -
> +default_boot_size=50
>   default_root_size=256
>   default_config_size=5
>   default_logging_size=2048
>   # -1 indicates data partition should use remaining disk
>   default_data_size=-1
> -
> +boot_min_size=50
>   root_min_size=256
>   config_min_size=5
>   logging_min_size=5
> @@ -206,6 +206,11 @@ get_dev_name()
>   do_configure()
>   {
>       local name_and_size
> +    if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then
> +        printf "\n\nPlease select the disk to use for the Boot partition.\n\n"
> +        BOOTDRIVE=$(get_dev_name) || return 0
> +        get_drive_size $BOOTDRIVE BOOTDRIVESPACE
> +    fi
>       printf "\n\nPlease select the disk to use for the Root.\n\n"
>       ROOTDRIVE=$(get_dev_name) || return 0
>       get_drive_size $ROOTDRIVE ROOTDRIVESPACE
> @@ -230,7 +235,12 @@ do_configure()
>       fi
>
>       local space_left=$HOSTVGDRIVESPACE
> -    for part in swap root config logging data ; do
> +    if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then
> +        partlist="boot swap root config logging data"
> +    else
> +        partlist="swap root config logging data"
> +    fi
> +    for part in $partlist ; do
>           part_regexp="^0$"
>           if [ "$part" = "data" ]; then
>               part_regexp="^\-1|0$"
> @@ -276,12 +286,19 @@ do_configure()
>       # save input variables
>       augtool<<EOF
>   set /files$OVIRT_DEFAULTS/OVIRT_INIT $ROOTDRIVE
> +set /files$OVIRT_DEFAULTS/OVIRT_VOL_BOOT_SIZE $BOOT_SIZE
>   set /files$OVIRT_DEFAULTS/OVIRT_VOL_SWAP_SIZE $SWAP_SIZE
>   set /files$OVIRT_DEFAULTS/OVIRT_VOL_ROOT_SIZE $ROOT_SIZE
>   set /files$OVIRT_DEFAULTS/OVIRT_VOL_CONFIG_SIZE $CONFIG_SIZE
>   set /files$OVIRT_DEFAULTS/OVIRT_VOL_LOGGING_SIZE $LOGGING_SIZE
>   set /files$OVIRT_DEFAULTS/OVIRT_VOL_DATA_SIZE $DATA_SIZE
>   EOF
> +
> +   if [ -n $BOOTDRIVE ]; then
> +       augtool<<EOF
> +set /files$OVIRT_DEFAULTS/OVIRT_BOOT_INIT $BOOTDRIVE
> +EOF
> +   fi
>   }
>
>   do_review()
> @@ -356,20 +373,33 @@ perform_partitioning()
>       partprobe -s $ROOTDRIVE
>
>       MEM_SIZE_MB=$(echo "scale=0; $MEM_SIZE_MB / 1024;" | bc -l)
> +    local boot_size_si=$(echo "scale=0; $BOOT_SIZE * (1024 * 1024) / (1000 * 1000)" | bc -l)
>       log "Labeling Drive: $ROOTDRIVE"
>       parted $ROOTDRIVE -s "mklabel ${LABEL_TYPE}"
> +    if [ -n "$BOOTDRIVE" ]; then
> +        dd if=/dev/zero of=$BOOTDRIVE bs=1024K count=1
> +        blockdev --rereadpt $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"
> +    fi
>       if [ $ROOTDRIVE != $HOSTVGDRIVE ]; then
>           log "Labeling Drive: $HOSTVGDRIVE"
>           parted $HOSTVGDRIVE -s "mklabel ${LABEL_TYPE}"
>       fi
>       log "Creating Root and RootBackup Partitions"
>       let RootBackup_end=${ROOT_SIZE}*2
> -    parted $ROOTDRIVE -s "mkpartfs primary ext2 0M ${ROOT_SIZE}M"
> -    parted $ROOTDRIVE -s "mkpartfs primary ext2 ${ROOT_SIZE}M ${RootBackup_end}M"
> +    parted $ROOTDRIVE -s "mkpart primary ext2 0M ${ROOT_SIZE}M"
> +    parted $ROOTDRIVE -s "mkpart primary ext2 ${ROOT_SIZE}M ${RootBackup_end}M"
>       # sleep to ensure filesystems are created before continuing
>       sleep 10
> -    e2label ${ROOTDRIVE}1 Root
> -    e2label ${ROOTDRIVE}2 RootBackup
> +    if [ -n "$BOOTDRIVE" ]; then
> +        mke2fs ${BOOTDRIVE}1 -L Boot
> +        tune2fs -c 0 -i 0 ${BOOTDRIVE}1
> +    fi
> +    mke2fs ${ROOTDRIVE}1 -L Root
> +    mke2fs ${ROOTDRIVE}2 -L RootBackup
>       tune2fs -c 0 -i 0 ${ROOTDRIVE}1
>       tune2fs -c 0 -i 0 ${ROOTDRIVE}2
>       log "Creating LVM partition"
> @@ -468,6 +498,7 @@ perform_partitioning()
>
>   do_confirm()
>   {
> +
>       if [ -z "$ROOTDRIVE" ]; then
>           printf "\nNo storage device selected.\n"
>           return
> @@ -502,6 +533,101 @@ do_confirm()
>       done
>   }
>
> +do_iscsi_target()
> +{
> +while true; do
> +    OPTIONS="\"Target IP\" \"Target Port\"" #\"CHAP Username\" \"CHAP Password\""
> +    printf "\nPress Enter to leave option blank or Q to quit (default Target Port is 3260)\n"
> +    eval set $OPTIONS
> +    PS3="Choose an option: "
> +    for OPTION in "$@"; do
> +        while true; do
> +            read -ep "Enter $OPTION: "
> +            if [[ $REPLY == "q" || $REPLY == "Q" ]]; then
> +                return
> +            fi
> +
> +            if [ "$OPTION" == "Target IP" ]; then
> +                OVIRT_ISCSI_TARGET_IP=$REPLY
> +                if [ -n "$REPLY" ]; then
> +                    break;
> +                fi
> +
> +            elif [ "$OPTION" == "Target Port" ]; then
> +                OVIRT_ISCSI_TARGET_PORT=$REPLY
> +                if [ -z "$REPLY" ]; then
> +                    OVIRT_ISCSI_TARGET_PORT="3260"
> +                    break;
> +                else
> +                    break;
> +                fi
> +
> +            elif [ "$OPTION" == "CHAP Username" ]; then
> +                OVIRT_ISCSI_CHAP_USERNAME=$REPLY
> +                break
> +
> +            elif [ "$OPTION" == "CHAP Password" ]; then
> +                OVIRT_ISCSI_CHAP_PASSWORD=$REPLY
> +                break;
> +            fi
> +        done
> +    done
> +
> +    cat<<EOF
> +
> +The iSCSI target be configured as follows:
> +================================================
> +    Target IP:   $OVIRT_ISCSI_TARGET_IP
> +  Target Port:   $OVIRT_ISCSI_TARGET_PORT
> +
> +EOF
> +#     Username:   $OVIRT_ISCSI_CHAP_USERNAME
> +#     Password:   $OVIRT_ISCSI_CHAP_PASSWORD
> +#EOF
> +
> +if ask_yes_or_no "Is this correct ([Y]es/[N]o)?" true true; then
> +
> +    OVIRT_ISCSI_ENABLED="y"
> +    augtool<<EOF
> +set /files/etc/default/ovirt/OVIRT_ISCSI_ENABLED y
> +set /files/etc/default/ovirt/OVIRT_ISCSI_TARGET_IP $OVIRT_ISCSI_TARGET_IP
> +set /files/etc/default/ovirt/OVIRT_ISCSI_TARGET_PORT $OVIRT_ISCSI_TARGET_PORT
> +EOF
> +
> +    if [[ -n "$OVIRT_ISCSI_CHAP_USERNAME"&&  -n "$OVIRT_ISCSI_CHAP_PASSWORD" ]]; then
> +        log "setting iscsid.conf username/password"
> +        augtool<<EOF
> +set /files/etc/iscsi/iscsid.conf/node.session.auth.authmethod CHAP
> +set /files/etc/iscsi/iscsid.conf/node.session.auth.username $OVIRT_ISCSI_CHAP_USERNAME
> +set /files/etc/iscsi/iscsid.conf/node.session.auth.password $OVIRT_ISCSI_CHAP_PASSWORD
> +set /files/etc/default/ovirt/OVIRT_ISCSI_CHAP_USERNAME $OVIRT_ISCSI_CHAP_USERNAME
> +set /files/etc/default/ovirt/OVIRT_ISCSI_CHAP_PASSWORD $OVIRT_ISCSI_CHAP_PASSWORD
> +EOF
> +    fi
> +
> +    iscsiadm -p $OVIRT_ISCSI_TARGET_IP:$OVIRT_ISCSI_TARGET_PORT -m discovery -t sendtargets
> +    log "Restarting iscsi service"
> +    service iscsi restart
> +
> +ISCSI_NODE_NAMES="$(iscsiadm -m discovery -p $OVIRT_ISCSI_TARGET_IP:$OVIRT_ISCSI_TARGET_PORT -t sendtargets|awk {'print $2'})"
> +
> +printf "\n\n Select iSCSI target node\n\n">&2
> +select OVIRT_ISCSI_NODE_NAME in $ISCSI_NODE_NAMES ; do
> +log " Selected Node Name: $OVIRT_ISCSI_NODE_NAME"
> +break;
> +done
> +
> +augtool<<EOF
> +set /files/etc/default/ovirt/OVIRT_ISCSI_ENABLED y
> +set /files/etc/default/ovirt/OVIRT_ISCSI_TARGET_IP $OVIRT_ISCSI_TARGET_IP
> +set /files/etc/default/ovirt/OVIRT_ISCSI_TARGET_PORT $OVIRT_ISCSI_TARGET_PORT
> +set /files/etc/default/ovirt/OVIRT_ISCSI_NODE_NAME $OVIRT_ISCSI_NODE_NAME
> +EOF
> +break;
> +fi
> +done
> +}
> +
>   MEM_SIZE_MB=$(awk '/MemTotal:/ { print $2 }' /proc/meminfo)
>   case $MEM_SIZE_MB in
>       ''|*[^0-9]*) die failed to get system memory size;;
> @@ -527,6 +653,7 @@ fi
>
>   CALC_SWAP_SIZE=$(echo "scale=0; ${BASE_SWAP_SIZE} + ${OVERCOMMIT_SWAP_SIZE};" | bc -l)
>
> +BOOT_SIZE=${OVIRT_VOL_BOOT_SIZE:-$default_boot_size}
>   SWAP_SIZE=${OVIRT_VOL_SWAP_SIZE:-$CALC_SWAP_SIZE}
>   ROOT_SIZE=${OVIRT_VOL_ROOT_SIZE:-$default_root_size}
>   CONFIG_SIZE=${OVIRT_VOL_CONFIG_SIZE:-$default_config_size}
> @@ -577,6 +704,7 @@ else
>           select OPTION in "$@"
>           do
>               case "$OPTION" in
> +                "Enable iSCSI Target") do_iscsi_target; break ;;
>                   "Configure Storage") do_configure ; break ;;
>                   "Review")    do_review    ; break ;;
>                   "Commit Changes And Quit") do_confirm   ; break ;;
> diff --git a/scripts/ovirt-functions b/scripts/ovirt-functions
> index 7cf8613..7cd9c81 100644
> --- a/scripts/ovirt-functions
> +++ b/scripts/ovirt-functions
> @@ -304,6 +304,14 @@ mount_config() {
>       fi
>   }
>
> +mount_boot() {
> +
> +    if grep -q " /boot " /etc/mtab; then
> +       return 0
> +    fi
> +    mkdir -p /boot
> +    mount /dev/disk/by-label/Boot /boot
> +}
>   # stop any service which keeps /var/log busy
>   # keep the list of services
>   unmount_logging_services() {
>    


This also fixes the live booting option in grub for dracut with the 
node-images.

Just building and running a normal install to "local storage" that 
doesn't fail is the expected result for now.




More information about the ovirt-devel mailing list