File: efi

package info (click to toggle)
partman-efi 111
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 680 kB
  • sloc: sh: 435; makefile: 2
file content (169 lines) | stat: -rwxr-xr-x 4,660 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/bin/sh
set -e

# This script sets method "efi" for all fat16/fat32 partitions that
# have the esp flag set.
#FIXME This is not true: it does not care about the filesystem

ARCH="$(archdetect)"

# Prod the kernel to load EFI stuff and mount the efivarfs fs if
# needed
modprobe efivarfs >/dev/null 2>&1 || true
mount -t efivarfs none /sys/firmware/efi/efivars 2>&1 || true

in_efi_mode() {
    [ -d /sys/firmware/efi ]
}

if in_efi_mode; then
	> /var/lib/partman/efi
else
	case $ARCH in
	    i386/mac|amd64/mac)
		# Intel Macs have an EFI partition, regardless of
		# whether we're currently booted using BIOS
		# compatibility or not (if we are, we won't be able to
		# talk to EFI directly).
		> /var/lib/partman/efi
		;;
	    *)
		rm -f /var/lib/partman/efi
		exit 0
		;;
	esac
fi

. /usr/lib/partman/lib/base.sh

gpt_efi_type=c12a7328-f81f-11d2-ba4b-00a0c93ec93b
gpt_bios_boot_type=21686148-6449-6e6f-744e-656564454649
msdos_efi_type=0xef

NUM_ESP=0
NUM_NOT_ESP=0

for dev in /var/lib/partman/devices/*; do
	[ -d "$dev" ] || continue
	cd $dev

	open_dialog GET_LABEL_TYPE
	read_line label_type
	close_dialog

	if [ "$label_type" = msdos ]; then
		DISK_BIOS_BOOT=yes
	else
		DISK_BIOS_BOOT=no
	fi

	NON_EFI_THIS_DISK=0
	partitions=
	open_dialog PARTITIONS
	while { read_line num id size type fs path name; [ "$id" ]; }; do
		# Build a list of partitions that:
		# 1. Will *not* be bios-bootable (e.g. ESP)
		# 2. Might be bios-bootable (~anything that's not
		#    "free space"
		if [ "$fs" = fat16 ]; then
			partitions="$partitions $id"
		elif [ "$fs" = fat32 ] && echo "$name" |
                     grep -i "^EFI System Partition" >/dev/null; then
			partitions="$partitions $id"
		elif [ "$label_type" = msdos ] && \
		     [ "$(blkid -o value -s PART_ENTRY_TYPE -p "$path" 2>/dev/null)" = "$msdos_efi_type" ]; then
			partitions="$partitions $id"
		elif [ "$label_type" = gpt ] && \
		     [ "$(blkid -o value -s PART_ENTRY_TYPE -p "$path" 2>/dev/null)" = "$gpt_efi_type" ]; then
			partitions="$partitions $id"
		elif [ "$label_type" = gpt ] && \
		     [ "$(blkid -o value -s PART_ENTRY_TYPE -p "$path" 2>/dev/null)" = "$gpt_bios_boot_type" ]; then
			# We have a GPT disk with a "BIOS BOOT"
			# partition included, so this disk might be
			# set up for BIOS boot.
			DISK_BIOS_BOOT=yes
			log "Disk $dev contains a BIOS boot partition"
			partitions="$partitions $id"
		else
			if [ "$fs" != "free" ]; then
				log "Partition $path might be bios-bootable, checking further"
				partitions="$partitions $id"
			fi
		fi
	done
	close_dialog

	# Now look for more details on each of those partitions
	for id in $partitions; do
		efi=no

		open_dialog GET_FLAGS $id
		# cannot break here until we've hit close_dialog below
		while { read_line flag; [ "$flag" ]; }; do
			log "$dev $id has $flag flag"
			if [ "$flag" = esp ]; then
				efi=yes
			fi
		done
		close_dialog

		if [ "$efi" = yes ]; then
			# An ESP is clearly not for BIOS use!
			log "$dev $id is an ESP"
			method=
			if [ -f $id/method ]; then
				method=$(cat $id/method)
			fi
			# skip if already seen and changed
			if [ "$method" != efi ] && [ ! -e $id/old_efi ]; then
				log "efi_debug: set method efi and old_efi on partition $dev $id"
				mkdir -p $id
				echo efi >$id/method
				>$id/old_efi
			fi
			NUM_ESP=$(($NUM_ESP + 1))
		else
			# BIOS may well work with anything else
			# remaining
			log "$dev $id is possibly bootable"
			NON_EFI_THIS_DISK=$(($NON_EFI_THIS_DISK + 1))
		fi
	done

	if [ "$DISK_BIOS_BOOT" = "yes" ]; then
		log "Disk $dev is BIOS-bootable"
		log "Disk $dev has $NON_EFI_THIS_DISK non-ESP partition(s)"
		if [ $NON_EFI_THIS_DISK -gt 0 ]; then
			NUM_NOT_ESP=$(($NUM_NOT_ESP + 1))
		fi
	fi

done

log "Found $NUM_ESP ESP(s), $NUM_NOT_ESP BIOS-bootable disk(s) total"

if [ -f /var/lib/partman/uefi_check_done ]; then
	log "Found flag file /var/lib/partman/uefi_check_done, not checking further"
else
	if in_efi_mode && [ $NUM_ESP = 0 ] && [ $NUM_NOT_ESP -gt 0 ]; then
		case $ARCH in
			i386/*|amd64/*)
				db_input critical partman-efi/non_efi_system || true
				db_go || exit 1
				db_fset partman-efi/non_efi_system seen true
				db_get partman-efi/non_efi_system
				if [ "$RET" = false ]; then
					log "User chose to ignore UEFI"
					touch /var/lib/partman/ignore_uefi
				else
					log "User chose to continue in UEFI mode"
				fi
				;;
		esac
	fi
	# We've got this far at least once without triggering the
	# check. Flag that so that any further changes we make in this
	# d-i session can't trigger a false-positive here.
	touch /var/lib/partman/uefi_check_done
	log "UEFI check done, wrote flag file /var/lib/partman/uefi_check_done"
fi