diff options
Diffstat (limited to 'scripts/contrib/mkefidisk.sh')
-rwxr-xr-x | scripts/contrib/mkefidisk.sh | 115 |
1 files changed, 68 insertions, 47 deletions
diff --git a/scripts/contrib/mkefidisk.sh b/scripts/contrib/mkefidisk.sh index 530b7842bb..6cc6b78de2 100755 --- a/scripts/contrib/mkefidisk.sh +++ b/scripts/contrib/mkefidisk.sh | |||
@@ -28,6 +28,22 @@ BOOT_SIZE=20 | |||
28 | # 5% for swap | 28 | # 5% for swap |
29 | SWAP_RATIO=5 | 29 | SWAP_RATIO=5 |
30 | 30 | ||
31 | # Cleanup after die() | ||
32 | cleanup() { | ||
33 | echo "Syncing and unmounting devices..." | ||
34 | # Unmount anything we mounted | ||
35 | unmount $ROOTFS_MNT || error "Failed to unmount $ROOTFS_MNT" | ||
36 | unmount $BOOTFS_MNT || error "Failed to unmount $BOOTFS_MNT" | ||
37 | unmount $HDDIMG_ROOTFS_MNT || error "Failed to unmount $HDDIMG_ROOTFS_MNT" | ||
38 | unmount $HDDIMG_MNT || error "Failed to unmount $HDDIMG_MNT" | ||
39 | |||
40 | # Remove the TMPDIR | ||
41 | echo "Removing temporary files..." | ||
42 | if [ -d "$TMPDIR" ]; then | ||
43 | rm -rf $TMPDIR || error "Failed to remove $TMPDIR" | ||
44 | fi | ||
45 | } | ||
46 | |||
31 | # Logging routines | 47 | # Logging routines |
32 | WARNINGS=0 | 48 | WARNINGS=0 |
33 | ERRORS=0 | 49 | ERRORS=0 |
@@ -50,6 +66,11 @@ warn() { | |||
50 | success() { | 66 | success() { |
51 | echo "${GREEN}$1${CLEAR}" | 67 | echo "${GREEN}$1${CLEAR}" |
52 | } | 68 | } |
69 | die() { | ||
70 | error $1 | ||
71 | cleanup | ||
72 | exit 1 | ||
73 | } | ||
53 | 74 | ||
54 | usage() { | 75 | usage() { |
55 | echo "Usage: $(basename $0) DEVICE HDDIMG TARGET_DEVICE" | 76 | echo "Usage: $(basename $0) DEVICE HDDIMG TARGET_DEVICE" |
@@ -99,14 +120,20 @@ unmount_device() { | |||
99 | if [ $? -eq 0 ]; then | 120 | if [ $? -eq 0 ]; then |
100 | warn "$DEVICE listed in /proc/mounts, attempting to unmount..." | 121 | warn "$DEVICE listed in /proc/mounts, attempting to unmount..." |
101 | umount $DEVICE* 2>/dev/null | 122 | umount $DEVICE* 2>/dev/null |
102 | grep -q $DEVICE /proc/mounts | 123 | return $? |
103 | if [ $? -eq 0 ]; then | ||
104 | error "Failed to unmount $DEVICE" | ||
105 | exit 1 | ||
106 | fi | ||
107 | fi | 124 | fi |
125 | return 0 | ||
108 | } | 126 | } |
109 | 127 | ||
128 | unmount() { | ||
129 | grep -q $1 /proc/mounts | ||
130 | if [ $? -eq 0 ]; then | ||
131 | echo "Unmounting $1..." | ||
132 | umount $1 | ||
133 | return $? | ||
134 | fi | ||
135 | return 0 | ||
136 | } | ||
110 | 137 | ||
111 | # | 138 | # |
112 | # Parse and validate arguments | 139 | # Parse and validate arguments |
@@ -126,23 +153,24 @@ if [ $? -eq 0 ]; then | |||
126 | fi | 153 | fi |
127 | 154 | ||
128 | if [ ! -w "$DEVICE" ]; then | 155 | if [ ! -w "$DEVICE" ]; then |
129 | error "Device $DEVICE does not exist or is not writable" | ||
130 | usage | 156 | usage |
131 | exit 1 | 157 | die "Device $DEVICE does not exist or is not writable" |
132 | fi | 158 | fi |
133 | 159 | ||
134 | if [ ! -e "$HDDIMG" ]; then | 160 | if [ ! -e "$HDDIMG" ]; then |
135 | error "HDDIMG $HDDIMG does not exist" | ||
136 | usage | 161 | usage |
137 | exit 1 | 162 | die "HDDIMG $HDDIMG does not exist" |
138 | fi | 163 | fi |
139 | 164 | ||
165 | # | ||
166 | # Ensure the hddimg is not mounted | ||
167 | # | ||
168 | unmount "$HDDIMG" || die "Failed to unmount $HDDIMG" | ||
140 | 169 | ||
141 | # | 170 | # |
142 | # Check if any $DEVICE partitions are mounted | 171 | # Check if any $DEVICE partitions are mounted |
143 | # | 172 | # |
144 | unmount_device | 173 | unmount_device || die "Failed to unmount $DEVICE" |
145 | |||
146 | 174 | ||
147 | # | 175 | # |
148 | # Confirm device with user | 176 | # Confirm device with user |
@@ -158,12 +186,26 @@ fi | |||
158 | 186 | ||
159 | 187 | ||
160 | # | 188 | # |
189 | # Prepare the temporary working space | ||
190 | # | ||
191 | TMPDIR=$(mktemp -d mkefidisk-XXX) || die "Failed to create temporary mounting directory." | ||
192 | HDDIMG_MNT=$TMPDIR/hddimg | ||
193 | HDDIMG_ROOTFS_MNT=$TMPDIR/hddimg_rootfs | ||
194 | ROOTFS_MNT=$TMPDIR/rootfs | ||
195 | BOOTFS_MNT=$TMPDIR/bootfs | ||
196 | mkdir $HDDIMG_MNT || die "Failed to create $HDDIMG_MNT" | ||
197 | mkdir $HDDIMG_ROOTFS_MNT || die "Failed to create $HDDIMG_ROOTFS_MNT" | ||
198 | mkdir $ROOTFS_MNT || die "Failed to create $ROOTFS_MNT" | ||
199 | mkdir $BOOTFS_MNT || die "Failed to create $BOOTFS_MNT" | ||
200 | |||
201 | |||
202 | # | ||
161 | # Partition $DEVICE | 203 | # Partition $DEVICE |
162 | # | 204 | # |
163 | DEVICE_SIZE=$(parted $DEVICE unit mb print | grep ^Disk | cut -d" " -f 3 | sed -e "s/MB//") | 205 | DEVICE_SIZE=$(parted $DEVICE unit mb print | grep ^Disk | cut -d" " -f 3 | sed -e "s/MB//") |
164 | # If the device size is not reported there may not be a valid label | 206 | # If the device size is not reported there may not be a valid label |
165 | if [ "$DEVICE_SIZE" = "" ] ; then | 207 | if [ "$DEVICE_SIZE" = "" ] ; then |
166 | parted $DEVICE mklabel msdos | 208 | parted $DEVICE mklabel msdos || die "Failed to create MSDOS partition table" |
167 | DEVICE_SIZE=$(parted $DEVICE unit mb print | grep ^Disk | cut -d" " -f 3 | sed -e "s/MB//") | 209 | DEVICE_SIZE=$(parted $DEVICE unit mb print | grep ^Disk | cut -d" " -f 3 | sed -e "s/MB//") |
168 | fi | 210 | fi |
169 | SWAP_SIZE=$((DEVICE_SIZE*SWAP_RATIO/100)) | 211 | SWAP_SIZE=$((DEVICE_SIZE*SWAP_RATIO/100)) |
@@ -195,25 +237,25 @@ echo "Swap partition size: $SWAP_SIZE MB ($SWAP)" | |||
195 | echo "*****************" | 237 | echo "*****************" |
196 | 238 | ||
197 | echo "Deleting partition table on $DEVICE ..." | 239 | echo "Deleting partition table on $DEVICE ..." |
198 | dd if=/dev/zero of=$DEVICE bs=512 count=2 | 240 | dd if=/dev/zero of=$DEVICE bs=512 count=2 > /dev/null || die "Failed to zero beginning of $DEVICE" |
199 | 241 | ||
200 | # Use MSDOS by default as GPT cannot be reliably distributed in disk image form | 242 | # Use MSDOS by default as GPT cannot be reliably distributed in disk image form |
201 | # as it requires the backup table to be on the last block of the device, which | 243 | # as it requires the backup table to be on the last block of the device, which |
202 | # of course varies from device to device. | 244 | # of course varies from device to device. |
203 | echo "Creating new partition table (MSDOS) on $DEVICE ..." | 245 | echo "Creating new partition table (MSDOS) on $DEVICE ..." |
204 | parted $DEVICE mklabel msdos | 246 | parted $DEVICE mklabel msdos || die "Failed to create MSDOS partition table" |
205 | 247 | ||
206 | echo "Creating boot partition on $BOOTFS" | 248 | echo "Creating boot partition on $BOOTFS" |
207 | parted $DEVICE mkpart primary 0% $BOOT_SIZE | 249 | parted $DEVICE mkpart primary 0% $BOOT_SIZE || die "Failed to create BOOT partition" |
208 | 250 | ||
209 | echo "Enabling boot flag on $BOOTFS" | 251 | echo "Enabling boot flag on $BOOTFS" |
210 | parted $DEVICE set 1 boot on | 252 | parted $DEVICE set 1 boot on || die "Failed to enable boot flag" |
211 | 253 | ||
212 | echo "Creating ROOTFS partition on $ROOTFS" | 254 | echo "Creating ROOTFS partition on $ROOTFS" |
213 | parted $DEVICE mkpart primary $ROOTFS_START $ROOTFS_END | 255 | parted $DEVICE mkpart primary $ROOTFS_START $ROOTFS_END || die "Failed to create ROOTFS partition" |
214 | 256 | ||
215 | echo "Creating swap partition on $SWAP" | 257 | echo "Creating swap partition on $SWAP" |
216 | parted $DEVICE mkpart primary $SWAP_START 100% | 258 | parted $DEVICE mkpart primary $SWAP_START 100% || die "Failed to create SWAP partition" |
217 | 259 | ||
218 | parted $DEVICE print | 260 | parted $DEVICE print |
219 | 261 | ||
@@ -221,7 +263,7 @@ parted $DEVICE print | |||
221 | # | 263 | # |
222 | # Check if any $DEVICE partitions are mounted after partitioning | 264 | # Check if any $DEVICE partitions are mounted after partitioning |
223 | # | 265 | # |
224 | unmount_device | 266 | unmount_device || die "Failed to unmount $DEVICE partitions" |
225 | 267 | ||
226 | 268 | ||
227 | # | 269 | # |
@@ -230,16 +272,16 @@ unmount_device | |||
230 | echo "" | 272 | echo "" |
231 | echo "Formatting $BOOTFS as vfat..." | 273 | echo "Formatting $BOOTFS as vfat..." |
232 | if [ ! "${DEVICE#/dev/loop}" = "${DEVICE}" ]; then | 274 | if [ ! "${DEVICE#/dev/loop}" = "${DEVICE}" ]; then |
233 | mkfs.vfat -I $BOOTFS -n "EFI" || error "Failed to format $BOOTFS" | 275 | mkfs.vfat -I $BOOTFS -n "EFI" || die "Failed to format $BOOTFS" |
234 | else | 276 | else |
235 | mkfs.vfat $BOOTFS -n "EFI" || error "Failed to format $BOOTFS" | 277 | mkfs.vfat $BOOTFS -n "EFI" || die "Failed to format $BOOTFS" |
236 | fi | 278 | fi |
237 | 279 | ||
238 | echo "Formatting $ROOTFS as ext3..." | 280 | echo "Formatting $ROOTFS as ext3..." |
239 | mkfs.ext3 -F $ROOTFS -L "ROOT" || error "Failed to format $ROOTFS" | 281 | mkfs.ext3 -F $ROOTFS -L "ROOT" || die "Failed to format $ROOTFS" |
240 | 282 | ||
241 | echo "Formatting swap partition...($SWAP)" | 283 | echo "Formatting swap partition...($SWAP)" |
242 | mkswap $SWAP || error "Failed to prepare swap" | 284 | mkswap $SWAP || die "Failed to prepare swap" |
243 | 285 | ||
244 | 286 | ||
245 | # | 287 | # |
@@ -247,24 +289,8 @@ mkswap $SWAP || error "Failed to prepare swap" | |||
247 | # | 289 | # |
248 | echo "" | 290 | echo "" |
249 | echo "Mounting images and device in preparation for installation..." | 291 | echo "Mounting images and device in preparation for installation..." |
250 | TMPDIR=$(mktemp -d mkefidisk-XXX) | ||
251 | if [ $? -ne 0 ]; then | ||
252 | error "Failed to create temporary mounting directory." | ||
253 | exit 1 | ||
254 | fi | ||
255 | HDDIMG_MNT=$TMPDIR/hddimg | ||
256 | HDDIMG_ROOTFS_MNT=$TMPDIR/hddimg_rootfs | ||
257 | ROOTFS_MNT=$TMPDIR/rootfs | ||
258 | BOOTFS_MNT=$TMPDIR/bootfs | ||
259 | mkdir $HDDIMG_MNT | ||
260 | mkdir $HDDIMG_ROOTFS_MNT | ||
261 | mkdir $ROOTFS_MNT | ||
262 | mkdir $BOOTFS_MNT | ||
263 | |||
264 | mount -o loop $HDDIMG $HDDIMG_MNT || error "Failed to mount $HDDIMG" | 292 | mount -o loop $HDDIMG $HDDIMG_MNT || error "Failed to mount $HDDIMG" |
265 | |||
266 | mount -o loop $HDDIMG_MNT/rootfs.img $HDDIMG_ROOTFS_MNT || error "Failed to mount rootfs.img" | 293 | mount -o loop $HDDIMG_MNT/rootfs.img $HDDIMG_ROOTFS_MNT || error "Failed to mount rootfs.img" |
267 | |||
268 | mount $ROOTFS $ROOTFS_MNT || error "Failed to mount $ROOTFS on $ROOTFS_MNT" | 294 | mount $ROOTFS $ROOTFS_MNT || error "Failed to mount $ROOTFS on $ROOTFS_MNT" |
269 | mount $BOOTFS $BOOTFS_MNT || error "Failed to mount $BOOTFS on $BOOTFS_MNT" | 295 | mount $BOOTFS $BOOTFS_MNT || error "Failed to mount $BOOTFS on $BOOTFS_MNT" |
270 | 296 | ||
@@ -278,9 +304,6 @@ if [ -d $ROOTFS_MNT/etc/udev/ ] ; then | |||
278 | echo "$TARGET_DEVICE" >> $ROOTFS_MNT/etc/udev/mount.blacklist | 304 | echo "$TARGET_DEVICE" >> $ROOTFS_MNT/etc/udev/mount.blacklist |
279 | fi | 305 | fi |
280 | 306 | ||
281 | umount $ROOTFS_MNT || error "Failed to unmount $ROOTFS_MNT" | ||
282 | umount $HDDIMG_ROOTFS_MNT || error "Failed to unmount $HDDIMG_ROOTFS_MNT" | ||
283 | |||
284 | echo "Preparing boot partition..." | 307 | echo "Preparing boot partition..." |
285 | EFIDIR="$BOOTFS_MNT/EFI/BOOT" | 308 | EFIDIR="$BOOTFS_MNT/EFI/BOOT" |
286 | cp $HDDIMG_MNT/vmlinuz $BOOTFS_MNT || error "Failed to copy vmlinuz" | 309 | cp $HDDIMG_MNT/vmlinuz $BOOTFS_MNT || error "Failed to copy vmlinuz" |
@@ -330,13 +353,11 @@ fi | |||
330 | 353 | ||
331 | # Ensure we have at least one EFI bootloader configured | 354 | # Ensure we have at least one EFI bootloader configured |
332 | if [ ! -e $GRUB_CFG ] && [ ! -e $GUMMI_CFG ]; then | 355 | if [ ! -e $GRUB_CFG ] && [ ! -e $GUMMI_CFG ]; then |
333 | error "No EFI bootloader configuration found" | 356 | die "No EFI bootloader configuration found" |
334 | fi | 357 | fi |
335 | 358 | ||
336 | umount $BOOTFS_MNT || error "Failed to unmount $BOOTFS_MNT" | 359 | # Call cleanup to unmount devices and images and remove the TMPDIR |
337 | umount $HDDIMG_MNT || error "Failed to unmount $HDDIMG_MNT" | 360 | cleanup |
338 | rm -rf $TMPDIR || error "Failed to cleanup $TMPDIR" | ||
339 | sync | ||
340 | 361 | ||
341 | if [ $WARNINGS -ne 0 ] && [ $ERRORS -eq 0 ]; then | 362 | if [ $WARNINGS -ne 0 ] && [ $ERRORS -eq 0 ]; then |
342 | echo "${YELLOW}Installation completed with warnings${CLEAR}" | 363 | echo "${YELLOW}Installation completed with warnings${CLEAR}" |