From c25740e7e10e87cc858dd0987eae4c51469e995b Mon Sep 17 00:00:00 2001 From: macmpi <16296055+macmpi@users.noreply.github.com> Date: Fri, 17 Nov 2023 00:06:41 +0100 Subject: [PATCH] version 1.1 improved interfaces detection fixes https://github.com/macmpi/alpine-linux-headless-bootstrap/issues/20 --- README.md | 4 +- headless.apkovl.tar.gz | Bin 7263 -> 7543 bytes make.sh | 33 +++--- overlay/usr/local/bin/headless_bootstrap | 123 +++++++++++++---------- 4 files changed, 90 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index c906df8..c15bca8 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Please follow [Alpine Linux Wiki](https://wiki.alpinelinux.org/wiki/Installation 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://is.gd/apkovl_master)[^2] overlay file *as-is* at the root of Alpine Linux boot media (or onto any custom side-media) and boot-up the system.\ -With default DCHP-based network interface definitions (and [SSID/pass file](#extra-configuration) if using wifi), system can then be remotely accessed with: `ssh root@`\ +With default DCHP-based network interface definitions (and [SSID/pass](#extra-configuration) 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`). As with Alpine Linux initial bring-up, `root` account has no password initially (change that during target setup!).\ @@ -29,7 +29,7 @@ Extra files may be added next to `headless.apkovl.tar.gz` to customise boostrapp **Goody:** seamless USB-serial & USB-ethernet gadget mode (PiZero for instance):\ On supporting Pi devices, just add `dtoverlay=dwc2,dr_mode=peripheral` in `usercfg.txt` (or `config.txt`), and plug USB cable into host Computer port.\ -Serial terminal can then be connected-to from host Computer (xon/xoff flow control: e.g. on Linux with `cu -l ttyACM0`).\ +Serial terminal can then be connected-to from host Computer (e.g. `cu -l ttyACM0` on Linux. xon/xoff flow control).\ Alternatively, with host Computer set-up to share networking with USB interface as 10.42.0.1 gateway, one can log into device from host with: `ssh root@10.42.0.2`. Main execution steps are logged: `cat /var/log/messages | grep headless`. diff --git a/headless.apkovl.tar.gz b/headless.apkovl.tar.gz index c468d2f458cd118ac1d7abf5805983e679222c92..b63ae17897b16033bf3bbe0ea9c3ad141c01c497 100644 GIT binary patch literal 7543 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 /dev/null || alias doas="/usr/bin/sudo" build_path="$(mktemp -d)" if [ -n "$build_path" ]; then - cp -r overlay "$build_path"/. - find "$build_path"/overlay/ -exec touch -md "$(date '+%F 00:00:00')" {} \; - - # setting owner/groups for runtime (won't affect mtime) + cp -a overlay "$build_path"/. + # busybox config on Alpine & Ubuntu has FEATURE_TAR_GNU_EXTENSIONS + # so will preserve user/group/modes & mtime + find "$build_path"/overlay/ -exec sh -c 'TZ=UTC touch -chm -t $( TZ=UTC date +%Y%m%d0000.00 ) $0' {} \; + # setting modes and owner/groups for runtime (won't affect mtime) find "$build_path"/overlay/etc -type d -exec chmod 755 {} \; - chmod +x "$build_path"/overlay/etc/init.d/* - find "$build_path"/overlay/usr -type d -exec chmod 755 {} \; - chmod +x "$build_path"/overlay/usr/local/bin/* + chmod 755 "$build_path"/overlay/etc/init.d/* + chmod 755 "$build_path"/overlay/etc/runlevels/default/* chmod 777 "$build_path"/overlay/tmp chmod 700 "$build_path"/overlay/tmp/.trash - chmod 600 "$build_path"/overlay/tmp/.trash/ssh_host_*_key - doas chown -R 0:0 "$build_path"/overlay/* - - doas tar -cvf "$build_path"/headless.apkovl.tar -C "$build_path"/overlay etc usr tmp - gzip -nk9 "$build_path"/headless.apkovl.tar && mv "$build_path"/headless.apkovl.tar.gz . - touch -md "$(date '+%F 00:00:00')" headless.apkovl.tar.gz + chmod -R 600 "$build_path"/overlay/tmp/.trash/ssh_host_*_key + find "$build_path"/overlay/usr -type d -exec chmod 755 {} \; + chmod 755 "$build_path"/overlay/usr/local/bin/* + # busybox config on Ubuntu does not enable use of user and group names in tar + # (FEATURE_TAR_UNAME_GNAME not set) + doas chown -Rh 0:0 "$build_path"/overlay/* + # shellcheck disable=SC2046 # we want word splitting as result of find + doas tar cv -C "$build_path"/overlay --no-recursion \ + $(doas find "$build_path"/overlay/ | sed "s|$build_path/overlay/||" | sort | xargs ) | \ + gzip -c9n > headless.apkovl.tar.gz + TZ=UTC touch -cm -t "$( TZ=UTC date +%Y%m%d0000.00 )" headless.apkovl.tar.gz doas rm -rf "$build_path" fi diff --git a/overlay/usr/local/bin/headless_bootstrap b/overlay/usr/local/bin/headless_bootstrap index 485f5f8..6ba5a96 100755 --- a/overlay/usr/local/bin/headless_bootstrap +++ b/overlay/usr/local/bin/headless_bootstrap @@ -3,7 +3,7 @@ # SPDX-FileCopyrightText: Copyright 2022-2023, macmpi # SPDX-License-Identifier: MIT -HDLSBSTRP_VERSION="1.0" +HDLSBSTRP_VERSION="1.1" _apk() { local cmd="$1" @@ -29,7 +29,7 @@ _apk() { _preserve() { # create a back-up of element (file, folder, symlink) [ -z "${1}" ] && return 1 - [ -e "$1" ] && cp -a "$1" "${1}.orig" + [ -e "${1}" ] && cp -a "${1}" "${1}".orig } _restore() { @@ -37,7 +37,7 @@ _restore() { # previous back-up if available [ -z "${1}" ] && return 1 rm -rf "${1}" - [ -e "${1}.orig" ] && mv -f "${1}.orig" "${1}" + [ -e "${1}".orig ] && mv -f "${1}".orig "${1}" } # shellcheck disable=SC2142 # known special case @@ -69,7 +69,7 @@ cat <<-EOF >> /tmp/.trash/headless_cleanup rm -f /usr/local/bin/headless_bootstrap # Run unattended script if available - install -m755 "${ovlpath}/unattended.sh" /tmp/headless_unattended > /dev/null 2>&1 && \ + install -m755 "${ovlpath}"/unattended.sh /tmp/headless_unattended > /dev/null 2>&1 && \ _logger "Starting headless_unattended service" && \ rc-service headless_unattended start @@ -99,7 +99,7 @@ cat <<-EOF > /etc/ssh/sshd_config EOF # Client authorized_keys or no authentication -if install -m600 "${ovlpath}/authorized_keys" /tmp/.trash/authorized_keys > /dev/null 2>&1; then +if install -m600 "${ovlpath}"/authorized_keys /tmp/.trash/authorized_keys > /dev/null 2>&1; then _logger "Enabling public key SSH authentication..." cat <<-EOF >> /etc/ssh/sshd_config AuthenticationMethods publickey @@ -161,58 +161,66 @@ _logger "Internet access: $status" _setup_networking() { ## Setup Network interfaces -if [ -d "/sys/class/net/wlan0" ] && [ -f "${ovlpath}/wpa_supplicant.conf" ]; then +local has_wifi +_has_wifi() { return "$has_wifi"; } + +find /sys/class/ieee80211/*/device/net/* -maxdepth 0 -type d -exec basename {} \; > /tmp/.wlan_list 2>/dev/null +[ -s /tmp/.wlan_list ] && [ -f "${ovlpath}"/wpa_supplicant.conf ] +has_wifi=$? +if _has_wifi; then _logger "Configuring wifi..." _apk add wpa_supplicant _preserve "/etc/wpa_supplicant/wpa_supplicant.conf" - install -m600 "${ovlpath}/wpa_supplicant.conf" /etc/wpa_supplicant/wpa_supplicant.conf + install -m600 "${ovlpath}"/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf + rc-service wpa_supplicant restart else - _logger "No wifi interface or setup file supplied" + _logger "No wifi interface or SSID/pass file supplied" fi _preserve "/etc/network/interfaces" -if ! install -m644 "${ovlpath}/interfaces" /etc/network/interfaces > /dev/null 2>&1; then - # set default interfaces if not specified by interface file on boot storage +if ! install -m644 "${ovlpath}"/interfaces /etc/network/interfaces > /dev/null 2>&1; then _logger "No interfaces file supplied, building defaults..." + cat <<-EOF > /etc/network/interfaces + auto lo + iface lo inet loopback + + EOF for dev in /sys/class/net/*; do - dev="$(basename "$dev")" - case ${dev%%[0-9]*} in + # shellcheck disable=SC2034 # Unused IFINDEX while still sourced from uevent + local DEVTYPE INTERFACE IFINDEX + DEVTYPE="" + # shellcheck source=/dev/null + . "$dev"/uevent + case ${INTERFACE%%[0-9]*} in lo) - cat <<-EOF >> /etc/network/interfaces - auto $dev - iface $dev inet loopback - - EOF - ;; + ;; eth) + cat <<-EOF >> /etc/network/interfaces + auto $INTERFACE + iface $INTERFACE inet dhcp + + EOF + ;; + *) + _has_wifi && grep -q "$INTERFACE" /tmp/.wlan_list && \ cat <<-EOF >> /etc/network/interfaces - auto $dev - iface $dev inet dhcp + auto $INTERFACE + iface $INTERFACE inet dhcp - EOF - ;; - wlan) - [ -f /etc/wpa_supplicant/wpa_supplicant.conf ] && cat <<-EOF >> /etc/network/interfaces - auto $dev - iface $dev inet dhcp + EOF + [ "$DEVTYPE" = "gadget" ] && \ + cat <<-EOF >> /etc/network/interfaces && cat <<-EOF > /etc/resolv.conf + auto $INTERFACE + iface $INTERFACE inet static + address 10.42.0.2/24 + gateway 10.42.0.1 - EOF - ;; - usb) - cat <<-EOF >> /etc/network/interfaces - auto $dev - iface $dev inet static - address 10.42.0.2/24 - gateway 10.42.0.1 + EOF + nameserver 208.67.222.222 + nameserver 208.67.220.220 - EOF - - cat <<-EOF > /etc/resolv.conf - nameserver 208.67.222.222 - nameserver 208.67.220.220 - - EOF - ;; + EOF + ;; esac done fi @@ -226,25 +234,31 @@ _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 restart rc-service networking restart +rm -f /tmp/.wlan_list } _setup_gadget() { -# load composite USB Serial/USB Ethernel driver & setup terminal +## load composite USB Serial/USB Ethernel driver & setup terminal _logger "Enabling USB-gadget Serial and Ethernet ports" lsmod | grep -q "dwc2" || modprobe -qs dwc2 -modprobe -qs g_cdc -# default config: xon/xoff flow control -stty -g -F /dev/ttyGS0 >/dev/null 2>&1 && setconsole /dev/ttyGS0 +# remove conflicting modules in case they were initially loaded (cmdline.txt) +modprobe -rq g_serial g_ether g_cdc +modprobe -q g_cdc && sleep 1 +# once driver has settled check if cable is connected: unload if not +[ "$( cat "$udc_gadget"/current_speed )" = "UNKNOWN" ] && \ + _logger "USB cable not connected !!" && modprobe -rq g_cdc && return 1 + +# default serial config: xon/xoff flow control +stty -g -F /dev/ttyGS0 >/dev/null 2>&1 # notes to users willing to connect from Linux Ubuntu-based host terminal: # - user on host needs to be part of dialout group (reboot required), and # - disable spurious AT commands from ModemManager on host-side Gadget serial port # you may create a /etc/udev/rules.d/99-ttyacms-gadget.rules as per: # https://linux-tips.com/t/prevent-modem-manager-to-capture-usb-serial-devices/284/2 # ATTRS{idVendor}=="0525" ATTRS{idProduct}=="a4aa", ENV{ID_MM_DEVICE_IGNORE}="1" + +setconsole /dev/ttyGS0 } @@ -258,9 +272,10 @@ _logger "Alpine Linux headless bootstrap v$HDLSBSTRP_VERSION by macmpi" # help randomness for wpa_supplicant and sshd (urandom until 3.16) rc-service seedrng restart || rc-service urandom restart -# setup USB gadget mode if device has compatible device-tree -find /proc/device-tree/soc/usb* -name "dr_mode" -print0 | \ - xargs -0 grep -q "peripheral" && _setup_gadget +# setup USB gadget mode if such device mode is enabled +udc_gadget="$( dirname "$( find -L /sys/class/udc/* -maxdepth 2 -type f -name "is_a_peripheral" 2>/dev/null)" )" +[ "$( cat "$udc_gadget"/is_a_peripheral 2>/dev/null )" = "0" ] && \ + _setup_gadget # Determine ovl file location # grab used ovl filename from dmesg @@ -293,10 +308,10 @@ _setup_networking # Test latest available version online # Can be skipped by creating a 'opt-out'-named dummy file aside apkovl file -[ -f "${ovlpath}/opt-out" ] || _tst_version & +[ -f "${ovlpath}"/opt-out ] || _tst_version & # setup sshd unless unattended.sh script prevents it -grep -q "^#NO_SSH$" "${ovlpath}/unattended.sh" > /dev/null 2>&1 \ +grep -q "^#NO_SSH$" "${ovlpath}"/unattended.sh > /dev/null 2>&1 \ || _setup_sshd _prep_cleanup