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
|