- 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 <[email protected]>
---
 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() {
-- 
1.6.5.2

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

Reply via email to