#!/bin/sh set -e def_arch=$(uname -m) def_ver="1.0-rc1" readonly PROGNAME=$(basename $0) [ -z $ZSH_VERSION ] || set -y warn() { printf '>>> ' printf '\033[01;33mWARNING\033[00;39m ' printf '>>> ' printf '\033[01;33mWARNING\033[00;39m ' printf '>>> ' printf '\033[01;33mWARNING\033[00;39m ' printf '>>> ' printf '\033[01;33mWARNING\033[00;39m ' printf '>>>\n' } fatal() { printf '>>> ' printf '\033[01;31mERROR\033[00;39m ' printf '>>> ' printf '\033[01;31mERROR\033[00;39m ' printf '>>> ' printf '\033[01;31mERROR\033[00;39m ' printf '>>> ' printf '\033[01;31mERROR\033[00;39m ' printf '>>>\n' } ensure_commands() { if ! command -v apk>/dev/null 2>/dev/null; then fatal printf 'You must have apk installed. On Gentoo, see sys-devel/apk-tools.\n' exit 127 fi if ! command -pv tar>/dev/null 2>/dev/null; then fatal printf 'You must have tar installed.\n' exit 127 fi } usage() { printf 'usage: %s [-a ARCH] [--mini] [-v VERSION] [--help]\n\n' $PROGNAME printf 'Create an Adélie Linux root FS tarball (.TXZ) using the specified parameters.\n\n' printf 'Default ARCH: %s\n' $def_arch printf 'Default VERSION: %s\n' $def_ver } while [ -n "$1" ]; do case $1 in -a | --arch) shift readonly MY_ARCH=$1 ;; -h | --help) usage exit ;; --mini) readonly MINI=yes ;; -v | --version) shift readonly MY_VER=$1 ;; -c | --cache) shift readonly MY_CACHE=$1 ;; --no-cache) unset def_cache ;; *) usage >&2 exit 127 ;; esac shift done [ -d /etc/apk/cache ] && def_cache=/etc/apk/cache [ -z "${MY_ARCH}" -o "${MY_ARCH}" = "${def_arch}" ] || unset def_cache set -a readonly ARCH=${MY_ARCH:-$def_arch} readonly LDARCH=${LDARCH:-$ARCH} readonly PHASE=${MY_PHASE:-all} readonly VERSION=${MY_VER:-$def_ver} readonly APKVER=${MY_APKVER:-$VERSION} readonly URL=${MY_URL:-https://distfiles.adelielinux.org/adelie/$VERSION/} readonly CACHE=${MY_CACHE:-$def_cache} set +a ensure_commands header() { printf '\033[01;32m * \033[37m%s\033[00;39m\n' "$1" } header 'Adélie Linux Root FS Tarball Creation Tool' printf '\n' clean_dirs() { warn printf 'This will erase all files at the directories %s/rootfs-%s.\n\n' `pwd` $ARCH printf 'When you are ready, press RETURN. To cancel, press Ctrl-C.\n' read dontcare rm -rf rootfs-$ARCH mkdir rootfs-$ARCH mkdir -p out } install_pkgs() { header "Installing base system to tar root..." if test -n "${MINI+mini}"; then readonly PACKAGES="adelie-core dash-binsh" readonly ARCH_PKGS="" else readonly PACKAGES="$(cat packages/base 2>/dev/null | tr '\n' ' ' || fatal 'No core packages specified')" readonly ARCH_PKGS="$(cat packages/arch/$ARCH 2>/dev/null | tr '\n' ' ' || echo '')" fi mkdir -p rootfs-$ARCH/etc/apk cp -r /etc/apk/keys rootfs-$ARCH/etc/apk/ # Disable grub trigger. mkdir -p rootfs-$ARCH/etc/default printf "ADELIE_MANUAL_CONFIG=1\n" >> rootfs-$ARCH/etc/default/grub mkdir -p rootfs-$ARCH/dev mknod rootfs-$ARCH/dev/urandom c 1 9 mkdir -p rootfs-$ARCH/usr/sbin mkdir -p rootfs-$ARCH/root cp -r bin rootfs-$ARCH/root/bin apk --arch $ARCH \ ${CACHE:+--cache-dir "${CACHE}"} \ -X "$URL/system/$EXTRA_MIRROR" \ -X "$URL/user/$EXTRA_MIRROR" \ -U --root rootfs-$ARCH --initdb add $PACKAGES $ARCH_PKGS rm -fr rootfs-$ARCH/root/bin } make_structure() { if test -n "${MINI+mini}"; then echo 'adelie-mini' > rootfs-$ARCH/etc/hostname else echo 'adelie-root' > rootfs-$ARCH/etc/hostname for _runlevel in sysinit boot default shutdown; do mkdir -p rootfs-$ARCH/etc/runlevels/$_runlevel done echo 'mtab_is_file=no' > rootfs-$ARCH/etc/conf.d/mtab for siservice in udev udev-trigger lvmetad; do ln -s /etc/init.d/$siservice \ rootfs-$ARCH/etc/runlevels/sysinit/$siservice done for bootservice in root binfmt bootmisc fsck hostname hwclock \ keymaps localmount loopback modules mtab procfs sysctl \ sysfsconf termencoding tmpfiles.setup urandom; do ln -s /etc/init.d/$bootservice \ rootfs-$ARCH/etc/runlevels/boot/$bootservice done readonly BASE_SERVICES="$(cat services/base 2>/dev/null | tr '\n' ' ' || echo '')" [ -z BASE_SERVICES ] || for base_service in $BASE_SERVICES; do ln -s /etc/init.d/$base_service \ rootfs-$ARCH/etc/runlevels/default/$base_service done cp AdelieTux.icns rootfs-$ARCH/.VolumeIcon.icns # Put a copy of the kernel(s) in the kernels/$ARCH/ directory, # so users may download them for netbooting or such. mkdir -p out/kernels/$ARCH cp -r rootfs-$ARCH/boot/* out/kernels/$ARCH/ fi cat >rootfs-$ARCH/etc/fstab <<- FSTAB # Welcome to Adélie Linux. # This fstab(5) is for the live media only. Edit for use for your installation. tmpfs /tmp tmpfs defaults 0 1 proc /proc proc defaults 0 1 FSTAB cat >rootfs-$ARCH/etc/resolv.conf <<- RESOLVE nameserver 2620:fe::fe nameserver 9.9.9.9 nameserver 149.112.112.112 RESOLVE cat >rootfs-$ARCH/etc/apk/repositories <<-REPOS https://distfiles.adelielinux.org/adelie/$APKVER/system/$EXTRA_MIRROR https://distfiles.adelielinux.org/adelie/$APKVER/user/$EXTRA_MIRROR REPOS } tar_it() { header 'Creating file system archive...' cd rootfs-$ARCH tar -cf - . | xz -v > ../out/adelie-rootfs-${MINI+mini-}$ARCH-$VERSION-$(date +%Y%m%d).txz } # in case we want to add phase support like adelie-build-cd has later case $PHASE in clean) clean_dirs ;; install) install_pkgs make_structure ;; tar) tar_it ;; all) clean_dirs install_pkgs make_structure tar_it ;; *) fatal printf 'Unknown phase %s. Stop.\n' $PHASE ;; esac