Compare commits

...

42 Commits
master ... rpi3

Author SHA1 Message Date
Storm Dragon f6a2a43906 Default etc/environment file added. 2024-03-05 18:13:18 -05:00
Storm Dragon 9f8355514f Updated configure-stormux stub. 2024-03-03 14:38:44 -05:00
Storm Dragon 563362985f Fix removal part of first boot script. 2024-03-03 14:24:24 -05:00
Storm Dragon 51f8c1b3d4 Updated the .bash_aliases file. 2024-02-26 00:25:23 -05:00
Storm Dragon cdfd1d31a2 Make sure the greeting for configure stormux only appears on the tty where it spawns. 2024-02-16 02:54:54 -05:00
Storm Dragon 2af9365e22 Updated the first boot script. 2024-02-16 01:36:59 -05:00
Storm Dragon 3a37c33a64 New attempt at getting configure-stormux to run on first boot. 2024-02-16 01:35:39 -05:00
Storm Dragon 2144432ec5 Added package raspberrypi-utils 2024-02-16 01:14:10 -05:00
Storm Dragon 3dbf1f97fb Updated firmware package name. 2023-12-29 11:44:19 -05:00
Storm Dragon 4f7dbb4f82 Updated configure-stormus stub file. Because it is ran initially as root, no need for the sudo calls. Also handle removal of the cron job that causes it to run on the first boot of the image. 2023-09-24 15:47:42 -04:00
Storm Dragon 7ed27d5c65 Changed firstrun script to not delete itself. This will be handled in configure-stormux past a certain point. This way if something goes wrong, the script will stil run if the Pi had to be powered down without completing setup. 2023-09-24 15:35:31 -04:00
Storm Dragon 4c23704b2a Use cron to run configure-stormux on first boot. 2023-09-24 15:31:14 -04:00
Storm Dragon 7d15478e18 Updated the p3 build script. 2023-08-19 19:51:59 -04:00
Storm Dragon 110e7d9253 Added screen to installed packages. 2023-08-19 18:04:24 -04:00
Storm Dragon 2dc2f72e22 Missed a couple spots for audible prompt. 2023-08-19 12:48:51 -04:00
Storm Dragon cea6ad9988 Update the configure-stormux stub to use the audible prompt. 2023-08-19 10:37:02 -04:00
Storm Dragon 340ebb5861 Put the skel stuff in the wrong place... More cofrfee please. 2023-08-19 09:03:30 -04:00
Storm Dragon 89ab28a79c New files from skel moved into place. 2023-08-19 08:42:51 -04:00
Storm Dragon 44cc2024fc Added skel with some default files to improve convenience. 2023-08-19 08:35:35 -04:00
Storm Dragon 5bae083148 Update the audibleprompt script to use the arguments from sudo. This should keep locales. 2023-08-17 16:33:57 -04:00
Storm Dragon 800d6ca71b Working toward audible sudo prompts for some operations. 2023-08-17 15:28:03 -04:00
Storm Dragon d5c86ab680 Added donation leader board to motd file. 2023-07-01 10:20:35 -04:00
Storm Dragon 6e6f02df1e Added arch-install-scripts to package checks. 2023-06-25 22:27:43 -04:00
stormdragon2976 0796f3fe65 Work around to get armv7h builds for the Pi4. 2023-01-21 01:31:45 -05:00
stormdragon2976 1e32dac8da The configure-stormux stub should now set the clock before updating so that there will not be certificate is not yet valid errors. 2023-01-19 01:00:33 -05:00
stormdragon2976 83ceeda6f3 Added package raspberrypi-firmware to the build scripts. 2023-01-18 19:27:31 -05:00
stormdragon2976 46113cc659 Started updates for the Pi3 build script. 2023-01-18 00:31:23 -05:00
stormdragon2976 1357d2ef04 Fixed aur package building. 2023-01-17 19:41:17 -05:00
stormdragon2976 e721b7ef60 Updated package names for qemu. 2023-01-01 14:55:07 -05:00
stormdragon2976 354c79cc5b Update initial configure-stormux script to use new repository. 2023-01-01 14:47:44 -05:00
Storm Dragon 8101bf6907 Add user to realtime group to help with hdmi sound. 2022-04-21 00:29:30 -04:00
Storm Dragon f8987fca58 Add user to realtime group to help with hdmi sound. 2022-04-21 00:25:25 -04:00
Storm Dragon 2fe6cc1cb4 Clear the screen when applying laptop layout so when Fenrir restarts it is less spammy. 2022-04-04 03:10:22 -04:00
Storm Dragon 02913ad280 Pi3 support coming back. 2022-04-02 22:29:36 -04:00
Storm Dragon 25bbd9f3c6 Finall.y remembered to enable wireplumber. 2022-04-02 20:31:26 -04:00
Storm Dragon 00ccf36543 Switch to dbus-broker. 2022-04-02 16:47:27 -04:00
Storm Dragon 824b68b90a Another shot at speeding up time sync. 2022-04-01 00:35:18 -04:00
Storm Dragon 3642af9128 Make the git clone process quiet. 2022-04-01 00:27:05 -04:00
Storm Dragon 0182d40087 Hopefully make time sync at boot faster. Update the configure-stormux starter script. 2022-03-31 23:41:41 -04:00
Storm Dragon efe1f75e08 Add noconfirm to the removal and installation of kernels. 2022-03-30 04:56:10 -04:00
Storm Dragon dc356e52ae forgot to comment out the sed statement which is not needed for linux-rpi. 2022-03-30 04:38:47 -04:00
Storm Dragon c156bddb94 Moving toward 64 bit. Hopefully everything is ready, needs testing. 2022-03-30 04:37:45 -04:00
43 changed files with 874 additions and 45 deletions

View File

@ -1,12 +0,0 @@
#!/bin/bash
trap 'popd &> /dev/null' EXIT
if [[ ! -d /opt/configure-stormux ]]; then
echo "Installing configure-stormux..."
sudo git -C /opt clone https://gitlab.com/stormux/configure-stormux.git || exit 1
fi
pushd /opt/configure-stormux
./configure-stormux.sh
exit 0

View File

@ -50,9 +50,9 @@ help() {
declare -A command=(
[h]="This help screen."
[l:]="Language default is en_US."
[n:]="Image name, default is stormux-pi<3|4>-<yyyy-mm-dd>.img"
[n:]="Image name, default is stormux-pi3-<armv7h|aarch64>-<yyyy-mm-dd>.img"
[s:]="image size in GB, default is 4."
[v:]="Version of the Raspberry Pi for which you are building. (3|4 default)"
[v:]="Version of the Raspberry Pi for which you are building. (32|64) default is 64."
)
# Convert the keys of the associative array to a format usable by getopts
@ -76,10 +76,10 @@ while getopts "${args}" i ; do
fi
;;
v)
if [[ "${OPTARG}" =~ ^[34]$ ]]; then
if [[ "${OPTARG}" =~ ^32|64$ ]]; then
imageVersion="${OPTARG}"
else
echo "Image version must be 3 for the Raspberry Pi 3, or 4 for the Raspberry Pi 4 (default)."
echo "Image version must be 32 for 32 bit (armv7h), or 64 for 64 bit (aarch64 default)."
exit 1
fi
;;
@ -90,9 +90,12 @@ while getopts "${args}" i ; do
done
# make sure variables are set, or use defaults.
export imageVersion="${imageVersion:-4}"
export imageVersion="${imageVersion:-64}"
export imageSize="${imageSize:-4G}"
export imageName="${imageName:-stormux-pi${imageVersion}-$(date '+%Y-%m-%d').img}"
imageName="${imageName:-stormux-pi3-${imageVersion}-$(date '+%Y-%m-%d').img}"
imageName="${imageName/-64-/-aarch64-}"
imageName="${imageName/-32-/-armv7h-}"
export imageName
export imageLanguage="${imageLanguage:-en_US.UTF-8}"
# Make sure the image file doesn't exist.
@ -110,15 +113,15 @@ 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 qemu-user-static and binfmt-qemu-static before continuing."
echo "Please install qemu-user-static and qemu-user-static-binfmt before continuing."
exit 1
fi
if ! pacman -Q binfmt-qemu-static &> /dev/null ; then
echo "Please install qemu-user-static and binfmt-qemu-static before continuing."
if ! pacman -Q qemu-user-static-binfmt &> /dev/null ; then
echo "Please install qemu-user-static and qemu-user-static-binfmt before continuing."
exit 1
fi
fi
for i in dosfstools parted wget ; do
for i in arch-install-scripts dosfstools parted wget ; do
if ! pacman -Q $i &> /dev/null ; then
echo "Please install $i before continuing."
exit 1
@ -127,14 +130,12 @@ done
# Url for the image to be downloaded.
#url[3]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz"
url[3]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-2-latest.tar.gz"
#url[4]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz"
url[4]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-armv7-latest.tar.gz"
url[32]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-armv7-latest.tar.gz"
url[64]="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%
parted --script "${loopdev}" mklabel msdos mkpart primary fat32 0% 200M mkpart primary ext4 200M 100%
mkfs.vfat -F32 "${loopdev}p1"
mkfs.ext4 -F "${loopdev}p2"
mount "${loopdev}p2" /mnt
@ -149,7 +150,15 @@ arch-chroot /mnt << EOF
# set up pacman
pacman-key --init
pacman-key --populate archlinuxarm
pacman -Syyu --needed --noconfirm \
pacman -Syy
# Change kernels for aarch64
if [[ "$imageVersion" == "64" ]]; then
pacman -R --noconfirm linux-aarch64 uboot-raspberrypi
pacman -S --noconfirm linux-rpi
fi
# Install packages
pacman -Su --needed --noconfirm \
alsa-firmware \
alsa-utils \
base \
@ -158,9 +167,13 @@ pacman -Syyu --needed --noconfirm \
bluez \
bluez-utils \
brltty \
cloud-utils \
cronie \
dbus-broker \
espeak-ng \
fake-hwclock \
git \
go \
magic-wormhole \
man \
man-pages \
@ -170,9 +183,18 @@ pacman -Syyu --needed --noconfirm \
pipewire-alsa \
pipewire-jack \
pipewire-pulse \
poppler \
python-pyudev \
python-daemonize \
python-evdev \
python-dbus \
python-pyte \
raspberrypi-firmware \
realtime-privileges \
rhvoice-voice-bdl \
rng-tools \
rsync \
screen \
sox \
w3m \
wget \
@ -192,7 +214,7 @@ systemctl enable rngd.service
echo 'Stormux \r (\l)' > /etc/issue
echo >> /etc/issue
# Change the alarm user to be stormux
usermod -a -g users -G wheel,audio,video,network,brlapi -m -d /home/stormux -l stormux alarm
usermod -a -g users -G wheel,realtime,audio,video,network,brlapi -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 root user
@ -203,30 +225,44 @@ echo -e "stormux\nstormux" | passwd "stormux"
sudo -iu stormux
# Create desktop, downloads, music, and other directories.
xdg-user-dirs-update
# Install the yay package manager
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si --noconfirm
cd ~
rm -rf yay
yay -S --noconfirm fenrir-git growpartfs log2ram
rm -rf .cache/yay
/usr/share/fenrirscreenreader/tools/configure_pipewire.sh
# Build AUR packages
export aurPackages=(fenrir-git \
growpartfs \
log2ram \
yay)
export PKGDEST=~/packages
for p in "\${aurPackages[@]}" ; do
git clone https://aur.archlinux.org/\${p}.git
cd ~/\${p}
makepkg -A
cd ~
rm -rf \${p}
done
exit
# Install built packages
for p in /home/stormux/packages/* ; do
pacman -U --noconfirm \${p}
done
rm -rf /home/stormux/packages/
# Enable linger so that hopefully sound will start at login.
mkdir -p /var/lib/systemd/linger
touch /var/lib/systemd/linger/stormux
systemctl --global enable pipewire.service pipewire-pulse.service
systemctl --global enable dbus-broker.service pipewire.service pipewire-pulse.service
/usr/share/fenrirscreenreader/tools/configure_pipewire.sh
sudo -u stormux /usr/share/fenrirscreenreader/tools/configure_pipewire.sh
# Configure sudo for group wheel, remove nopasswd for the stormux user
echo '%wheel ALL=(ALL) ALL' > /etc/sudoers.d/wheel
# Set the hostname
echo stormux > /etc/hostname
# Enable services
systemctl enable brltty.path cronie.service fenrirscreenreader.service log2ram.service NetworkManager.service ntpd.service
# Configure services
systemctl enable brltty.path cronie.service dbus-broker.service fake-hwclock.service fenrirscreenreader.service log2ram.service NetworkManager.service ntpd.service
systemctl disable dbus.service
# Cleanup packages
pacman -Sc --noconfirm
pacman -R --noconfirm go
# Update fstab for Raspberry Pi 4.
#[[ $imageVersion -eq 4 ]] && sed -i 's/mmcblk0/mmcblk1/g' /etc/fstab
# Update fstab for Raspberry Pi 4. Not needed until linux-aarch64 works.
# [[ $imageVersion -eq 4 ]] && sed -i 's/mmcblk0/mmcblk1/g' /etc/fstab
EOF
# Copy override files into place.
@ -234,6 +270,7 @@ cp -rv ../files/boot/* /mnt/boot
cp -rv ../files/etc/* /mnt/etc
cp -rv ../files/var/* /mnt/var
cp -rv ../files/usr/* /mnt/usr
find ../files/etc/skel/ -mindepth 1 -exec cp -rv "{}" /mnt/home/stormux/ \;
# Exiting calls the cleanup function to unmount.
exit 0

7
pi3/files/etc/audibleprompt.sh Executable file
View File

@ -0,0 +1,7 @@
#!/usr/bin/env bash
play -qnV0 synth 3 pluck D3 pluck A3 pluck D4 pluck F4 pluck A4 delay 0 .1 .2 .3 .4 remix - chorus 0.9 0.9 38 0.75 0.3 0.5 -t &
read -rsp "$*"$'\n' password
echo "$password"
exit 0

View File

@ -3,6 +3,8 @@ Welcome to Stormux, powered by Arch Linux ARM
Stormux Website: https://stormux.org
Arch Linux ARM Forum: https://archlinuxarm.org/forum
Stormux IRC: #stormux on irc.libera.chat
Stormux IRC: #stormux on irc.stormux.org
Arch Linux ARM IRC: #archlinuxarm on irc.libera.chat
Thank you Stormux supporters! https://ko-fi.com/stormux/leaderboard

View File

@ -0,0 +1 @@
alias sudo='sudo '

View File

@ -0,0 +1,21 @@
memuse() {
ps axo rss,comm,pid \
| awk '{ proc_list[$2] += $1; } END \
{ for (proc in proc_list) { printf("%d\t%s\n", proc_list[proc],proc); }}' \
| sort -n | tail -n 10 | sort -rn \
| awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}'
}
pdf()
{
if [[ $# -ne 1 ]]; then
echo 'Usage: pdf <file>' >&2
else
local dir=$(mktemp -d -p /tmp pdf_conversion.XXXXXX)
local outFile="${1##*/}"
local outFile="${outFile%.*}"
pdftohtml -noframes -i -s "$1" "${dir}/${outFile}.html"
w3m -s "${dir}/${outFile}.html"
fi
}

View File

@ -0,0 +1,24 @@
#
# ~/.bashrc
#
# If not running interactively, don't do anything
[[ $- != *i* ]] && return
#Change directories without using cd
shopt -s autocd
# Keep bash history in screen
export HISTFILE="${HISTFILE}${WINDOW:+.${WINDOW}}"
# load Aliases and functions
[[ -f ".bash_aliases" ]] && source .bash_aliases
[[ -f ".bash_functions" ]] && source .bash_functions
#Invironment variables
PS1='[\u@\h \W] \$ '
export DIALOGOPTS='--no-lines --visit-items'
GPG_TTY=$(tty)
export GPG_TTY
# Don't put commands prefixed with space, or duplicate commands in history
export HISTCONTROL=ignoreboth

View File

@ -0,0 +1,6 @@
# Reload changes with control+x followed by control+r
set echo-control-characters off
# History searching with up and down arrows.
"\e[A": history-search-backward
"\e[B": history-search-forward

View File

@ -0,0 +1,18 @@
vbell off
bell_msg ""
hardstatus off
startup_message off
defscrollback 4096
bind ! select 10
bind @ select 11
bind \# select 12
bind $ select 13
bind % select 14
bind ^ select 15
bind & select 16
bind * select 17
bind ( select 18
bind ) select 19
bind b eval "writebuf" 'exec !!! xclip -selection "clipboard" -i /tmp/screen-exchange'
#termcapinfo xterm|xterms|xs|rxvt ti@:te@
termcapinfo xterm* ti@:te@

View File

@ -6,7 +6,7 @@ Conflicts=systemd-timesyncd.service
[Service]
Type=forking
PrivateTmp=true
ExecStartPre=/usr/bin/ntpd -gq
ExecStartPre=/usr/bin/ntpd -Ggq
ExecStart=/usr/bin/ntpd -g -u ntp:ntp
Restart=always

View File

@ -0,0 +1,47 @@
#!/bin/bash
trap 'popd &> /dev/null' EXIT
export SUDO_ASKPASS=/etc/audibleprompt.sh
if [[ ! -d /opt/configure-stormux ]]; then
# Offer to switch fenrir layout.
echo "Would you like to switch Fenrir to laptop layout? (y/n)"
read -r continue
continue="${continue::1}"
if [[ "${continue,}" == "y" ]];then
sudo -A sed -i 's/=desktop/=laptop/' /etc/fenrirscreenreader/settings/settings.conf
sudo -A systemctl restart fenrirscreenreader.service
clear
fi
if ! ping -c1 stormux.org &> /dev/null ; then
echo "No internet connection detected. Press enter to open NetworkManager."
echo "Note, it is best to put Fenrir into highlight mode while using NetworkManager."
echo "In desktop layout this is done by pressing Fenrir+numpad asterisk."
echo "That is the key just above numpad 9."
echo "In laptop mode, press Fenrir+y."
echo "In desktop mode the Fenrir key is numpad insert."
echo "In laptop mode the Fenrir key is the Super key, sometimes called the Windows key."
echo "Press enter to continue."
read -r continue
nmtui-connect
fi
# Check for internet connectivity
if ping -qc1 -W 1 stormux.org &> /dev/null; then
echo "Updating the clock to prevent certificate errors..."
# Get current date and time
date_time=$(curl -s http://worldtimeapi.org/api/ip | grep -oP '(?<="datetime":")[^"]*')
echo "Current date and time: $date_time"
# set date and time
sudo -A date -s "$date_time"
else
echo "Please connect to the internet and run ${0##*/} again."
exit 1
fi
echo "Installing configure-stormux..."
sudo -A git -C /opt clone -q https://git.stormux.org/storm/configure-stormux || exit 1
fi
pushd /opt/configure-stormux
./configure-stormux.sh
exit 0

283
pi4/build/build-stormux.sh Executable file
View File

@ -0,0 +1,283 @@
#! /bin/bash
#
# Copyright 2020, Stormux, <storm_dragon@linux-a11y.org>
#
# 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
if [[ -n "${imageFileName}" ]]; then
rm "${imageFileName}"
fi
exit 0
}
help() {
echo -e "Usage:\n"
echo "With no arguments, build with default parameters."
for i in "${!command[@]}" ; do
echo "-${i/:/ <parameter>}: ${command[${i}]}"
done | sort
exit 0
}
# Array of command line arguments
declare -A command=(
[h]="This help screen."
[l:]="Language default is en_US."
[n:]="Image name, default is stormux-pi<32|64>-<yyyy-mm-dd>.img"
[s:]="image size in GB, default is 4."
[v:]="Version of the Raspberry Pi for which you are building. (32|64) default is 64."
)
# 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
h) help ;;
l)
imageLanguage="${OPTARG}.UTF-8"
;;
n)
imageName="${OPTARG}"
;;
s)
if [[ "${OPTARG}" =~ ^[[:digit:]]+$ ]]; then
imageSize="${OPTARG}G"
else
echo "Image size must be numeric."
exit 1
fi
;;
v)
if [[ "${OPTARG}" =~ ^32|64$ ]]; then
imageVersion="${OPTARG}"
else
echo "Image version must be 32 for 32 bit (armv7h), or 64 for 64 bit (aarch64 default)."
exit 1
fi
;;
*)
exit 1
;;
esac
done
# make sure variables are set, or use defaults.
export imageVersion="${imageVersion:-64}"
export imageSize="${imageSize:-4G}"
imageName="${imageName:-stormux-pi4-${imageVersion}-$(date '+%Y-%m-%d').img}"
imageName="${imageName/-64-/-aarch64-}"
imageName="${imageName/-32-/-armv7h-}"
export imageName
export imageLanguage="${imageLanguage:-en_US.UTF-8}"
# 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 qemu-user-static and qemu-user-static-binfmt before continuing."
exit 1
fi
if ! pacman -Q qemu-user-static-binfmt &> /dev/null ; then
echo "Please install qemu-user-static and qemu-user-static-binfmt before continuing."
exit 1
fi
fi
for i in arch-install-scripts dosfstools 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[32]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-armv7-latest.tar.gz"
url[64]="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% 200M mkpart primary ext4 200M 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
imageFileName=$(mktemp)
wget "${url[$imageVersion]}" -O "${imageFileName}"
if [[ $imageVersion -eq 32 ]]; then
# Workaround for bsdtar errors when extracting 32 bit image.
set +e
fi
bsdtar -xpf "${imageFileName}" -C /mnt
# Set -e in case it got unset for 32 bit image
set -e
arch-chroot /mnt << EOF
# set up pacman
pacman-key --init
pacman-key --populate archlinuxarm
pacman -Syy
# Change kernels for aarch64
if [[ "$imageVersion" == "64" ]]; then
pacman -R --noconfirm linux-aarch64 uboot-raspberrypi
pacman -S --noconfirm linux-rpi
fi
# Install packages
pacman -Su --needed --noconfirm \
alsa-firmware \
alsa-utils \
base \
base-devel \
bash-completion \
bluez \
bluez-utils \
brltty \
cloud-utils \
cronie \
dbus-broker \
espeak-ng \
fake-hwclock \
firmware-raspberrypi \
git \
go \
magic-wormhole \
man \
man-pages \
networkmanager \
ntp \
pipewire \
pipewire-alsa \
pipewire-jack \
pipewire-pulse \
poppler \
python-pyudev \
python-daemonize \
python-evdev \
python-dbus \
python-pyte \
raspberrypi-utils \
realtime-privileges \
rhvoice-voice-bdl \
rng-tools \
rsync \
screen \
sox \
w3m \
wget \
wireless-regdb \
wireplumber \
xdg-user-dirs \
xdg-utils
# set the language
sed -i "s/#$imageLanguage/$imageLanguage/" /etc/locale.gen
echo "LANG=$imageLanguage" > /etc/locale.conf
locale-gen
# Configure and enable Hardware Random Number Generator
echo 'RNGD_OPTS="-o /dev/random -r /dev/hwrng"' > /etc/conf.d/rngd
systemctl enable rngd.service
# 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,realtime,audio,video,network,brlapi -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 root user
echo -e "root\nroot" | passwd "root"
# Set the password for the stormux user
echo -e "stormux\nstormux" | passwd "stormux"
# Change to the stormux user and install some packages
sudo -iu stormux
# Create desktop, downloads, music, and other directories.
xdg-user-dirs-update
# Build AUR packages
export aurPackages=(fenrir-git \
growpartfs \
log2ram \
yay)
export PKGDEST=~/packages
for p in "\${aurPackages[@]}" ; do
git clone https://aur.archlinux.org/\${p}.git
cd ~/\${p}
makepkg -A
cd ~
rm -rf \${p}
done
exit
# Install built packages
for p in /home/stormux/packages/* ; do
pacman -U --noconfirm \${p}
done
rm -rf /home/stormux/packages/
# Enable linger so that hopefully sound will start at login.
mkdir -p /var/lib/systemd/linger
touch /var/lib/systemd/linger/stormux
systemctl --global enable dbus-broker.service pipewire.service pipewire-pulse.service
/usr/share/fenrirscreenreader/tools/configure_pipewire.sh
sudo -u stormux /usr/share/fenrirscreenreader/tools/configure_pipewire.sh
# Configure sudo for group wheel, remove nopasswd for the stormux user
echo '%wheel ALL=(ALL) ALL' > /etc/sudoers.d/wheel
# Set the hostname
echo stormux > /etc/hostname
# Configure services
systemctl enable brltty.path cronie.service dbus-broker.service fake-hwclock.service fenrirscreenreader.service log2ram.service NetworkManager.service ntpd.service
systemctl disable dbus.service
# Cleanup packages
pacman -Sc --noconfirm
pacman -R --noconfirm go
# Update fstab for Raspberry Pi 4. Not needed until linux-aarch64 works.
# [[ $imageVersion -eq 4 ]] && sed -i 's/mmcblk0/mmcblk1/g' /etc/fstab
EOF
# Copy override files into place.
cp -rv ../files/boot/* /mnt/boot
cp -rv ../files/etc/* /mnt/etc
cp -rv ../files/var/* /mnt/var
cp -rv ../files/usr/* /mnt/usr
find ../files/etc/skel/ -mindepth 1 -exec cp -rv "{}" /mnt/home/stormux/ \;
# Exiting calls the cleanup function to unmount.
exit 0

10
pi4/files/boot/config.txt Executable file
View File

@ -0,0 +1,10 @@
# See /boot/overlays/README for all available options
dtoverlay=vc4-kms-v3d
initramfs initramfs-linux.img followkernel
dtparam=audio=on,krnbt=on
hdmi_drive=2
[pi4]
# Run as fast as firmware / board allows
arm_boost=1

View File

@ -0,0 +1,20 @@
Section "Monitor"
Identifier "dummy_monitor"
HorizSync 28.0-80.0
VertRefresh 48.0-75.0
Modeline "1920x1080" 172.80 1920 2040 2248 2576 1080 1081 1084 1118
EndSection
Section "Device"
Identifier "dummy_card"
VideoRam 256000
Driver "dummy"
EndSection
Section "Screen"
Identifier "dummy_screen"
Device "dummy_card"
Monitor "dummy_monitor"
SubSection "Display"
EndSubSection
EndSection

7
pi4/files/etc/audibleprompt.sh Executable file
View File

@ -0,0 +1,7 @@
#!/usr/bin/env bash
play -qnV0 synth 3 pluck D3 pluck A3 pluck D4 pluck F4 pluck A4 delay 0 .1 .2 .3 .4 remix - chorus 0.9 0.9 38 0.75 0.3 0.5 -t &
read -rsp "$*"$'\n' password
echo "$password"
exit 0

12
pi4/files/etc/environment Normal file
View File

@ -0,0 +1,12 @@
#
# This file is parsed by pam_env module
#
# Syntax: simple "KEY=VAL" pairs on separate lines
#
# Accessibility variables
export ACCESSIBILITY_ENABLED=1
export GTK_MODULES=gail:atk-bridge
export GNOME_ACCESSIBILITY=1
export QT_ACCESSIBILITY=1
export QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
export SAL_USE_VCLPLUGIN=gtk3

1
pi4/files/etc/hostname Normal file
View File

@ -0,0 +1 @@
stormux

5
pi4/files/etc/hosts Normal file
View File

@ -0,0 +1,5 @@
# Static table lookup for hostnames.
# See hosts(5) for details.
127.0.0.1 localhost
::1 localhost
127.0.1.1 stormux.localdomain stormux

View File

@ -0,0 +1,37 @@
# Configuration file for Log2Ram (https://github.com/azlux/log2ram) under MIT license.
# This configuration file is read by the log2ram service
# Size for the ram folder, it defines the size the log folder will reserve into the RAM.
# If it's not enough, log2ram will not be able to use ram. Check you /var/log size folder.
# The default is 40M and is basically enough for a lot of applications.
# You will need to increase it if you have a server and a lot of log for example.
SIZE=128M
# This variable can be set to true if you prefer "rsync" rather than "cp".
# I use the command cp -u and rsync -X, so I don't copy the all folder every time for optimization.
# You can choose which one you want. Be sure rsync is installed if you use it.
USE_RSYNC=true
# If there are some errors with available RAM space, a system mail will be send
# Change it to false and you will have only a log if there is no place on RAM anymore.
MAIL=false
# Variable for folders to put in RAM. You need to specify the real folder `/path/folder` , the `/path/hdd.folder` will be automatically created. Multiple path can be separeted by `;`. Do not add the final `/` !
# example : PATH_DISK="/var/log;/home/test/FolderInRam"
PATH_DISK="/var/log"
# **************** Zram backing conf *************************************************
# ZL2R Zram Log 2 Ram enables a zram drive when ZL2R=true ZL2R=false is mem only tmpfs
ZL2R=false
# COMP_ALG this is any compression algorithm listed in /proc/crypto
# lz4 is fastest with lightest load but deflate (zlib) and Zstandard (zstd) give far better compression ratios
# lzo is very close to lz4 and may with some binaries have better optimisation
# COMP_ALG=lz4 for speed or Zstd for compression, lzo or zlib if optimisation or availabilty is a problem
COMP_ALG=lz4
# LOG_DISK_SIZE is the uncompressed disk size. Note zram uses about 0.1% of the size of the disk when not in use
# LOG_DISK_SIZE is expected compression ratio of alg chosen multiplied by log SIZE
# lzo/lz4=2.1:1 compression ratio zlib=2.7:1 zstandard=2.9:1
# Really a guestimate of a bit bigger than compression ratio whilst minimising 0.1% mem usage of disk size
LOG_DISK_SIZE=100M

10
pi4/files/etc/motd Normal file
View File

@ -0,0 +1,10 @@
Welcome to Stormux, powered by Arch Linux ARM
Stormux Website: https://stormux.org
Arch Linux ARM Forum: https://archlinuxarm.org/forum
Stormux IRC: #stormux on irc.stormux.org
Arch Linux ARM IRC: #archlinuxarm on irc.libera.chat
Thank you Stormux supporters! https://ko-fi.com/stormux/leaderboard

6
pi4/files/etc/pam.d/nodm Normal file
View File

@ -0,0 +1,6 @@
#%PAM-1.0
auth include system-local-login
account include system-local-login
password include system-local-login
session include system-local-login

View File

@ -0,0 +1,18 @@
#!/usr/bin/env bash
if [[ "$(tty)" = "/dev/tty1" ]]; then
cat << "EOF"
Hello, and welcome to Stormux!
Let's get you set up. After you press enter, you will be prompted for the sudo password.
When that happens, type the word stormux and press enter.
You will not receive any speech feedback for this process.
That is completely normal, and speech will return after you have typed the password.
Once again, the password is stormux in all lower case letters.
Please press enter to continue.
EOF
read -r
sudo configure-stormux
sudo rm -- "/etc/profile.d/stormux_first_boot.sh"
fi

View File

@ -0,0 +1,3 @@
# Raspberry Pi Information
alias pi-temp='/usr/bin/vcgencmd measure_temp'
alias pi-version='cat /sys/firmware/devicetree/base/model;echo'

View File

@ -0,0 +1,21 @@
memuse() {
ps axo rss,comm,pid \
| awk '{ proc_list[$2] += $1; } END \
{ for (proc in proc_list) { printf("%d\t%s\n", proc_list[proc],proc); }}' \
| sort -n | tail -n 10 | sort -rn \
| awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}'
}
pdf()
{
if [[ $# -ne 1 ]]; then
echo 'Usage: pdf <file>' >&2
else
local dir=$(mktemp -d -p /tmp pdf_conversion.XXXXXX)
local outFile="${1##*/}"
local outFile="${outFile%.*}"
pdftohtml -noframes -i -s "$1" "${dir}/${outFile}.html"
w3m -s "${dir}/${outFile}.html"
fi
}

View File

@ -0,0 +1,24 @@
#
# ~/.bashrc
#
# If not running interactively, don't do anything
[[ $- != *i* ]] && return
#Change directories without using cd
shopt -s autocd
# Keep bash history in screen
export HISTFILE="${HISTFILE}${WINDOW:+.${WINDOW}}"
# load Aliases and functions
[[ -f ".bash_aliases" ]] && source .bash_aliases
[[ -f ".bash_functions" ]] && source .bash_functions
#Invironment variables
PS1='[\u@\h \W] \$ '
export DIALOGOPTS='--no-lines --visit-items'
GPG_TTY=$(tty)
export GPG_TTY
# Don't put commands prefixed with space, or duplicate commands in history
export HISTCONTROL=ignoreboth

View File

@ -0,0 +1,6 @@
# Reload changes with control+x followed by control+r
set echo-control-characters off
# History searching with up and down arrows.
"\e[A": history-search-backward
"\e[B": history-search-forward

View File

@ -0,0 +1,18 @@
vbell off
bell_msg ""
hardstatus off
startup_message off
defscrollback 4096
bind ! select 10
bind @ select 11
bind \# select 12
bind $ select 13
bind % select 14
bind ^ select 15
bind & select 16
bind * select 17
bind ( select 18
bind ) select 19
bind b eval "writebuf" 'exec !!! xclip -selection "clipboard" -i /tmp/screen-exchange'
#termcapinfo xterm|xterms|xs|rxvt ti@:te@
termcapinfo xterm* ti@:te@

View File

@ -0,0 +1 @@
kernel.printk = 3 3 3 3

View File

@ -0,0 +1,47 @@
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 2.1 of the License, or (at your option)
# any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file, or by creating "drop-ins" in
# the journald.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
# Use 'systemd-analyze cat-config systemd/journald.conf' to display the full config.
#
# See journald.conf(5) for details.
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
SystemMaxUse=20M
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=no
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K
#ReadKMsg=yes
#Audit=yes

View File

@ -0,0 +1,2 @@
[Resolve]
DNSSEC=no

View File

@ -0,0 +1,14 @@
[Unit]
Description=Network Time Service
After=network.target nss-lookup.target
Conflicts=systemd-timesyncd.service
[Service]
Type=forking
PrivateTmp=true
ExecStartPre=/usr/bin/ntpd -Ggq
ExecStart=/usr/bin/ntpd -g -u ntp:ntp
Restart=always
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,54 @@
#!/bin/bash
trap 'popd &> /dev/null' EXIT
export SUDO_ASKPASS=/etc/audibleprompt.sh
if [[ ! -d /opt/configure-stormux ]]; then
# Offer to switch fenrir layout.
echo "Would you like to switch Fenrir to laptop layout? (y/n)"
read -r continue
continue="${continue::1}"
if [[ "${continue,}" == "y" ]];then
sed -i 's/=desktop/=laptop/' /etc/fenrirscreenreader/settings/settings.conf
systemctl restart fenrirscreenreader.service
clear
fi
if ! ping -c1 stormux.org &> /dev/null ; then
echo "No internet connection detected. Press enter to open NetworkManager."
echo "Note, it is best to put Fenrir into highlight mode while using NetworkManager."
echo "In desktop layout this is done by pressing Fenrir+numpad asterisk."
echo "That is the key just above numpad 9."
echo "In laptop mode, press Fenrir+y."
echo "In desktop mode the Fenrir key is numpad insert."
echo "In laptop mode the Fenrir key is the Super key, sometimes called the Windows key."
echo "Press enter to continue."
read -r continue
nmtui-connect
fi
# Check for internet connectivity
if ping -qc1 -W 1 stormux.org &> /dev/null; then
echo "Updating the clock to prevent certificate errors..."
# Get current date and time
date_time=$(curl -s http://worldtimeapi.org/api/ip | grep -oP '(?<="datetime":")[^"]*')
echo "Current date and time: $date_time"
# set date and time
date -s "$date_time"
else
echo "Please connect to the internet and run ${0##*/} again."
exit 1
fi
echo "Installing configure-stormux..."
git -C /opt clone -q https://git.stormux.org/storm/configure-stormux || exit 1
fi
echo
echo "Initial setup is complete."
echo
echo "If you would like more options, run configure-stormux,"
echo "or you may configure your system manually."
echo
echo "Thank you for choosing Stormux."
exit 0

View File

@ -0,0 +1,79 @@
state.ALSA {
control.1 {
iface MIXER
name 'PCM Playback Volume'
value -197
comment {
access 'read write'
type INTEGER
count 1
range '-10239 - 400'
dbmin -9999999
dbmax 400
dbvalue.0 -197
}
}
control.2 {
iface MIXER
name 'PCM Playback Switch'
value true
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.3 {
iface MIXER
name 'PCM Playback Route'
value 1
comment {
access 'read write'
type INTEGER
count 1
range '0 - 2'
}
}
control.4 {
iface PCM
name 'IEC958 Playback Default'
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read write'
type IEC958
count 1
}
}
control.5 {
iface PCM
name 'IEC958 Playback Con Mask'
value '0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access read
type IEC958
count 1
}
}
control.6 {
iface PCM
name 'IEC958 Playback PCM Stream'
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read write inactive'
type IEC958
count 1
}
}
}
state.vc4hdmi {
control.1 {
iface PCM
name ELD
value '100008006a10000100000000000000000469fd22415355532056533232380917070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read volatile'
type BYTES
count 128
}
}
}