diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /scripts/qemu-guest-agent | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip | |
Diffstat (limited to 'scripts/qemu-guest-agent')
| -rwxr-xr-x | scripts/qemu-guest-agent/fsfreeze-hook | 33 | ||||
| -rwxr-xr-x | scripts/qemu-guest-agent/fsfreeze-hook.d/mysql-flush.sh.sample | 56 | 
2 files changed, 89 insertions, 0 deletions
| diff --git a/scripts/qemu-guest-agent/fsfreeze-hook b/scripts/qemu-guest-agent/fsfreeze-hook new file mode 100755 index 00000000..c27b29f2 --- /dev/null +++ b/scripts/qemu-guest-agent/fsfreeze-hook @@ -0,0 +1,33 @@ +#!/bin/sh + +# This script is executed when a guest agent receives fsfreeze-freeze and +# fsfreeze-thaw command, if it is specified in --fsfreeze-hook (-F) +# option of qemu-ga or placed in default path (/etc/qemu/fsfreeze-hook). +# When the agent receives fsfreeze-freeze request, this script is issued with +# "freeze" argument before the filesystem is frozen. And for fsfreeze-thaw +# request, it is issued with "thaw" argument after filesystem is thawed. + +LOGFILE=/var/log/qga-fsfreeze-hook.log +FSFREEZE_D=$(dirname -- "$0")/fsfreeze-hook.d + +# Check whether file $1 is a backup or rpm-generated file and should be ignored +is_ignored_file() { +    case "$1" in +        *~ | *.bak | *.orig | *.rpmnew | *.rpmorig | *.rpmsave | *.sample) +            return 0 ;; +    esac +    return 1 +} + +# Iterate executables in directory "fsfreeze-hook.d" with the specified args +[ ! -d "$FSFREEZE_D" ] && exit 0 +for file in "$FSFREEZE_D"/* ; do +    is_ignored_file "$file" && continue +    [ -x "$file" ] || continue +    printf "$(date): execute $file $@\n" >>$LOGFILE +    "$file" "$@" >>$LOGFILE 2>&1 +    STATUS=$? +    printf "$(date): $file finished with status=$STATUS\n" >>$LOGFILE +done + +exit 0 diff --git a/scripts/qemu-guest-agent/fsfreeze-hook.d/mysql-flush.sh.sample b/scripts/qemu-guest-agent/fsfreeze-hook.d/mysql-flush.sh.sample new file mode 100755 index 00000000..2b4fa3ae --- /dev/null +++ b/scripts/qemu-guest-agent/fsfreeze-hook.d/mysql-flush.sh.sample @@ -0,0 +1,56 @@ +#!/bin/sh + +# Flush MySQL tables to the disk before the filesystem is frozen. +# At the same time, this keeps a read lock in order to avoid write accesses +# from the other clients until the filesystem is thawed. + +MYSQL="/usr/bin/mysql" +MYSQL_OPTS="-uroot" #"-prootpassword" +FIFO=/var/run/mysql-flush.fifo + +# Check mysql is installed and the server running +[ -x "$MYSQL" ] && "$MYSQL" $MYSQL_OPTS < /dev/null || exit 0 + +flush_and_wait() { +    printf "FLUSH TABLES WITH READ LOCK \\G\n" +    trap 'printf "$(date): $0 is killed\n">&2' HUP INT QUIT ALRM TERM +    read < $FIFO +    printf "UNLOCK TABLES \\G\n" +    rm -f $FIFO +} + +case "$1" in +    freeze) +        mkfifo $FIFO || exit 1 +        flush_and_wait | "$MYSQL" $MYSQL_OPTS & +        # wait until every block is flushed +        while [ "$(echo 'SHOW STATUS LIKE "Key_blocks_not_flushed"' |\ +                 "$MYSQL" $MYSQL_OPTS | tail -1 | cut -f 2)" -gt 0 ]; do +            sleep 1 +        done +        # for InnoDB, wait until every log is flushed +        INNODB_STATUS=$(mktemp /tmp/mysql-flush.XXXXXX) +        [ $? -ne 0 ] && exit 2 +        trap "rm -f $INNODB_STATUS; exit 1" HUP INT QUIT ALRM TERM +        while :; do +            printf "SHOW ENGINE INNODB STATUS \\G" |\ +                "$MYSQL" $MYSQL_OPTS > $INNODB_STATUS +            LOG_CURRENT=$(grep 'Log sequence number' $INNODB_STATUS |\ +                          tr -s ' ' | cut -d' ' -f4) +            LOG_FLUSHED=$(grep 'Log flushed up to' $INNODB_STATUS |\ +                          tr -s ' ' | cut -d' ' -f5) +            [ "$LOG_CURRENT" = "$LOG_FLUSHED" ] && break +            sleep 1 +        done +        rm -f $INNODB_STATUS +        ;; + +    thaw) +        [ ! -p $FIFO ] && exit 1 +        echo > $FIFO +        ;; + +    *) +        exit 1 +        ;; +esac | 
