[Ovirt-devel] [PATCH node] Refactoring of o-c-storage and logging in general to correct some bugs
Perry Myers
pmyers at redhat.com
Thu Jan 22 04:16:32 UTC 2009
* Allow o-c-storage to be reentrant by properly wiping out old partitions
and lvm after they have been created. Needed to fix firstboot scripts
to use /tmp/ovirt.log to prevent open file descriptor when unmounting/
destroying /var/log partition/lvm.
* Correct size calculation problems (1000 vs 1024 based MB) so that the
LVM partition actually would use up the remainder of the disk
* Cleanup of output for size configuration prompting including
calculation of size remaining after each entry
* If invalid size entries are entered, user is prompted until a valid
entry is entered
* set +e is done at end of perform_partitioning to undo set -e at
top of function
* MEM_SIZE_MB fixed (awk doesn't need file cat'd to it, can just open
file directly)
Signed-off-by: Perry Myers <pmyers at redhat.com>
---
scripts/ovirt-config-setup | 6 ++-
scripts/ovirt-config-storage | 103 +++++++++++++++++++++++-------------------
scripts/ovirt-firstboot | 4 +-
scripts/ovirt-functions | 25 +++++++++-
4 files changed, 86 insertions(+), 52 deletions(-)
diff --git a/scripts/ovirt-config-setup b/scripts/ovirt-config-setup
index c39c76a..270ce3d 100755
--- a/scripts/ovirt-config-setup
+++ b/scripts/ovirt-config-setup
@@ -47,7 +47,11 @@ while true; do
printf "\nERROR: $OPTION FAILED. "
printf "See $OVIRT_LOGFILE\n\n"
fi
- } 2>&1 | $TEE;
+ } 2>&1 | tee -a $OVIRT_TMP_LOGFILE;
+ if [ -f $OVIRT_TMP_LOGFILE ]; then
+ cat $OVIRT_TMP_LOGFILE >> $OVIRT_LOGFILE
+ rm -f $OVIRT_TMP_LOGFILE
+ fi
break ;;
esac
done
diff --git a/scripts/ovirt-config-storage b/scripts/ovirt-config-storage
index a34203b..3a49523 100755
--- a/scripts/ovirt-config-storage
+++ b/scripts/ovirt-config-storage
@@ -32,21 +32,22 @@ swap_min_size=5
get_selected_drive_size()
{
start_log
+ local size=
local udi=$(hal-find-by-property --key block.device --string $DRIVE)
if [ -z "$udi" ]; then
# If hal didn't find the device, it could be a virtio block device
# In this case, use sfdisk -s to get the size
size=$(sfdisk -s $DRIVE)
- SPACE=$(echo "scale=0; $size / 1024" | bc -l)
+ size=$(echo "scale=0; $size * 1024" | bc -l)
else
size=$(hal-get-property --udi "$udi" --key storage.size)
if [ $size -eq 0 ]; then
# disk is probably hot-swappable, use different HAL key
size=$(hal-get-property --udi "$udi" --key storage.removable.media_size)
fi
- SPACE=$(echo "scale=0; $size / (1024 * 1024)" | bc -l)
fi
+ SPACE=$(echo "scale=0; $size / (1024 * 1024)" | bc -l)
log "Selected Device: $DRIVE ($SPACE MB)"
stop_log
}
@@ -68,7 +69,7 @@ check_partition_sizes()
"+ $CONFIG_SIZE + $LOGGING_SIZE + $min_data_size" | bc -l)
if [ $need_size -gt $disk_size ]; then
- gap_size=$(echo "scale=0; $need_size-$disk_size;" | bc -l)
+ local gap_size=$(echo "scale=0; $need_size-$disk_size;" | bc -l)
printf "\n"
printf "=============================================================\n"
printf "The target storage device is too small for the desired sizes:\n"
@@ -150,31 +151,49 @@ do_configure()
get_selected_drive_size
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"
- printf "If the partition is enabled, it will have a minimum valid size.\n"
- printf "For the Data partition, a size of -1 indicates that the\n"
- printf "partition should use up the remaining space on the disk.\n\n"
-
- for i in boot swap root config logging data ; do
+ printf "* Enter partition sizes in MB.\n"
+ printf "* A value of 0 indicates the partition should be disabled.\n"
+ printf "* If the partition is enabled, it will have a minimum valid size.\n"
+ printf "* Size remaining value is approximate due to cylinder rounding\n"
+ printf " during partitioning.\n"
+ printf "* For the Data partition, a size of -1 indicates that the\n"
+ printf " partition should use up the remaining space on the disk.\n\n"
+
+ local space_left=$SPACE
+ for part in boot swap root config logging data ; do
part_regexp="^0$"
- if [ "$i" = "data" ]; then
+ if [ "$part" = "data" ]; then
part_regexp="^\-1|0$"
fi
- uc=$(echo $i|tr '[[:lower:]]' '[[:upper:]]')
+ uc=$(echo $part|tr '[[:lower:]]' '[[:upper:]]')
size_var=${uc}_SIZE
eval "size=\$$size_var"
- min_size_var=${i}_min_size
+ min_size_var=${part}_min_size
eval "min_size=\$$min_size_var"
- read -ep "Change $i partition size. (Current $size MB, Minimum $min_size MB)? "
- r=$REPLY
- test -z "$r" && r=$size
- if [[ $r =~ ^-*[0-9]+$ ]] && [[ $r -ge $min_size ||
- $r =~ $part_regexp ]] ; then
- eval "$size_var=$r"
- else
- printf "invalid $i size: '$r' retaining $size MB.\n"
- fi
+
+ while true; do
+ printf "\nChange $part partition size. (Def. $size MB), "
+ printf "Min. $min_size MB, "
+ printf "Max. ~$space_left MB)\n"
+ read -ep "? "
+ mb_input=$REPLY
+ test -z "$mb_input" && mb_input=$size
+ local size_used=0
+ if [[ $mb_input =~ ^-*[0-9]+$ ]]; then
+ if [[ $mb_input -ge $min_size || $mb_input =~ $part_regexp ]] \
+ && [[ $mb_input -le $space_left ]] ; then
+ eval "$size_var=$mb_input"
+ size_used=$mb_input
+ break;
+ else
+ printf "invalid $part size: $mb_input. "
+ printf "Does not fall into specified range.\n"
+ fi
+ else
+ printf "invalid $part size: '$mb_input'.\n"
+ fi
+ done
+ space_left=$(echo "scale=0;$space_left - $size_used" | bc -l)
done
if ! check_partition_sizes; then
@@ -230,13 +249,17 @@ EOF
# - remove LVM volumes and groups
wipe_lvm_on_disk()
{
+ unmount_logging
for vg in $(pvdisplay -c $DRIVE* 2>/dev/null|awk -F: '{print $2}'|sort -u); do
for d in $(grep $vg /proc/mounts|awk '{print $2}'); do
+ log "Unmounting $d"
umount $d
done
for lv in $(lvdisplay -c $vg|awk -F: '{print $1}'); do
+ log "Removing $lv"
lvremove -f $lv
done
+ log "Removing $vg"
vgremove -f $vg
done
}
@@ -248,40 +271,27 @@ perform_partitioning()
return
fi
- DRIVE_FILE=$(echo $DRIVE | tr '/' '_')
- if [ -f /tmp/ovirt-config-storage-$DRIVE_FILE ]; then
- printf "\n\nERROR:\n"
- printf "Storage Configuration has already been run for $DRIVE.\n"
- printf "To run it again, please reboot the Node from USB/cdrom/PXE\n"
- printf "in stand-alone mode.\n\n\n"
- return 1
- fi
-
- touch /tmp/ovirt-config-storage-$DRIVE_FILE
-
start_log
log "Starting partitioning of $DRIVE"
- log "Removing old LVM partitions"
- wipe_lvm_on_disk
-
# Exit upon any failure.
set -e
+ log "Removing old LVM partitions"
+ wipe_lvm_on_disk
+
# FIXME: save a backup copy, just in case?
log "Wiping old boot sector"
dd if=/dev/zero of=$DRIVE bs=1024K count=1
blockdev --rereadpt $DRIVE
partprobe -s $DRIVE
- if [ "$BOOT_SIZE" -lt 10 ]; then
- # ensure minimal BOOT partition
- BOOT_SIZE=10
- fi
log "Creating boot partition"
+ 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)
parted $DRIVE -s "mklabel ${LABEL_TYPE}"
- parted $DRIVE -s "mkpartfs primary ext2 0M ${BOOT_SIZE}M"
- parted $DRIVE -s "mkpart primary ext2 ${BOOT_SIZE}M ${SPACE}M"
+ parted $DRIVE -s "mkpartfs primary ext2 0M ${boot_size_si}M"
+ parted $DRIVE -s "mkpart primary ext2 ${boot_size_si}M -1"
parted $DRIVE -s "set 1 boot on"
parted $DRIVE -s "set 2 lvm on"
parted $DRIVE -s "print"
@@ -307,19 +317,19 @@ perform_partitioning()
if [ "$SWAP_SIZE" -gt 0 ]; then
log "Creating swap partition"
- lvcreate --name Swap --size ${SWAP_SIZE}M /dev/HostVG
+ lvcreate --name Swap --size ${SWAP_SIZE}M /dev/HostVG
mkswap -L "SWAP" /dev/HostVG/Swap
echo "/dev/HostVG/Swap swap swap defaults 0 0" >> /etc/fstab
fi
if [ "$ROOT_SIZE" -gt 0 ]; then
log "Creating root partition"
- lvcreate --name Root --size ${ROOT_SIZE}M /dev/HostVG
+ lvcreate --name Root --size ${ROOT_SIZE}M /dev/HostVG
mke2fs -j /dev/HostVG/Root -L "ROOT"
tune2fs -c 0 -i 0 /dev/HostVG/Root
fi
if [ "$CONFIG_SIZE" -gt 0 ]; then
log "Creating config partition"
- lvcreate --name Config --size ${CONFIG_SIZE}M /dev/HostVG
+ lvcreate --name Config --size ${CONFIG_SIZE}M /dev/HostVG
mke2fs -j /dev/HostVG/Config -L "CONFIG"
tune2fs -c 0 -i 0 /dev/HostVG/Config
fi
@@ -359,6 +369,7 @@ perform_partitioning()
mount_logging
log "Completed!"
+ set +e
stop_log
}
@@ -402,7 +413,7 @@ do_confirm()
done
}
-MEM_SIZE_MB=$(cat /proc/meminfo | awk '/MemTotal:/ { print $2 }')
+MEM_SIZE_MB=$(awk '/MemTotal:/ { print $2 }' /proc/meminfo)
case $MEM_SIZE_MB in
''|*[^0-9]*) die failed to get system memory size;;
esac
diff --git a/scripts/ovirt-firstboot b/scripts/ovirt-firstboot
index 575fa89..403f66a 100755
--- a/scripts/ovirt-firstboot
+++ b/scripts/ovirt-firstboot
@@ -60,9 +60,7 @@ start ()
fi
disable_firstboot
- start_log
- ovirt_store_firstboot_config
- stop_log
+ ovirt_store_firstboot_config > $OVIRT_LOGFILE 2>&1
}
case "$1" in
diff --git a/scripts/ovirt-functions b/scripts/ovirt-functions
index 7f97bb9..fa2d025 100644
--- a/scripts/ovirt-functions
+++ b/scripts/ovirt-functions
@@ -1,7 +1,7 @@
# -*-Shell-script-*-
OVIRT_LOGFILE=/var/log/ovirt.log
-TEE="tee -a $OVIRT_LOGFILE"
+OVIRT_TMP_LOGFILE=/tmp/ovirt.log
_log_status=1
# label of the oVirt partition
@@ -37,7 +37,7 @@ start_log() {
if [ "$_log_status" = 1 ]; then
exec 6>&1
exec 7>&2
- exec 1>>$OVIRT_LOGFILE
+ exec 1>>$OVIRT_TMP_LOGFILE
exec 2>&1
_log_status=0
fi
@@ -278,6 +278,27 @@ mount_logging() {
fi
}
+unmount_logging() {
+ if ! grep -q " /var/log ext3" /proc/mounts; then
+ return 0
+ fi
+
+ log "Unmounting log partition"
+ service rsyslog stop
+ if [ -e /var/log.bak ]; then
+ rm -rf /var/log.bak
+ fi
+ cp -av /var/log /var/log.bak
+
+ umount /var/log
+ cp -av /var/log.bak/* /var/log
+ restorecon -rv /var/log
+ rm -Rf /var/log.bak
+ service rsyslog start
+
+ return 0
+}
+
# mount data partition
mount_data() {
if grep -q " /data ext3" /proc/mounts; then
--
1.6.0.6
More information about the ovirt-devel
mailing list