~smoser/+junk/powerkvm-install

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/bin/sh
set -f

Usage() {
    cat <<EOF
${0##*/} [user]

14.10 (utopic) supports kvm from inside ubuntu running in power-nv
This script gets necessary packages and sets up system to work.
EOF
}

[ "$1" = "-h" -o "$1" = "--help" ] && { Usage; exit 0; }

if [ "$(id -u)" != "0" ]; then
    exec sudo "$0" "$(id --user --name)"
fi
msg() { echo "info:" "$@" 1>&2; }
fail() { echo "error:" "$@" 1>&2; exit 1; }
run_or_fail() { "$@" || fail "$*"; }

user=${1:-${SUDO_USER:-none}}
group="kvm"
pkgs="qemu-system-ppc qemu-slof qemu-utils genisoimage"

filter_installed_packages() {
    # write to stdout, a list of packages not installed locally
    local fmt='${Package} ${Version}\n'
    LC_ALL=C dpkg-query --show "--showformat=${fmt}" "$@" 2>&1 | awk '
        $0 ~ /[Nn]o packages/ {
            sub("[.]$","",$NF);
            pkgs[n]=$NF;
            n=n+1;
        }
        $2 == "" {
                pkgs[n]=$1;
                n=n+1;
        };
        END { for(p in pkgs) {printf("%s ",pkgs[p])}; printf("\n"); }' n=0
}

set -e
needed=$(filter_installed_packages $pkgs)
if [ -n "$needed" ]; then
    msg "installing packages: $needed"
    run_or_fail apt-get update --quiet
    run_or_fail apt-get install --quiet --assume-yes $needed
else
    msg "no needed packages"
fi

if ! LANG=C ppc64_cpu --smt | grep -qi "is off"; then
    msg "setting ppc64_cpu --smt=off"
    run_or_fail ppc64_cpu --smt=off
else
    msg "smt was already off"
fi

if ! grep -q kvm_hv /proc/modules && ! grep -q kvm_pr /proc/modules; then
    msg "loading module kvm_hv"
    run_or_fail sh -c 'modprobe kvm_hv || modprobe kvm_pr'
else
    msg "kvm_hv already loaded"
fi

if [ "$user" != "none" -a "$group" != "none" ]; then
    gout=$(groups "$user")
    gout=" ${gout#*:} "
    if [ "${gout#* $group }" = "$gout" ]; then
        # to avoid dealing with new login. once user is in kvm, dont need this.
        msg "adding '$user' to '$group' and adding world write to /dev/kvm."
        run_or_fail chmod 666 /dev/kvm
        run_or_fail adduser "$user" "$group"
    else
        msg "user '$user' already in '$group'"
    fi
else
    msg "user or group was 'none', not modifying"
fi

exit 0