| 1 |
#! /bin/sh -e
|
| 2 |
|
| 3 |
. /usr/share/debconf/confmodule
|
| 4 |
|
| 5 |
logfile=/var/log/messages
|
| 6 |
|
| 7 |
log() {
|
| 8 |
logger -t kernel-installer "$@"
|
| 9 |
}
|
| 10 |
error() {
|
| 11 |
log "error: $*"
|
| 12 |
}
|
| 13 |
warning() {
|
| 14 |
log "warning: $*"
|
| 15 |
}
|
| 16 |
info() {
|
| 17 |
log "info: $*"
|
| 18 |
}
|
| 19 |
|
| 20 |
# =================== Pick the kernel package =========================
|
| 21 |
|
| 22 |
# find all packages implementing 'kernel-image'. Is there a better
|
| 23 |
# way? [pere 2003-02-16]
|
| 24 |
|
| 25 |
chroot="chroot /target"
|
| 26 |
|
| 27 |
db_progress START 0 5 kernel-installer/progress/title
|
| 28 |
|
| 29 |
db_progress INFO kernel-installer/progress/step_locate
|
| 30 |
|
| 31 |
# Fetch the current default
|
| 32 |
if db_get debian-installer/kernel/image && [ "$RET" ] ; then
|
| 33 |
kernel="$RET"
|
| 34 |
fi
|
| 35 |
|
| 36 |
# the busybox do not support 'uniq' and 'sort -r' at
|
| 37 |
# the moment [pere 2003-02-06]
|
| 38 |
|
| 39 |
kernel_list=/tmp/available_kernels.txt
|
| 40 |
kernel_update_list() {
|
| 41 |
# Using 'uniq' to avoid listing the same kernel more then once.
|
| 42 |
$chroot apt-cache search kernel-image | grep ^kernel-image | \
|
| 43 |
cut -d" " -f1 | /target/usr/bin/uniq > $kernel_list
|
| 44 |
}
|
| 45 |
|
| 46 |
kernel_present() {
|
| 47 |
if grep -q "^$1\$" $kernel_list ; then
|
| 48 |
true
|
| 49 |
else
|
| 50 |
false
|
| 51 |
fi
|
| 52 |
}
|
| 53 |
|
| 54 |
# Using 'sort -r' to get the newest kernel version at the start of the
|
| 55 |
# list (ie 2.4.20 above 2.2.20). This is in conflict with getting the
|
| 56 |
# most generic architecture first (386 above 686).
|
| 57 |
|
| 58 |
kernel_update_list
|
| 59 |
kernels=`/target/usr/bin/sort -r $kernel_list| tr '\n' ',' | sed -e 's/,$//'`
|
| 60 |
|
| 61 |
info "Found kernels '$kernels'"
|
| 62 |
|
| 63 |
if [ "$kernels" ] ; then
|
| 64 |
db_subst kernel-installer/which-kernel KERNELS "$kernels"
|
| 65 |
else
|
| 66 |
db_subst kernel-installer/no-kernels-found KERNEL "$kernel"
|
| 67 |
db_input critical kernel-installer/no-kernels-found || [ $? -eq 30 ]
|
| 68 |
db_go
|
| 69 |
db_progress STOP
|
| 70 |
exit 1
|
| 71 |
fi
|
| 72 |
|
| 73 |
db_progress STEP 1
|
| 74 |
db_progress INFO kernel-installer/progress/step_select
|
| 75 |
|
| 76 |
# Try to make current rootskel setting the default, make sure it is
|
| 77 |
# available first.
|
| 78 |
if kernel_present "$kernel" ; then
|
| 79 |
# Current selection is available, nothing to do
|
| 80 |
:
|
| 81 |
else
|
| 82 |
# Pick the first in the list
|
| 83 |
kernel=`echo "$kernels" | cut -d, -f1`
|
| 84 |
fi
|
| 85 |
|
| 86 |
# Pick a good default choice, based on the available kernels and
|
| 87 |
# perhaps /proc/cpuinfo.
|
| 88 |
ARCH=`udpkg --print-architecture`
|
| 89 |
|
| 90 |
# Should this instead be located in small script fragments, named
|
| 91 |
# after their architecture? Something like this:
|
| 92 |
# [ -f /usr/lib/kernel-installer/$ARCH ] && . /usr/lib/kernel-installer/$ARCH
|
| 93 |
trykernel=
|
| 94 |
separate_pcmcia_modules=n
|
| 95 |
case "$ARCH" in
|
| 96 |
i386*)
|
| 97 |
version=2.4
|
| 98 |
separate_pcmcia_modules=y
|
| 99 |
MODEL=`grep 'model name' /proc/cpuinfo | cut -d: -f2`
|
| 100 |
if dmesg | grep -q ^Processors:; then
|
| 101 |
CPUS=`dmesg | grep ^Processors: | cut -d: -f2`
|
| 102 |
else
|
| 103 |
CPUS=1
|
| 104 |
fi
|
| 105 |
case "$MODEL" in
|
| 106 |
" Intel(R) Pentium(R) 4"*)
|
| 107 |
if test $CPUS -eq 1; then
|
| 108 |
trykernel=kernel-image-$version-686
|
| 109 |
else
|
| 110 |
trykernel=kernel-image-$version-686-smp
|
| 111 |
fi
|
| 112 |
;;
|
| 113 |
" AMD Athlon(tm) Processor"*)
|
| 114 |
if test $CPUS -eq 1; then
|
| 115 |
trykernel=kernel-image-$version-k7
|
| 116 |
else
|
| 117 |
trykernel=kernel-image-$version-k7-smp
|
| 118 |
fi
|
| 119 |
;;
|
| 120 |
*)
|
| 121 |
trykernel=kernel-image-$version-386
|
| 122 |
;;
|
| 123 |
esac
|
| 124 |
;;
|
| 125 |
sparc)
|
| 126 |
version=2.4.21
|
| 127 |
MODEL=`uname -m`
|
| 128 |
CPUS=`grep 'ncpus probed' /proc/cpuinfo | cut -d: -f2`
|
| 129 |
case "$MODEL" in
|
| 130 |
sparc)
|
| 131 |
if [ "$CPUS" -eq 1 ]; then
|
| 132 |
trykernel=kernel-image-$version-sun4cdm
|
| 133 |
else
|
| 134 |
trykernel=kernel-image-$version-sun4dm-smp
|
| 135 |
fi
|
| 136 |
;;
|
| 137 |
sparc64)
|
| 138 |
if [ "$CPUS" -eq 1 ]; then
|
| 139 |
trykernel=kernel-image-$version-sun4u
|
| 140 |
else
|
| 141 |
trykernel=kernel-image-$version-sun4u-smp
|
| 142 |
fi
|
| 143 |
;;
|
| 144 |
esac
|
| 145 |
;;
|
| 146 |
powerpc)
|
| 147 |
version=2.4.22 #hack, hack!
|
| 148 |
MODEL=`/bin/archdetect`
|
| 149 |
case "$MODEL" in
|
| 150 |
"powerpc/powermac_newworld")
|
| 151 |
trykernel=kernel-image-$version-powerpc
|
| 152 |
;;
|
| 153 |
# what's below is probably nonsense, porters have to start building 2.4 kernels for d-i!
|
| 154 |
# But at least the infrastructure will be there and these are the latest versions in
|
| 155 |
# the archive.
|
| 156 |
"powerpc/powermac_oldworld")
|
| 157 |
trykernel=kernel-image-$version-powerpc
|
| 158 |
;;
|
| 159 |
"powerpc/prep")
|
| 160 |
trykernel=kernel-image-2.2.20-prep
|
| 161 |
;;
|
| 162 |
# do we need a special case here for powerpc/chrp_pegasos?
|
| 163 |
"powerpc/chrp")
|
| 164 |
trykernel=kernel-image-2.2.20-chrp
|
| 165 |
;;
|
| 166 |
"powerpc/amiga")
|
| 167 |
trykernel=kernel-image-2.4.20-apus
|
| 168 |
;;
|
| 169 |
*)
|
| 170 |
log "warning: Unknown $ARCH subarchitecture '$MODEL'."
|
| 171 |
;;
|
| 172 |
esac
|
| 173 |
;;
|
| 174 |
mips*)
|
| 175 |
MODEL=`/bin/archdetect`
|
| 176 |
case "$MODEL" in
|
| 177 |
# big endian
|
| 178 |
mips/r4k-ip22) trykernel=kernel-image-*-r4k-ip22 ;;
|
| 179 |
mips/r5k-ip22) trykernel=kernel-image-*-r5k-ip22 ;;
|
| 180 |
|
| 181 |
# little endian
|
| 182 |
mipsel/r3k-kn02) trykernel=kernel-image-*-r3k-kn02 ;;
|
| 183 |
mipsel/r4k-kn04) trykernel=kernel-image-*-r4k-kn04 ;;
|
| 184 |
|
| 185 |
# sorry, no luck
|
| 186 |
*) log "warning: Unknown $ARCH subarchitecture '$MODEL'." ;;
|
| 187 |
esac
|
| 188 |
;;
|
| 189 |
ia64)
|
| 190 |
version=2.4.20 #hack, hack!
|
| 191 |
# Running a UP kernel for install atm, so don't know how to detect
|
| 192 |
# whether SMP is needed. Assume SMP for now.
|
| 193 |
if grep -q Itanium /proc/cpuinfo; then
|
| 194 |
family=itanium
|
| 195 |
else
|
| 196 |
family=mckinley
|
| 197 |
fi
|
| 198 |
trykernel=kernel-image-$version-$family-smp
|
| 199 |
;;
|
| 200 |
*)
|
| 201 |
log "warning: Unknown architecture '$ARCH'."
|
| 202 |
;;
|
| 203 |
esac
|
| 204 |
|
| 205 |
if kernel_present $trykernel ; then
|
| 206 |
kernel=$trykernel
|
| 207 |
fi
|
| 208 |
|
| 209 |
rm -f $kernel_list
|
| 210 |
|
| 211 |
if [ "$kernel" ] ; then
|
| 212 |
db_set kernel-installer/which-kernel "$kernel"
|
| 213 |
fi
|
| 214 |
|
| 215 |
db_input medium kernel-installer/which-kernel || [ $? -eq 30 ]
|
| 216 |
db_go || true
|
| 217 |
|
| 218 |
db_get kernel-installer/which-kernel
|
| 219 |
kernel=$RET
|
| 220 |
|
| 221 |
info "Using kernel '$kernel'"
|
| 222 |
|
| 223 |
# Pass the kernel name on to kernel-installer
|
| 224 |
db_set debian-installer/kernel/image "$kernel"
|
| 225 |
|
| 226 |
db_progress STEP 1
|
| 227 |
db_progress INFO kernel-installer/progress/step_config
|
| 228 |
|
| 229 |
# =================== Install the kernel =========================
|
| 230 |
|
| 231 |
if db_get debian-installer/kernel/linux/initrd ; then
|
| 232 |
if [ "$RET" = "true" ]; then
|
| 233 |
do_initrd=yes
|
| 234 |
else
|
| 235 |
do_initrd=no
|
| 236 |
fi
|
| 237 |
else
|
| 238 |
warning "Failed to get debconf answer 'debian-installer/kernel/linux/initrd'."
|
| 239 |
warning "Setting default do_initrd='yes'."
|
| 240 |
do_initrd=yes
|
| 241 |
fi
|
| 242 |
|
| 243 |
if db_get debian-installer/kernel/linux/link_in_boot ; then
|
| 244 |
if [ "$RET" = "true" ]; then
|
| 245 |
link_in_boot=yes
|
| 246 |
else
|
| 247 |
link_in_boot=no
|
| 248 |
fi
|
| 249 |
else
|
| 250 |
warning "Failed to get debconf answer 'debian-installer/kernel/linux/link_in_boot'."
|
| 251 |
warning "Setting default link_in_boot='no'."
|
| 252 |
link_in_boot=no
|
| 253 |
fi
|
| 254 |
|
| 255 |
info "Setting do_initrd='$do_initrd'."
|
| 256 |
info "Setting link_in_boot='$link_in_boot'."
|
| 257 |
|
| 258 |
if [ -f /target/etc/kernel-img.conf ]; then
|
| 259 |
# Backup old kernel-img.conf
|
| 260 |
mv /target/etc/kernel-img.conf /target/etc/kernel-img.conf.$$
|
| 261 |
fi
|
| 262 |
|
| 263 |
cat > /target/etc/kernel-img.conf <<EOF
|
| 264 |
# Do not create symbolic links in /
|
| 265 |
do_symlinks = yes
|
| 266 |
relative_links = yes
|
| 267 |
do_bootloader = no
|
| 268 |
do_bootfloppy = no
|
| 269 |
do_initrd = $do_initrd
|
| 270 |
link_in_boot = $link_in_boot
|
| 271 |
EOF
|
| 272 |
|
| 273 |
if [ yes = "$do_initrd" ] ; then
|
| 274 |
# Make sure initrd-tools is installed before we change its configuration
|
| 275 |
if ! apt-install initrd-tools 2>> $logfile ; then
|
| 276 |
error "Failed to download initrd tools!"
|
| 277 |
|
| 278 |
# TODO: This needs a new debconf template after the string freeze.
|
| 279 |
#db_input critical kernel-installer/failed-initrd-tools-install || [ $? -eq 30 ]
|
| 280 |
#db_go
|
| 281 |
db_progress STOP
|
| 282 |
exit 1
|
| 283 |
fi
|
| 284 |
|
| 285 |
# Avoid possible root shell without giving passord while booting
|
| 286 |
# the 2.4 kernel
|
| 287 |
mkinitrdconf=/target/etc/mkinitrd/mkinitrd.conf
|
| 288 |
if [ -f $mkinitrdconf ] ; then
|
| 289 |
sed 's/^DELAY=.*/DELAY=0/' < $mkinitrdconf > $mkinitrdconf.new &&
|
| 290 |
mv $mkinitrdconf.new $mkinitrdconf
|
| 291 |
else
|
| 292 |
echo 'DELAY=0' >> $mkinitrdconf
|
| 293 |
fi
|
| 294 |
fi
|
| 295 |
|
| 296 |
if db_get debian-installer/kernel/image ; then
|
| 297 |
if [ -z "$RET" ] ; then
|
| 298 |
error "Empty value in 'debian-installer/kernel/image'!"
|
| 299 |
error "Unable to install kernel."
|
| 300 |
|
| 301 |
db_input critical kernel-installer/no-kernel || [ $? -eq 30 ]
|
| 302 |
db_go
|
| 303 |
db_progress STOP
|
| 304 |
if [ -f /target/etc/kernel-img.conf.$$ ]; then
|
| 305 |
# Revert old kernel-img.conf
|
| 306 |
mv /target/etc/kernel-img.conf.$$ /target/etc/kernel-img.conf
|
| 307 |
fi
|
| 308 |
exit 1
|
| 309 |
fi
|
| 310 |
kernel="$RET"
|
| 311 |
else
|
| 312 |
warning "Unable to get debconf answer debian-installer/kernel/image."
|
| 313 |
kernel=kernel-image
|
| 314 |
warning "Setting default kernel='$kernel'"
|
| 315 |
fi
|
| 316 |
|
| 317 |
db_progress STEP 1
|
| 318 |
db_subst kernel-installer/progress/step_install KERNEL "$kernel"
|
| 319 |
db_progress INFO kernel-installer/progress/step_install
|
| 320 |
|
| 321 |
info "Installing kernel '$kernel'."
|
| 322 |
|
| 323 |
if ! apt-install "$kernel" 2>> $logfile ; then
|
| 324 |
db_subst kernel-installer/failed-install KERNEL "$kernel"
|
| 325 |
db_input critical kernel-installer/failed-install || [ $? -eq 30 ]
|
| 326 |
db_go
|
| 327 |
db_progress STOP
|
| 328 |
if [ -f /target/etc/kernel-img.conf.$$ ]; then
|
| 329 |
# Revert old kernel-img.conf
|
| 330 |
mv /target/etc/kernel-img.conf.$$ /target/etc/kernel-img.conf
|
| 331 |
fi
|
| 332 |
exit 1
|
| 333 |
fi
|
| 334 |
|
| 335 |
if [ -f /target/etc/kernel-img.conf.$$ ]; then
|
| 336 |
# Revert old kernel-img.conf
|
| 337 |
mv /target/etc/kernel-img.conf.$$ /target/etc/kernel-img.conf
|
| 338 |
fi
|
| 339 |
|
| 340 |
db_progress STEP 1
|
| 341 |
if [ "$separate_pcmcia_modules" = y ]; then
|
| 342 |
pcmcia_package=$(echo "$kernel" | sed 's/^kernel-image/kernel-pcmcia-modules/')
|
| 343 |
info "Installing pcmcia package '$pcmcia_package'."
|
| 344 |
# TODO uncomment this once string freeze is over and
|
| 345 |
# templates file is updated.
|
| 346 |
#db_subst kernel-installer/progress/step_install_pcmcia PACKAGE "$pcmcia_package"
|
| 347 |
#db_progress INFO kernel-installer/progress/step_install_pcmcia
|
| 348 |
if ! apt-install "$pcmcia_package" 2>> $logfile ; then
|
| 349 |
:
|
| 350 |
# TODO uncomment this once string freeze is over and
|
| 351 |
# templates file is updated.
|
| 352 |
#db_subst kernel-installer/failed-pcmcia-install PACKAGE "$pcmcia_package"
|
| 353 |
#db_input critical kernel-installer/failed-pcmcia-install || [ $? -eq 30 ]
|
| 354 |
#db_go
|
| 355 |
#db_progress STOP
|
| 356 |
#exit 1
|
| 357 |
fi
|
| 358 |
fi
|
| 359 |
|
| 360 |
db_progress STEP 1
|
| 361 |
db_progress STOP
|
| 362 |
|
| 363 |
exit 0
|