WIP archlinux bootstrap from nixos
This commit is contained in:
parent
8a7b9ed927
commit
605365998b
|
@ -0,0 +1,102 @@
|
|||
{
|
||||
lib,
|
||||
concatText,
|
||||
fetchzip,
|
||||
stdenvNoCC,
|
||||
writeText,
|
||||
writeShellApplication,
|
||||
|
||||
bash,
|
||||
cacert,
|
||||
coreutils,
|
||||
pacman,
|
||||
systemd,
|
||||
zstd,
|
||||
|
||||
repos ? ["core" "community" "extra"],
|
||||
keyring-version ? "20241015-1",
|
||||
keyring-hash ? "sha256-7IegfprKTNn0aPRMgTw34SEc/GRCfy92mE9CVI4rxr0=",
|
||||
mirror ? "https://mirror.rackspace.com/archlinux/$repo/os/$arch",
|
||||
}: rec {
|
||||
keyring = (fetchzip.override { withUnzip = false; }) {
|
||||
url = "${builtins.replaceStrings ["$repo" "$arch"] ["core" "x86_64"] mirror}/archlinux-keyring-${keyring-version}-any.pkg.tar.zst";
|
||||
hash = keyring-hash;
|
||||
nativeBuildInputs = [ zstd ];
|
||||
stripRoot = false;
|
||||
postFetch = ''
|
||||
rm "$out"/.BUILDINFO "$out"/.INSTALL "$out"/.MTREE "$out"/.PKGINFO
|
||||
mkdir "$out"/share/pacman -p
|
||||
mv "$out"/usr/share/pacman/keyrings "$out"/share/pacman
|
||||
rm -rf "$out"/usr
|
||||
'';
|
||||
};
|
||||
|
||||
pacman_conf_in =
|
||||
writeText
|
||||
"pacman-mirrors.conf"
|
||||
(lib.strings.concatLines
|
||||
(lib.map
|
||||
(repo: ''
|
||||
[${repo}]
|
||||
Server = ${mirror}
|
||||
'')
|
||||
repos));
|
||||
|
||||
pacman_conf = concatText "pacman.conf" [ "${pacman}/etc/pacman.conf" pacman_conf_in ];
|
||||
|
||||
bootstrap = writeShellApplication {
|
||||
name = "archlinux-bootstrap";
|
||||
|
||||
runtimeInputs = [ coreutils pacman systemd ];
|
||||
|
||||
text = ''
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "usage: $0 [directory] [pkgs ...]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
newroot="$1"
|
||||
shift
|
||||
|
||||
echo "Installing arch linux to $newroot"
|
||||
|
||||
# set up new base filesystem
|
||||
install -dm0755 "$newroot"
|
||||
install -dm0755 "$newroot"/var/{cache/pacman/pkg,lib/pacman,log}
|
||||
install -dm0755 "$newroot"/{dev,run,etc/pacman.d}
|
||||
install -dm1777 "$newroot"/tmp
|
||||
install -dm0555 "$newroot"/{sys,proc}
|
||||
|
||||
# set up mountpoint for nix
|
||||
install -dm0755 "$newroot"/nix
|
||||
|
||||
# temporarily set up /etc/mtab, pacman needs this to work
|
||||
ln -sf /proc/mounts "$newroot"/etc/mtab
|
||||
|
||||
# fully initialize the keyring ahead of entering the container
|
||||
pacman_conf="${pacman_conf}"
|
||||
pacman-key --gpgdir "$newroot"/etc/pacman.d/gnupg --config "$pacman_conf" --init
|
||||
pacman-key --gpgdir "$newroot"/etc/pacman.d/gnupg --config "$pacman_conf" \
|
||||
--populate archlinux --populate-from "${keyring}/share/pacman/keyrings"
|
||||
|
||||
# install the config file
|
||||
install -Dm0755 "$pacman_conf" "$newroot"/etc/pacman.conf
|
||||
|
||||
# bootstrap the system. allow pacman to overwrite the existing mtab entry
|
||||
systemd-nspawn -D "$newroot" --bind-ro=/nix \
|
||||
-E SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt \
|
||||
-E PATH=/usr/bin/ \
|
||||
-- \
|
||||
"${pacman}/bin/pacman" -Sy --noconfirm --overwrite /etc/mtab base "$@"
|
||||
|
||||
# remove nix mount point
|
||||
rmdir "$newroot"/nix
|
||||
|
||||
echo "Done installing!"
|
||||
echo "Set root password:"
|
||||
echo " sudo systemd-nspawn -UD \"$newroot\" -- /bin/passwd root"
|
||||
echo "Boot system:"
|
||||
echo " sudo systemd-nspawn -bUD \"$newroot\""
|
||||
'';
|
||||
};
|
||||
}
|
Loading…
Reference in New Issue