[Ovirt-devel] [PATCH node] Added support for local storage configuration.

Darryl L. Pierce dpierce at redhat.com
Mon Nov 17 20:49:47 UTC 2008


This patch wipes out the entire disk on the node and replaces it with
a set of partitions. The partitions are a raw partition to hold the bootable
kernel, and the rest of the disk is taken up as an physical volume.

On the physical volume is created the following logical volumes:

 * SWAP    - swap partition
 * ROOT    - to host the node image
 * CONFIG  - to hold node configuration data
 * LOGGING - to hold local logs
 * DATA    - to hold VM images

If a kernel argument named OVIRT_VOL is present, then the firstboot script
will run ovirt-config-storage in non-interactive mode. Default values are used
unless environment variables override them.

Signed-off-by: Darryl L. Pierce <dpierce at redhat.com>
---
 scripts/ovirt-config-storage |  200 ++++++++++++++++++++++++++++++++++++++++++
 scripts/ovirt-firstboot      |    6 +-
 2 files changed, 205 insertions(+), 1 deletions(-)

diff --git a/scripts/ovirt-config-storage b/scripts/ovirt-config-storage
index c856ef1..04db5ea 100755
--- a/scripts/ovirt-config-storage
+++ b/scripts/ovirt-config-storage
@@ -1,2 +1,202 @@
 #!/bin/bash
 #
+# To automate the partitioning, pass in the specific fields in this order
+# ovirt-config-storage [swap size] [boot size] [root size] [logging size]
+#
+# All sizes are in megabytes
+#
+
+function init
+{
+    if [ -n "$OVIRT_BOOT_SIZE" ]; then BOOT_SIZE=$OVIRT_BOOT_SIZE; else BOOT_SIZE="256"; fi
+    if [ -n "$OVIRT_ROOT_SIZE" ]; then ROOT_SIZE=$OVIRT_ROOT_SIZE; else ROOT_SIZE="256"; fi
+    if [ -n "$OVIRT_CONFIG_SIZE" ]; then CONFIG_SIZE=$OVIRT_CONFIG_SIZE; else CONFIG_SIZE="5"; fi
+    if [ -n "$OVIRT_LOGGING_SIZE" ]; then LOGGING_SIZE=$OVIRT_LOGGING_SIZE; else LOGGING_SIZE="256"; fi
+    if [ -n "$OVIRT_DATA_SIZE" ]; then DATA_SIZE=$OVIRT_DATA_SIZE; fi
+
+    MEM_SIZE=$(virsh -c qemu:///system nodeinfo | awk '/Memory size/ { print $3 }')
+    MEM_SIZE=$(echo "scale=0; $MEM_SIZE / 1024" | bc -l)
+    SWAP_SIZE=$MEM_SIZE
+}
+
+function resolve_sizes
+{
+    DATA_SIZE=$(echo "scale=0; ($SPACE - $BOOT_SIZE - $SWAP_SIZE - $ROOT_SIZE - $CONFIG_SIZE - $LOGGING_SIZE)" | bc -l)
+}
+
+function configure
+{
+    DEVICES=$(for drive in `hal-find-by-capability --capability storage`; do
+        info=$(lshal -u $drive -s)
+        if [[ $info =~ "storage.drive_type = 'disk'" ]]; then
+             lshal -u $drive -s | awk ' /block.device/ {
+                    match($0, "block.device = *'"'"'(.*)'"'"'", device)
+                    printf "%s ", device[1]
+            }'
+        fi
+    done)
+
+    DEVICES="$DEVICES Abort"
+
+    select DEVICE in $DEVICES
+    do
+        case "$DEVICE" in
+            "Abort") return ;;
+            *) 
+                DRIVE=$DEVICE
+                SPACE=$(for drive in `hal-find-by-capability --capability storage`; do
+                    info=$(lshal -u $drive -s)
+                    if [[ $info =~ $DRIVE ]]; then
+                         lshal -u $drive -s | awk ' /storage.size/ {
+                                match($0, "storage.size *= *([0-9]+)", device)
+                                printf "%s", device[1]
+                        }'
+                    fi
+                done)
+
+                SPACE=$(echo "scale=0; $SPACE / (1024 * 1024)" | bc -l)
+
+                for i in swap boot root logging config; do
+                    uc=$(echo $i|tr '[[:lower:]]' '[[:upper:]]')
+                    var=${uc}_SIZE
+                    eval "size=\$$var"
+                    read -p "Change $i partition size (currently $size MB)? "
+                    if [[ $REPLY =~ ^[0-9]+$ ]] && [[ $REPLY -gt 0 ]]; then
+                        eval "$var=$REPLY"
+                    else
+                        printf "Invalid value for $i. Retaining $size MB.\n"
+                    fi
+                done
+
+                resolve_sizes
+
+                return
+                ;;
+        esac
+    done
+}
+
+function review
+{
+    printf "\n"
+    if [ -n "$DRIVE" ]; then
+        printf "The local disk will be repartitioned as follows:\n"
+        printf "================================================\n"
+        printf "           Physical Hard Disk: ${DRIVE}\n"
+        printf "      Total storage available: ${SPACE} MB\n"
+        printf "          Swap partition size: ${SWAP_SIZE} MB\n"
+        printf "          Boot partition size: ${BOOT_SIZE} MB\n"
+        printf "  Installation partition size: ${ROOT_SIZE} MB\n"
+        printf " Configuration partition size: ${CONFIG_SIZE} MB\n"
+        printf "       Logging partition size: ${LOGGING_SIZE} MB\n"
+        printf "          Data partition size: ${DATA_SIZE} MB\n"
+        printf "\n"
+    else
+        printf "No storage device selected.\n"
+    fi
+}
+
+function perform_partitioning
+{
+    printf "\n"
+    if [ -n "$DRIVE" ]; then
+        printf "Preparing local storage. Please wait..."
+
+        {
+        vgroups=$(vgdisplay -C | awk '{ print $1" "; }')
+        vgremove -f $vgroups
+
+        dd if=/dev/zero of=$DRIVE bs=1K count=1
+        blockdev --rereadpt $DRIVE
+        partprobe -s $DRIVE
+
+        parted $DRIVE -s "mklabel gpt"
+        parted $DRIVE -s "mkpart primary ext2 0M ${BOOT_SIZE}M"
+        parted $DRIVE -s "mkpart primary ext2 ${BOOT_SIZE}M ${SPACE}M"
+        parted $DRIVE -s "set 2 lvm on"
+
+        pvcreate "$DRIVE"2
+        pvck
+        vgcreate /dev/HostVG "$DRIVE"2
+
+        lvcreate --name Swap    --size ${SWAP_SIZE}M    /dev/HostVG
+        lvcreate --name Root    --size ${ROOT_SIZE}M    /dev/HostVG
+        lvcreate --name Config  --size ${CONFIG_SIZE}M  /dev/HostVG
+        lvcreate --name Logging --size ${LOGGING_SIZE}M /dev/HostVG
+        lvcreate --name Data    -l 100%FREE             /dev/HostVG
+
+        mke2fs -j -T ext3 "$DRIVE"1         -L "BOOT"
+        tune2fs -c 0 -i 0 "$DRIVE"1
+        mkswap /dev/HostVG/Swap
+        mke2fs -j -T ext3 /dev/HostVG/Root    -L "ROOT"
+        tune2fs -c 0 -i 0 /dev/HostVG/Root
+        mke2fs -j -T ext3 /dev/HostVG/Config  -L "CONFIG"
+        tune2fs -c 0 -i 0 /dev/HostVG/Config
+        mke2fs -j -T ext3 /dev/HostVG/Logging -L "LOGGING"
+        tune2fs -c 0 -i 0 /dev/HostVG/Logging
+        mke2fs -j -T ext3 /dev/HostVG/Data    -L "DATA"
+        tune2fs -c 0 -i 0 /dev/HostVG/Data
+        } > /var/log/ovirt-partition.log 2>&1
+
+        printf "Completed!\n\n"
+    else
+        printf "No storage device selected.\n"
+    fi
+}
+
+function confirm
+{
+    printf "\n"
+    if [ -n "$DRIVE" ]; then
+        while true; do
+            printf "!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!\n"
+            printf "!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!\n"
+            printf "!!WARNING!!                                                                               !!WARNING!!\n"
+            printf "!!WARNING!!                                                                               !!WARNING!!\n"
+            printf "!!WARNING!!      If you proceed this will destroy all data on your local system, and      !!WARNING!!\n"
+            printf "!!WARNING!!             your hard disk will be irreversably reconfiguration.              !!WARNING!!\n"
+            printf "!!WARNING!!                                                                               !!WARNING!!\n"
+            printf "!!WARNING!!                                                                               !!WARNING!!\n"
+            printf "!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!\n"
+            printf "!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!\n"
+            printf "\n"
+            printf "\tContinue? (Y/n) "
+            read
+            case $REPLY in
+                Y|y)
+                    perform_partitioning; break ;;
+                N|n)  return ;;
+            esac
+        done
+    else
+        printf "No storage device selected!\n"
+    fi
+}
+
+init
+
+if [ "$1" == "AUTO" ]; then
+    DRIVE=$OVIRT_VOL
+    perform_partitioning
+    printf "[DONE]\n"
+    exit 0
+else
+    while true; do
+        resolve_sizes
+
+        OPTIONS="Configure Review Partition Quit"
+        PS3="Choose an option: "
+
+        printf "\n"
+
+        select OPTION in $OPTIONS
+        do
+            case "$OPTION" in
+                "Configure") configure ; break ;;
+                "Review")    review    ; break ;;
+                "Partition") confirm   ; break ;;
+                "Quit")      exit ;;
+            esac
+        done
+    done
+fi
diff --git a/scripts/ovirt-firstboot b/scripts/ovirt-firstboot
index 82d9e48..70a88f1 100755
--- a/scripts/ovirt-firstboot
+++ b/scripts/ovirt-firstboot
@@ -29,6 +29,11 @@
 
 start ()
 {
+    if [ -n "$OVIRT_VOL" ]; then
+        INTERACTIVE="N"
+        ovirt-config-storage AUTO
+    fi
+
     ovirt-config-setup
 }
 
@@ -52,4 +57,3 @@ case "$1" in
         echo "Usage: ovirt-firstboot {start}"
         exit 2
 esac
-
-- 
1.5.6.5




More information about the ovirt-devel mailing list