Files
arch/arch-2.sh

448 lines
18 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
hostname="$1"
username="$2"
# Bootstrap the GPG keyring
rm -rf /etc/pacman.d/gnupg
mkdir -m700 /etc/pacman.d/gnupg
pacman-key --init
pacman-key --populate archlinux
printf "\nEnabling multilib.\n"
pacman_file="/etc/pacman.conf"; printf "\n\n# Enabling multilib." >> "$pacman_file"; \
printf "\n[multilib]" >> "$pacman_file"; printf "\nInclude = /etc/pacman.d/mirrorlist\n" >> "$pacman_file"
# Now update and install everything else with pacman
pacman -Syyu --noconfirm
printf "\n\nPart 2 - continuing install/customisation.\nConfiguring locale to London/UK.\n"
pacman -S --noconfirm terminus-font
rm -rf /etc/localtime
ln -sf /usr/share/zoneinfo/Europe/London /etc/localtime
hwclock --systohc --utc
grep -rl "#en_GB.UTF-8 UTF-8" /etc/locale.gen | xargs sed -i 's/#en_GB.UTF-8 UTF-8/en_GB.UTF-8 UTF-8/g'
echo LANG=en_GB.UTF-8 > /etc/locale.conf
export LANG=en_GB.UTF-8
# localectl list-keymaps - use to list available keymaps
echo "KEYMAP=uk" >> /etc/vconsole.conf
echo "XKBLAYOUT=gb" >> /etc/vconsole.conf
echo "FONT=ter-922b" >> /etc/vconsole.conf
locale-gen
printf "\nConfiguring hostname\n"
echo "$hostname" > /etc/hostname
# printf "Enabling DHCP.\n"
# systemctl enable dhcpcd.service
printf "\nEnabling SSH.\n"
pacman -S --noconfirm openssh
systemctl enable sshd.service
echo "%wheel ALL=(ALL:ALL) ALL" > /etc/sudoers.d/00-wheel-sudo
chmod 0440 /etc/sudoers.d/00-wheel-sudo
printf "\nInstalling GRUB.\n"
pacman -S --noconfirm grub efibootmgr dosfstools os-prober mtools
# grub-install --target=x86_64-efi --bootloader-id=grub_uefi --efi-directory=/boot/EFI/ --bootloader-id="ArchLinux"
grub-install --target=x86_64-efi --efi-directory=/boot/EFI/ --bootloader-id="ArchLinux-$hostname"
# single quote ' is '\''
grep -rl " quiet" /etc/default/grub | xargs sed -i 's/ quiet/ quiet mitigations=off /g'
grub-mkconfig -o /boot/grub/grub.cfg
mkinitcpio -p linux
printf "\nInstalling Intel video drivers, KDE Plasma, fonts.\n"
pacman -S --noconfirm zram-generator
pacman -S --noconfirm perf strace
pacman -S --noconfirm intel-media-driver libva-utils
pacman -S --noconfirm plasma-meta plasma-x11-session kwin-x11 plasma-workspace sddm
pacman -S --noconfirm ark dolphin kate konsole gwenview
pacman -S --noconfirm pipewire-alsa pavucontrol sof-firmware
pacman -S --noconfirm mc nano vim htop wget iwd iotop-c less man-pages mandoc bc
pacman -S --noconfirm ttf-dejavu ttf-roboto-mono ttf-bitstream-vera ttf-liberation ttf-nerd-fonts-symbols-mono
pacman -S --noconfirm git networkmanager-openvpn nm-connection-editor network-manager-applet
pacman -S --noconfirm firefox unzip unrar aria2 7zip
### wezterm
# URL of the package to download
# PACKAGE_URL="https://github.com/georgeabr/arch-iso/releases/download/20250728_142256/wezterm-git-20250725.073938.dd6e5bd2-1-x86_64.pkg.tar.zst"
# PACKAGE_URL="https://github.com/georgeabr/arch-iso/releases/download/20251223_112125/wezterm-git-20251223.105516.d3b0fdad4-1-x86_64.pkg.tar.zst"
PACKAGE_URL="https://github.com/georgeabr/arch-iso/releases/download/20260804_163527/wezterm-git-20260804.160917.b16aa977e-1-x86_64.pkg.tar.zst"
# create a temporary directory
TMPDIR=$(mktemp -d)
PACKAGE_FILE="${TMPDIR}/$(basename "${PACKAGE_URL}")"
# download the package
echo "Downloading ${PACKAGE_URL}"
curl -L -o "${PACKAGE_FILE}" "${PACKAGE_URL}"
# install the downloaded package and its missing dependencies
echo "Installing ${PACKAGE_FILE}"
pacman -U --noconfirm "${PACKAGE_FILE}"
# cleanup
rm -rf "${TMPDIR}"
pacman -Q wezterm-git
echo "wezterm-git package installed."
### wezterm
### trizen AUR downloader
# URL of the package to download
PACKAGE_URL="https://github.com/georgeabr/arch-iso/releases/download/trizen-git/trizen-1.1.68-1-any.pkg.tar.zst"
# create a temporary directory
TMPDIR=$(mktemp -d)
PACKAGE_FILE="${TMPDIR}/$(basename "${PACKAGE_URL}")"
# download the package
echo "Downloading ${PACKAGE_URL}"
curl -L -o "${PACKAGE_FILE}" "${PACKAGE_URL}"
# install the downloaded package and its missing dependencies
echo "Installing ${PACKAGE_FILE}"
pacman -U --noconfirm "${PACKAGE_FILE}"
# cleanup
rm -rf "${TMPDIR}"
pacman -Q trizen
echo "trizen package installed."
### trizen AUR downloader
### Cousine Nerd Font
# 1) Configuration
REPO="ryanoasis/nerd-fonts"
FONT="Cousine"
INSTALL_DIR="/usr/local/share/fonts/${FONT}NerdFont"
# 2) Fetch latest release JSON and extract the ZIP URL for Cousine
echo "Looking up latest ${FONT} Nerd Font release"
API_URL="https://api.github.com/repos/${REPO}/releases/latest"
ASSET_URL=$(
curl -s "${API_URL}" \
| grep -E 'browser_download_url.*Cousine.*\.zip"' \
| head -n1 \
| cut -d '"' -f4
)
if [[ -z "$ASSET_URL" ]]; then
echo "Failed to find a download URL for ${FONT}.zip, skipping install" >&2
else
echo "Found download URL: $ASSET_URL"
# 3) Download the ZIP to a temp dir (own variable, not the shared TMPDIR
# used by the wezterm/trizen blocks above, so this block's cleanup
# can never remove a tmpdir it didn't create)
FONT_TMPDIR=$(mktemp -d)
ZIPFILE="${FONT_TMPDIR}/${FONT}.zip"
echo "Downloading ZIP to $ZIPFILE"
curl -sfL --retry 3 --retry-connrefused --connect-timeout 10 -o "$ZIPFILE" "$ASSET_URL"
# Only proceed if the download actually produced a valid zip
if [[ ! -s "$ZIPFILE" ]] || ! unzip -tq "$ZIPFILE" >/dev/null 2>&1; then
echo "Download failed or file is not a valid zip, skipping install" >&2
else
# 4) Unpack into the system fonts directory
echo "Installing into $INSTALL_DIR"
mkdir -p "$INSTALL_DIR"
unzip -o "$ZIPFILE" -d "$INSTALL_DIR" >/dev/null
echo "Installed ${FONT} Nerd Font to $INSTALL_DIR"
fi
rm -rf "$FONT_TMPDIR"
fi
# 5) Refresh font cache
echo "Refreshing font cache"
fc-cache -f -v >/dev/null
echo "${FONT} Nerd Font installed system-wide in $INSTALL_DIR"
### Cousine Nerd Font
### NTP and UK keyboard layout
#
# enable-ntp-keymap.sh
# Run inside an Arch chroot (e.g. arch-chroot /mnt /root/enable-ntp-keymap.sh)
#
# full paths to files and binaries
TIMESYNCD_CONF="/etc/systemd/timesyncd.conf"
SERVICE_UNIT="/usr/lib/systemd/system/systemd-timesyncd.service"
WANTS_DIR="/etc/systemd/system/multi-user.target.wants"
WANTS_LINK="${WANTS_DIR}/systemd-timesyncd.service"
echo "1) Configuring NTP servers in ${TIMESYNCD_CONF}"
mkdir -p "${WANTS_DIR}"
sed -E -i 's@^#?NTP=.*@NTP=0.arch.pool.ntp.org 1.arch.pool.ntp.org@' \
"${TIMESYNCD_CONF}"
echo "2) Enabling systemd-timesyncd.service at boot"
ln -sf "${SERVICE_UNIT}" "${WANTS_LINK}"
echo "3) Verifying NTP configuration"
grep '^NTP=' "${TIMESYNCD_CONF}"
ls -l "${WANTS_LINK}"
echo ""
echo ">> All done. Exit chroot and reboot for changes to take effect."
### NTP and UK keyboard layout
### Disable QT/SDDM cursor blink globally, add UK keyboard layout
# Ensure target directories exist
mkdir -p /etc/xdg /etc/sddm.conf.d
# 1) system-wide X11 layout (kxkbrc)
echo '[Layout]' > /etc/xdg/kxkbrc
echo 'Enabled=true' >> /etc/xdg/kxkbrc
echo 'LayoutList=gb' >> /etc/xdg/kxkbrc
echo 'PerWindow=false' >> /etc/xdg/kxkbrc
echo 'PerApplication=false' >> /etc/xdg/kxkbrc
echo '' >> /etc/xdg/kxkbrc
echo '[Options]' >> /etc/xdg/kxkbrc
# echo 'grp:alt_shift_toggle' >> /etc/xdg/kxkbrc # optional XKB options
chmod 644 /etc/xdg/kxkbrc
# 2) system-wide KDE input settings (kcminputrc) for Plasma6
echo '[Keyboard]' > /etc/xdg/kcminputrc
echo 'Layout=gb' >> /etc/xdg/kcminputrc
echo 'Model=pc105' >> /etc/xdg/kcminputrc
echo 'Variant=' >> /etc/xdg/kcminputrc
echo 'Options=' >> /etc/xdg/kcminputrc
chmod 644 /etc/xdg/kcminputrc
# 3) SDDM login screen layout (keyboard.conf)
echo '[General]' > /etc/sddm.conf.d/keyboard.conf
echo 'InputMethod=none' >> /etc/sddm.conf.d/keyboard.conf
echo '' >> /etc/sddm.conf.d/keyboard.conf
echo '[Keyboard]' >> /etc/sddm.conf.d/keyboard.conf
echo 'Layout=gb' >> /etc/sddm.conf.d/keyboard.conf
echo 'Model=pc105' >> /etc/sddm.conf.d/keyboard.conf
chmod 644 /etc/sddm.conf.d/keyboard.conf
# 4) Disable cursor blink system-wide (kdeglobals)
echo '[General]' > /etc/xdg/kdeglobals
echo 'CursorBlinkRate=0' >> /etc/xdg/kdeglobals
echo '[KDE]' >> /etc/xdg/kdeglobals
echo 'CursorBlinkRate=0' >> /etc/xdg/kdeglobals
echo 'AnimationDurationFactor=0' >> /etc/xdg/kdeglobals
chmod 644 /etc/xdg/kdeglobals
echo "System-wide UK keyboard layout configured for Plasma6 & SDDM, cursor blink disabled."
### Disable QT/SDDM cursor blink globally, add UK keyboard layout
### GTK 3/4 cursor blink
# Create GTK3 and GTK4 system‐wide config dirs
mkdir -p /etc/gtk-3.0 /etc/gtk-4.0
# 1) Disable cursor blink in GTK3 apps
echo '[Settings]' > /etc/gtk-3.0/settings.ini
echo 'gtk-cursor-blink = false' >> /etc/gtk-3.0/settings.ini
echo 'gtk-cursor-blink-timeout = 0' >> /etc/gtk-3.0/settings.ini
chmod 644 /etc/gtk-3.0/settings.ini
# 2) Disable cursor blink in GTK4 apps
echo '[Settings]' > /etc/gtk-4.0/settings.ini
echo 'gtk-cursor-blink = false' >> /etc/gtk-4.0/settings.ini
echo 'gtk-cursor-blink-timeout = 0' >> /etc/gtk-4.0/settings.ini
chmod 644 /etc/gtk-4.0/settings.ini
echo "GTK3/4 cursor blink globally disabled."
### GTK 3/4 cursor blink
# Enable ZRAM
printf "\nEnabling ZRAM.\n"
printf "[zram0]\n" > /etc/systemd/zram-generator.conf
systemctl enable systemd-zram-setup@zram0.service
systemctl enable sddm.service
systemctl enable NetworkManager
systemctl start NetworkManager
# do user creation after everything is installed
printf "\nEnter <root> user password....\n"
passwd root
printf "\nAdding user <$username>, sudo permission.\n"
useradd -m -G wheel -s /bin/bash "$username"
printf "Enter password for user <$username> ...\n"
passwd "$username"
# Not needed, `useradd -m` does it
# mkhomedir_helper $username
# printf "\041" - meaning !
# ~/.config/gtk-4.0/settings.ini
mkdir "/home/$username/.config"; chown "$username:$username" "/home/$username/.config"
mkdir "/home/$username/.config/gtk-4.0";
printf "[Settings]" > "/home/$username/.config/gtk-4.0/settings.ini"
printf "\ngtk-cursor-blink = 0\n" >> "/home/$username/.config/gtk-4.0/settings.ini"
chown "$username:$username" "/home/$username/.config/gtk-4.0/settings.ini"
# ~/.config/gtk-3.0/settings.ini
mkdir "/home/$username/.config/gtk-3.0";
printf "[Settings]" > "/home/$username/.config/gtk-3.0/settings.ini"
printf "\ngtk-cursor-blink = 0\n" >> "/home/$username/.config/gtk-3.0/settings.ini"
# consistency for all GTK3 apps, including Firefox
#printf "\ngtk-cursor-theme-name = Adwaita" >> /home/george/.config/gtk-3.0/settings.ini
#printf "\ngtk-cursor-theme-size = 32" >> /home/george/.config/gtk-3.0/settings.ini
chown "$username:$username" "/home/$username/.config/gtk-3.0/settings.ini"
curl -s -L -o "/home/$username/.vimrc" https://raw.githubusercontent.com/georgeabr/linux-configs/refs/heads/master/.vimrc
curl -s -L -o "/home/$username/.wezterm.lua" https://raw.githubusercontent.com/georgeabr/linux-configs/refs/heads/master/.wezterm.lua
chown "$username:$username" "/home/$username/.vimrc"
chown "$username:$username" "/home/$username/.wezterm.lua"
# for gtk2, including under kde
printf "\ngtk-cursor-blink = 0\n" >> "/home/$username/.gtkrc-2.0"
printf "\ngtk-cursor-blink = 0\n" >> "/home/$username/.gtkrc-2.0-kde"
chown "$username:$username" "/home/$username/.gtkrc-2.0"
chown "$username:$username" "/home/$username/.gtkrc-2.0-kde"
# Ensure user's config directory exists
mkdir -p "/home/$username/.config"
chown "$username:$username" "/home/$username/.config"
# Write keyboard layout config (kxkbrc) for KDE sessions
echo '[Layout]' > "/home/$username/.config/kxkbrc"
echo 'Use=true' >> "/home/$username/.config/kxkbrc"
echo 'LayoutList=gb' >> "/home/$username/.config/kxkbrc"
echo 'Options=' >> "/home/$username/.config/kxkbrc"
echo 'Model=pc105' >> "/home/$username/.config/kxkbrc"
echo 'Variant=' >> "/home/$username/.config/kxkbrc"
# Set permissions
chown "$username:$username" "/home/$username/.config/kxkbrc"
chmod 644 "/home/$username/.config/kxkbrc"
echo '# Better icon scaling in KDE' >> "/home/$username/.profile"
echo 'export QT_SCALE_FACTOR_ROUNDING_POLICY=Round' >> "/home/$username/.profile"
# Create or update kdeglobals to disable cursor blink
echo '[General]' >> "/home/$username/.config/kdeglobals"
echo 'AccentColor=104,107,111' >> "/home/$username/.config/kdeglobals"
# echo 'ColorScheme=BreezeDark1' >> /home/$username/.config/kdeglobals
echo 'ColorScheme=BreezeDark-new-darker' >> "/home/$username/.config/kdeglobals"
echo '[KDE]' >> "/home/$username/.config/kdeglobals"
echo 'CursorBlinkRate=0' >> "/home/$username/.config/kdeglobals"
echo 'AnimationDurationFactor=0' >> "/home/$username/.config/kdeglobals"
# Set ownership and permission
chown "$username:$username" "/home/$username/.config/kdeglobals"
chmod 644 "/home/$username/.config/kdeglobals"
echo '[Keyboard]' >> "/home/$username/.config/kcminputrc"
echo 'NumLock=0' >> "/home/$username/.config/kcminputrc"
echo '[Mouse]' >> "/home/$username/.config/kcminputrc"
echo 'cursorSize=40' >> "/home/$username/.config/kcminputrc"
echo 'cursorTheme=XCursor-Pro-Dark' >> "/home/$username/.config/kcminputrc"
# Set ownership and permission
chown "$username:$username" "/home/$username/.config/kcminputrc"
chmod 644 "/home/$username/.config/kcminputrc"
echo "contents of kcminputrc"
cat "/home/$username/.config/kcminputrc"
echo; echo "contents of kdeglobals"
cat "/home/$username/.config/kdeglobals"
# --- Start of user's requested KDE/XCursor configuration ---
printf "\nConfiguring KDE colour schemes and XCursor themes...\n"
# Dark colour schemes for KDE
mkdir -p "/home/$username/.local/share/color-schemes"
chown "$username:$username" "/home/$username/.local/share/color-schemes/"
curl -s -L -o "/home/$username/.local/share/color-schemes/BreezeDark1.colors" \
https://raw.githubusercontent.com/georgeabr/linux-configs/refs/heads/master/BreezeDark1.colors
curl -s -L -o "/home/$username/.local/share/color-schemes/BreezeDark-new-darker.colors" \
https://raw.githubusercontent.com/georgeabr/linux-configs/refs/heads/master/BreezeDark-new-darker.colors
curl -s -L -o "/home/$username/.local/share/color-schemes/Chocula-darker-warm.colors" \
https://raw.githubusercontent.com/georgeabr/linux-configs/refs/heads/master/Chocula-darker-warm.colors
curl -s -L -o "/home/$username/.local/share/color-schemes/Chocula-darker.colors" \
https://raw.githubusercontent.com/georgeabr/linux-configs/refs/heads/master/Chocula-darker.colors
curl -s -L -o "/home/$username/.local/share/color-schemes/We10XOSDark1.colors" \
https://raw.githubusercontent.com/georgeabr/linux-configs/refs/heads/master/We10XOSDark1.colors
chown "$username:$username" "/home/$username/.local/share/color-schemes/BreezeDark1.colors"
chown "$username:$username" "/home/$username/.local/share/color-schemes/BreezeDark-new-darker.colors"
chown "$username:$username" "/home/$username/.local/share/color-schemes/Chocula-darker-warm.colors"
chown "$username:$username" "/home/$username/.local/share/color-schemes/Chocula-darker.colors"
chown "$username:$username" "/home/$username/.local/share/color-schemes/We10XOSDark1.colors"
ls -lha "/home/$username/.local/share/color-schemes/"
# Downloads an archive, validates it, extracts it, and cleans up.
# Skips gracefully (script continues) if the download or archive is bad.
# Args: url dest_file extract_dir label
fetch_and_extract() {
local url="$1" dest="$2" extract_dir="$3" label="$4"
echo "Downloading ${label}"
if ! curl -sfL --retry 3 --retry-connrefused --connect-timeout 10 -o "$dest" "$url"; then
echo "Warning: failed to download ${label} from ${url}, skipping" >&2
rm -f "$dest"
return 1
fi
if [[ ! -s "$dest" ]] || ! tar -tf "$dest" >/dev/null 2>&1; then
echo "Warning: downloaded file for ${label} is missing or not a valid archive, skipping" >&2
rm -f "$dest"
return 1
fi
tar -xf "$dest" -C "$extract_dir"
rm -f "$dest"
echo "Installed ${label} into ${extract_dir}"
return 0
}
mkdir -p "/home/$username/.icons"
chown "$username:$username" "/home/$username/.icons/"
fetch_and_extract \
"https://github.com/ful1e5/XCursor-pro/releases/download/v2.0.2/XCursor-Pro-Dark.tar.xz" \
"/home/$username/XCursor-Pro-Dark.tar.xz" \
"/home/$username/.icons" \
"XCursor-Pro-Dark cursor theme"
# Corrected GitLab raw URL for Hackneyed-Dark
fetch_and_extract \
"https://github.com/georgeabr/linux-configs/raw/refs/heads/master/Hackneyed-Dark-36px-0.9.3-right-handed.tar.bz2" \
"/home/$username/Hackneyed-Dark-36px-0.9.3-right-handed.tar.bz2" \
"/home/$username/.icons" \
"Hackneyed-Dark cursor theme"
# KDE does not see the application icons otherwise
mkdir -p "/home/$username/.local/share/icons"
# Monochrome icon colour theme
fetch_and_extract \
"https://raw.githubusercontent.com/georgeabr/linux-configs/refs/heads/master/YAMIS-Muted.tar.gz" \
"/home/$username/YAMIS-Muted.tar.gz" \
"/home/$username/.local/share/icons" \
"YAMIS-Muted icon theme"
ls -lha "/home/$username/.icons/"
ls -lha "/home/$username/.local/share/icons/"
# htop tweaking
mkdir -p "/home/$username/.config/htop"
curl -s -L -o "/home/$username/.config/htop/htoprc" \
https://raw.githubusercontent.com/georgeabr/linux-configs/refs/heads/master/v5/.config/htop/htoprc
# Making sure the user owns their home folder recursively
chown -R "$username:$username" "/home/$username/"
printf "\nInstallation completed. Please reboot and log into KDE.\n"