Conty/create-arch-bootstrap.sh
2022-06-13 17:38:53 +05:00

288 lines
9.1 KiB
Bash
Executable file

#!/usr/bin/env bash
# Dependencies: wget tar gzip grep sha256sum
# Root rights are required
if [ $EUID != 0 ]; then
echo "Root rights are required!"
exit 1
fi
if ! command -v wget 1>/dev/null; then
echo "wget is required!"
exit 1
fi
if ! command -v gzip 1>/dev/null; then
echo "gzip is required!"
exit 1
fi
if ! command -v grep 1>/dev/null; then
echo "grep is required!"
exit 1
fi
if ! command -v sha256sum 1>/dev/null; then
echo "sha256sum is required!"
exit 1
fi
script_dir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
mount_chroot () {
# First unmount just in case
umount -Rl "${bootstrap}"
mount --bind "${bootstrap}" "${bootstrap}"
mount -t proc /proc "${bootstrap}"/proc
mount --bind /sys "${bootstrap}"/sys
mount --make-rslave "${bootstrap}"/sys
mount --bind /dev "${bootstrap}"/dev
mount --bind /dev/pts "${bootstrap}"/dev/pts
mount --bind /dev/shm "${bootstrap}"/dev/shm
mount --make-rslave "${bootstrap}"/dev
rm -f "${bootstrap}"/etc/resolv.conf
cp /etc/resolv.conf "${bootstrap}"/etc/resolv.conf
mkdir -p "${bootstrap}"/run/shm
}
unmount_chroot () {
umount -l "${bootstrap}"
umount "${bootstrap}"/proc
umount "${bootstrap}"/sys
umount "${bootstrap}"/dev/pts
umount "${bootstrap}"/dev/shm
umount "${bootstrap}"/dev
}
run_in_chroot () {
chroot "${bootstrap}" /usr/bin/env LANG=en_US.UTF-8 TERM=xterm PATH="/bin:/sbin:/usr/bin:/usr/sbin" "$@"
}
generate_localegen () {
cat <<EOF > locale.gen
ar_EG.UTF-8 UTF-8
en_US.UTF-8 UTF-8
en_GB.UTF-8 UTF-8
en_CA.UTF-8 UTF-8
es_MX.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
fr_FR.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8
ru_UA.UTF-8 UTF-8
es_ES.UTF-8 UTF-8
de_DE.UTF-8 UTF-8
pt_BR.UTF-8 UTF-8
it_IT.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8
bg_BG.UTF-8 UTF-8
pl_PL.UTF-8 UTF-8
da_DK.UTF-8 UTF-8
ko_KR.UTF-8 UTF-8
tr_TR.UTF-8 UTF-8
hu_HU.UTF-8 UTF-8
cs_CZ.UTF-8 UTF-8
bn_IN UTF-8
EOF
}
generate_mirrorlist () {
cat <<EOF > mirrorlist
Server = https://mirror.osbeck.com/archlinux/\$repo/os/\$arch
Server = https://mirror.f4st.host/archlinux/\$repo/os/\$arch
Server = https://geo.mirror.pkgbuild.com/\$repo/os/\$arch
Server = https://archlinux.thaller.ws/\$repo/os/\$arch
Server = https://archmirror.it/repos/\$repo/os/\$arch
EOF
}
cd "${script_dir}" || exit 1
bootstrap="${script_dir}"/root.x86_64
# Package groups
audio_pkgs="alsa-lib lib32-alsa-lib alsa-plugins lib32-alsa-plugins libpulse \
lib32-libpulse jack2 lib32-jack2 alsa-tools alsa-utils"
video_pkgs="mesa lib32-mesa vulkan-radeon lib32-vulkan-radeon \
vulkan-intel lib32-vulkan-intel nvidia-utils lib32-nvidia-utils \
vulkan-icd-loader lib32-vulkan-icd-loader vulkan-mesa-layers \
lib32-vulkan-mesa-layers libva-mesa-driver lib32-libva-mesa-driver \
libva-intel-driver lib32-libva-intel-driver intel-media-driver \
mesa-demos vulkan-tools nvidia-prime libva-utils"
wine_pkgs="wine-staging winetricks-git wine-nine wineasio \
giflib lib32-giflib libpng lib32-libpng libldap lib32-libldap \
gnutls lib32-gnutls mpg123 lib32-mpg123 openal lib32-openal \
v4l-utils lib32-v4l-utils libpulse lib32-libpulse alsa-plugins \
lib32-alsa-plugins alsa-lib lib32-alsa-lib libjpeg-turbo \
lib32-libjpeg-turbo libxcomposite lib32-libxcomposite libxinerama \
lib32-libxinerama libxslt lib32-libxslt libva lib32-libva gtk3 \
lib32-gtk3 vulkan-icd-loader lib32-vulkan-icd-loader sdl2 lib32-sdl2 \
vkd3d lib32-vkd3d libgphoto2 ffmpeg gst-plugins-good gst-plugins-bad \
gst-plugins-ugly gst-plugins-base lib32-gst-plugins-good lib32-gst-plugins-base"
# List of packages to install
# You can remove packages that you don't need
# Besides packages from the official Arch repos, you can list
# packages from the Chaotic-AUR repo here
export packagelist="${audio_pkgs} ${video_pkgs} ${wine_pkgs} \
base-devel nano ttf-dejavu ttf-liberation lutris steam firefox \
mpv geany pcmanfm ppsspp dolphin-emu git wget htop qbittorrent \
speedcrunch gpicview file-roller xorg-xwayland steam-native-runtime \
meson mingw-w64-gcc gamemode lib32-gamemode cmake jre-openjdk \
lxterminal steamtinkerlaunch mangohud lib32-mangohud qt6-wayland \
wayland lib32-wayland qt5-wayland retroarch python-magic-ahupp \
xorg-server-xephyr openbox obs-studio gamehub minigalaxy legendary \
gamescope-git pcsx2 multimc5 youtube-dl bottles"
wget -q --show-progress -O chaotic-keyring.pkg.tar.zst 'https://mirrors.fossho.st/garuda/repos/chaotic-aur/x86_64/chaotic-keyring-20220514-1-any.pkg.tar.zst'
wget -q --show-progress -O chaotic-mirrorlist.pkg.tar.zst 'https://mirrors.fossho.st/garuda/repos/chaotic-aur/x86_64/chaotic-mirrorlist-20220504-2-any.pkg.tar.zst'
if [ ! -s chaotic-keyring.pkg.tar.zst ] || [ ! -s chaotic-mirrorlist.pkg.tar.zst ]; then
echo "The links for Chaotic-AUR keyring and/or mirrorlist are outdated"
echo "Update them manually or wait until the script in the repo is updated"
exit 1
fi
current_release="$(wget -q "https://archlinux.org/download/" -O - | grep "Current Release" | tail -c -16 | head -c +10)"
bootstrap_urls="mirror.osbeck.com \
mirror.f4st.host \
mirror.luzea.de"
echo "Downloading Arch Linux bootstrap version ${current_release}"
for link in ${bootstrap_urls}; do
wget -q --show-progress -O archlinux-bootstrap-${current_release}-x86_64.tar.gz \
"https://${link}/archlinux/iso/${current_release}/archlinux-bootstrap-${current_release}-x86_64.tar.gz"
wget -q --show-progress -O sha256sums.txt \
"https://${link}/archlinux/iso/${current_release}/sha256sums.txt"
if [ -s sha256sums.txt ]; then
cat sha256sums.txt | grep bootstrap > sha256.txt
echo "Verifying the integrity of the bootstrap"
if sha256sum -c sha256.txt &>/dev/null; then
bootstrap_is_good=1
break
fi
fi
echo "Download failed, trying again with different mirror"
done
if [ -z "${bootstrap_is_good}" ]; then
echo "Bootstrap download failed or its checksum is incorrect"
exit 1
fi
tar xf archlinux-bootstrap-${current_release}-x86_64.tar.gz
rm archlinux-bootstrap-${current_release}-x86_64.tar.gz
rm sha256sums.txt sha256.txt
mount_chroot
generate_localegen
if command -v reflector 1>/dev/null; then
reflector --protocol https --score 5 --sort rate --save mirrorlist
else
generate_mirrorlist
fi
rm "${bootstrap}"/etc/locale.gen
mv locale.gen "${bootstrap}"/etc/locale.gen
rm "${bootstrap}"/etc/pacman.d/mirrorlist
mv mirrorlist "${bootstrap}"/etc/pacman.d/mirrorlist
echo >> "${bootstrap}"/etc/pacman.conf
echo "[multilib]" >> "${bootstrap}"/etc/pacman.conf
echo "Include = /etc/pacman.d/mirrorlist" >> "${bootstrap}"/etc/pacman.conf
run_in_chroot pacman-key --init
echo "keyserver hkps://keyserver.ubuntu.com" >> "${bootstrap}"/etc/pacman.d/gnupg/gpg.conf
run_in_chroot pacman-key --populate archlinux
# Add Chaotic-AUR repo
run_in_chroot pacman-key --recv-key FBA220DFC880C036
run_in_chroot pacman-key --lsign-key FBA220DFC880C036
mv chaotic-keyring.pkg.tar.zst chaotic-mirrorlist.pkg.tar.zst "${bootstrap}"/opt
run_in_chroot pacman --noconfirm -U /opt/chaotic-keyring.pkg.tar.zst /opt/chaotic-mirrorlist.pkg.tar.zst
rm "${bootstrap}"/opt/chaotic-keyring.pkg.tar.zst "${bootstrap}"/opt/chaotic-mirrorlist.pkg.tar.zst
echo >> "${bootstrap}"/etc/pacman.conf
echo "[chaotic-aur]" >> "${bootstrap}"/etc/pacman.conf
echo "Include = /etc/pacman.d/chaotic-mirrorlist" >> "${bootstrap}"/etc/pacman.conf
# The ParallelDownloads feature of pacman
# Speeds up packages installation, especially when there are many small packages to install
sed -i 's/#ParallelDownloads = 5/ParallelDownloads = 3/g' "${bootstrap}"/etc/pacman.conf
run_in_chroot pacman -Syu --noconfirm
date -u +"%d-%m-%Y %H:%M (DMY UTC)" > "${bootstrap}"/version
# These packages are required for the self-update feature to work properly
run_in_chroot pacman --noconfirm --needed -S base reflector squashfs-tools fakeroot
cat <<EOF > "${bootstrap}"/opt/install_packages.sh
echo "Checking if packages are present in the repos, please wait..."
for p in \${packagelist}; do
if pacman -Sp "\${p}" &>/dev/null; then
good_pkglist="\${good_pkglist} \${p}"
else
bad_pkglist="\${bad_pkglist} \${p}"
fi
done
if [ -n "\${bad_pkglist}" ]; then
echo \${bad_pkglist} > /opt/bad_pkglist.txt
fi
pacman --noconfirm --needed -S \${good_pkglist}
EOF
chmod +x "${bootstrap}"/opt/install_packages.sh
run_in_chroot bash /opt/install_packages.sh
rm "${bootstrap}"/opt/install_packages.sh
run_in_chroot locale-gen
# Generate a list of installed packages
run_in_chroot pacman -Qn > "${bootstrap}"/pkglist.x86_64.txt
unmount_chroot
# Clear pacman package cache
rm -f "${bootstrap}"/var/cache/pacman/pkg/*
# Create some empty files and directories
# This is needed for bubblewrap to be able to bind real files/dirs to them
# later in the conty-start.sh script
mkdir "${bootstrap}"/media
mkdir -p "${bootstrap}"/usr/share/steam/compatibilitytools.d
touch "${bootstrap}"/etc/asound.conf
touch "${bootstrap}"/etc/localtime
chmod 755 "${bootstrap}"/root
# Enable full font hinting
rm -f "${bootstrap}"/etc/fonts/conf.d/10-hinting-slight.conf
ln -s /usr/share/fontconfig/conf.avail/10-hinting-full.conf "${bootstrap}"/etc/fonts/conf.d
clear
echo "Done"
if [ -f "${bootstrap}"/opt/bad_pkglist.txt ]; then
echo
echo "These packages are not in the repos and have not been installed:"
cat "${bootstrap}"/opt/bad_pkglist.txt
rm "${bootstrap}"/opt/bad_pkglist.txt
fi