arch scripts

It took a moment to work out that there is actually no way of
bootstrapping an arch environment without permanently installing things
to the host system! So we just download a live image and unpack it.

Then after that, getting erlang to work was very easy, just install it,
install zx, run. No R26 incompatibility problems, life is good!
This commit is contained in:
Jarvis Carroll 2025-06-04 17:07:45 +10:00
parent a60bcf941b
commit c2fcde0f26
9 changed files with 241 additions and 0 deletions

5
.gitignore vendored
View File

@ -6,3 +6,8 @@ debian/debootstrap.tar.gz
void/clean_environment void/clean_environment
void/test_environment void/test_environment
void/xbps-static*.tar.xz void/xbps-static*.tar.xz
arch/archlinux-bootstrap*.tar.zst
arch/clean_environment
arch/test_environment
arch/pkglist.x86_64.txt

102
arch/cleanup Executable file
View File

@ -0,0 +1,102 @@
#!/bin/sh
if test `id -u` -ne 0
then
echo "$0 must be run as root."
return
fi
set -e
FRESH=clean_environment
ROOT=test_environment
add_mount() {
if mountpoint -q "$ROOT$1"
then
echo "$ROOT$1 already mounted."
else
echo "Mounting $2$1 to $ROOT$1"
mkdir -p "$ROOT$1"
mount -o bind "$2$1" "$ROOT$1"
fi
}
remove_mount() {
if mountpoint -q "$ROOT$1"
then
echo "Unmounting $ROOT$1"
umount -l "$ROOT$1"
fi
}
add_mounts() {
add_mount / "$ROOT"
add_mount /proc
add_mount /sys
add_mount /dev
add_mount /dev/pts
add_mount /tmp/.X11-unix
}
remove_mounts() {
remove_mount /tmp/.X11-unix
remove_mount /dev/pts
remove_mount /dev
remove_mount /sys
remove_mount /proc
remove_mount /
}
remove_environment() {
if test -d "$ROOT"
then
# Call this script that automatically unmounts the mount points too.
remove_mounts
echo "Removing $ROOT"
rm -r "$ROOT"
else
echo "No environment found at $ROOT. Doing nothing."
fi
}
remove_everything() {
if test -d "$ROOT"
then
# Call this script that automatically unmounts the mount points too.
remove_environment
fi
if test -d "$FRESH"
then
echo "Removing $FRESH"
rm -r "$FRESH"
fi
if test -d debootstrap
then
echo "Removing debootstrap"
rm -r debootstrap
fi
if test -f pkglist.x86_64.txt
then
echo "Removing pkglist.x86_64.txt"
rm pkglist.x86_64.txt
fi
if test -f archlinux-bootstrap*.tar.zst
then
echo "Removing archlinux bootstrap tarballs."
rm archlinux-bootstrap*.tar.zst
fi
}
case "$1" in
everything) remove_everything ;;
mounts) remove_mounts ;;
add_mounts) add_mounts ;;
environment) remove_environment ;;
"") remove_environment ;;
esac

50
arch/create_environment Executable file
View File

@ -0,0 +1,50 @@
#!/bin/sh
if test `id -u` -ne 0
then
echo "$0 must be run as root."
return
fi
set -e
ROOT=test_environment
FRESH=clean_environment
TARBALL=archlinux-bootstrap-x86_64.tar.zst
REPO="https://geo.mirror.pkgbuild.com"
if test -e "$FRESH"
then
echo "Clean arch environment found at $FRESH. Good."
else
echo "No arch environment found at $FRESH, downloading from $REPO"
curl -O "$REPO/iso/latest/$TARBALL"
tar -xf "$TARBALL"
mv root.x86_64 "$FRESH"
fi
if test -e "$ROOT"
then
echo "Existing installation found at $ROOT, removing."
./cleanup
fi
echo "Copying $FRESH to $ROOT."
cp -r "$FRESH" "$ROOT"
echo "Initializing $ROOT."
./cleanup add_mounts
chmod 1777 "$ROOT/tmp"
echo 'Server = http://ftp.swin.edu.au/archlinux/$repo/os/$arch' > "$ROOT/etc/pacman.d/mirrorlist"
cp /etc/resolv.conf "$ROOT/etc/resolv.conf"
cp -r install_scripts "$ROOT/root"
chroot "$ROOT" /root/install_scripts/user_setup "$@" || echo Script failed.
./cleanup mounts

22
arch/enter_environment Executable file
View File

@ -0,0 +1,22 @@
#!/bin/sh
if test `id -u` -ne 0
then
echo "$0 must be run as root."
return
fi
ROOT=test_environment
if test -e "$ROOT"
then
echo "Using existing environment in $ROOT."
else
./create_environment
fi
./cleanup add_mounts
chroot "$ROOT" sudo -iu user "$@"
./cleanup mounts

29
arch/get_pacstrap Executable file
View File

@ -0,0 +1,29 @@
#!/bin/sh
# Finds pacstrap in $PATH, or download some version of it if not found.
# This script prefers to use local copies that are already downloaded, over
# system-wide installations, in case you want to test on some specific
# outdated version of pacstrap.
LOCALDIR=`pwd`/arch-install-scripts
if test -e "$LOCALDIR/pacstrap"
then
echo "Found $LOCALDIR/pacstrap in current directory"
# Run pacstrap without installing it to the system.
bash "$LOCALDIR/pacstrap" "$@"
elif IT=`command -v pacstrap`
then
echo "Found $IT in PATH"
# Use the version of pacstrap that was already installed.
pacstrap "$@"
else
echo "pacstrap not found. Downloading to $LOCALDIR."
git clone https://gitlab.archlinux.org/archlinux/arch-install-scripts
make -C arch-install-scripts pacstrap
# Run pacstrap without installing it to the system.
bash "$LOCALDIR/pacstrap" "$@"
fi

View File

@ -0,0 +1,10 @@
#!/bin/sh
sudo pacman -S wget erlang erlang-wx --noconfirm
wget -q https://zxq9.com/projects/zomp/get_zx && bash get_zx
export PATH=$PATH:$HOME/bin
zx import realm install_scripts/qpq.zrf
zx import realm install_scripts/uwiger.zrf
zx run qpq-gajumine

Binary file not shown.

23
arch/install_scripts/user_setup Executable file
View File

@ -0,0 +1,23 @@
#!/bin/bash
pacman-key --init
pacman-key --populate archlinux
pacman -Sy sudo --noconfirm
# Overwrite locale setting specified before the chroot
export LANG=C
export LC_ALL=C
# Add a passwordless sudoer
useradd -m -s /bin/bash -G wheel user
passwd -d user
echo "user ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/user"
chmod 0440 "/etc/sudoers.d/user"
# Copy the install scripts into their home directory
cp -r ~/install_scripts /home/user
chown -R user:user /home/user/install_scripts
# su to this new user... Or sudo -iu, since we want to pass in arguments too.
cd /home/user
sudo -iu user "$@"

Binary file not shown.