#! /bin/bash # # Copyright 2020, Stormux, # # This is free software; you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free # Software Foundation; either version 3, or (at your option) any later # version. # # This software 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 # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this package; see the file COPYING. If not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # # keep track of mounted status for exit function mounted=1 set -e # Don't want to destroy stuff if this goes majorly wrong. trap cleanup EXIT # make sure the script cleans up after itself before closing. cleanup() { if [[ $mounted -eq 0 ]]; then umount -R /mnt partx -d ${loopdev} losetup --detach ${loopdev} fi exit 0 } help() { echo -e "Usage:\n" echo "With no arguments, build with default parameters." for i in "${!command[@]}" ; do echo "-${i}: ${command[${i}]}" done | sort exit 0 } # Array of command line arguments declare -A command=( [h]="This help screen." [n]="Image name, default is stormux-pi<3|4>-.img" [s]="image size in GB, default is 4." [v]="Version of the Raspberry Pi for which you are building. (3|4 default)" ) # Convert the keys of the associative array to a format usable by getopts args="${!command[*]}" args="${args//[[:space:]]/}" while getopts "${args}" i ; do case "$i" in n) shift imageName="$1" shift ;; h) help;; s) shift if [[ "$1" =~ ^[[:digit:]]+$ ]]; then imageSize="${1}G" else echo "Image size must be numeric." exit 1 fi shift ;; v) shift if [[ "$1" =~ ^[34]$ ]]; then imageVersion="$1" else echo "Image version must be 3 for the Raspberry Pi 3, or 4 for the Raspberry Pi 4 (default)." exit 1 fi shift ;; esac done # make sure variables are set, or use defaults. export imageVersion="${imageVersion:-4}" export imageSize="${imageSize:-4G}" export imageName="${imageName:-stormux-pi${imageVersion}-$(date '+%Y-%m-%d').img}" # Make sure the image file doesn't exist. if [[ -e "$imageName" ]]; then echo "${imageName} exists, please remove or move it for this script to continue." exit 1 fi # Make sure this script is ran as root. if [ "$(whoami)" != "root" ] ; then echo "Error: This script must be run as root." exit 1 fi # make sure the needed tools are installed if [[ "$(uname -m)" == "x86_64" ]]; then if ! pacman -Q qemu-user-static &> /dev/null ; then echo "Please install pacman -Q qemu-user-static before continuing." exit 1 fi fi for i in parted wget ; do if ! pacman -Q $i &> /dev/null ; then echo "Please install $i before continuing." exit 1 fi done # Url for the image to be downloaded. url[3]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz" url[4]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz" fallocate -l $imageSize "$imageName" loopdev="$(losetup --find --show "${imageName}")" parted --script ${loopdev} mklabel msdos mkpart primary fat32 0% 100M mkpart primary ext4 100M 100% mkfs.vfat -F32 ${loopdev}p1 mkfs.ext4 -F ${loopdev}p2 mount ${loopdev}p2 /mnt mkdir /mnt/boot mount ${loopdev}p1 /mnt/boot # Things are mounted now, so set mounted to 0 (bash true) mounted=0 wget "${url[$imageVersion]}" -O- | bsdtar -xpf - -C /mnt arch-chroot /mnt << EOF # set up pacman pacman-key --init pacman-key --populate archlinuxarm pacman -Syu --needed --noconfirm base base-devel bash-completion cronie espeak-ng git # Set the distribution name. echo 'Stormux \r (\l)' > /etc/issue echo >> /etc/issue # Change the alarm user to be stormux usermod -a -g users -G wheel,audio,video -m -d /home/stormux -l stormux alarm # Grant sudo privileges to the stormux user for package installation. echo 'stormux ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/wheel # Set the password for the stormux user echo -e "stormux\nstormux" | passwd "stormux" # Change to the stormux user and install some packages sudo su - stormux git clone https://aur.archlinux.org/yay.git cd yay makepkg -si cd ~ rm -rf yay yay -S fenrir-git informant magic-wormhole exit # Make sure informant is up to date with news informant read --all # Configure sudo for group wheel, remove nopasswd for the stormux user sed '/stormux/d' /etc/sudoers.d/wheel sed 's/^# %wheel ALL=(ALL) ALL$/%wheel ALL=(ALL) ALL/' /etc/sudoers.d/wheel # Set the hostname echo stormux > /etc/hostname # Enable services systemctl enable cronie.service fenrirscreenreader.service # Update fstab for Raspberry Pi 4. [[ $imageVersion -eq 4 ]] && sed -i 's/mmcblk0/mmcblk1/g' /etc/fstab EOF exit 0