diff options
author | Jesús <heckyel@hyperbola.info> | 2021-03-08 19:43:35 -0500 |
---|---|---|
committer | Jesús <heckyel@hyperbola.info> | 2021-03-08 19:43:35 -0500 |
commit | df1904ac0db6410abbb10ca1308695bbc626ff69 (patch) | |
tree | dde5b3223c898b1c08dc0f2205cd724d59939886 | |
parent | ab6a7fcb62c68f3011e01bac962148cb206dbd9b (diff) | |
download | hyperbola-bootstrap-df1904ac0db6410abbb10ca1308695bbc626ff69.tar.lz hyperbola-bootstrap-df1904ac0db6410abbb10ca1308695bbc626ff69.tar.xz hyperbola-bootstrap-df1904ac0db6410abbb10ca1308695bbc626ff69.zip |
Add support Hyperbola v0.3
-rwxr-xr-x | hyper-bootstrap_v0.3.sh | 282 | ||||
-rwxr-xr-x | hyper-bootstrap_v0.4.sh (renamed from hyper-bootstrap.sh) | 0 | ||||
-rw-r--r-- | make-bootstrap-file.sh | 9 |
3 files changed, 288 insertions, 3 deletions
diff --git a/hyper-bootstrap_v0.3.sh b/hyper-bootstrap_v0.3.sh new file mode 100755 index 0000000..98408ad --- /dev/null +++ b/hyper-bootstrap_v0.3.sh @@ -0,0 +1,282 @@ +#!/bin/bash +# +# hyperbola-bootstrap: Bootstrap a base Hyperbola GNU+Linux-libre system using any GNU distribution. +# +# Dependencies: bash >= 4, coreutils, wget, sed, gawk, tar, gzip, chroot, xz, zstd. +# Project: https://git.sr.ht/~heckyel/hyperbola-bootstrap +# +# Usage: +# +# # ./hyper-bootstrap.sh destination +# # ./hyper-bootstrap.sh -a x86_64 -r https://repo.hyperbola.info:50011/gnu-plus-linux-libre/testing destination-64 +# +# Example: +# +# # ./hyper-bootstrap.sh -a x86_64 -r "https://mirror.fsf.org/hyperbola/gnu-plus-linux-libre/testing" myhyper +# # ./hyper-bootstrap.sh myhyper +# +# And then you can chroot to the destination directory (user: root, password: root): +# +# # chroot destination +# +# Note that some packages require some system directories to be mounted. Some of the commands you can try: +# +# # mount --bind /proc myhyper/proc +# # mount --bind /sys myhyper/sys +# # mount --bind /dev myhyper/dev +# # mount --bind /dev/pts myhyper/dev/pts +# + +set -e -u -o pipefail + +# Packages needed by pacman (see get-pacman-dependencies.sh) +PACMAN_PACKAGES=( + bash acl hyperbola-keyring attr bzip2 curl expat glibc gpgme libarchive grep sed coreutils + libassuan libgpg-error libnghttp2 libssh2 lzo libressl pacman pacman-mirrorlist xz zlib libffi + krb5 e2fsprogs keyutils libidn gcc-libs lz4 libpsl icu readline libunistring findutils + ncurses pinentry lsb-release ca-certificates ca-certificates-utils p11-kit libtasn1 + libcap shadow pcre +) +CORE_PACKAGES=(${PACMAN_PACKAGES[*]} filesystem) +COMMUNITY_PACKAGES=(lzip zstd) +EXTRA_PACKAGES=(gawk file tar openrc) +DEFAULT_REPO_URL="https://mirror.fsf.org/hyperbola/gnu-plus-linux-libre/testing" + +stderr() { + echo "$@" >&2 +} + +debug() { + echo -e "\e[1;32m==>\e[0m\033[1m $* \e[m" +} + +extract_href() { + sed -n '/<a / s/^.*<a [^>]*href="\([^\"]*\)".*$/\1/p' +} + +fetch() { + curl -L -s "$@" +} + +fetch_file() { + local FILEPATH=$1 + shift + if [[ -e "$FILEPATH" ]]; then + curl -L -z "$FILEPATH" -o "$FILEPATH" "$@" + else + curl -L -o "$FILEPATH" "$@" + fi +} + +uncompress() { + local FILEPATH=$1 DEST=$2 + + case "$FILEPATH" in + *.gz) + tar xzf "$FILEPATH" -C "$DEST";; + *.xz) + # tar xzf "$FILEPATH" -C "$DEST" ;; + tar -xf "$FILEPATH" -C "$DEST" > /dev/null 2> /dev/null;; + *.lz) + tar xf "$FILEPATH" -C "$DEST";; + *.zst) + zstd -dc "$FILEPATH" | tar x -C "$DEST";; + *) + debug "Error: unknown package format: $FILEPATH" + return 1;; + esac +} + +### + +get_default_repo() { + local ARCH=$1 + if [[ "$ARCH" == x86* || "$ARCH" == i686 ]]; then + echo $DEFAULT_REPO_URL + fi +} + +get_core_repo_url() { + local REPO_URL=$1 ARCH=$2 + if [[ "$ARCH" == x86* || "$ARCH" == i686 ]]; then + echo "${REPO_URL%/}/core/os/$ARCH" + fi +} + +get_extra_repo_url() { + local REPO_URL=$1 ARCH=$2 + if [[ "$ARCH" == x86* || "$ARCH" == i686 ]]; then + echo "${REPO_URL%/}/extra/os/$ARCH" + fi +} + +get_community_repo_url() { + local REPO_URL=$1 ARCH=$2 + if [[ "$ARCH" == x86* || "$ARCH" == i686 ]]; then + echo "${REPO_URL%/}/community/os/$ARCH" + fi +} + +get_template_repo_url() { + local REPO_URL=$1 ARCH=$2 + if [[ "$ARCH" == x86* || "$ARCH" == i686 ]]; then + echo "${REPO_URL%/}/\$repo/os/$ARCH" + fi +} + +configure_pacman() { + local DEST=$1 ARCH=$2 + debug "Configuring SERVER" + SERVER=$(get_template_repo_url "$REPO_URL" "$ARCH") + echo "Server = $SERVER" > "$DEST/etc/pacman.d/mirrorlist" + debug "Configuring CERT" + cp -fv certs/1.pem "$DEST/etc/ca-certificates/extracted/tls-ca-bundle.pem" +} + +clean_chroot() { + local DEST=$1 + debug "Clean Chroot" + rm -rf "$DEST/.BUILDINFO" "$DEST/.INSTALL" "$DEST/.MTREE" "$DEST/.PKGINFO" || true +} + +configure_minimal_system() { + local DEST=$1 + + mkdir -p "$DEST/dev" + sed -ie 's|^root:.*$|root:$1$GT9AUpJe$oXANVIjIzcnmOpY07iaGi/:14657::::::|' "$DEST/etc/shadow" + touch "$DEST/etc/group" + echo "bootstrap" > "$DEST/etc/hostname" + + rm -f "$DEST/etc/mtab" + echo "rootfs / rootfs rw 0 0" > "$DEST/etc/mtab" + test -e "$DEST/dev/null" || mknod "$DEST/dev/null" c 1 3 + test -e "$DEST/dev/random" || mknod -m 0644 "$DEST/dev/random" c 1 8 + test -e "$DEST/dev/urandom" || mknod -m 0644 "$DEST/dev/urandom" c 1 9 + + sed -i "s|^[[:space:]]*\(CheckSpace\)|# \1|" "$DEST/etc/pacman.conf" + sed -i "s|^[[:space:]]*SigLevel[[:space:]]*=.*$|SigLevel = Never|" "$DEST/etc/pacman.conf" +} + +fetch_packages_list() { + local REPO=$1 + + debug "Fetch packages list: $REPO/" + fetch "$REPO/" | extract_href | awk -F"/" '{print $NF}' | sort -rn || + { debug "Error: cannot fetch packages list: $REPO"; return 1; } +} + +install_pacman_packages() { + local BASIC_PACKAGES=$1 DEST=$2 LIST=$3 DOWNLOAD_DIR=$4 + debug "pacman package and dependencies: $BASIC_PACKAGES" + + for PACKAGE in $BASIC_PACKAGES; do + local FILE=$(echo "$LIST" | grep -m1 "^$PACKAGE-[[:digit:]].*\(\.gz\|\.xz\|\.lz\|\.zst\)$") + test "$FILE" || { debug "Error: cannot find package: $PACKAGE"; return 1; } + local FILEPATH="$DOWNLOAD_DIR/$FILE" + + debug "Download package: $REPO/$FILE" + fetch_file "$FILEPATH" "$REPO/$FILE" + debug "Uncompress package: $FILEPATH" + uncompress "$FILEPATH" "$DEST" + done +} + +install_pacman_packages_community() { + local BASIC_PACKAGES=$1 DEST=$2 LIST=$3 DOWNLOAD_DIR=$4 + debug "pacman package and dependencies: $COMMUNITY_PACKAGES" + + for PACKAGE in $BASIC_PACKAGES; do + local FILE=$(echo "$LIST" | grep -m1 "^$PACKAGE-[[:digit:]].*\(\.gz\|\.xz\|\.lz\|\.zst\)$") + test "$FILE" || { debug "Error: cannot find package: $PACKAGE"; return 1; } + local FILEPATH="$DOWNLOAD_DIR/$FILE" + + debug "Download package: $REPO_COMMUNITY/$FILE" + fetch_file "$FILEPATH" "$REPO_COMMUNITY/$FILE" + debug "Uncompress package: $FILEPATH" + uncompress "$FILEPATH" "$DEST" + done +} + +configure_static_qemu() { + local ARCH=$1 DEST=$2 + [[ "$ARCH" == arm* ]] && ARCH=arm + QEMU_STATIC_BIN=$(command -v qemu-$ARCH-static || echo ) + [[ -e "$QEMU_STATIC_BIN" ]] ||\ + { debug "No static qemu for $ARCH, ignoring"; return 0; } + cp "$QEMU_STATIC_BIN" "$DEST/usr/bin" +} + +install_packages() { + local ARCH=$1 DEST=$2 PACKAGES=$3 + debug "Install packages: $PACKAGES" + LC_ALL=C chroot "$DEST" \ + /usr/bin/pacman --noconfirm --arch $ARCH -Syy --force $PACKAGES +} + +configure_keyring() { + local DEST=$1 + sed -i 's|SigLevel = Never|SigLevel = Required DatabaseOptional|' "$DEST/etc/pacman.conf" + LC_ALL=C chroot "$DEST" \ + /usr/bin/pacman-key --init && /usr/bin/pacman-key --populate hyperbola +} + +show_usage() { + stderr "Usage: $(basename "$0") [-q] [-a i686|x86_64|arm] [-r REPO_URL] [-d DOWNLOAD_DIR] DESTDIR" +} + +main() { + # Process arguments and options + test $# -eq 0 && set -- "-h" + local ARCH= + local REPO_URL= + local USE_QEMU= + local DOWNLOAD_DIR= + local PRESERVE_DOWNLOAD_DIR= + + while getopts "qa:r:d:h" ARG; do + case "$ARG" in + a) ARCH=$OPTARG;; + r) REPO_URL=$OPTARG;; + q) USE_QEMU=true;; + d) DOWNLOAD_DIR=$OPTARG + PRESERVE_DOWNLOAD_DIR=true;; + *) show_usage; return 1;; + esac + done + shift $(($OPTIND-1)) + test $# -eq 1 || { show_usage; return 1; } + + [[ -z "$ARCH" ]] && ARCH=$(uname -m) + [[ -z "$REPO_URL" ]] && REPO_URL=$(get_default_repo "$ARCH") + + local DEST=$1 + local REPO=$(get_core_repo_url "$REPO_URL" "$ARCH") + local REPO_COMMUNITY=$(get_community_repo_url "$REPO_URL" "$ARCH") + [[ -z "$DOWNLOAD_DIR" ]] && DOWNLOAD_DIR=$(mktemp -d) + mkdir -p "$DOWNLOAD_DIR" + [[ -z "$PRESERVE_DOWNLOAD_DIR" ]] && trap "rm -rf '$DOWNLOAD_DIR'" TERM EXIT + debug "Destination directory: $DEST" + debug "Core repository: $REPO" + debug "Temporary directory: $DOWNLOAD_DIR" + + # Fetch packages, install system and do a minimal configuration + mkdir -p "$DEST" + local LIST_1=$(fetch_packages_list $REPO) + local LIST_3=$(fetch_packages_list $REPO_COMMUNITY) + install_pacman_packages "${CORE_PACKAGES[*]}" "$DEST" "$LIST_1" "$DOWNLOAD_DIR" + install_pacman_packages_community "${COMMUNITY_PACKAGES[*]}" "$DEST" "$LIST_3" "$DOWNLOAD_DIR" + configure_pacman "$DEST" "$ARCH" + configure_minimal_system "$DEST" + [[ -n "$USE_QEMU" ]] && configure_static_qemu "$ARCH" "$DEST" + install_packages "$ARCH" "$DEST" "${CORE_PACKAGES[*]} ${EXTRA_PACKAGES[*]}" + configure_keyring "$DEST" + clean_chroot "$DEST" # clean + [[ -z "$PRESERVE_DOWNLOAD_DIR" ]] && rm -rf "$DOWNLOAD_DIR" + + debug "Done!" + debug + debug "You may now chroot or arch-chroot from package arch-install-scripts:" + debug "$ doas arch-chroot $DEST" +} + +main "$@" diff --git a/hyper-bootstrap.sh b/hyper-bootstrap_v0.4.sh index fd057c5..fd057c5 100755 --- a/hyper-bootstrap.sh +++ b/hyper-bootstrap_v0.4.sh diff --git a/make-bootstrap-file.sh b/make-bootstrap-file.sh index 00e46bf..c411cf2 100644 --- a/make-bootstrap-file.sh +++ b/make-bootstrap-file.sh @@ -10,13 +10,16 @@ CHROOT_DELETE='y' RESULTPATH=${SCRIPT_PWD}/ ARCH="x86_64" -REPO_URL="https://mirror.fsf.org/hyperbola/gnu-plus-linux-libre/testing" +REPO_URL="https://mirror.fsf.org/hyperbola/gnu-plus-linux-libre/stable" ROOTFS="$ARCH" # remove old archives rm -f "${RESULTPATH}/hyperbola-bootstrap.tar.gz" "${RESULTPATH}/hyperbola-bootstrap.tar.gz.sha512sum" -# bootstrap -"${SCRIPT_PWD}/hyper-bootstrap.sh" -a "${ARCH}" -r "${REPO_URL}" "${ROOTFS}" +# bootstrap for v0.4 +"${SCRIPT_PWD}/hyper-bootstrap_v0.4.sh" -a "${ARCH}" -r "${REPO_URL}" "${ROOTFS}" + +# bootstrap for v0.3 +# "${SCRIPT_PWD}/hyper-bootstrap_v0.3.sh" -a "${ARCH}" -r "${REPO_URL}" "${ROOTFS}" cd "${ROOTFS}" # clean up package cache |