#!/bin/sh -efu # ALT: write Elbrus boot media # public domain 2020 Michael Shigorin # http://altlinux.org/elbrus error() { echo -e "$@" >&2; exit 1; } usage() { error "Usage: $0 [-f] /path/to/alt-e2k.iso /dev/sdX1_or_/dev/sr0$@"; } eject() { umount "$src" "$dst" && rmdir -- "$src" "$dst"; exit; } check() { needing="$(du -sB1024 "$1" | { read s d; echo $s; };)" getting="$(df -P "$2" | tail -1 | { read d b u f rest; echo $f; };)" [ "$needing" -lt "$getting" ] || error "$2: not free enough space" } # "yes, this flash drive's filesystem can be overwritten" force= [ "$1" = "-f" ] && force=1 && shift [ $# = 2 ] || usage [ -s "$1" ] || usage "\n$1 looks inappropriate (need ISO image)" [ -b "$2" ] || usage "\n$2 is not a block device (need sr0 or flash partition)" checkuid() { [ "$(id -u)" = 0 ] || error "$0: need to run as root to mount"; } format() { mkfs.ext2 -E packed_meta_blocks=1,num_backup_sb=1 -L altinst "$1"; } # use a partition block device, not the whole disk one checkpart() { dev="${1#/dev/}" [ -n "$dev" ] || usage "\nweird $1" [ -f "/sys/class/block/$dev/partition" ] || usage "\nneed a partition" } date case "$2" in /dev/sr[0-9]*|dvd*|cd*) grep -qw "^$2" /proc/mounts && checkuid && umount -v "$2" echo "Writing DVD image..." growisofs -dvd-compat -Z "$2"="$1" ;; /dev/sd*) grep -qw "^$2" /proc/mounts && [ -z "$force" ] && error "$2 mounted" checkpart "$2" checkuid [ "$(blkid -o value -s LABEL "$2")" = "altinst" ] || format "$2" src="$(mktemp -d)" dst="$(mktemp -d)" trap eject HUP INT TERM QUIT echo -n "mounting image... " mount -o loop,ro "$1" "$src"; echo "done" echo -n "mounting drive... " mount -o noatime "$2" "$dst"; echo "done" check "$src" "$2" echo "copying contents..." if type -t rsync >&/dev/null; then rsync -Pavc --inplace --delete --numeric-ids "$src/" "$dst/" else cp -avt "$dst" -- "$src"/{.disk,*} fi grep -q "^default=.*_flash$" "$dst/boot.conf" || { cur="$(sed -rn 's/^default=(.*)$/\1/p' "$dst/boot.conf")" grep -q "^label=${cur}_flash$" "$dst/boot.conf" && { echo -n "updating default boot target... " sed -i 's,^default=.*$,&_flash,' "$dst/boot.conf" echo "done" } ||: } echo -n "unmounting media... " eject echo "done." ;; *) usage ;; esac date