[Ovirt-devel] [PATCH node] Enables stateless iscsi remote boot

Joey Boggs jboggs at redhat.com
Thu Dec 10 19:13:10 UTC 2009


Used in conjunction with livecd-iso-to-iscsi. Creates a local boot partition with vmlinuz/initrd and grub configuration.

Disk Partitioning > enable iscsi target > configure storage > local install and reboot
---
 scripts/ovirt-config-boot    |  131 +++++++++++++++++++--------------
 scripts/ovirt-config-storage |  164 +++++++++++++++++++++++++-----------------
 tools/livecd-iso-to-iscsi    |    3 +
 3 files changed, 177 insertions(+), 121 deletions(-)

diff --git a/scripts/ovirt-config-boot b/scripts/ovirt-config-boot
index 4c4e3d7..7978010 100755
--- a/scripts/ovirt-config-boot
+++ b/scripts/ovirt-config-boot
@@ -48,7 +48,7 @@ ovirt_boot_setup() {
     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/$grub_dev_label|awk {'
         print "disk=" substr($1,1,length($1)-1);
@@ -62,54 +62,57 @@ ovirt_boot_setup() {
       return 1
     fi
 
-    mountpoint /liveos
-    if [ $? -ne 0 ] ; then
-      log "Root partition not available"
-      return 1
-    fi
+    if [ "$OVIRT_ISCSI_ENABLED" != "y" ]; then
+        mount_liveos
+        mountpoint /liveos
+        if [ $? -ne 0 ] ; then
+          log "Root partition not available"
+          return 1
+        fi
 
-    if [ ! -e "$disk" ]; then
-        # e.g. c0d0p1
-        disk="$disk2"
-    fi
-    mkdir -p /liveos
-    # prepare Root partition update
-    candidate=
-    if [ -e /dev/disk/by-label/RootBackup ]; then
-        candidate=RootBackup
-    elif [ -e /dev/disk/by-label/RootUpdate ]; then
-        candidate=RootUpdate
-    elif [ -e /dev/disk/by-label/RootNew ]; then
-        candidate=RootNew
-    fi
-    if [ -z "$candidate" ]; then
-        rc=1
-    elif [ "$candidate" = "RootNew" ]; then
-        umount /liveos
-        rc=0
-    else
-        candidate_dev=$(readlink -f /dev/disk/by-label/$candidate)
-        e2label $candidate_dev RootNew
-        rc=$?
-    fi
-    if [ $rc -ne 0 ]; then
-      log "root partition not available."
-      log "$(ls -al /dev/disk/by-label)"
-      return $rc
-    fi
+        if [ ! -e "$disk" ]; then
+            # e.g. c0d0p1
+            disk="$disk2"
+        fi
+        # prepare Root partition update
+        candidate=
+        if [ -e /dev/disk/by-label/RootBackup ]; then
+            candidate=RootBackup
+        elif [ -e /dev/disk/by-label/RootUpdate ]; then
+            candidate=RootUpdate
+        elif [ -e /dev/disk/by-label/RootNew ]; then
+            candidate=RootNew
+        fi
+        if [ -z "$candidate" ]; then
+            rc=1
+        elif [ "$candidate" = "RootNew" ]; then
+            umount /liveos
+            rc=0
+        else
+            candidate_dev=$(readlink -f /dev/disk/by-label/$candidate)
+            e2label $candidate_dev RootNew
+            rc=$?
+        fi
+        if [ $rc -ne 0 ]; then
+          log "root partition not available."
+          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
-      syslinux=syslinux
-    elif [ -e "$live/isolinux" ]; then
-      syslinux=isolinux
-    else
-      syslinux=
-    fi
+        mount $candidate_dev /liveos
 
-    rm -rf /liveos/LiveOS
-    mkdir -p /liveos/LiveOS
+        rm -rf /liveos/LiveOS
+        mkdir -p /liveos/LiveOS
+
+    fi
+        # install oVirt Node image for local boot
+        if [ -e "$live/syslinux" ]; then
+          syslinux=syslinux
+        elif [ -e "$live/isolinux" ]; then
+          syslinux=isolinux
+        else
+          syslinux=
+        fi
 
     if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then
         initrd_dest="/boot"
@@ -124,13 +127,22 @@ ovirt_boot_setup() {
     rm -rf  $grub_dir
     mkdir -p $grub_dir
 
-    cp -p $live/LiveOS/squashfs.img /liveos/LiveOS \
-    && cp -p $live/$syslinux/vmlinuz0 $initrd_dest
+    cp -p $live/$syslinux/vmlinuz0 $initrd_dest
     rc=$?
     if [ $rc -ne 0 ]; then
-      log "image copy failed."
-      return $rc
+        log "kernel image copy failed."
+        return $rc
+    fi
+
+    if [ "$OVIRT_ISCSI_ENABLED" != "y" ]; then
+        cp -p $live/LiveOS/squashfs.img /liveos/LiveOS
+        rc=$?
+        if [ $rc -ne 0 ]; then
+          log "squashfs image copy failed."
+          return $rc
+        fi
     fi
+
     # append LVM support to the livecd initramfs
     tmpdir=$(mktemp -d)
     cd $tmpdir
@@ -182,10 +194,10 @@ set -e\
     release=$(rpm -q --qf '%{release}' ovirt-node)
     # reorder tty0 to allow both serial and phys console after installation
     if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then
-        bootparams="ro root=LABEL=live:Root roottypefs=ext3 console=tty0 \
+        bootparams="ro root=LABEL=ovirt-node-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 \
+        bootparams="ro root=live:LABEL=Root roottypefs=ext3 console=tty0 \
                 $(echo $bootparams | sed s/console=tty0//g)"
     fi
     cat > $grub_dir/grub.conf << EOF
@@ -209,9 +221,11 @@ EOF
         return $rc
     fi
 
-    umount /liveos
-    # mark new Root ready to go, reboot() in ovirt-function switches it to active
-    e2label $candidate_dev RootUpdate
+    if [ "$OVIRT_ISCSI_ENABLED" != "y" ]; then
+        umount /liveos
+        # mark new Root ready to go, reboot() in ovirt-function switches it to active
+        e2label $candidate_dev RootUpdate
+    fi
 
     rm -rf $tmpdir
     if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then 
@@ -253,7 +267,12 @@ if [ $rc -eq 0 -a "$doreboot" = "yes" ]; then
     disable_firstboot
     ovirt_store_firstboot_config
     stop_log
-    reboot
+
+    if [ "$OVIRT_ISCSI_ENABLED" != "y" ]; then
+        reboot
+    else
+        /sbin/reboot
+    fi
 fi
 stop_log
 exit $rc
diff --git a/scripts/ovirt-config-storage b/scripts/ovirt-config-storage
index f9a5b41..2ffcaa4 100755
--- a/scripts/ovirt-config-storage
+++ b/scripts/ovirt-config-storage
@@ -85,17 +85,23 @@ check_partition_sizes()
     fi
 
     printf "\n"
-    get_drive_size $ROOTDRIVE ROOTDRIVESPACE
-    get_drive_size $HOSTVGDRIVE HOSTVGDRIVESPACE
-    ROOT_NEED_SIZE=$(echo "scale=0; $ROOT_SIZE * 2"| bc -l)
-    HOSTVG_NEED_SIZE=$(echo "scale=0;" \
-                     "$SWAP_SIZE + $CONFIG_SIZE + $LOGGING_SIZE + $min_data_size" | bc -l)
-
-    if [ $ROOTDRIVE == $HOSTVGDRIVE ]; then
-        drive_list="ROOT"
-        ROOT_NEED_SIZE=$(echo "scale=0; $ROOT_SIZE * 2 + $HOSTVG_NEED_SIZE"| bc -l)
+    if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then
+        get_drive_size $BOOTDRIVE BOOTDRIVESPACE
+        drive_list="BOOT"
+        BOOT_NEED_SIZE=$BOOT_SIZE
     else
-        drive_list="ROOT HOSTVG"
+        get_drive_size $ROOTDRIVE ROOTDRIVESPACE
+        get_drive_size $HOSTVGDRIVE HOSTVGDRIVESPACE
+        ROOT_NEED_SIZE=$(echo "scale=0; $ROOT_SIZE * 2"| bc -l)
+        HOSTVG_NEED_SIZE=$(echo "scale=0;" \
+                         "$SWAP_SIZE + $CONFIG_SIZE + $LOGGING_SIZE + $min_data_size" | bc -l)
+
+        if [ $ROOTDRIVE == $HOSTVGDRIVE ]; then
+            drive_list="ROOT"
+            ROOT_NEED_SIZE=$(echo "scale=0; $ROOT_SIZE * 2 + $HOSTVG_NEED_SIZE"| bc -l)
+        else
+            drive_list="ROOT HOSTVG"
+        fi
     fi
 
     for drive in $drive_list; do
@@ -120,22 +126,26 @@ check_partition_sizes()
     done
 
     # check if an existing HostVG exists on a device other than the target
-    devices="$(pvs -o pv_name,vg_name --noheadings | \
-        grep "HostVG"|grep -v $HOSTVGDRIVE|awk '{ print $1 }')"
-    rc=0
-    if [ -n "$devices" ]; then
-        printf "\n"
-        printf "There appears to already be an installation on another device:\n"
-        for device in $devices; do
-            udi=$(hal-find-by-property --key block.device --string $device)
-            printf "\t$device ($(basename "$udi"))\n"
-        done
-        printf "We cannot proceed until either device is removed from the system\n"
-        printf "or until the HostVG volume group is removed.\n"
-        printf "\nTo re-install the node, please select \"Uninstall Node\" from the main\n"
-        printf "menu and then try to partition.\n"
-        printf "\n"
-        rc=1
+    if [ "$OVIRT_ISCSI_ENABLED" != "y" ]; then
+        devices="$(pvs -o pv_name,vg_name --noheadings | \
+            grep "HostVG"|grep -v $HOSTVGDRIVE|awk '{ print $1 }')"
+        rc=0
+        if [ -n "$devices" ]; then
+            printf "\n"
+            printf "There appears to already be an installation on another device:\n"
+            for device in $devices; do
+                udi=$(hal-find-by-property --key block.device --string $device)
+                printf "\t$device ($(basename "$udi"))\n"
+            done
+            printf "We cannot proceed until either device is removed from the system\n"
+            printf "or until the HostVG volume group is removed.\n"
+            printf "\nTo re-install the node, please select \"Uninstall Node\" from the main\n"
+            printf "menu and then try to partition.\n"
+            printf "\n"
+            rc=1
+        fi
+    else
+        rc=0
     fi
 
     return $rc
@@ -210,16 +220,17 @@ do_configure()
         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
+        echo $BOOTDRIVE
+    else
+        printf "\n\nPlease select the disk to use for the Root.\n\n"
+        ROOTDRIVE=$(get_dev_name) || return 0
+        get_drive_size $ROOTDRIVE ROOTDRIVESPACE
+
+        printf "\n\nPlease select the disk to use for the HostVG.\n\n"
+        HOSTVGDRIVE=$(get_dev_name) || return 0
+        get_drive_size $HOSTVGDRIVE HOSTVGDRIVESPACE
+        echo $HOSTVGDRIVESPACE
     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
-
-    printf "\n\nPlease select the disk to use for the HostVG.\n\n"
-    HOSTVGDRIVE=$(get_dev_name) || return 0
-    get_drive_size $HOSTVGDRIVE HOSTVGDRIVESPACE
-    echo $HOSTVGDRIVESPACE
-
     printf "\n\nPlease configure storage partitions.\n\n"
     printf "* Enter partition sizes in MB.\n"
     printf "* A value of 0 indicates the partition should be disabled.\n"
@@ -236,7 +247,8 @@ do_configure()
 
     local space_left=$HOSTVGDRIVESPACE
     if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then
-        partlist="boot swap root config logging data"
+        partlist="boot" # swap root config logging data"
+        local space_left=$BOOTDRIVESPACE
     else
         partlist="swap root config logging data"
     fi
@@ -303,24 +315,25 @@ EOF
 
 do_review()
 {
-    if [ -z "$ROOTDRIVE" ]; then
+    if [[ -z "$ROOTDRIVE" && "$OVIRT_ISCSI_ENABLED" != "y" ]]; then
         printf "\nNo Root storage device selected.\n"
         return
     fi
 
-    local data_size_display="$DATA_SIZE MB"
-    if [ "$DATA_SIZE" = -1 ]; then
+    if [ "$OVIRT_ISCSI_ENABLED" != "y" ]; then
+        local data_size_display="$DATA_SIZE MB"
+        if [ "$DATA_SIZE" = -1 ]; then
 
-        if [ $ROOTDRIVE == $HOSTVGDRIVE ]; then
-            local remaining_mb=$(( $ROOTDRIVESPACE - $SWAP_SIZE \
-                    - $ROOT_SIZE * 2 - $CONFIG_SIZE - $LOGGING_SIZE ))
-        else
-            local remaining_mb=$(( $HOSTVGDRIVESPACE - $SWAP_SIZE - $CONFIG_SIZE - $LOGGING_SIZE ))
+            if [ $ROOTDRIVE == $HOSTVGDRIVE ]; then
+                local remaining_mb=$(( $ROOTDRIVESPACE - $SWAP_SIZE \
+                        - $ROOT_SIZE * 2 - $CONFIG_SIZE - $LOGGING_SIZE ))
+            else
+                local remaining_mb=$(( $HOSTVGDRIVESPACE - $SWAP_SIZE - $CONFIG_SIZE - $LOGGING_SIZE ))
+            fi
+            data_size_display="$remaining_mb MB"
         fi
-        data_size_display="$remaining_mb MB"
-    fi
 
-    cat <<EOF
+        cat <<EOF
 
 The local disk will be repartitioned as follows:
 ================================================
@@ -333,6 +346,17 @@ The local disk will be repartitioned as follows:
           Data partition size: $data_size_display
 
 EOF
+    else
+        cat <<EOF
+
+The local disk will be repartitioned as follows:
+================================================
+                   Boot Drive: $(get_drive_size $BOOTDRIVE)
+          Boot partition size: $BOOT_SIZE
+
+EOF
+
+    fi
 }
 
 # cleanup lvms on selected disk
@@ -348,14 +372,16 @@ wipe_lvm_on_disk()
 
 perform_partitioning()
 {
-    log "Partitioning drive: $ROOTDRIVE"
-    if [ -z "$HOSTVGDRIVE" ]; then
+    if [[ -z "$HOSTVGDRIVE" && "$OVIRT_ISCSI_ENABLED" != "y" ]]; then
         printf "\nNo storage device selected.\n"
         return
     fi
 
+    if [[ -z "$BOOTDRIVE" && "$OVIRT_ISCSI_ENABLED" == "y" ]]; then
+        printf "\nNo storage device selected.\n"
+        return
+    fi
     start_log
-    log "Starting partitioning of $ROOTDRIVE"
 
     log "Saving parameters"
     unmount_config /etc/default/ovirt
@@ -366,24 +392,36 @@ perform_partitioning()
     # begin critical section
     set -e
 
-    # 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
-    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
+
+    if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then
+        log "Partitioning drive: $BOOTDRIVE"
+        log "Wiping old boot sector"
         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"
+        # sleep to ensure filesystems are created before continuing
+        sleep 10
+        mke2fs ${BOOTDRIVE}1 -L Boot
+        tune2fs -c 0 -i 0 ${BOOTDRIVE}1
+        log "Completed!"
+        return
     fi
+
+    log "Starting partitioning of $ROOTDRIVE"
+    log "Partitioning drive: $ROOTDRIVE"
+ # 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
+    partprobe -s $ROOTDRIVE
+    log "Labeling Drive: $ROOTDRIVE"
+    parted $ROOTDRIVE -s "mklabel ${LABEL_TYPE}"
+
     if [ $ROOTDRIVE != $HOSTVGDRIVE ]; then
         log "Labeling Drive: $HOSTVGDRIVE"
         parted $HOSTVGDRIVE -s "mklabel ${LABEL_TYPE}"
@@ -394,10 +432,6 @@ perform_partitioning()
     parted $ROOTDRIVE -s "mkpart primary ext2 ${ROOT_SIZE}M ${RootBackup_end}M"
     # sleep to ensure filesystems are created before continuing
     sleep 10
-    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
@@ -499,7 +533,7 @@ perform_partitioning()
 do_confirm()
 {
 
-    if [ -z "$ROOTDRIVE" ]; then
+    if [[ -z "$ROOTDRIVE" && "$OVIRT_ISCSI_ENABLED" != "y" ]]; then
         printf "\nNo storage device selected.\n"
         return
     fi
@@ -694,7 +728,7 @@ if [ "$1" == "AUTO" ]; then
 	log "Missing device parameter: unable to partition any disk"
     fi
 else
-    OPTIONS="\"Configure Storage\" \"Review\" \"Commit Changes And Quit\" \"Return To Menu\""
+    OPTIONS="\"Enable iSCSI Target\" \"Configure Storage\" \"Review\" \"Commit Changes And Quit\" \"Return To Menu\""
     eval set $OPTIONS
     PS3="Choose an option: "
 
diff --git a/tools/livecd-iso-to-iscsi b/tools/livecd-iso-to-iscsi
index fd3934d..f2d5059 100755
--- a/tools/livecd-iso-to-iscsi
+++ b/tools/livecd-iso-to-iscsi
@@ -119,6 +119,9 @@ squashfs="%s/LiveOS/squashfs.img" % isomount
 ext3fs="tftpboot/squashfs-root/LiveOS/ext3fs.img"
 shutil.copy(kernel,"tftpboot")
 shutil.copy(initrd,"tftpboot")
+e2label_ret = subprocess.call(["e2label", options.disk_label])
+if e2label_ret != 0:
+    fail("Error relabeling %s to %s" % (options.disk,options.disk_label))
 
 unsquash = subprocess.call(["unsquashfs", squashfs])
 
-- 
1.6.5.2




More information about the ovirt-devel mailing list