Magellan Linux

Contents of /trunk/virtualbox/virtualbox-config.sh

Parent Directory Parent Directory | Revision Log Revision Log


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