From c2fcde0f261d9e36ad8296edf0697ec36f207d0b Mon Sep 17 00:00:00 2001 From: Jarvis Carroll Date: Wed, 4 Jun 2025 17:07:45 +1000 Subject: [PATCH] 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! --- .gitignore | 5 ++ arch/cleanup | 102 ++++++++++++++++++++++ arch/create_environment | 50 +++++++++++ arch/enter_environment | 22 +++++ arch/get_pacstrap | 29 ++++++ arch/install_scripts/install_miner_pacman | 10 +++ arch/install_scripts/qpq.zrf | Bin 0 -> 2298 bytes arch/install_scripts/user_setup | 23 +++++ arch/install_scripts/uwiger.zrf | Bin 0 -> 2294 bytes 9 files changed, 241 insertions(+) create mode 100755 arch/cleanup create mode 100755 arch/create_environment create mode 100755 arch/enter_environment create mode 100755 arch/get_pacstrap create mode 100755 arch/install_scripts/install_miner_pacman create mode 100644 arch/install_scripts/qpq.zrf create mode 100755 arch/install_scripts/user_setup create mode 100644 arch/install_scripts/uwiger.zrf diff --git a/.gitignore b/.gitignore index 7157ebb..642ea54 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,8 @@ debian/debootstrap.tar.gz void/clean_environment void/test_environment void/xbps-static*.tar.xz + +arch/archlinux-bootstrap*.tar.zst +arch/clean_environment +arch/test_environment +arch/pkglist.x86_64.txt diff --git a/arch/cleanup b/arch/cleanup new file mode 100755 index 0000000..8fc2ada --- /dev/null +++ b/arch/cleanup @@ -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 + diff --git a/arch/create_environment b/arch/create_environment new file mode 100755 index 0000000..70e1953 --- /dev/null +++ b/arch/create_environment @@ -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 diff --git a/arch/enter_environment b/arch/enter_environment new file mode 100755 index 0000000..81bc884 --- /dev/null +++ b/arch/enter_environment @@ -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 diff --git a/arch/get_pacstrap b/arch/get_pacstrap new file mode 100755 index 0000000..d052fde --- /dev/null +++ b/arch/get_pacstrap @@ -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 + diff --git a/arch/install_scripts/install_miner_pacman b/arch/install_scripts/install_miner_pacman new file mode 100755 index 0000000..e6cadce --- /dev/null +++ b/arch/install_scripts/install_miner_pacman @@ -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 diff --git a/arch/install_scripts/qpq.zrf b/arch/install_scripts/qpq.zrf new file mode 100644 index 0000000000000000000000000000000000000000..e0ff1c36b6b2d7378051ef06e32b325461490d07 GIT binary patch literal 2298 zcmV~Wpi|4ZE$D;XaiyZ00-$|1Yrqi17QGRDq#+H18Ze@ zZ2$lOKp~00|ofs8jcx#x=Jnh#?UGtJGcCTk=Jc;wi$)CoxjMt#+h1Wh*ziG zLn7ev$Q7vl=9=+`n0k`BGDa_0&4&cdT(uTE^%;i zE^~Kjb8}(<04y(e19ft2YIg;4WnpY>YXAdraB*z_00<5+f(Qx%f(QWsyp;h>t%EZ8 zZd@=k&O8UIGw!vbR~AxO`{@w-ClOkdvebU-b0V+^8ziYJzc{O`!-Zb3h3K?Gtm|Q>+1@gL-5K z-ha`KaD(<|#>Lh6+CTb#@Ktyu`4=xprYArx>4yAlUz?qoKWuhXh)nECg;3G{v9Xo| z{B|gIcydJ@*u5E-S^d}Q#6NhVdFfByAK@CI-uu>E^*UvU#XfSs>o`P(4Z$R<$xOEa zt@V$W?W!ZR_ziISzgJI1|IaE^VXD#O{VWE=qL^Lv2oc%m8^90>&wEW>4#Bb@4lh=s z&_HkT_&kWWd&_79XjdP09p`z`;Um1lb#P>ppzdi}htg$km(}WI2A2R^;yf{ON<4HT zXncvu$`2F8a_IJS!XLz3k-sZNe@TSf&xt0vU*89t-S-fv6*<)5$S6{x`?l=$39r%U zH#q8Hsmr(FhTe)VI)WDs`L{5-ERV{Oa7N=)tOd??xfb%_{zCWOwOG6V)k*A0p$lKu zO*U1|fzW?Mknz~TD9#BZFm^_~-V@pqH@yW)Cu9@JR_{*MlttRQSD>6DWyxR6fcp5P zFMrV!{Ct6ZFJIbYU*5g5hpA+Wge_N{X5p2T4}hB0!Kz7$LL+yz{FJ3pI}sGyYM`=B zK~`FnE?i)WHZ<$A0fp(JpxNQiY%=Q|@|hdzHblT|V%?Nzq3XOA8eP?J&09OUuad>h5t$dOQr48un@h+*q9H#`w; zh?wXi`%-pb_zrJyqsBs%U5Z<&ioy$a+qHDwE=l3w{Ol{$_j_bnL1nf;c}8@T(pbG^ zanLE%IL{TyK~hM3?_nH%J+l-5$g4D4K`opg&Qc%$Yfy@EwL@DuA@W8TZJSv23WYA& z4^8^?Llvg?QjwDwQH3D`mbd08Mezb%#k0=St`v0hh(|rB+6Z5Pe-8>haKFIu%dVS) z@v;Q=Eb+q6Fcjm*J+%;mhtgJX{CrnA3WpG?l;o_A;9#nOS@oI`4(}8feUjUkzv7@T z?l_T=3Q=luUE$U{`Nqu+)X>JQLocj8(-np%!`00c0X(F~L=`r|>{x=_3P+|!V^dC9 zXS42u6nt>&ipRnKdNkjS8Gp+y%GD?!Vn7A?*CwW{QGBIX!hrrB-D&Q=z};yEfx;P% zw#3s&_ZIeOEX?kfktGn<3|xmib>9aV%^MN7igv+gTI&$iU@y;1Kn~l9`=DdQ(-@Ij zSXoTudVusq$HL6dY0T#?_?G+sj2!3;6Y9@5+s@|{?CWH9UV(nwIehjU?TRCGf*lr( z&|+ZJYvZE8aihWA!)Pp&RireBHb5g-7`n+I;MzCUl$?Z6qQl-}2GdLV4SDN|PQ?(1 zRahEXjnN8;t)_GzzmA+SLjuXam@B zK@twd>J2xVD&YA-+RNrFnJ|fgT!!(mx*Y&R8erC`SNSEPAM5XyD(f<>6w&b{J<(+* zoZ{qO8h3gP85!00kjWGsD^_Ibju#Afi%8>Gok{V`c zAIyC{stMzW&V~+X&!ZFX`8dwnqUCdj65$n4N`zslSmLQ|g`!2`4g+jMqHCxHFiZGQ zVWx3FrxC!>wij`2>M_C|uJ0CWJa>lM!rgf!ugi(BfW}XF~vGEMQZe#)UrUl^Q-+b7Mx{5uEJjS{BJJA{`1RJeUE8xq!ougo%!CAKd_H6nx=jW+U z zk_<(H_(r1Ey^PoQdaVLEqe2`bZ`^`7t2~l1`1=7R!E(Y}e-G6Z0`M2q4lG)dum(YN z6UOxl!M{ra$10iZF{JU~`!TD&FSJ zZfTmOYSPabQ4+2BVh;&j$l1Xo`NcShCswC1iJphQ7s|nZgstb+_h4F264Q;98_%<@ zJoG%g&~yRoWQYEIFGYU{s9Sa*Z=s}#>57D0(?k3Rwv0tPVvG*SjGj>Ad?GH#6@Z82=a>)2%q$Coo!Fyd(X9fmLUUoMZPp@ zEp{oXv~OSNdSS@pWwb$;uZMdaPjAkK(FdkY*;!>pgUMBrTij#*ybiw|7)kh|JEjK} z>ec#S2HOfO>9d6s(mddNOJiy3THulIFlyS1JTa>}i9@vM{6#{34=A|0Y1WoXYmg U)+$~@sUuui|1Sg00s{d60d-<*)&Kwi literal 0 HcmV?d00001 diff --git a/arch/install_scripts/user_setup b/arch/install_scripts/user_setup new file mode 100755 index 0000000..c593717 --- /dev/null +++ b/arch/install_scripts/user_setup @@ -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 "$@" diff --git a/arch/install_scripts/uwiger.zrf b/arch/install_scripts/uwiger.zrf new file mode 100644 index 0000000000000000000000000000000000000000..934f79b218bc53d7c9177b352c17e871f8f6d9e7 GIT binary patch literal 2294 zcmV~Wpi|4ZE$D;XaiyZ00-$|1Yr_r17QbY0AU|@18Ze@ zZ2$lOKn_q+12@G47d}n_!HI5_i&qXc#BEw&M{?ySO|crYsM*_!lwafr6DJn+xp6|> zBzwSHD7CMsR=2@^Qv=$0gLegUd2?@YXaj2i26cC7XJvA000~uWW*}E-XJv9|0&4&T zWo=<;Y-<1wb!=upcWGy3axQLVbaw@Ca%pX4XaZ{h5_)fKa4vOhW-fPWXJv9OZe?_0 z001m6cLQ~DY-)D}a%Ev`ZEFAqb$4lJWpZr*00<5+f(Qx%f(QWsph`9v%kT(7DE@PE z^YM#G|DLc!PG7rDrPO_9j{G`Sp4fpIM~;Q96!l6$gRWW&M^PjN29Nv>^Bg!P`*apH7u-A9MdZOX5)N&-(z zANSWuE}Gac$D2T-_fu%`?7-xts3>G!aA8eB_%98Ck7}-Kg}?@hFl;?G(<5K(P%ONC zHA(6aPfwHo&(@tTq4iXObP zTSAj$f-XS=88a_YTO@M}&GR!xQMYADY}Y#KNa~GF8v+NrqC*|3{pL z-<{7jLawCj>sspBg13$r#*?~-_-J*}{W+gges;LI*rg4rrLNHmL>oY~c?zpc5sNHQ zyuL%d=YmL-^o!`Bb^c78~%);jE` zat*)sg>Q5`w{Nkwjm~)-0N{+M6j~F`6uEqe7af<(J73ND(|L&CZZg*h0W{(zF&|t& zA9%QG^@SRqEJV)B?oO}Vu*n0wO};#%=T~9-I?HskV*Q{4@lu_(SoVm^k0`W?pO&Nn z4~Br_2d2Iv37C3-;k9s@28)OdTMq=XLn&<(u3QFTuNQ6GYQ;k(I3LHZP+mt0a%Wi8PW9}HOmm^@{+C5<4VknHbyul}P|7spqN7j`ww7M?iH~(liqmy`16#mRaZ-LihLD2}JmuGQHpO5LzT8OC}S zT1PZih$ePG7nZdKaia)oa?a2lV;j5^|Bpe9KC2}4yLMk9iD3=XaHgQ1XqKkau}DU2u51)Xbq(bKERUXLo2Irqvg=`1 z+`V$~;GdIC-HD!YFBO$jA=z!|jyc~Ko_3TkcJ{%?To&EBZ5AS<(zCE{{0)^&q@UJ8& zj)cbRDa$RyBWnJ|<~bolrJum582BD*^eB0#f=xM0*xxlG)+24}fE<1=egXVXL8Bc` zK#9MrdkI(>F@T6^#!%(TJopM@Xuwm$cXq;w#bBH=(vB^EDdX}AhoQUvY* zy^p)A>eJ{z)2%Ps3NqDB>E0Y{E}E_ZzmW_~^aZ0qr`AX%Eh{5i6I7r$H6pz}C=Kvx zrAGI_NjyMnD%GM!7rJc0Jqmi-yt1g8gMQ9KGbUBIMq{A>w!gD=?KdZ$op?>dcb99y zW}vS^I*mt2Cvy~xT<2UIup{)QvQDGs^>_CM`y>3Ew)k9b$2!535pDD36~2|A&GOnl zT>?WIYQmyPLQUF^hcCK(_YiA&t43LamlDY{?XL1c-Dlm6u~K#}izw}hGa&HT1XBKk ze8a0(x3VW%8M@VYQnTc&8ibF5E>KWDMfkg%_+>%pIwW3#gk%Q*gu;9YB(8=gqpc%4 zGp%6dcRl=EVdW9}2Ls+BO1GYZY}=QHUH;6Um<;$nq&0QYMrQ z>~ExjmMvia=VW)S4_<#)I_RaUdK