Initial implementation
[profile/ivi/setup-mbr-ivi.git] / setup-mbr-ivi
1 #!/bin/sh -efu
2
3 # Copyright 2013 Intel Corporation
4 # Author: Artem Bityutskiy
5 # License: GPLv2
6
7 #
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:
11 #
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
19 #    partition number X
20 # 6. INSTALLERFW_PARTX_DEVNODE_NOW - device node for partition number X
21
22 PROG="setup-mbr-ivi"
23
24 # Print debugging information
25 print_debug_info()
26 {
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"
61
62         cat /proc/mounts
63         ls -l /dev/
64         ls -l /dev/mapper
65 }
66
67 # This is a helper function which prints an error message and exits
68 fatal()
69 {
70         printf "%s\n" "$PROG: error: $1" 1>&2
71         exit 1
72 }
73
74 #print_debug_info
75
76 # Make sure the installer framework variables are defined
77 [ "${INSTALLERFW_PART_COUNT:+x}" == "x" ] ||
78        fatal "installer framework environment variables not found"
79
80 # Find the required root and boot parition parameters
81 pnum=0
82 root_partuuid=
83 boot_mountpoint=
84
85 while [ "$pnum" -lt "$INSTALLERFW_PART_COUNT" ]; do
86         mountpoint="INSTALLERFW_PART${pnum}_MOUNTPOINT"
87         mountpoint="$(eval printf "%s" '$'$mountpoint)"
88
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"
96
97                 boot_devnode="INSTALLERFW_PART${pnum}_DEVNODE_NOW"
98                 boot_devnode="$(eval printf "%s" '$'$boot_devnode)"
99
100                 mbr_devnode="INSTALLERFW_PART${pnum}_DISK_DEVNODE_NOW"
101                 mbr_devnode="$(eval printf "%s" '$'$mbr_devnode)"
102         fi
103
104         pnum="$((pnum+1))"
105 done
106
107 bootdir="$INSTALLERFW_MOUNT_PREFIX/$boot_mountpoint"
108 extlinuxdir="$bootdir/extlinux"
109
110 # Install extlinux
111 extlinux_binary="$INSTALLERFW_MOUNT_PREFIX/sbin/extlinux"
112 "$extlinux_binary" --device "$boot_devnode" -i "$extlinuxdir" || \
113         fatal "cannot install extlinux to $extlinuxdir"
114
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"
119
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"
124
125 # Create the extlinux.conf file
126 cat > "$extlinuxdir/extlinux.conf" <<EOF
127 prompt 0
128 timeout 0
129 default tizen
130 label tizen
131         linux ../vmlinuz
132         append $INSTALLERFW_KERNEL_OPTS root=PARTUUID=$root_partuuid
133 EOF