Files
void-installer/installer/lib/bootstrap.sh

124 lines
5.0 KiB
Bash
Executable File

#!/bin/bash
# Bootstrap base system into $TARGET via xbps-install.
# shellcheck source=common.sh
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
bootstrap_base() {
step "Bootstrapping base system into $TARGET (this takes a while)"
local TARGET="${TARGET:-/mnt}"
local pkg_list=()
mapfile -t pkg_list < <(grep -vE '^\s*(#|$)' "${PKG_LIST_FILE:-/usr/local/share/installer/packages.list}")
mkdir -p "$TARGET/var/db/xbps/keys"
cp -a /var/db/xbps/keys/* "$TARGET/var/db/xbps/keys/" 2>/dev/null || \
warn "could not copy xbps keys (running outside Void live env?)"
# Use the caching proxy during install if available; fall back to real repo.
# The proxy URL (if set) is only used during installation — the installed
# system's xbps.d always gets the real REPO_URL.
local _repo="${INSTALL_REPO_URL:-$REPO_URL}"
local _nonfree="${_repo%/current}/current/nonfree"
local _multilib="${_repo%/current}/current/multilib"
local _multilib_nonfree="${_repo%/current}/current/multilib/nonfree"
# Normalise: if _repo doesn't end in /current the above substitution
# leaves it unchanged; append nonfree/multilib paths directly.
[[ "$_repo" == */current ]] || {
_nonfree="${_repo}/nonfree"
_multilib="${_repo}/multilib"
_multilib_nonfree="${_repo}/multilib/nonfree"
}
log "install repo: $_repo (proxy=${INSTALL_REPO_URL:-none})"
# Bootstrap base-system via proxy/repo.
XBPS_ARCH="$ARCH" xbps-install -y -S -r "$TARGET" -R "$_repo" base-system
ok "base-system installed"
# Enable extra repos in target xbps.d — always write the REAL URLs so the
# installed system never depends on the proxy.
mkdir -p "$TARGET/etc/xbps.d"
cat > "$TARGET/etc/xbps.d/00-repository-main.conf" <<EOF
repository=$REPO_URL
EOF
log "enabling extra repos: ${EXTRA_REPOS[*]}"
XBPS_ARCH="$ARCH" xbps-install -y -S -r "$TARGET" \
-R "$_repo" -R "$_nonfree" -R "$_multilib" -R "$_multilib_nonfree" \
void-repo-nonfree void-repo-multilib void-repo-multilib-nonfree
# Sync from all newly enabled repos.
XBPS_ARCH="$ARCH" xbps-install -y -S -r "$TARGET" \
-R "$_repo" -R "$_nonfree" -R "$_multilib" -R "$_multilib_nonfree"
log "installing extra packages from $PKG_LIST_FILE"
XBPS_ARCH="$ARCH" xbps-install -y -r "$TARGET" \
-R "$_repo" -R "$_nonfree" -R "$_multilib" -R "$_multilib_nonfree" \
"${pkg_list[@]}"
# Ensure the installed system's xbps config points only at real repos.
cat > "$TARGET/etc/xbps.d/00-repository-main.conf" <<EOF
repository=$REPO_URL
EOF
ok "all xbps packages installed (proxy removed from target xbps.d)"
}
generate_fstab() {
step "Generating /etc/fstab"
local TARGET="${TARGET:-/mnt}"
if command -v xgenfstab >/dev/null 2>&1; then
xgenfstab -U "$TARGET" > "$TARGET/etc/fstab"
else
# fallback minimal generator (uses BTRFS_SUBVOLS array from install.conf)
: > "$TARGET/etc/fstab"
local uuid entry sv mp pass
uuid=$(blkid -s UUID -o value "$ROOT_PART")
for entry in "${BTRFS_SUBVOLS[@]}"; do
sv="${entry%%:*}"
mp="${entry##*:}"
# root gets fsck pass 1, others 2
pass=2; [[ "$mp" == "/" ]] && pass=1
printf 'UUID=%s %-12s btrfs %s,subvol=%s 0 %d\n' \
"$uuid" "$mp" "$BTRFS_MOUNT_OPTS" "$sv" "$pass" >> "$TARGET/etc/fstab"
done
local efi_uuid
efi_uuid=$(blkid -s UUID -o value "$EFI_PART")
printf 'UUID=%s /boot/efi vfat defaults,noatime,umask=0077 0 2\n' "$efi_uuid" >> "$TARGET/etc/fstab"
printf 'tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0\n' >> "$TARGET/etc/fstab"
fi
ok "fstab generated"
}
mount_pseudo_fs() {
local TARGET="${TARGET:-/mnt}"
step "Mounting pseudo-filesystems for chroot"
for d in dev proc sys run; do
mkdir -p "$TARGET/$d"
mount --rbind "/$d" "$TARGET/$d"
mount --make-rslave "$TARGET/$d"
done
# /dev/shm must be a real tmpfs for python multiprocessing (sem_open)
# used by xbps-reconfigure → compileall. Without it the byte-compile
# step fails with FileNotFoundError on every python package.
mkdir -p "$TARGET/dev/shm"
mountpoint -q "$TARGET/dev/shm" || mount -t tmpfs -o nosuid,nodev tmpfs "$TARGET/dev/shm" 2>/dev/null || true
if is_uefi; then
mkdir -p "$TARGET/sys/firmware/efi/efivars"
mount -t efivarfs efivarfs "$TARGET/sys/firmware/efi/efivars" 2>/dev/null || true
fi
# Make DNS work inside the chroot (needed for VS Code download, etc.).
if [[ -r /etc/resolv.conf ]]; then
install -Dm644 /etc/resolv.conf "$TARGET/etc/resolv.conf" 2>/dev/null \
|| cp /etc/resolv.conf "$TARGET/etc/resolv.conf" 2>/dev/null || true
fi
}
unmount_target() {
local TARGET="${TARGET:-/mnt}"
step "Unmounting $TARGET"
sync
umount -R "$TARGET" 2>/dev/null || warn "lazy umount fallback"
umount -lR "$TARGET" 2>/dev/null || true
}