source: grub2/trunk/fuentes/postinst.in @ 5465

Last change on this file since 5465 was 5465, checked in by hectorgh, 4 years ago

updating postinst.in

File size: 27.1 KB
Line 
1#!/bin/bash
2set -e
3
4merge_debconf_into_conf()
5{
6  local tmpfile; tmpfile="$1"
7  local setting; setting="$2"
8  local template; template="$3"
9
10  db_get "$template"
11  local value; value="$(echo "$RET" | sed -e 's,[$`"\],\\&,g')"
12  if grep -q "^${setting}=" "$tmpfile"; then
13    value="$(echo "$value" | sed -e 's,[\@],\\&,g')"
14    sed -i -re "s@^(${setting}=).*@\1\"${value}\"@" "$tmpfile"
15  else
16    echo >> "$tmpfile"
17    echo "${setting}=\"${value}\"" >> "$tmpfile"
18  fi
19}
20
21get_wubi_device()
22{
23  if [ ! -x /usr/share/lupin-support/grub-mkimage ] || \
24     ! /usr/share/lupin-support/grub-mkimage --test; then
25    return 1
26  fi
27
28  local bootdev="$(grub-probe --target=device /boot)" || true
29  local loop_file=
30  case $bootdev in
31    /dev/loop/*|/dev/loop[0-9])
32      loop_file="$(losetup "$bootdev" | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/")"
33      # If it's loop-mounted from another device, it isn't Wubi.
34      case $loop_file in
35        /dev/*) return 1 ;;
36      esac
37    ;;
38    *) return 1 ;;
39  esac
40
41  echo "$bootdev"
42}
43
44# This only works on a Linux system with udev running.  This is probably the
45# vast majority of systems where we need any of this, though, and we fall
46# back reasonably gracefully if we don't have it.
47cached_available_ids=
48available_ids()
49{
50  local id path
51
52  if [ "$cached_available_ids" ]; then
53    echo "$cached_available_ids"
54    return
55  fi
56
57  [ -d /dev/disk/by-id ] || return
58  cached_available_ids="$(
59    for path in /dev/disk/by-id/*; do
60      [ -e "$path" ] || continue
61      printf '%s %s\n' "$path" "$(readlink -f "$path")"
62    done | sort -k2 -s -u | cut -d' ' -f1
63  )"
64  echo "$cached_available_ids"
65}
66
67# Returns non-zero and no output if no mapping can be found.
68device_to_id()
69{
70  local id
71  for id in $(available_ids); do
72    if [ "$(readlink -f "$id")" = "$(readlink -f "$1")" ]; then
73      echo "$id"
74      return 0
75    fi
76  done
77  # Fall back to the plain device name if there's no by-id link for it.
78  if [ -e "$1" ]; then
79    echo "$1"
80    return 0
81  fi
82  return 1
83}
84
85devices_to_ids()
86{
87  local device id ids
88  ids=
89  for device; do
90    id="$(device_to_id "$device" || true)"
91    if [ "$id" ]; then
92      ids="${ids:+$ids, }$id"
93    fi
94  done
95  echo "$ids"
96}
97
98all_disks()
99{
100  local id
101  for id in $(available_ids); do
102    case $id in
103      *-part*) ;;
104      *) echo "$id" ;;
105    esac
106  done
107}
108
109all_partitions()
110{
111  local id ids
112  ids=
113  for id in $(available_ids); do
114    if [ "$id" != "$1" ] && [ "${id%-part*}" = "$1" ]; then
115      ids="${ids:+$ids }$id"
116    fi
117  done
118  echo "$ids"
119}
120
121# In order to determine whether we accidentally ran grub-install without
122# upgrade-from-grub-legacy on versions older than 1.98+20100617-1, we need
123# to be able to scan a disk to determine whether GRUB 2 was installed in its
124# boot sector.  This is specific to i386-pc (but that's the only platform
125# where we need it).
126scan_grub2()
127{
128  if ! dd if="$1" bs=512 count=1 2>/dev/null | grep -aq GRUB; then
129    # No version of GRUB is installed.
130    return 1
131  fi
132
133  # The GRUB boot sector always starts with a JMP instruction.
134  initial_jmp="$(dd if="$1" bs=2 count=1 2>/dev/null | od -Ax -tx1 | \
135                 head -n1 | cut -d' ' -f2,3)"
136  [ "$initial_jmp" ] || return 1
137  initial_jmp_opcode="${initial_jmp%% *}"
138  [ "$initial_jmp_opcode" = eb ] || return 1
139  initial_jmp_operand="${initial_jmp#* }"
140  case $initial_jmp_operand in
141    47|4b|4c|63)
142      # I believe this covers all versions of GRUB 2 up to the package
143      # version where we gained a more explicit mechanism.  GRUB Legacy
144      # always had 48 here.
145      return 0
146    ;;
147  esac
148
149  return 1
150}
151
152# for Linux
153sysfs_size()
154{
155  local num_sectors sector_size size
156  # Try to find out the size without relying on a partitioning tool being
157  # installed. This isn't too hard on Linux 2.6 with sysfs, but we have to
158  # try a couple of variants on detection of the sector size.
159  if [ -e "$1/size" ]; then
160    num_sectors="$(cat "$1/size")"
161    sector_size=512
162    if [ -e "$1/queue/logical_block_size" ]; then
163      sector_size="$(cat "$1/queue/logical_block_size")"
164    elif [ -e "$1/queue/hw_sector_size" ]; then
165      sector_size="$(cat "$1/queue/hw_sector_size")"
166    fi
167    size="$(expr "$num_sectors" \* "$sector_size" / 1000 / 1000)"
168  fi
169  [ "$size" ] || size='???'
170  echo "$size"
171}
172
173# for kFreeBSD
174camcontrol_size()
175{
176  local num_sectors sector_size size=
177
178  if num_sectors="$(camcontrol readcap "$1" -q -s -N)"; then
179    sector_size="$(camcontrol readcap "$1" -q -b)"
180    size="$(expr "$num_sectors" \* "$sector_size" / 1000 / 1000)"
181  fi
182
183  [ "$size" ] || size='???'
184  echo "$size"
185}
186
187# Returns value in $RET, like a debconf command.
188describe_disk()
189{
190  local disk id base size
191  disk="$1"
192  id="$2"
193
194  model=
195  case $(uname -s) in
196    Linux)
197      if which udevadm >/dev/null 2>&1; then
198        size="$(sysfs_size "/sys$(udevadm info -n "$disk" -q path)")"
199      else
200        base="${disk#/dev/}"
201        base="$(printf %s "$base" | sed 's,/,!,g')"
202        size="$(sysfs_size "/sys/block/$base")"
203      fi
204
205      if which udevadm >/dev/null 2>&1; then
206        model="$(udevadm info -n "$disk" -q property | sed -n 's/^ID_MODEL=//p')"
207        if [ -z "$model" ]; then
208          model="$(udevadm info -n "$disk" -q property | sed -n 's/^DM_NAME=//p')"
209          if [ -z "$model" ]; then
210            model="$(udevadm info -n "$disk" -q property | sed -n 's/^MD_NAME=//p')"
211            if [ -z "$model" ] && which dmsetup >/dev/null 2>&1; then
212              model="$(dmsetup info -c --noheadings -o name "$disk" 2>/dev/null || true)"
213            fi
214          fi
215        fi
216      fi
217    ;;
218    GNU/kFreeBSD)
219      disk_basename=$(basename "$disk")
220      size="$(camcontrol_size "$disk_basename")"
221      model="$(camcontrol inquiry "$disk_basename" | sed -ne "s/^pass0: <\([^>]*\)>.*/\1/p")"
222    ;;
223  esac
224
225  [ "$model" ] || model='???'
226
227  db_subst grub-pc/disk_description DEVICE "$disk"
228  db_subst grub-pc/disk_description SIZE "$size"
229  db_subst grub-pc/disk_description MODEL "$model"
230  db_metaget grub-pc/disk_description description
231}
232
233# Returns value in $RET, like a debconf command.
234describe_partition()
235{
236  local disk part id path diskbase partbase size
237  disk="$1"
238  part="$2"
239  id="$3"
240  path="$4"
241
242  if which udevadm >/dev/null 2>&1; then
243    size="$(sysfs_size "/sys$(udevadm info -n "$part" -q path)")"
244  else
245    diskbase="${disk#/dev/}"
246    diskbase="$(printf %s "$diskbase" | sed 's,/,!,g')"
247    partbase="${part#/dev/}"
248    partbase="$(printf %s "$partbase" | sed 's,/,!,g')"
249    size="$(sysfs_size "/sys/block/$diskbase/$partbase")"
250  fi
251
252  db_subst grub-pc/partition_description DEVICE "$part"
253  db_subst grub-pc/partition_description SIZE "$size"
254  db_subst grub-pc/partition_description PATH "$path"
255  db_metaget grub-pc/partition_description description
256}
257
258usable_partitions()
259{
260  local last_partition path partition partition_id
261
262  last_partition=
263  for path in / /boot /boot/grub; do
264    partition="$(grub-probe -t device "$path" || true)"
265    if [ -z "$partition" ] || [ "$partition" = "$last_partition" ]; then
266      continue
267    fi
268    partition_id="$(device_to_id "$partition" || true)"
269    echo "$path:$partition_id"
270    last_partition="$partition"
271  done | sort -t: -k2
272}
273
274get_mountpoint()
275{
276  local relpath boot_mountpoint
277
278  relpath="$(grub-mkrelpath "$1")"
279  boot_mountpoint="${1#$relpath}"
280  echo "${boot_mountpoint:-/}"
281}
282
283config_item()
284{
285  for x in /etc/default/grub /etc/default/grub.d/*.cfg; do
286    if [ -e "$x" ]; then
287      . "$x"
288    fi
289  done
290  if [ "$(eval echo "\${$1+set}")" = set ]; then
291    eval echo "\$$1"
292  else
293    return
294  fi
295}
296
297running_in_container()
298{
299  type systemd-detect-virt >/dev/null 2>&1 && systemd-detect-virt --quiet --container
300}
301
302run_grub_install()
303{
304    if ! grub-install $@ ; then
305        echo "Failed: grub-install $@" >&2
306        echo "WARNING: Bootloader is not properly installed, system may not be bootable" >&2
307    fi
308}
309
310case "$1" in
311  configure)
312    . /usr/share/debconf/confmodule
313
314    devicemap_regenerated=
315
316    if egrep -q '^[[:space:]]*post(inst|rm)_hook[[:space:]]*=[[:space:]]*(/sbin/|/usr/sbin/)?update-grub' /etc/kernel-img.conf 2>/dev/null; then
317      echo 'Removing update-grub hooks from /etc/kernel-img.conf in favour of' >&2
318      echo '/etc/kernel/ hooks.' >&2
319      sed -ri /etc/kernel-img.conf -e '\%^[[:space:]]*post(inst|rm)_hook[[:space:]]*=[[:space:]]*(/sbin/|/usr/sbin/)?update-grub%d'
320    fi
321
322    case @PACKAGE@ in
323      grub-pc)
324        mkdir -p /boot/grub
325
326        if test -e /boot/grub/device.map && ! test -e /boot/grub/core.img && \
327           ! test -e /boot/grub/@FIRST_CPU_PLATFORM@/core.img; then
328          # Looks like your device.map was generated by GRUB Legacy, which
329          # used to generate broken device.map (see #422851).  Avoid the risk
330          # by regenerating it.
331          grub-mkdevicemap --no-floppy
332          devicemap_regenerated=1
333        fi
334      ;;
335    esac
336
337    if test -z "$devicemap_regenerated" && test -s /boot/grub/device.map && \
338       dpkg --compare-versions "$2" lt-nl 1.98+20100702-1 && \
339       test "$(uname -s)" = Linux; then
340      # Earlier versions of GRUB used unstable device names in device.map,
341      # which caused a variety of problems.  There is some risk associated with
342      # regenerating it (so we prompt the user if it's non-trivial), but on the
343      # whole it's less risky to move to /dev/disk/by-id/.
344      devicemap_lines="$(egrep -v '^[[:space:]]+#' /boot/grub/device.map | wc -l)"
345      grub-mkdevicemap --no-floppy
346      devicemap_regenerated=1
347      if test "$devicemap_lines" != 1; then
348        db_input critical grub2/device_map_regenerated || true
349        db_go || true
350      fi
351    fi
352
353    if test -z "$devicemap_regenerated" && \
354       dpkg --compare-versions "$2" lt-nl 1.99~20101210-2 && \
355       grep -qs /md-uuid- /boot/grub/device.map; then
356      echo "Removing MD devices from device.map, since the BIOS cannot read from these." >&2
357      sed -i '/\/md-uuid-/d' /boot/grub/device.map
358    fi
359
360    tmp_default_grub="$(mktemp -t grub.XXXXXXXXXX)"
361    trap "rm -f ${tmp_default_grub}" EXIT
362    cp -p /usr/share/grub/default/grub ${tmp_default_grub}
363
364    merge_debconf_into_conf "$tmp_default_grub" GRUB_CMDLINE_LINUX grub2/linux_cmdline
365    merge_debconf_into_conf "$tmp_default_grub" GRUB_CMDLINE_LINUX_DEFAULT grub2/linux_cmdline_default
366
367    case @PACKAGE@ in
368      grub-pc)
369        merge_debconf_into_conf "$tmp_default_grub" GRUB_TIMEOUT grub-pc/timeout
370        sed -i -e 's/^\(GRUB_TIMEOUT=\)"\([0-9][0-9]*\)"/\1\2/' "$tmp_default_grub"
371        db_get grub-pc/hidden_timeout
372        if [ "$RET" = false ]; then
373          sed -i -e 's/^GRUB_HIDDEN_TIMEOUT=/#&/' "$tmp_default_grub"
374        fi
375      ;;
376      grub-ieee1275)
377        if grep ^platform /proc/cpuinfo | grep -q PowerNV; then
378                cat <<-EOF >>"$tmp_default_grub"
379
380                # Disable os-prober for ppc64el on the PowerNV platform (for Petitboot)
381                GRUB_DISABLE_OS_PROBER=true
382                EOF
383        fi
384        ;;
385    esac
386
387    # LLIUREX HACK
388    # ucf --three-way --debconf-ok --sum-file=/usr/share/grub/default/grub.md5sum ${tmp_default_grub} /etc/default/grub
389
390    package="$(ucfq --with-colons /etc/default/grub | cut -d : -f 2)"
391    if echo $package | grep -q "^grub-" ; then
392      ucfr --force @PACKAGE@ /etc/default/grub
393    else
394      ucfr @PACKAGE@ /etc/default/grub
395    fi
396
397    case @PACKAGE@ in
398      grub-pc)
399
400        fix_mixed_system=
401        if test -e /boot/grub/stage2 && test -e /boot/grub/menu.lst && \
402           ! test -e /boot/grub/grub2-installed && \
403           test -z "$UPGRADE_FROM_GRUB_LEGACY"; then
404          # Unfortunately, it's still possible that the user upgraded fully
405          # to GRUB 2 in some way other than running
406          # upgrade-from-grub-legacy; perhaps they ran grub-install by hand
407          # for some reason.  It's really quite difficult to detect this
408          # situation, because the only difference between this and a
409          # working chainloaded setup is that in this case grub-setup has
410          # been run.  So, to try to tell the difference, we scan the boot
411          # sectors of all disks for a GRUB 2 boot sector.  Hopefully this
412          # won't cause too much to explode, since I can't think of a better
413          # method.
414          grub2_disks=
415          for disk in $(all_disks); do
416            if scan_grub2 "$disk"; then
417              grub2_disks="${grub2_disks:+$grub2_disks }$(readlink -f "$disk")"
418            fi
419          done
420          if [ "$grub2_disks" ]; then
421            # No || true here; it's vital that the user sees this, and it's
422            # better to throw an error than to do the wrong thing.
423            db_subst grub-pc/mixed_legacy_and_grub2 DISKS "$grub2_disks"
424            db_fset grub-pc/mixed_legacy_and_grub2 seen false
425            db_input critical grub-pc/mixed_legacy_and_grub2
426            db_go
427            db_get grub-pc/mixed_legacy_and_grub2
428            if [ "$RET" = true ]; then
429              db_reset grub-pc/install_devices
430              UPGRADE_FROM_GRUB_LEGACY=1
431              fix_mixed_system=1
432              # Fall through to normal installation logic.
433            fi
434          fi
435        fi
436
437        # Make sure that Wubi users never see confusing device prompts.
438        # Wubi is a very specialised hack that does complicated things with
439        # grub-install diversions to create an image that's chained from the
440        # Windows boot loader to boot an operating system from a file on a
441        # Windows file system.  In these circumstances, prompting for where
442        # to install GRUB is not going to help anyone.
443        wubi_device="$(get_wubi_device)" || true
444        if [ "$wubi_device" ]; then
445          db_set grub-pc/install_devices "$wubi_device"
446          db_fset grub-pc/install_devices seen true
447        fi
448
449        if test -e /boot/grub/stage2 && test -e /boot/grub/menu.lst && \
450           ! test -e /boot/grub/grub2-installed && \
451           test -z "$UPGRADE_FROM_GRUB_LEGACY"; then
452          db_get grub-pc/chainload_from_menu.lst
453          if $RET ; then
454            # Create core.img (but do not risk writing to MBR).
455            # Using grub-probe instead of "(hd0)" avoids (UUID=) hack slowness
456            # in case /boot/grub is not on (hd0) in device.map.
457            echo "Generating core.img" >&2
458            grub-install --target=i386-pc --no-floppy --grub-setup=/bin/true "$(grub-probe -t drive /boot/grub)" > /dev/null
459
460            # Update menu.lst to reflect that:
461            # - core.img is present now
462            # - core.img has to be the first option
463            echo "Saving menu.lst backup in /boot/grub/menu.lst_backup_by_grub2_postinst" >&2
464            cp /boot/grub/menu.lst{,_backup_by_grub2_postinst}
465            echo "Running update-grub Legacy to hook our core.img in it" >&2
466            LET_US_TRY_GRUB_2=true /usr/lib/grub-legacy/update-grub 2>&1 | sed -e "s/^/    /g" >&2
467            # We just hooked GRUB 2 in menu.lst; then also generate grub.cfg.
468            touch /boot/grub/grub.cfg
469          fi
470        elif running_in_container; then
471          # Skip grub-install in containers.
472          :
473        elif test -z "$2" || test -e /boot/grub/core.img || \
474             test -e /boot/grub/@FIRST_CPU_PLATFORM@/core.img || \
475             test "$UPGRADE_FROM_GRUB_LEGACY" || test "$wubi_device"; then
476          question=grub-pc/install_devices
477          priority=high
478          device_map="$(grub-mkdevicemap -m - | grep -v '^(fd[0-9]\+)' || true)"
479          devices="$(echo "$device_map" | cut -f2)"
480          if dpkg --compare-versions "$2" lt 1.98+20100702-1 && \
481             test "$(uname -s)" = Linux && [ -z "$wubi_device" ]; then
482            # Migrate to new by-id naming scheme.
483            db_get grub-pc/install_devices
484            old_devices="$(echo "$RET" | sed 's/, / /g')"
485            new_devices=
486            # Common-case optimisation: if the list of devices is
487            # identical to the LHS of grub-mkdevicemap's output, then
488            # there's no point asking again; just install to all disks.
489            # (This handles e.g. "(hd0)" with one disk.)
490            if [ "$(echo "$device_map" | cut -f1 | sort)" = \
491                 "$(echo "$old_devices" | xargs -n1 | sort)" ]; then
492              new_devices="$(devices_to_ids $devices)"
493              db_set grub-pc/install_devices "$new_devices"
494            # Alternatively, we might be installing to a single partition
495            # on a single disk, and we can deal with that too if there's
496            # only one available disk and it has an appropriate partition.
497            # This doesn't necessarily work for multiple disks because now
498            # the order matters.
499            elif [ "$(echo "$device_map" | wc -l)" = 1 ] && \
500                 [ "$(echo "$old_devices" | wc -w)" = 1 ] && \
501                 echo "$old_devices" | grep -q ,; then
502              old_device="${old_devices#(}"
503              old_device="${old_device%)}"
504              old_disk="${old_device%,*}"
505              old_partition="${old_device##*,}"
506              new_device="$(echo "$device_map" | grep "^($old_disk)" | \
507                            cut -f2)"
508              new_device="$(device_to_id $new_device)"
509              if [ "$new_device" ]; then
510                new_device="$new_device-part$old_partition"
511                # Run through device_to_id again to check for existence.
512                new_device="$(device_to_id $new_device)"
513              fi
514              if [ "$new_device" ]; then
515                new_devices="$new_device"
516                db_set grub-pc/install_devices "$new_device"
517              fi
518            fi
519            if [ -z "$new_devices" ]; then
520              new_devices="$(devices_to_ids $old_devices)"
521              db_set grub-pc/install_devices "$new_devices"
522              # Common-case optimisation: if all devices are translatable
523              # to by-id and the number of devices there is the same as
524              # the number of devices GRUB can see, then there's no point
525              # asking again.  (This handles e.g. "/dev/sda" with one
526              # disk.)
527              old_devices_count="$(echo "$old_devices" | wc -w)"
528              new_devices_count="$(echo "$new_devices" | wc -w)"
529              devices_count="$(echo "$devices" | wc -w)"
530              if [ "$old_devices_count" != "$new_devices_count" ] || \
531                 [ "$new_devices_count" != "$devices_count" ]; then
532                db_fset grub-pc/install_devices seen false
533                db_fset grub-pc/install_devices_empty seen false
534              fi
535            fi
536          else
537            db_get grub-pc/install_devices
538            valid=1
539            for device in $RET; do
540              if [ ! -e "${device%,}" ]; then
541                valid=0
542                break
543              fi
544            done
545            if [ "$valid" = 0 ]; then
546              question=grub-pc/install_devices_disks_changed
547              priority=critical
548              db_set "$question" "$RET"
549              db_fset "$question" seen false
550              db_fset grub-pc/install_devices_empty seen false
551            fi
552          fi
553
554          while :; do
555            ids=
556            descriptions=
557            partitions="$(usable_partitions)"
558            for device in $devices; do
559              disk_id="$(device_to_id "$device" || true)"
560              if [ "$disk_id" ]; then
561                ids="${ids:+$ids, }$disk_id"
562                describe_disk "$(readlink -f "$device")" "$disk_id"
563                RET="$(printf %s "$RET" | sed 's/,/\\,/g')"
564                descriptions="${descriptions:+$descriptions, }$RET"
565                for partition_pair in $partitions; do
566                  partition_id="${partition_pair#*:}"
567                  if [ "${partition_id#$disk_id-part}" != "$partition_id" ]; then
568                    ids="${ids:+$ids, }$partition_id"
569                    describe_partition "$(readlink -f "$device")" "$(readlink -f "$partition_id")" "$partition_id" "$(get_mountpoint "${partition_pair%%:*}")"
570                    RET="$(printf %s "$RET" | sed 's/,/\\,/g')"
571                    descriptions="${descriptions:+$descriptions, }$RET"
572                  fi
573                done
574              fi
575            done
576            # Some "partitions" may in fact be at the disk level, e.g. RAID.
577            # List these as well if they haven't already been listed.
578            for partition_pair in $partitions; do
579              partition_id="${partition_pair#*:}"
580              if [ "${partition_id#*-part}" = "$partition_id" ]; then
581                case ", $ids, " in
582                  ", $partition_id, ") ;;
583                  *)
584                    ids="${ids:+$ids, }$partition_id"
585                    describe_disk "$(readlink -f "$partition_id")" "$partition_id"
586                    RET="$(printf %s "$RET" | sed 's/,/\\,/g')"
587                    descriptions="${descriptions:+$descriptions, }$RET"
588                    ;;
589                esac
590              fi
591            done
592            db_subst "$question" RAW_CHOICES "$ids"
593            db_subst "$question" CHOICES "$descriptions"
594            db_input "$priority" "$question" || true
595            db_go
596            db_get "$question"
597            failed_devices=
598            for i in `echo $RET | sed -e 's/, / /g'` ; do
599              real_device="$(readlink -f "$i")"
600              if grub-install --target=i386-pc --force --no-floppy $real_device ; then
601                # We just installed GRUB 2; then also generate grub.cfg.
602                touch /boot/grub/grub.cfg
603              else
604                failed_devices="$failed_devices $real_device"
605              fi
606            done
607
608            if [ "$question" != grub-pc/install_devices ]; then
609              db_set grub-pc/install_devices "$RET"
610              db_fset grub-pc/install_devices seen true
611            fi
612
613            if [ "$failed_devices" ]; then
614              if [ "$UPGRADE_FROM_GRUB_LEGACY" ]; then
615                db_subst grub-pc/install_devices_failed_upgrade FAILED_DEVICES "$failed_devices"
616                db_fset grub-pc/install_devices_failed_upgrade seen false
617                if db_input critical grub-pc/install_devices_failed_upgrade; then
618                  db_go
619                  db_get grub-pc/install_devices_failed_upgrade
620                  if [ "$RET" = true ]; then
621                    db_fset "$question" seen false
622                    db_fset grub-pc/install_devices_failed_upgrade seen false
623                    continue
624                  else
625                    exit 1
626                  fi
627                else
628                  exit 1 # noninteractive
629                fi
630              else
631                db_subst grub-pc/install_devices_failed FAILED_DEVICES "$failed_devices"
632                db_fset grub-pc/install_devices_failed seen false
633                if db_input critical grub-pc/install_devices_failed; then
634                  db_go
635                  db_get grub-pc/install_devices_failed
636                  if [ "$RET" = true ]; then
637                    break
638                  else
639                    db_fset "$question" seen false
640                    db_fset grub-pc/install_devices_failed seen false
641                    continue
642                  fi
643                else
644                  break # noninteractive
645                fi
646              fi
647            fi
648
649            db_get grub-pc/install_devices
650            if [ -z "$RET" ]; then
651              # Reset the seen flag if the current answer is false, since
652              # otherwise we'll loop with no indication of why.
653              db_get grub-pc/install_devices_empty
654              if [ "$RET" = false ]; then
655                db_fset grub-pc/install_devices_empty seen false
656              fi
657              if db_input critical grub-pc/install_devices_empty; then
658                db_go
659                db_get grub-pc/install_devices_empty
660                if [ "$RET" = true ]; then
661                  break
662                else
663                  db_fset "$question" seen false
664                  db_fset grub-pc/install_devices_empty seen false
665                fi
666              else
667                break # noninteractive
668              fi
669            else
670              break
671            fi
672          done
673        fi
674
675        # /boot/grub/ has more chances of being accessible by GRUB
676        for i in /usr/share/grub/unicode.pf2 ; do
677          if test -e $i ; then
678            mkdir -p /boot/grub
679            cp $i /boot/grub/
680          fi
681        done
682
683        if [ "$fix_mixed_system" ]; then
684          # These never contain any valuable information, and they aren't
685          # useful for boot any more, since we just overwrote MBR/PBR.
686          rm -f /boot/grub/{{xfs,reiserfs,e2fs,fat,jfs,minix}_stage1_5,stage{1,2}}
687          # Remove marker file used to indicate that grub-install was run
688          # rather than upgrade-from-grub-legacy.  Since stage2 has been
689          # removed, we don't need this any more.
690          rm -f /boot/grub/grub2-installed
691        fi
692      ;;
693
694      grub-efi-ia32|grub-efi-amd64|grub-efi-ia64|grub-efi-arm|grub-efi-arm64)
695        bootloader_id="$(config_item GRUB_DISTRIBUTOR | tr A-Z a-z | \
696                         cut -d' ' -f1)"
697        case $bootloader_id in
698          kubuntu) bootloader_id=ubuntu ;;
699        esac
700
701        if dpkg --compare-versions "$2" lt-nl 2.02~beta2-36ubuntu3.10; then
702          if [ -e "/boot/efi/EFI/${bootloader_id}/fbx64.efi" ]; then
703            rm -f "/boot/efi/EFI/${bootloader_id}/fbx64.efi";
704          fi
705        fi
706
707        if [ "$bootloader_id" ] && [ -d "/boot/efi/EFI/$bootloader_id" ]; then
708          case @PACKAGE@ in
709            grub-efi-ia32)  target=i386-efi ;;
710            grub-efi-amd64) target=x86_64-efi ;;
711            grub-efi-ia64)  target=ia64-efi ;;
712            grub-efi-arm)   target=arm-efi ;;
713            grub-efi-arm64) target=arm64-efi ;;
714          esac
715          db_get grub2/force_efi_extra_removable
716          if [ "$RET" = true ]; then
717            FORCE_EXTRA_REMOVABLE="--force-extra-removable"
718          fi
719          run_grub_install --target="$target" "$FORCE_EXTRA_REMOVABLE"
720        fi
721
722        # /boot/grub/ has more chances of being accessible by GRUB
723        for i in /usr/share/grub/unicode.pf2 ; do
724          if test -e $i ; then
725            mkdir -p /boot/grub
726            cp $i /boot/grub/
727          fi
728        done
729
730        if type update-secureboot-policy >/dev/null 2>&1; then
731          update-secureboot-policy || true
732        fi
733      ;;
734
735      grub-ieee1275)
736        case $(dpkg --print-architecture) in
737          ppc64el)
738            # Output may be empty; if so, just update the core image but
739            # don't install it to any PReP partition.
740            prep_bootdev="$(/usr/lib/grub/powerpc-ieee1275/prep-bootdev)"
741            run_grub_install --target=powerpc-ieee1275 $prep_bootdev
742          ;;
743        esac
744      ;;
745
746      grub-yeeloong)
747        run_grub_install --target=mipsel-loongson
748      ;;
749
750      grub-xen)
751        # Install for x86_64 regardless of arch, since a 32-bit userspace can still boot with a 64-bit kernel.
752        mkdir -p /boot/xen
753        run_grub_install --target=x86_64-xen
754        case $(dpkg --print-architecture) in
755          i386)
756            run_grub_install --target=i386-xen
757          ;;
758        esac
759      ;;
760    esac
761
762    # If grub.cfg has been generated, update it.
763    if test -e /boot/grub/grub.cfg && ! running_in_container; then
764      update-grub 3>&-
765    fi
766  ;;
767  abort-upgrade|abort-remove|abort-deconfigure)
768  ;;
769  *)
770    echo "postinst called with unknown argument \`$1'" >&2
771    exit 1
772  ;;
773esac
774
775# dh_installdeb will replace this with shell code automatically
776# generated by other debhelper scripts.
777
778#DEBHELPER#
779
780exit 0
Note: See TracBrowser for help on using the repository browser.