Contents of /trunk/virtualbox/virtualbox-guest-config.sh
Parent Directory | Revision Log
Revision 1685 -
(show annotations)
(download)
(as text)
Sun Mar 4 12:29:58 2012 UTC (12 years, 6 months ago) by niro
File MIME type: application/x-sh
File size: 6032 byte(s)
Sun Mar 4 12:29:58 2012 UTC (12 years, 6 months ago) by niro
File MIME type: application/x-sh
File size: 6032 byte(s)
-added config script for guest-addtions
1 | #!/bin/bash |
2 | # $Id$ |
3 | # Configures virtualbox for Magellan-Linux guests |
4 | |
5 | # get INSTALL_DIR location |
6 | source /etc/vbox/vbox.cfg |
7 | |
8 | VBOXVERSION="$(< ${INSTALL_DIR}/version)" |
9 | VBOXMODEXT=ko |
10 | VBOXGUESTMODULE=vboxguest |
11 | VBOXSFMODULE=vboxsf |
12 | VBOXVIDEOMODULE=vboxsf |
13 | KERNELMODULES=( "${VBOXGUESTMODULE}" "${VBOXSFMODULE}" "${VBOXVIDEOMODULE}" ) |
14 | |
15 | COLRED="\033[1;6m\033[31m" |
16 | COLGREEN="\033[1;6m\033[32m" |
17 | COLDEFAULT="\033[0m" |
18 | |
19 | if [[ ${NOCOLORS} = true ]] |
20 | then |
21 | COLRED="" |
22 | COLGREEN="" |
23 | COLDEFAULT="" |
24 | fi |
25 | |
26 | die() { echo -e "${COLRED}$@${COLDEFAULT}"; exit 1; } |
27 | mecho() { echo -e "${COLGREEN}$@${COLDEFAULT}"; } |
28 | usage() |
29 | { |
30 | echo "Usage: $(basename $0 .sh) [opts]" |
31 | echo "Options are:" |
32 | echo " --kernel-version - build modules for given kernel version not current" |
33 | echo " --kernel-sources - use kernel sources different from default path" |
34 | echo " --force - force a rebuild of the kernel modules even if they exist" |
35 | echo " --verbose - be verbose while building the modules" |
36 | echo " --help - show this help" |
37 | exit |
38 | } |
39 | |
40 | # must be root |
41 | [[ $(id -u) != 0 ]] && die "You must be r00t!" |
42 | |
43 | # check for given argvs |
44 | for i in $* |
45 | do |
46 | case $1 in |
47 | --kernel-version) shift; KERNEL_VERSION="$1" ;; |
48 | --kernel-sources) shift; KERNEL_SOURCES="$1" ;; |
49 | --force) FORCED_REBUILD="1" ;; |
50 | --verbose) VERBOSE="1" ;; |
51 | --help) usage ;; |
52 | esac |
53 | shift |
54 | done |
55 | |
56 | # some sane defaults |
57 | [[ -z ${KERNEL_VERSION} ]] && KERNEL_VERSION="$(uname -r)" |
58 | [[ -z ${KERNEL_SOURCES} ]] && KERNEL_SOURCES="/lib/modules/${KERNEL_VERSION}/source" |
59 | [[ -z ${FORCED_REBUILD} ]] && FORCED_REBUILD="0" |
60 | [[ -z ${VERBOSE} ]] && VERBOSE="0" |
61 | [[ ${VERBOSE} = 0 ]] && makequiet="-s" |
62 | |
63 | mecho "Running $(basename $0) for kernelversion ${KERNEL_VERSION} ..." |
64 | |
65 | # first stop the vboxguest service |
66 | if [[ -x $(which systemctl) ]] |
67 | then |
68 | systemctl is-active vboxguest.service && systemctl stop vboxguest.service |
69 | systemctl is-enabled vboxguest.service && systemctl disable vboxguest.service |
70 | elif [[ -x /etc/rc.d/init.d/vboxguest ]] |
71 | then |
72 | /etc/rc.d/init.d/vboxguest stop |
73 | rc-config del vboxguest |
74 | fi |
75 | |
76 | # check module version and recompile if it doesen't fit else break here |
77 | compile="yes" |
78 | for module in ${KERNELMODULES[*]} |
79 | do |
80 | if [[ -f /lib/modules/${KERNEL_VERSION}/misc/${module}.${VBOXMODEXT} ]] |
81 | then |
82 | myver=$(modinfo -k ${KERNEL_VERSION} -F version ${module} | sed "s:\(.*\)_.*:\1:") |
83 | if [[ ${VBOXVERSION} = ${myver} ]] && [[ ${FORCED_REBUILD} = 0 ]] |
84 | then |
85 | compile="no" |
86 | fi |
87 | fi |
88 | done |
89 | |
90 | # try to unload the modules in reverse order to honor dependencies |
91 | count=${#KERNELMODULES[*]} |
92 | for (( i=count-1; i>=0; i-- )) |
93 | do |
94 | if [[ -f /lib/modules/${KERNEL_VERSION}/misc/${KERNELMODULES[${i}]}.${VBOXMODEXT} ]] |
95 | then |
96 | if [[ -n $(grep "${KERNELMODULES[${i}]} " /proc/modules 2> /dev/null) ]] |
97 | then |
98 | mecho "Unloading ${KERNELMODULES[${i}]} module ..." |
99 | modprobe -r ${KERNELMODULES[${i}]} |
100 | fi |
101 | fi |
102 | done |
103 | |
104 | if [[ ${compile} = yes ]] |
105 | then |
106 | if [ ! -f ${KERNEL_SOURCES}/include/linux/version.h ] |
107 | then |
108 | die "No kernel sources for kernel ${KERNEL_VERSION} found! Aborting." |
109 | fi |
110 | |
111 | for module in ${KERNELMODULES[*]} |
112 | do |
113 | if [[ -f /lib/modules/${KERNEL_VERSION}/misc/${module}.${VBOXMODEXT} ]] |
114 | then |
115 | mecho "Removing old ${module} module ..." |
116 | rm -f /lib/modules/${KERNEL_VERSION}/misc/${module}.${VBOXMODEXT} |
117 | fi |
118 | done |
119 | |
120 | # compile the modules |
121 | pushd ${INSTALL_DIR}/additions/src > /dev/null |
122 | for module in ${KERNELMODULES[*]} |
123 | do |
124 | mecho "Compiling ${module} module ..." |
125 | make ${makequiet} -C ${module} KBUILD_VERBOSE=${VERBOSE} clean || die "mod-compile ${module}" |
126 | |
127 | # need some symver from vboxmodule (must be run after clean!) |
128 | if [[ ${module} = ${VBOXSFMODULE} ]] |
129 | then |
130 | [[ -f ${VBOXGUESTMODULE}/Module.symvers ]] && cp ${VBOXGUESTMODULE}/Module.symvers ${module} |
131 | fi |
132 | |
133 | make ${makequiet} -C ${module} KBUILD_VERBOSE=${VERBOSE} || die "mod-compile ${module}" |
134 | |
135 | # install the modules |
136 | install -d /lib/modules/${KERNEL_VERSION}/misc |
137 | install -m0644 ${module}/${module}.${VBOXMODEXT} /lib/modules/${KERNEL_VERSION}/misc || die "mod-install ${module}" |
138 | done |
139 | # do no clean before all modules are build, or required symbols and objects get deleted |
140 | for module in ${KERNELMODULES[*]} |
141 | do |
142 | # clean up |
143 | make ${makequiet} -C ${module} KBUILD_VERBOSE=${VERBOSE} clean || die "mod-compile ${module}" |
144 | done |
145 | popd > /dev/null |
146 | |
147 | # calc module dependencies |
148 | mecho "Calculating module dependencies ..." |
149 | depmod -a ${KERNEL_VERSION} |
150 | |
151 | # re-read udev rules to grant the right permissions |
152 | if [[ -x $(which udevadm) ]] |
153 | then |
154 | mecho "Reloading udev configuration ..." |
155 | udevadm control --reload-rules |
156 | fi |
157 | fi |
158 | |
159 | # load the module |
160 | if [[ x$(uname -r) = x${KERNEL_VERSION} ]] |
161 | then |
162 | for module in ${KERNELMODULES[*]} |
163 | do |
164 | mecho "Loading kernel-module ${module} ..." |
165 | modprobe ${module} |
166 | done |
167 | |
168 | if [ $(echo ${KERNEL_VERSION%%-*} | sed 's:\.::g') -ge 2639 ] |
169 | then |
170 | # fixes NMI warnings with kernels >=2.6.31: |
171 | # vboxdrv: Warning: 2.6.31+ kernel detected. Most likely the hardware performance |
172 | # vboxdrv: counter framework which can generate NMIs is active. |
173 | mecho "Disabled hardware performance counter NMIs ..." |
174 | echo 2 > /proc/sys/kernel/perf_event_paranoid |
175 | |
176 | elif [ $(echo ${KERNEL_VERSION%%-*} | sed 's:\.::g') -ge 2631 ] |
177 | then |
178 | # fixes NMI warnings with kernels >=2.6.31: |
179 | # vboxdrv: Warning: 2.6.31+ kernel detected. Most likely the hardware performance |
180 | # vboxdrv: counter framework which can generate NMIs is active. |
181 | mecho "Disabled hardware performance counter NMIs ..." |
182 | echo 2 > /proc/sys/kernel/perf_counter_paranoid |
183 | fi |
184 | else |
185 | echo -e ${COLRED} |
186 | echo "Your current running kernel does not match the the module target." |
187 | echo "You must boot into your target kernel and load the modules manually," |
188 | echo "before you can use virtualbox." |
189 | echo -en ${COLDEFAULT} |
190 | fi |
191 | |
192 | # start the vboxguest service |
193 | if [[ -x $(which systemctl) ]] |
194 | then |
195 | systemctl enable vboxguest.service |
196 | systemctl start vboxguest.service |
197 | elif [[ -x /etc/rc.d/init.d/vboxguest ]] |
198 | then |
199 | rc-config add vboxguest |
200 | /etc/rc.d/init.d/vboxguest stop |
201 | fi |
202 | |
203 | echo |
204 | mecho "Virtualbox guest-additions are now configured for your system." |
205 | echo |
206 | |
207 | exit 0 |