|
| 1 | +#!/bin/sh |
| 2 | + |
| 3 | +# SPDX-FileCopyrightText: Copyright 2025-2026, macmpi |
| 4 | +# SPDX-License-Identifier: MIT |
| 5 | + |
| 6 | +## Install minimal diskless Alpine with customizable install STEPS on media containing headless.apkovl file. |
| 7 | + |
| 8 | +# HOW TO USE (Customize MY_xxxx values and STEPS to your needs. Defaults are ok for Pi) |
| 9 | +# - prepare install media (Alpine 3.23 and later) as per Alpine wiki for your target hardware |
| 10 | +# - add headless.apkovl.tar.gz, this file (as unattended.sh) and wpa_supplicant.conf (if wifi) onto media |
| 11 | +# - boot machine, and let unattended install proceed & reboot (may be observed via root ssh login) |
| 12 | +# - after reboot, log-in as admin user via ssh (WARNING change default password in MY_PASS) |
| 13 | + |
| 14 | +## CUSTOMIZE values below to your needs |
| 15 | +MY_USER="alpine" # admin account user name |
| 16 | +MY_PASS="enipla" # password for that user |
| 17 | +MY_IFACE="wlan0" # network interface to be used; may be eth0, etc...(DHCP by default) |
| 18 | +MY_HOSTNAME="alpine-diskless" |
| 19 | + |
| 20 | +# Uncomment to redirect stdout and errors to logfile as service won't show messages |
| 21 | +# exec 1>>/tmp/alhb.log 2>&1 |
| 22 | + |
| 23 | +# shellcheck disable=SC2142 # known special case |
| 24 | +alias _logger='logger -st "${0##*/}"' |
| 25 | + |
| 26 | +# grab used ovl filename from dmesg |
| 27 | +ovl="$( dmesg | grep -o 'Loading user settings from .*:' | awk '{print $5}' | sed 's/:.*$//' )" |
| 28 | +if [ -f "${ovl}" ]; then |
| 29 | + ovlpath="$( dirname "$ovl" )" |
| 30 | +else |
| 31 | + # search path again as mountpoint have been changed later in the boot process... |
| 32 | + ovl="$( basename "${ovl}" )" |
| 33 | + ovlpath=$( find /media -maxdepth 2 -type d -path '*/.*' -prune -o -type f -name "${ovl}" -exec dirname {} \; | head -1 ) |
| 34 | + ovl="${ovlpath}/${ovl}" |
| 35 | +fi |
| 36 | + |
| 37 | +_logger "Starting base diskless installation" |
| 38 | +cat <<-EOF > /tmp/ANSWERFILE |
| 39 | + KEYMAPOPTS=none |
| 40 | + HOSTNAMEOPTS="$MY_HOSTNAME" |
| 41 | + DEVDOPTS=mdev |
| 42 | + INTERFACESOPTS="auto lo |
| 43 | + iface lo inet loopback |
| 44 | +
|
| 45 | + auto $MY_IFACE |
| 46 | + iface $MY_IFACE inet dhcp |
| 47 | + " |
| 48 | + DNSOPTS="" |
| 49 | + TIMEZONEOPTS=UTC |
| 50 | + PROXYOPTS=none |
| 51 | + APKREPOSOPTS="-1 -c" |
| 52 | + USEROPTS="-a -u $MY_USER" |
| 53 | + SSHDOPTS=openssh |
| 54 | + NTPOPTS=chrony |
| 55 | +
|
| 56 | + # No disk install (diskless) |
| 57 | + DISKOPTS=none |
| 58 | +
|
| 59 | + # Setup storage for diskless: use media where headless overlay is located |
| 60 | + LBUOPTS="$ovlpath" |
| 61 | + APKCACHEOPTS="\$LBUOPTS/cache" |
| 62 | +
|
| 63 | + EOF |
| 64 | + |
| 65 | +SSH_CONNECTION="FAKE" setup-alpine -ef /tmp/ANSWERFILE |
| 66 | + |
| 67 | +if install -m644 "${ovlpath}"/interfaces /etc/network/interfaces >/dev/null 2>&1; then |
| 68 | + _logger "Imported interfaces file" |
| 69 | +fi |
| 70 | + |
| 71 | +# Setup wifi if available |
| 72 | +if [ -e "$ovlpath/wpa_supplicant.conf" ]; then |
| 73 | + apk add wpa_supplicant |
| 74 | + install -m644 "$ovlpath/wpa_supplicant.conf" /etc/wpa_supplicant/wpa_supplicant.conf |
| 75 | + rc-update add wpa_supplicant boot |
| 76 | + _logger "Wifi configured with imported wpa_supplicant.conf" |
| 77 | +fi |
| 78 | + |
| 79 | +# Provision sshd authorized keys (host keys imported by default) if available |
| 80 | +if install -Dm600 "${ovlpath}"/authorized_keys /home/"$MY_USER"/.ssh/authorized_keys >/dev/null 2>&1; then |
| 81 | + _logger "Imported public key SSH for authentication." |
| 82 | + chown -R "$MY_USER" /home/"$MY_USER"/.ssh |
| 83 | +fi |
| 84 | + |
| 85 | +## CUSTOMIZE following install STEPS |
| 86 | +_logger "Install customizations" |
| 87 | +echo "$MY_USER:$MY_PASS" | chpasswd |
| 88 | +passwd -l root |
| 89 | + |
| 90 | +apk update |
| 91 | +apk upgrade --available |
| 92 | + |
| 93 | +lbu commit -d |
| 94 | +sync |
| 95 | +_logger "Finished unattended script - rebooting system" |
| 96 | +reboot |
| 97 | + |
0 commit comments