#!/usr/bin/env bash # This script builds the initial bootstrap zipball for Nix on Android. # Copyright (c) 2019 Alexander Sosedkin # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . set -ue ARCHIVE=nix-2.2.1-aarch64-linux.tar.bz2 BASEURL=https://nixos.org/releases/nix/nix-2.2.1 URL="$BASEURL/$ARCHIVE" INST="/data/data/com.termux.nix/files/usr" export PROOT_NO_SECCOMP=1 # see https://github.com/proot-me/PRoot/issues/106 rm -rf ./bootstrap mkdir -p bootstrap wget https://github.com/proot-me/proot-static-build/blob/master/static/proot-x86_64?raw=true -O proot-host chmod +x proot-host wget https://github.com/multiarch/qemu-user-static/releases/download/v3.1.0-2/qemu-aarch64-static -O qemu-aarch64 chmod +x qemu-aarch64 echo "downloading nix archive" wget $URL -O $ARCHIVE echo -n "extracting $ARCHIVE " tar -xf "$ARCHIVE" -C bootstrap --checkpoint=200 --checkpoint-action=dot echo " done" mv bootstrap/nix* bootstrap/nix-installer echo -n "copying store... " mkdir bootstrap/nix cp -r bootstrap/nix-installer/store bootstrap/nix/ echo "done" mkdir -p bootstrap/bin TGT_SHELL=$(find bootstrap/nix/store -path '*/bin/bash' | sed s/^bootstrap//) echo "shell found at $TGT_SHELL" ln -s "$TGT_SHELL" bootstrap/bin/sh mkdir -p bootstrap/usr/bin TGT_ENV=$(find bootstrap/nix/store -path '*/bin/env' | sed s/^bootstrap//) echo "env found at $TGT_ENV" ln -s "$TGT_ENV" bootstrap/usr/bin/env TGT_NIX=$(find bootstrap/nix/store -path '*/bin/nix' | sed s/^bootstrap//) TGT_NIX=${TGT_NIX%/bin/nix} echo "nix derivation found at $TGT_NIX" TGT_CACERT=$(find bootstrap/nix/store -path *-nss-cacert-*/ca-bundle.crt | sed s/^bootstrap//) echo "cacert found at $TGT_CACERT" PROOT_CMD="./proot-host -q ./qemu-aarch64 -r bootstrap -w /" echo "initialising Nix database..." $PROOT_CMD "$TGT_NIX/bin/nix-store" --init echo "registering paths..." $PROOT_CMD "$TGT_NIX/bin/nix-store" --load-db < bootstrap/nix-installer/.reginfo echo "injecting proot..." mkdir -p bootstrap/bin cp proot-tgt bootstrap/bin/proot echo "making up some resolv.conf..." mkdir -p bootstrap/etc echo -e "nameserver 1.1.1.1\nnameserver 8.8.8.8" > bootstrap/etc/resolv.conf echo "disabling sandboxing..." # we can't rely on USER_NS support mkdir -p bootstrap/etc/nix echo "sandbox = false " > bootstrap/etc/nix/nix.conf echo "composing login scripts..." mkdir -p bootstrap/tmp mkdir -p bootstrap/bin cat > bootstrap/bin/login < $INST/etc/passwd fi exec $INST/bin/proot \ -b $INST/nix:/nix \ -b $INST/bin:/bin \ -b $INST/etc:/etc \ -b $INST/tmp:/tmp \ -b $INST/usr:/usr \ -b /:/android \ --link2symlink \ $INST/bin/sh $INST/bin/.login-inner \$USER "\$@" EOF chmod +x bootstrap/bin/login cat > bootstrap/bin/.login-inner <' -A install else export NIX_PATH=\$HOME/.nix-defexpr/channels\${NIX_PATH:+:}\$NIX_PATH fi echo "Sourcing home-manager environment..." . "\$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh" echo "Dropping you into a shell." echo "You can summon software from nixpkgs (e.g. gitMinimal) with:" echo " * nix run nixpkgs.gitMinimal" echo " * nix-env -iA nixpkgs.gitMinimal" echo " * [edit ~/.config/nixpkgs/home.nix and run] home-manager switch" echo "or a myriad other ways." echo "Happy hacking!" exec /usr/bin/env bash "\$@" EOF chmod +x bootstrap/bin/.login-inner echo "providing a default home-manager config..." cat > bootstrap/etc/home.nix.default < bootstrap/EXECUTABLES.txt echo "finding symlinks..." for LINK in $(find bootstrap -type l); do LNK=$(echo "$LINK" | sed s@^bootstrap/@@) TGT=$(readlink $LINK) echo "$TGT←$LNK" >> bootstrap/SYMLINKS.txt rm "$LINK" done echo "packing..." rm -f bootstrap-aarch64.zip (cd bootstrap; zip -q -9 -r ../bootstrap-aarch64 ./*) cp bootstrap-aarch64.zip ../nix-on-droid-app/app/src/main/assets/bootstrap-aarch64 echo "done"