3 # Copyright 2013 Intel Corporation
4 # Author: Artem Bityutskiy
8 # This is a simple script which installs the extlinux bootloader and creates
9 # a valid extlinux.conf configuration file. This script requires a number of
10 # environment variables to be defined. Namely:
12 # 1. INSTALLERFW_PART_COUNT - count of partitions
13 # 2. INSTALLERFW_PARTX_MOUNTPOINT - mount point of partition number X
14 # (0 <= X < $INSTALLERFW_PART_COUNT)
15 # 3. INSTALLERFW_PARTX_PARTUUID - GPT GUID (AKA PARTUUID) of partition number X
16 # 4. INSTALLERFW_MOUNT_PREFIX - where the target partitions are mounted (the
17 # "root" directory of the file-system we install extlinux to)
18 # 5. INSTALLERFW_PARTX_DISK_DEVNODE_NOW - the disk device node which contains
20 # 6. INSTALLERFW_PARTX_DEVNODE_NOW - device node for partition number X
24 # Print debugging information
27 printf "%s\n" "INSTALLERFW_MOUNT_PREFIX=$INSTALLERFW_MOUNT_PREFIX"
28 printf "%s\n" "INSTALLERFW_PART_COUNT=$INSTALLERFW_PART_COUNT"
29 printf "%s\n" "INSTALLERFW_PART0_FSOPTS=$INSTALLERFW_PART0_FSOPTS"
30 printf "%s\n" "INSTALLERFW_PART0_FSTYPE=$INSTALLERFW_PART0_FSTYPE"
31 printf "%s\n" "INSTALLERFW_PART0_UUID=$INSTALLERFW_PART0_UUID"
32 printf "%s\n" "INSTALLERFW_PART0_MOUNTPOINT=$INSTALLERFW_PART0_MOUNTPOINT"
33 printf "%s\n" "INSTALLERFW_PART0_ALIGN=$INSTALLERFW_PART0_ALIGN"
34 printf "%s\n" "INSTALLERFW_PART0_BOOTFLAG=$INSTALLERFW_PART0_BOOTFLAG"
35 printf "%s\n" "INSTALLERFW_PART0_SIZE=$INSTALLERFW_PART0_SIZE"
36 printf "%s\n" "INSTALLERFW_PART0_TYPE_ID=$INSTALLERFW_PART0_TYPE_ID"
37 printf "%s\n" "INSTALLERFW_PART0_LABEL=$INSTALLERFW_PART0_LABEL"
38 printf "%s\n" "INSTALLERFW_PART0_DEVNODE=$INSTALLERFW_PART0_DEVNODE"
39 printf "%s\n" "INSTALLERFW_PART0_DISK_DEVNODE=$INSTALLERFW_PART0_DISK_DEVNODE"
40 printf "%s\n" "INSTALLERFW_PART0_DEVNODE_NOW=$INSTALLERFW_PART0_DEVNODE_NOW"
41 printf "%s\n" "INSTALLERFW_PART0_DISK_DEVNODE_NOW=$INSTALLERFW_PART0_DISK_DEVNODE_NOW"
42 printf "%s\n" "INSTALLERFW_PART0_PARTUUID=$INSTALLERFW_PART0_PARTUUID"
43 printf "%s\n" "INSTALLERFW_PART1_FSOPTS=$INSTALLERFW_PART1_FSOPTS"
44 printf "%s\n" "INSTALLERFW_PART1_FSTYPE=$INSTALLERFW_PART1_FSTYPE"
45 printf "%s\n" "INSTALLERFW_PART1_UUID=$INSTALLERFW_PART1_UUID"
46 printf "%s\n" "INSTALLERFW_PART1_MOUNTPOINT=$INSTALLERFW_PART1_MOUNTPOINT"
47 printf "%s\n" "INSTALLERFW_PART1_ALIGN=$INSTALLERFW_PART1_ALIGN"
48 printf "%s\n" "INSTALLERFW_PART1_BOOTFLAG=$INSTALLERFW_PART1_BOOTFLAG"
49 printf "%s\n" "INSTALLERFW_PART1_SIZE=$INSTALLERFW_PART1_SIZE"
50 printf "%s\n" "INSTALLERFW_PART1_TYPE_ID=$INSTALLERFW_PART1_TYPE_ID"
51 printf "%s\n" "INSTALLERFW_PART1_LABEL=$INSTALLERFW_PART1_LABEL"
52 printf "%s\n" "INSTALLERFW_PART1_DEVNODE=$INSTALLERFW_PART1_DEVNODE"
53 printf "%s\n" "INSTALLERFW_PART1_DISK_DEVNODE=$INSTALLERFW_PART1_DISK_DEVNODE"
54 printf "%s\n" "INSTALLERFW_PART1_DEVNODE_NOW=$INSTALLERFW_PART1_DEVNODE_NOW"
55 printf "%s\n" "INSTALLERFW_PART1_DISK_DEVNODE_NOW=$INSTALLERFW_PART1_DISK_DEVNODE_NOW"
56 printf "%s\n" "INSTALLERFW_PART1_PARTUUID=$INSTALLERFW_PART1_PARTUUID"
57 printf "%s\n" "INSTALLERFW_DISTRO_NAME=$INSTALLERFW_DISTRO_NAME"
58 printf "%s\n" "INSTALLERFW_KERNEL_OPTS=$INSTALLERFW_KERNEL_OPTS"
59 printf "%s\n" "INSTALLERFW_INSTALLER_NAME=$INSTALLERFW_INSTALLER_NAME"
60 printf "%s\n" "INSTALLERFW_PTABLE_FORMAT=$INSTALLERFW_PTABLE_FORMAT"
67 # This is a helper function which prints an error message and exits
70 printf "%s\n" "$PROG: error: $1" 1>&2
76 # Make sure the installer framework variables are defined
77 [ "${INSTALLERFW_PART_COUNT:+x}" == "x" ] ||
78 fatal "installer framework environment variables not found"
80 # Find the required root and boot parition parameters
85 while [ "$pnum" -lt "$INSTALLERFW_PART_COUNT" ]; do
86 mountpoint="INSTALLERFW_PART${pnum}_MOUNTPOINT"
87 mountpoint="$(eval printf "%s" '$'$mountpoint)"
89 # Find out all the required data for the root and boot partition
90 if [ "$mountpoint" == "/" ]; then
91 root_partuuid="INSTALLERFW_PART${pnum}_PARTUUID"
92 root_partuuid="$(eval printf "%s" '$'$root_partuuid)"
93 # The boot parition has to be at "/boot"
94 elif [ "$mountpoint" == "/boot" ]; then
95 boot_mountpoint="$mountpoint"
97 boot_devnode="INSTALLERFW_PART${pnum}_DEVNODE_NOW"
98 boot_devnode="$(eval printf "%s" '$'$boot_devnode)"
100 mbr_devnode="INSTALLERFW_PART${pnum}_DISK_DEVNODE_NOW"
101 mbr_devnode="$(eval printf "%s" '$'$mbr_devnode)"
107 bootdir="$INSTALLERFW_MOUNT_PREFIX/$boot_mountpoint"
108 extlinuxdir="$bootdir/extlinux"
111 extlinux_binary="$INSTALLERFW_MOUNT_PREFIX/sbin/extlinux"
112 "$extlinux_binary" --device "$boot_devnode" -i "$extlinuxdir" || \
113 fatal "cannot install extlinux to $extlinuxdir"
115 # Install the MBR part of extlinux
116 mbr_bin="$INSTALLERFW_MOUNT_PREFIX/usr/share/syslinux/gptmbr.bin"
117 dd if="$mbr_bin" of="$mbr_devnode" || \
118 fatal "cannot install MBR: dd if=$mbr_bin of=$mbr_devnode"
120 # Make the newest kernel to be the one we boot
121 newest_kernel="$(ls -1 "$bootdir" | grep "^vmlinuz-" | sort -r | head -n1)"
122 ln -sf "$newest_kernel" "$bootdir/vmlinuz" || \
123 fatal "cannot create symlink: $bootdir/vmlinuz --> $newest_kernel"
125 # Create the extlinux.conf file
126 cat > "$extlinuxdir/extlinux.conf" <<EOF
132 append $INSTALLERFW_KERNEL_OPTS root=PARTUUID=$root_partuuid