#!/bin/sh set -xeu chroot_dir="/mnt" arch="$(uname -m)" mirror="https://dl-cdn.alpinelinux.org/alpine" alpine_version="v3.20" apk_version="2.14.4-r1" apk_link="${mirror}/${alpine_version}/main/${arch}/apk-tools-static-${apk_version}.apk" fatal() { echo "$1" >&2 } die() { fatal "$2" exit "$1" } usage() { cat >&2 < [-r ] [-h] Action: rootfs deploy alpine rootfs in setup setup rootfs inside chroot environment full deploy rootfs and run setup inside chroot Options: -r specify chroot directory [default: $chroot_dir] -h show this help message EOF exit "$1" } ensure_root() { if [ "$(id -u)" = 0 ]; then return 0 fi die 1 "The script must be run as root" } parse_action() { case "$1" in rootfs|setup|full) action="$1" ;; *) fatal "unknown op: $1" usage 1 ;; esac } parse_args() { [ "$#" -lt 1 ] && usage 1 parse_action "$1" && shift while getopts "r:h" opt; do case "$opt" in r) chroot_dir="$(realpath "$OPTARG")" ;; h) usage 0 ;; ?) usage 1 ;; esac done } # download static apk and print the executable filename download_apk() { local tmpdir tmpdir="$(mktemp -d)" curl -L "$apk_link" | tar -C "$tmpdir" -xzf - echo "$tmpdir/sbin/apk.static" } install_rootfs() { apk_bin="$(download_apk)" mkdir -p "$chroot_dir/etc/apk" "$apk_bin" -X "$mirror/$alpine_version/main" -U --allow-untrusted \ -p "$chroot_dir" --initdb add alpine-base e2fsprogs cat > "$chroot_dir/etc/resolv.conf" < "$chroot_dir/etc/apk/repositories" <