1 | #!/bin/bash |
---|
2 | set -e |
---|
3 | |
---|
4 | merge_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 | |
---|
21 | get_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. |
---|
47 | cached_available_ids= |
---|
48 | available_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. |
---|
68 | device_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 | |
---|
85 | devices_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 | |
---|
98 | all_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 | |
---|
109 | all_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). |
---|
126 | scan_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 |
---|
153 | sysfs_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 |
---|
174 | camcontrol_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. |
---|
188 | describe_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. |
---|
234 | describe_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 | |
---|
258 | usable_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 | |
---|
274 | get_mountpoint() |
---|
275 | { |
---|
276 | local relpath boot_mountpoint |
---|
277 | |
---|
278 | relpath="$(grub-mkrelpath "$1")" |
---|
279 | boot_mountpoint="${1#$relpath}" |
---|
280 | echo "${boot_mountpoint:-/}" |
---|
281 | } |
---|
282 | |
---|
283 | config_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 | |
---|
297 | running_in_container() |
---|
298 | { |
---|
299 | type systemd-detect-virt >/dev/null 2>&1 && systemd-detect-virt --quiet --container |
---|
300 | } |
---|
301 | |
---|
302 | run_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 | |
---|
310 | case "$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 | ;; |
---|
773 | esac |
---|
774 | |
---|
775 | # dh_installdeb will replace this with shell code automatically |
---|
776 | # generated by other debhelper scripts. |
---|
777 | |
---|
778 | #DEBHELPER# |
---|
779 | |
---|
780 | exit 0 |
---|