From 1eca862849ff53fa2de1679f68f90e4779ca656e Mon Sep 17 00:00:00 2001 From: macmpi Date: Tue, 16 May 2023 09:28:58 +0200 Subject: [PATCH 1/4] improve overlay file detection take name from dmesg add suggestion for removal in banner --- headless.apkovl.tar.gz | Bin 5058 -> 5242 bytes overlay/etc/local.d/headless.start | 15 +++++++++++++-- sample_unattended.sh | 5 +++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/headless.apkovl.tar.gz b/headless.apkovl.tar.gz index 97fe05d22b0cf2ee668d43883f4984adec4866da..faed1ed7cabfeedcb39336fc306c3bdd3b93c9e0 100644 GIT binary patch literal 5242 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 A(f|Me literal 5058 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 diff --git a/overlay/etc/local.d/headless.start b/overlay/etc/local.d/headless.start index 8eec0c6..b68e546 100755 --- a/overlay/etc/local.d/headless.start +++ b/overlay/etc/local.d/headless.start @@ -11,9 +11,12 @@ exec 1>/dev/console 2>&1 logger -st ${0##*/} "Alpine Linux headless bootstrap v$VERSION by macmpi" mkdir /tmp/.trash -ovlpath=$( find /media -maxdepth 2 -type d -path '*/.*' -prune -o -type f -name *.apkovl.tar.gz -exec dirname {} \; | head -1 ) -# Help randomess for wpa_supplicant and ssh server +# grab used ovl filename from dmesg +ovl="$( dmesg | grep -o 'Loading user settings from .*:' | awk '{print $5}' | sed 's/:.*$//' )" +ovlpath="$( dirname "$ovl" )" + +# Help randomness for wpa_supplicant and ssh server rc-service seedrng start ## Setup Network interfaces @@ -95,10 +98,18 @@ cat <<-EOF >> /etc/ssh/sshd_config EOF # Banner file +warn="" +grep -q "${ovlpath}.*[[:space:]]ro[[:space:],]" /proc/mounts; RO=$? +[ "$RO" -eq "0" ] && warn="(remount partition read-write!)" + cat <<-EOF > /tmp/.trash/banner Alpine Linux headless bootstrap v$VERSION by macmpi +You may want to delete/rename overlay before next reboot ${warn}: +$ovl +(can be done automatically with unattended script - see sample snippet) + EOF # Bundled temporary keys are moved in RAM /tmp so they won't be stored diff --git a/sample_unattended.sh b/sample_unattended.sh index 58fab1b..0ab512e 100644 --- a/sample_unattended.sh +++ b/sample_unattended.sh @@ -14,12 +14,13 @@ sleep 60 ## This snippet removes apkovl file on volume after initial boot -ovlpath=$( find /media -maxdepth 2 -type d -path '*/.*' -prune -o -type f -name *.apkovl.tar.gz -exec dirname {} \; | head -1 ) +ovl="$( dmesg | grep -o 'Loading user settings from .*:' | awk '{print $5}' | sed 's/:.*$//' )" +ovlpath="$( dirname "$ovl" )" # also works in case volume is mounted read-only grep -q "${ovlpath}.*[[:space:]]ro[[:space:],]" /proc/mounts; RO=$? [ "$RO" -eq "0" ] && mount -o remount,rw "${ovlpath}" -rm "${ovlpath}"/*.apkovl.tar.gz +rm -f "${ovl}" [ "$RO" -eq "0" ] && mount -o remount,ro "${ovlpath}" ######################################################## From 51e426e9bf8459c7c40e07b067db2c2f7af5b60a Mon Sep 17 00:00:00 2001 From: macmpi Date: Tue, 16 May 2023 14:36:41 +0200 Subject: [PATCH 2/4] preserve original config files better this would allow to also use apkovl to rescue existing disk-based setup --- headless.apkovl.tar.gz | Bin 5242 -> 5644 bytes overlay/etc/local.d/headless.start | 84 ++++++++++++++++++++++------- 2 files changed, 65 insertions(+), 19 deletions(-) diff --git a/headless.apkovl.tar.gz b/headless.apkovl.tar.gz index faed1ed7cabfeedcb39336fc306c3bdd3b93c9e0..13cfcfdd675e468d3b5abcd21241d9394da2ef7a 100644 GIT binary patch literal 5644 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 A(f|Me diff --git a/overlay/etc/local.d/headless.start b/overlay/etc/local.d/headless.start index b68e546..847d3f7 100755 --- a/overlay/etc/local.d/headless.start +++ b/overlay/etc/local.d/headless.start @@ -5,6 +5,43 @@ VERSION="0.7" + +_apk() { + local cmd="$1" + local pkg="$2" + + case $cmd in + add) # install only if not already present + if ! apk info | grep -wq "${pkg}"; then + apk add "$pkg" && printf "${pkg} " >> /tmp/.trash/installed + fi + ;; + del) # delete only if previously installed + if grep -wq "$pkg" /tmp/.trash/installed; then + apk del "$pkg" && sed -i 's/\b'"${pkg}"'\b//' /tmp/.trash/installed + fi + ;; + *) + echo "only add/del: wrong usage"; exit + ;; + esac +} + +_preserve() { + [ -f "$1" ] && cp "$1" "${1}.orig" +} + +_restore() { + if [ -f "${1}.orig" ]; then + mv -- "${1}.orig" "${1}" + else + rm -rf "${1}" + fi +} + +##### End of part to be dupplicated into post-cleanup (do not alter!) + + # Redirect stdout and errors to console as rc.local does not log anything exec 1>/dev/console 2>&1 @@ -22,12 +59,14 @@ rc-service seedrng start ## Setup Network interfaces if [ -f "${ovlpath}/wpa_supplicant.conf" ]; then logger -st ${0##*/} "Wifi setup found !" - apk add wpa_supplicant + _apk add wpa_supplicant + _preserve "/etc/wpa_supplicant/wpa_supplicant.conf" install -m600 "${ovlpath}/wpa_supplicant.conf" /etc/wpa_supplicant/wpa_supplicant.conf else logger -st ${0##*/} "Wifi setup not found !" fi +_preserve "/etc/network/interfaces" if ! install -m644 "${ovlpath}/interfaces" /etc/network/interfaces; then # set default interfaces if not specified by interface file on boot storage logger -st ${0##*/} "No interfaces file supplied, building default interfaces..." @@ -77,18 +116,21 @@ fi echo "Using following network interfaces:" cat /etc/network/interfaces +_preserve "/etc/hostname" echo "alpine-headless" > /etc/hostname hostname -F /etc/hostname -grep -q "wlan" /etc/network/interfaces && [ -f /etc/wpa_supplicant/wpa_supplicant.conf ] && rc-service wpa_supplicant start +grep -q "wlan" /etc/network/interfaces && \ + [ -f /etc/wpa_supplicant/wpa_supplicant.conf ] && \ + rc-service wpa_supplicant start rc-service networking start ## Setup temporary SSH server (root login, no password) -## we use some bundled or optionaly provided keys to avoid generation at startup and save time -apk add openssh -cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig -cp /etc/conf.d/sshd /etc/conf.d/sshd.orig +## We use some bundled (or optionaly provided) keys to avoid generation at startup and save time +_apk add openssh +_preserve "/etc/ssh/sshd_config" +_preserve "/etc/conf.d/sshd" cat <<-EOF >> /etc/ssh/sshd_config AuthenticationMethods none @@ -100,26 +142,27 @@ cat <<-EOF >> /etc/ssh/sshd_config # Banner file warn="" grep -q "${ovlpath}.*[[:space:]]ro[[:space:],]" /proc/mounts; RO=$? -[ "$RO" -eq "0" ] && warn="(remount partition read-write!)" +[ "$RO" -eq "0" ] && warn="(remount partition rw!)" cat <<-EOF > /tmp/.trash/banner Alpine Linux headless bootstrap v$VERSION by macmpi -You may want to delete/rename overlay before next reboot ${warn}: +You may want to delete/rename .apkovl file before reboot ${warn}: $ovl (can be done automatically with unattended script - see sample snippet) + EOF # Bundled temporary keys are moved in RAM /tmp so they won't be stored -# within permanent config later (new ones will then be generated) +# within permanent config later (new ones will then be generated at reboot) KEYGEN_STANCE="sshd_disable_keygen=yes" mv /etc/ssh/ssh_host_*_key* /tmp/.trash/. # Inject optional custom keys (those might be stored) if install -m600 "${ovlpath}"/ssh_host_*_key* /etc/ssh/; then - # check for empty key within injected ones: generate new keys if found + # check for empty key within injected ones: if found, generate new keys if find /etc/ssh/ -maxdepth 1 -type f -name 'ssh_host_*_key*' -empty | grep -q .; then rm /etc/ssh/ssh_host_*_key* KEYGEN_STANCE="" @@ -141,16 +184,19 @@ rc-service sshd start ## Prep for final post-cleanup ## clears any installed packages and settings -cat <<-EOF > /tmp/.trash/post-cleanup - #!/bin/sh +# copy begininng of this file to keep functions +sed -n '/^#* End .*alter!)$/q;p' /etc/local.d/headless.start > /tmp/.trash/post-cleanup + +cat <<-EOF >> /tmp/.trash/post-cleanup + logger -st ${0##*/} "Cleaning-up..." - mv /etc/ssh/sshd_config.orig /etc/ssh/sshd_config - mv /etc/conf.d/sshd.orig /etc/conf.d/sshd - apk del openssh - apk del wpa_supplicant - rm -rf /etc/wpa_supplicant - rm /etc/network/interfaces - rm /etc/hostname + _restore "/etc/ssh/sshd_config" + _restore "/etc/conf.d/sshd" + _apk del openssh + _restore "/etc/wpa_supplicant/wpa_supplicant.conf" + _apk del wpa_supplicant + _restore "/etc/network/interfaces" + _restore "/etc/hostname" rm /etc/modules-load.d/g_ether.conf rm /etc/modprobe.d/g_ether.conf rc-update del local default From f10e0c0def2cfa2f14960fa12c40e10d541a520b Mon Sep 17 00:00:00 2001 From: macmpi Date: Wed, 17 May 2023 09:52:12 +0200 Subject: [PATCH 3/4] Update readme: original state preservation notes --- README.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index ff87050..58023a6 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ -# Deploy Alpine Linux on a headless system +# Bootstrap Alpine Linux on a headless system [Alpine Linux documentation](https://docs.alpinelinux.org/user-handbook/0.1a/Installing/setup_alpine.html) assumes **initial setup** is carried-out on a system with a keyboard & display to interract with.\ However, in many cases one might want to deploy a headless system that is only available through a network connection (ethernet, wifi or as USB ethernet gadget). -This repo provides an **overlay file** to initially boot such headless system (leveraging Alpine distro's `initramfs` feature): it starts a basic ssh server to log-into from another Computer, in order to then perform actual system setup. +This repo provides an **overlay file** to initially bootstrap[^1] a headless system (leveraging Alpine distro's `initramfs` feature): it starts a ssh server to log-into from another Computer, so that actual install on fresh system (or rescue on existing disk-based system) can then be performed remotely. -## Install procedure: +## Setup procedure: Please follow [Alpine Linux Wiki](https://wiki.alpinelinux.org/wiki/Installation#Installation_Overview) to download & create installation media for the target platform.\ Tools provided here can be used on any plaform for any install modes (diskless, data disk, system disk). -Just add [**headless.apkovl.tar.gz**](https://github.com/macmpi/alpine-linux-headless-bootstrap/raw/main/headless.apkovl.tar.gz)[^1] overlay file at the root of Alpine Linux boot media (or onto any custom side-media) and boot-up the system.\ +Just add [**headless.apkovl.tar.gz**](https://github.com/macmpi/alpine-linux-headless-bootstrap/raw/main/headless.apkovl.tar.gz)[^2] overlay file at the root of Alpine Linux boot media (or onto any custom side-media) and boot-up the system.\ With default network interface definitions (and SSID/pass file if using wifi), system can then be remotely accessed with: `ssh root@`\ (system IP address may be determined with any IP scanning tools such as `nmap`). @@ -19,21 +19,23 @@ From there, actual system install can be performed as usual with `setup-alpine` Extra files may be added next to `headless.apkovl.tar.gz` to customise boostrapping configuration (check sample files): -- `wpa_supplicant.conf`[^2] (*mandatory for wifi usecase*): define wifi SSID & password. -- `interfaces`[^2] (*optional*): define network interfaces at will, if defaults DCHP-based are not suitable. -- `ssh_host_*_key*` (*optional*): provide custom ssh keys to be injected (may be stored), instead of using bundled ones[^1] (not stored). Providing an empty key file will trigger new keys generation (ssh server may take longer to start). -- `unattended.sh`[^2] (*optional*): create custom automated deployment script to further tune & extend actual setup (backgrounded). +- `wpa_supplicant.conf`[^3] (*mandatory for wifi usecase*): define wifi SSID & password. +- `interfaces`[^3] (*optional*): define network interfaces at will, if defaults DCHP-based are not suitable. +- `ssh_host_*_key*` (*optional*): provide custom ssh keys to be injected (may be stored), instead of using bundled ones[^2] (not stored). Providing an empty key file will trigger new keys generation (ssh server may take longer to start). +- `unattended.sh`[^3] (*optional*): create custom automated deployment script to further tune & extend actual setup (backgrounded). -**Goody:** seamless USB bootstrapping for PiZero devices (or similar supporting USB ethernet gadget networking):\ -Just add `dtoverlay=dwc2` in `usercfg.txt` (or `config.txt`), and plug USB cable into Computer port.\ +**Goody:** seamless USB-ethernet gadget boostrapping (PiZero for instance):\ +On supporting Pi devices, just add `dtoverlay=dwc2` in `usercfg.txt` (or `config.txt`), and plug USB cable into Computer port.\ With Computer set-up to share networking with USB interface as 10.42.0.1 gateway, one can log into device from Computer with: `ssh root@10.42.0.2` Main execution steps are logged in `/var/log/messages`. -[^1]: About bundled ssh keys: as this package is essentially intended to **quickly bootstrap** system in order to configure it, it purposely embeds [some ssh keys](https://github.com/macmpi/alpine-linux-headless-bootstrap/tree/main/overlay/etc/ssh) so that bootstrapping is as fast as possible. Those (temporary) keys are moved in RAM /tmp, so they will **not be saved/reused** once permanent configuration is set (with or without ssh server voluntarily installed in permanent setup). +[^1]: Initial boot fully preserves system's original state (config files & installed packages): a fresh system will therefore come-up as unconfigured. -[^2]: These files are linux text files: Windows/macOS users need to use text editors supporting linux text line-ending (such as [notepad++](https://notepad-plus-plus.org/), BBEdit or any similar). +[^2]: About bundled ssh keys: this overlay is meant to **quickly bootstrap** system in order to then proceed with proper install; therefore it purposely embeds [some ssh keys](https://github.com/macmpi/alpine-linux-headless-bootstrap/tree/main/overlay/etc/ssh) so that bootstrapping is as fast as possible. Those temporary keys are moved in RAM /tmp: they will **not be stored/reused** once actual system install is performed (whether or not ssh server is installed in final setup). + +[^3]: These files are linux text files: Windows/macOS users need to use text editors supporting linux text line-ending (such as [notepad++](https://notepad-plus-plus.org/), BBEdit or any similar). ## How to customize ? From d40447c6fa09b45642d586c96f563b1cd25fa369 Mon Sep 17 00:00:00 2001 From: macmpi Date: Wed, 17 May 2023 19:13:41 +0200 Subject: [PATCH 4/4] bump version to 0.8 --- headless.apkovl.tar.gz | Bin 5644 -> 5642 bytes overlay/etc/local.d/headless.start | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/headless.apkovl.tar.gz b/headless.apkovl.tar.gz index 13cfcfdd675e468d3b5abcd21241d9394da2ef7a..aaac53ca077c83efa0184a819a34523948774e4a 100644 GIT binary patch delta 5439 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 delta 5440 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 diff --git a/overlay/etc/local.d/headless.start b/overlay/etc/local.d/headless.start index 847d3f7..0ad1ec6 100755 --- a/overlay/etc/local.d/headless.start +++ b/overlay/etc/local.d/headless.start @@ -3,7 +3,7 @@ # Copyright 2022 - 2023, macmpi # SPDX-License-Identifier: MIT -VERSION="0.7" +VERSION="0.8" _apk() {