Compare commits
54 Commits
rpi3
...
68cbe3c0bb
| Author | SHA1 | Date | |
|---|---|---|---|
| 68cbe3c0bb | |||
| a7e28c018f | |||
| 3c5490ea24 | |||
| fffe426d29 | |||
| 45b3c230e1 | |||
| fa9585a0e1 | |||
| 5e144e7955 | |||
| e39c1cedec | |||
| 8a7fb83be3 | |||
| f80ea1e056 | |||
| 696ddd9bfb | |||
| e0806e51da | |||
| 3612787274 | |||
| 41a0592f20 | |||
| 3ebb6f36cf | |||
| c88bd17709 | |||
| c1af07bf18 | |||
| a88a386ef4 | |||
| 034c561a53 | |||
| 2108f02719 | |||
| 06282f5ea8 | |||
| 6bb5267b91 | |||
| b87647756f | |||
| 505028ab44 | |||
| 9657719613 | |||
| 3e4c4d18ee | |||
| 9beea608ed | |||
| 69ca3a957c | |||
| 7c62016063 | |||
| 5d43526e85 | |||
| 749ef52656 | |||
| d0c8b864ae | |||
| 1658a53081 | |||
| 9cc539a6e4 | |||
| 46faab708b | |||
| e620f80b0e | |||
| 134d25682b | |||
| 88d7d12c69 | |||
| 83b7867da4 | |||
| af1642b138 | |||
| 51a0fd0883 | |||
| b22785ab3e | |||
| ef015add0a | |||
| 81d60bb1b3 | |||
| 50d9099231 | |||
| aa4ec62c47 | |||
| 7fb1ba5283 | |||
| 386cb3230e | |||
| 0b10dc426b | |||
| 40fd173777 | |||
| 1e24598316 | |||
| 901d5cdb7a | |||
| 16ae09c86d | |||
| b593494374 |
@@ -1,276 +0,0 @@
|
|||||||
#! /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-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. (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-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.
|
|
||||||
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}"
|
|
||||||
bsdtar -xpf "${imageFileName}" -C /mnt
|
|
||||||
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 \
|
|
||||||
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-firmware \
|
|
||||||
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
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# 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
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
# 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
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
|
|
||||||
auth include system-local-login
|
|
||||||
account include system-local-login
|
|
||||||
password include system-local-login
|
|
||||||
session include system-local-login
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
alias sudo='sudo '
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
# 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
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
[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
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#!/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
|
|
||||||
+152
-111
@@ -1,6 +1,6 @@
|
|||||||
#! /bin/bash
|
#! /bin/bash
|
||||||
#
|
#
|
||||||
# Copyright 2020, Stormux, <storm_dragon@linux-a11y.org>
|
# Copyright 2020, Stormux, <storm_dragon@stormux.org>
|
||||||
#
|
#
|
||||||
# This is free software; you can redistribute it and/or modify it under the
|
# 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
|
# terms of the GNU General Public License as published by the Free
|
||||||
@@ -50,9 +50,8 @@ help() {
|
|||||||
declare -A command=(
|
declare -A command=(
|
||||||
[h]="This help screen."
|
[h]="This help screen."
|
||||||
[l:]="Language default is en_US."
|
[l:]="Language default is en_US."
|
||||||
[n:]="Image name, default is stormux-pi<32|64>-<yyyy-mm-dd>.img"
|
[n:]="Image name, default is stormux-pi4-aarch64-<yyyy-mm-dd>.img"
|
||||||
[s:]="image size in GB, default is 4."
|
[s:]="image size in GB, default is 6."
|
||||||
[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
|
# Convert the keys of the associative array to a format usable by getopts
|
||||||
@@ -75,14 +74,6 @@ while getopts "${args}" i ; do
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
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
|
exit 1
|
||||||
;;
|
;;
|
||||||
@@ -90,11 +81,8 @@ while getopts "${args}" i ; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
# make sure variables are set, or use defaults.
|
# make sure variables are set, or use defaults.
|
||||||
export imageVersion="${imageVersion:-64}"
|
export imageSize="${imageSize:-6G}"
|
||||||
export imageSize="${imageSize:-4G}"
|
imageName="${imageName:-stormux-pi4-aarch64-$(date '+%Y-%m-%d').img}"
|
||||||
imageName="${imageName:-stormux-pi4-${imageVersion}-$(date '+%Y-%m-%d').img}"
|
|
||||||
imageName="${imageName/-64-/-aarch64-}"
|
|
||||||
imageName="${imageName/-32-/-armv7h-}"
|
|
||||||
export imageName
|
export imageName
|
||||||
export imageLanguage="${imageLanguage:-en_US.UTF-8}"
|
export imageLanguage="${imageLanguage:-en_US.UTF-8}"
|
||||||
|
|
||||||
@@ -129,87 +117,142 @@ for i in arch-install-scripts dosfstools parted wget ; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
# Url for the image to be downloaded.
|
# Url for the aarch64 image to be downloaded.
|
||||||
url[32]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-armv7-latest.tar.gz"
|
imageUrl="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz"
|
||||||
url[64]="http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz"
|
|
||||||
|
|
||||||
fallocate -l "$imageSize" "$imageName"
|
fallocate -l "$imageSize" "$imageName"
|
||||||
loopdev="$(losetup --find --show "${imageName}")"
|
loopdev="$(losetup --find --show "${imageName}")"
|
||||||
parted --script "${loopdev}" mklabel msdos mkpart primary fat32 0% 200M mkpart primary ext4 200M 100%
|
parted --script "${loopdev}" mklabel msdos mkpart primary fat32 0% 200M mkpart primary ext4 200M 100%
|
||||||
mkfs.vfat -F32 "${loopdev}p1"
|
mkfs.vfat -F32 -n STRMX_BOOT "${loopdev}p1"
|
||||||
mkfs.ext4 -F "${loopdev}p2"
|
mkfs.ext4 -F -L STRMX_ROOT "${loopdev}p2"
|
||||||
mount "${loopdev}p2" /mnt
|
mount "${loopdev}p2" /mnt
|
||||||
mkdir /mnt/boot
|
mkdir /mnt/boot
|
||||||
mount "${loopdev}p1" /mnt/boot
|
mount "${loopdev}p1" /mnt/boot
|
||||||
# Things are mounted now, so set mounted to 0 (bash true)
|
# Things are mounted now, so set mounted to 0 (bash true)
|
||||||
mounted=0
|
mounted=0
|
||||||
imageFileName=$(mktemp)
|
imageFileName=$(mktemp)
|
||||||
wget "${url[$imageVersion]}" -O "${imageFileName}"
|
wget "${imageUrl}" -O "${imageFileName}"
|
||||||
if [[ $imageVersion -eq 32 ]]; then
|
|
||||||
# Workaround for bsdtar errors when extracting 32 bit image.
|
|
||||||
set +e
|
|
||||||
fi
|
|
||||||
bsdtar -xpf "${imageFileName}" -C /mnt
|
bsdtar -xpf "${imageFileName}" -C /mnt
|
||||||
# Set -e in case it got unset for 32 bit image
|
|
||||||
set -e
|
# Copy override files into place before chroot (except skel to avoid conflicts)
|
||||||
arch-chroot /mnt << EOF
|
cp -rv ../files/boot/* /mnt/boot
|
||||||
|
cp -rv ../files/var/* /mnt/var
|
||||||
|
cp -rv ../files/usr/* /mnt/usr
|
||||||
|
# Copy etc files but exclude skel directory to avoid package conflicts
|
||||||
|
find ../files/etc -mindepth 1 -maxdepth 1 ! -name skel -exec cp -rv {} /mnt/etc/ \;
|
||||||
|
|
||||||
|
PS1="(Chroot) [\u@\h \W] \$" arch-chroot /mnt << EOF
|
||||||
|
echo "Chroot started."
|
||||||
# set up pacman
|
# set up pacman
|
||||||
pacman-key --init
|
pacman-key --init
|
||||||
pacman-key --populate archlinuxarm
|
pacman-key --populate archlinuxarm
|
||||||
pacman -Syy
|
|
||||||
# Change kernels for aarch64
|
# Add stormux repository
|
||||||
if [[ "$imageVersion" == "64" ]]; then
|
echo "Downloading stormux repository key..."
|
||||||
pacman -R --noconfirm linux-aarch64 uboot-raspberrypi
|
curl -s https://packages.stormux.org/stormux_repo.pub > /tmp/stormux_repo.pub
|
||||||
pacman -S --noconfirm linux-rpi
|
echo "Adding key to pacman keyring..."
|
||||||
|
pacman-key --add /tmp/stormux_repo.pub
|
||||||
|
echo "Locally signing key..."
|
||||||
|
pacman-key --lsign-key 52ADA49000F1FF0456F8AEEFB4CDE1CD56EF8E82
|
||||||
|
rm /tmp/stormux_repo.pub
|
||||||
|
# Add repository before core in pacman.conf
|
||||||
|
sed -i '/^\[core\]/i[stormux]\nSigLevel = Required DatabaseOptional\nServer = https://packages.stormux.org/\$arch\n' /etc/pacman.conf
|
||||||
|
|
||||||
|
# Test mirrors and configure based on responsiveness
|
||||||
|
echo "Testing mirror responsiveness..."
|
||||||
|
mirrors=(
|
||||||
|
"mirror.archlinuxarm.org"
|
||||||
|
"fl.us.mirror.archlinuxarm.org"
|
||||||
|
"il.us.mirror.archlinuxarm.org"
|
||||||
|
"tx.us.mirror.archlinuxarm.org"
|
||||||
|
"nj.us.mirror.archlinuxarm.org"
|
||||||
|
)
|
||||||
|
|
||||||
|
working_mirrors=()
|
||||||
|
for mirror in "\${mirrors[@]}"; do
|
||||||
|
echo "Testing \$mirror..."
|
||||||
|
if curl -m 5 -f -s "http://\$mirror/aarch64/core/core.db" > /dev/null 2>&1; then
|
||||||
|
echo " \$mirror: OK"
|
||||||
|
working_mirrors+=("\$mirror")
|
||||||
|
else
|
||||||
|
echo " \$mirror: FAILED"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Create mirrorlist with working mirrors first, then fallback to all mirrors
|
||||||
|
> /etc/pacman.d/mirrorlist
|
||||||
|
if [[ \${#working_mirrors[@]} -gt 0 ]]; then
|
||||||
|
echo "Using \${#working_mirrors[@]} working mirrors"
|
||||||
|
for mirror in "\${working_mirrors[@]}"; do
|
||||||
|
echo "Server = http://\$mirror/\\\$arch/\\\$repo" >> /etc/pacman.d/mirrorlist
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "No mirrors responded, using all mirrors as fallback"
|
||||||
|
for mirror in "\${mirrors[@]}"; do
|
||||||
|
echo "Server = http://\$mirror/\\\$arch/\\\$repo" >> /etc/pacman.d/mirrorlist
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Install packages
|
pacman -Syy
|
||||||
pacman -Su --needed --noconfirm \
|
# Change to the Pi kernel for aarch64
|
||||||
alsa-firmware \
|
pacman -R --noconfirm linux-aarch64 uboot-raspberrypi
|
||||||
alsa-utils \
|
pacman -S --noconfirm linux-rpi
|
||||||
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
|
|
||||||
|
|
||||||
|
# Install all packages (stormux repo has priority since it's listed first)
|
||||||
|
packages=(
|
||||||
|
alsa-firmware
|
||||||
|
alsa-utils
|
||||||
|
base
|
||||||
|
base-devel
|
||||||
|
bash-completion
|
||||||
|
bluez
|
||||||
|
bluez-utils
|
||||||
|
brltty
|
||||||
|
cronie
|
||||||
|
espeak-ng
|
||||||
|
fake-hwclock
|
||||||
|
fenrir
|
||||||
|
firmware-raspberrypi
|
||||||
|
git
|
||||||
|
gstreamer
|
||||||
|
gst-plugins-base
|
||||||
|
gst-plugins-good
|
||||||
|
magic-wormhole
|
||||||
|
man
|
||||||
|
man-pages
|
||||||
|
networkmanager
|
||||||
|
parted
|
||||||
|
pipewire
|
||||||
|
pipewire-alsa
|
||||||
|
pipewire-jack
|
||||||
|
pipewire-pulse
|
||||||
|
poppler
|
||||||
|
python-dbus
|
||||||
|
python-gobject
|
||||||
|
python-pyenchant
|
||||||
|
python-pyte
|
||||||
|
python-pyperclip
|
||||||
|
raspberrypi-utils
|
||||||
|
socat
|
||||||
|
realtime-privileges
|
||||||
|
rhvoice-voice-bdl
|
||||||
|
rng-tools
|
||||||
|
rsync
|
||||||
|
screen
|
||||||
|
sox
|
||||||
|
w3m-git
|
||||||
|
wget
|
||||||
|
wireless-regdb
|
||||||
|
wireplumber
|
||||||
|
xdg-user-dirs
|
||||||
|
xdg-utils
|
||||||
|
yay
|
||||||
|
)
|
||||||
|
|
||||||
|
pacman -Su --needed --noconfirm "\${packages[@]}"
|
||||||
|
|
||||||
|
# Restart gpg agents.
|
||||||
|
gpgconf --kill all
|
||||||
# set the language
|
# set the language
|
||||||
sed -i "s/#$imageLanguage/$imageLanguage/" /etc/locale.gen
|
sed -i "s/#$imageLanguage/$imageLanguage/" /etc/locale.gen
|
||||||
echo "LANG=$imageLanguage" > /etc/locale.conf
|
echo "LANG=$imageLanguage" > /etc/locale.conf
|
||||||
@@ -228,33 +271,18 @@ echo 'stormux ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/wheel
|
|||||||
echo -e "root\nroot" | passwd "root"
|
echo -e "root\nroot" | passwd "root"
|
||||||
# Set the password for the stormux user
|
# Set the password for the stormux user
|
||||||
echo -e "stormux\nstormux" | passwd "stormux"
|
echo -e "stormux\nstormux" | passwd "stormux"
|
||||||
# Change to the stormux user and install some packages
|
|
||||||
|
# Change to the stormux user for user configuration
|
||||||
sudo -iu stormux
|
sudo -iu stormux
|
||||||
|
# suppress git spam about default branch name
|
||||||
|
git config --global init.defaultBranch master
|
||||||
# Create desktop, downloads, music, and other directories.
|
# Create desktop, downloads, music, and other directories.
|
||||||
xdg-user-dirs-update
|
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
|
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.
|
# Enable linger so that hopefully sound will start at login.
|
||||||
mkdir -p /var/lib/systemd/linger
|
mkdir -p /var/lib/systemd/linger
|
||||||
touch /var/lib/systemd/linger/stormux
|
touch /var/lib/systemd/linger/stormux
|
||||||
systemctl --global enable dbus-broker.service pipewire.service pipewire-pulse.service
|
systemctl --global enable pipewire.service pipewire-pulse.service
|
||||||
/usr/share/fenrirscreenreader/tools/configure_pipewire.sh
|
/usr/share/fenrirscreenreader/tools/configure_pipewire.sh
|
||||||
sudo -u stormux /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
|
# Configure sudo for group wheel, remove nopasswd for the stormux user
|
||||||
@@ -262,21 +290,34 @@ echo '%wheel ALL=(ALL) ALL' > /etc/sudoers.d/wheel
|
|||||||
# Set the hostname
|
# Set the hostname
|
||||||
echo stormux > /etc/hostname
|
echo stormux > /etc/hostname
|
||||||
# Configure services
|
# Configure services
|
||||||
systemctl enable brltty.path cronie.service dbus-broker.service fake-hwclock.service fenrirscreenreader.service log2ram.service NetworkManager.service ntpd.service
|
systemctl disable systemd-networkd.service systemd-networkd.socket
|
||||||
systemctl disable dbus.service
|
# Enable services
|
||||||
|
services=(
|
||||||
|
brltty.path
|
||||||
|
cronie.service
|
||||||
|
fake-hwclock.service
|
||||||
|
fenrirscreenreader.service
|
||||||
|
log-to-ram-setup.service
|
||||||
|
log-to-ram-sync.timer
|
||||||
|
log-to-ram-shutdown.service
|
||||||
|
NetworkManager.service
|
||||||
|
)
|
||||||
|
|
||||||
|
for service in "\${services[@]}"; do
|
||||||
|
echo "Enabling \$service..."
|
||||||
|
if systemctl enable "\$service"; then
|
||||||
|
echo " \$service: OK"
|
||||||
|
else
|
||||||
|
echo " \$service: FAILED"
|
||||||
|
fi
|
||||||
|
done
|
||||||
# Cleanup packages
|
# Cleanup packages
|
||||||
|
pacman -Runcds libx11 --noconfirm
|
||||||
pacman -Sc --noconfirm
|
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
|
EOF
|
||||||
|
|
||||||
# Copy override files into place.
|
# Copy skel files to stormux user home (after user rename in chroot)
|
||||||
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/ \;
|
find ../files/etc/skel/ -mindepth 1 -exec cp -rv "{}" /mnt/home/stormux/ \;
|
||||||
|
|
||||||
# Exiting calls the cleanup function to unmount.
|
# Exiting calls the cleanup function to unmount.
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
root=LABEL=STRMX_ROOT rw rootwait console=serial0,115200 console=tty1 fsck.repair=yes
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# Static information about the filesystems.
|
||||||
|
# See fstab(5) for details.
|
||||||
|
|
||||||
|
# <file system> <dir> <type> <options> <dump> <pass>
|
||||||
|
LABEL=STRMX_BOOT /boot vfat defaults 0 1
|
||||||
|
LABEL=STRMX_ROOT / ext4 defaults,noatime 0 1
|
||||||
|
tmpfs /var/log tmpfs defaults,noatime,nosuid,nodev,noexec,mode=0755,size=128M 0 0
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
# 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
|
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
options brcmfmac feature_disable=0x82000
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
|
|
||||||
auth include system-local-login
|
|
||||||
account include system-local-login
|
|
||||||
password include system-local-login
|
|
||||||
session include system-local-login
|
|
||||||
@@ -1,7 +1,54 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
if [[ "$(tty)" = "/dev/tty1" ]]; then
|
if [[ "$(tty)" != "/dev/tty1" ]]; then
|
||||||
cat << "EOF"
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -x /opt/configure-stormux/configure-stormux.sh ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [[ -x /usr/local/bin/configure-stormux ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Volume calibration FIRST
|
||||||
|
echo "Setting up audio volume..."
|
||||||
|
volume=50
|
||||||
|
wait=0
|
||||||
|
|
||||||
|
# Wait for pipewire to become available
|
||||||
|
while [[ $wait -lt 30 ]]; do
|
||||||
|
if pgrep pipewire &> /dev/null ; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
sleep 1
|
||||||
|
((wait++))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Volume calibration - this should be the VERY FIRST interactive part
|
||||||
|
while [[ $volume -le 130 ]]; do
|
||||||
|
clear
|
||||||
|
pactl set-sink-volume @DEFAULT_SINK@ "${volume}%" 2>/dev/null
|
||||||
|
spd-say "If this is loud enough, press enter."
|
||||||
|
if read -t4 ; then
|
||||||
|
echo "Volume set to ${volume}%"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
((volume+=5))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# For audible sudo prompts:
|
||||||
|
unset sudoFlags
|
||||||
|
if [[ -x /etc/audibleprompt.sh ]]; then
|
||||||
|
export SUDO_ASKPASS=/etc/audibleprompt.sh
|
||||||
|
export sudoFlags=("-A")
|
||||||
|
fi
|
||||||
|
|
||||||
|
clear
|
||||||
|
cat << "EOF"
|
||||||
Hello, and welcome to Stormux!
|
Hello, and welcome to Stormux!
|
||||||
|
|
||||||
Let's get you set up. After you press enter, you will be prompted for the sudo password.
|
Let's get you set up. After you press enter, you will be prompted for the sudo password.
|
||||||
@@ -12,7 +59,5 @@ Once again, the password is stormux in all lower case letters.
|
|||||||
|
|
||||||
Please press enter to continue.
|
Please press enter to continue.
|
||||||
EOF
|
EOF
|
||||||
read -r
|
read -r
|
||||||
sudo configure-stormux
|
sudo "${sudoFlags[@]}" configure-stormux
|
||||||
sudo rm -- "/etc/profile.d/stormux_first_boot.sh"
|
|
||||||
fi
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
# Raspberry Pi Information
|
# Raspberry Pi Information
|
||||||
alias pi-temp='/usr/bin/vcgencmd measure_temp'
|
alias pi-temp='/usr/bin/vcgencmd measure_temp'
|
||||||
alias pi-version='cat /sys/firmware/devicetree/base/model;echo'
|
alias pi-version='cat /sys/firmware/devicetree/base/model;echo'
|
||||||
|
alias pi-ip='ip a | grep -v "127.0.0.1" | grep -E -o "([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}"'
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
# 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
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[Journal]
|
||||||
|
Storage=volatile
|
||||||
|
SystemMaxUse=20M
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Setup RAM logging and restore logs from disk
|
||||||
|
DefaultDependencies=false
|
||||||
|
After=local-fs.target
|
||||||
|
Before=sysinit.target
|
||||||
|
RequiresMountsFor=/var
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStartPre=/bin/mkdir -p /var/log.hdd
|
||||||
|
ExecStartPre=/bin/sh -c 'if [ -d /var/log.hdd ] && [ "$(ls -A /var/log.hdd 2>/dev/null)" ]; then cp -au /var/log.hdd/* /var/log/ 2>/dev/null || true; fi'
|
||||||
|
ExecStart=/bin/true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=sysinit.target
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Sync logs to disk before shutdown
|
||||||
|
DefaultDependencies=false
|
||||||
|
Before=shutdown.target reboot.target halt.target
|
||||||
|
Conflicts=shutdown.target reboot.target halt.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=true
|
||||||
|
ExecStart=/bin/sh -c 'rsync -aXv --delete --exclude="*.hdd" /var/log/ /var/log.hdd/ 2>/dev/null || true'
|
||||||
|
TimeoutStopSec=30
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=shutdown.target reboot.target halt.target
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Sync logs from RAM to disk
|
||||||
|
After=local-fs.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStartPre=/bin/mkdir -p /var/log.hdd
|
||||||
|
ExecStart=/bin/sh -c 'rsync -aXv --delete --exclude="*.hdd" /var/log/ /var/log.hdd/ 2>/dev/null || true'
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Sync logs from RAM to disk every hour
|
||||||
|
Requires=log-to-ram-sync.service
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnBootSec=15min
|
||||||
|
OnUnitActiveSec=1h
|
||||||
|
Persistent=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Update system time from worldtimeapi.org
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/local/bin/sync_time.sh
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# This is the fallback vconsole configuration provided by systemd.
|
||||||
|
|
||||||
|
KEYMAP=us_alt
|
||||||
Executable
+103
@@ -0,0 +1,103 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Renames a user
|
||||||
|
# Required arguments: old user name, new user name
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
question() {
|
||||||
|
echo
|
||||||
|
echo "$@"
|
||||||
|
read -r answer
|
||||||
|
answer="${answer:0:1}"
|
||||||
|
answer="${answer^}"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ $# -ne 2 ]]; then
|
||||||
|
echo "Usage: $0 old-user new-user"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
oldUser="$1"
|
||||||
|
newUser="$2"
|
||||||
|
|
||||||
|
# Make sure old user exists
|
||||||
|
if ! id "$oldUser" >/dev/null 2>&1; then
|
||||||
|
echo "The user $oldUser does not exist."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure old user is not logged in
|
||||||
|
if pgrep -u "$oldUser" >/dev/null; then
|
||||||
|
echo "The user $oldUser is currently logged in or has running processes. Cannot continue."
|
||||||
|
question "Would you like to forcibly log out $oldUser? (Y/N)"
|
||||||
|
if [[ "$answer" != "Y" ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
systemctl stop display-manager
|
||||||
|
loginctl terminate-user "$oldUser"
|
||||||
|
sleep 2
|
||||||
|
if pgrep -u "$oldUser" >/dev/null; then
|
||||||
|
echo "The user $oldUser still has running processes after termination. Cannot continue."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure new user does not exist
|
||||||
|
if id "$newUser" >/dev/null 2>&1; then
|
||||||
|
echo "The user name $newUser is already taken."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure the new name is acceptable
|
||||||
|
if ! [[ "$newUser" =~ ^[a-z_][a-z0-9_-]{0,31}$ ]]; then
|
||||||
|
echo "$newUser is not an acceptable user name."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Passed all safety checks, proceed with the rename
|
||||||
|
echo "Renaming $oldUser to $newUser..."
|
||||||
|
groups=$(id -nG "$oldUser")
|
||||||
|
groups="${groups// /,}"
|
||||||
|
usermod -G "$groups" -m -d "/home/$newUser" -l "$newUser" "$oldUser"
|
||||||
|
|
||||||
|
# Update nodm.conf if it exists
|
||||||
|
if [[ -e /etc/nodm.conf ]]; then
|
||||||
|
echo "Updating /etc/nodm.conf..."
|
||||||
|
sed -i -e "s#^NODM_USER=.*#NODM_USER='$newUser'#" -e "s#^NODM_XSESSION=.*#NODM_XSESSION='/home/$newUser/.xinitrc'#" /etc/nodm.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Copy over crontab if it exists
|
||||||
|
if crontab -u "$oldUser" -l >/tmp/${oldUser}_crontab.bak 2>/dev/null; then
|
||||||
|
echo "Copying over crontab..."
|
||||||
|
if crontab -u "$newUser" "/tmp/${oldUser}_crontab.bak"; then
|
||||||
|
rm "/tmp/${oldUser}_crontab.bak"
|
||||||
|
else
|
||||||
|
echo "Warning: failed to restore crontab for $newUser."
|
||||||
|
rm "/tmp/${oldUser}_crontab.bak"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update linger
|
||||||
|
if [[ -e "/var/lib/systemd/linger/$oldUser" ]]; then
|
||||||
|
echo "Enabling linger..."
|
||||||
|
mv "/var/lib/systemd/linger/$oldUser" "/var/lib/systemd/linger/$newUser"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Optionally update files in new home directory
|
||||||
|
echo
|
||||||
|
echo "Would you like to search for references to $oldUser and update them to $newUser in files located in /home/$newUser?"
|
||||||
|
question "This can take a while. (Y/N)"
|
||||||
|
if [[ "$answer" == "Y" ]]; then
|
||||||
|
echo "Updating files..."
|
||||||
|
find "/home/$newUser" -type f -exec grep -Iq . "{}" \; -and -exec sed -i "s|$oldUser|$newUser|g" "{}" \;
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Rename complete. The user, $newUser, is now available."
|
||||||
|
question "Would you like to reboot?"
|
||||||
|
if [[ "${answer}" == "Y" ]]; then
|
||||||
|
reboot
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -1,54 +1,141 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
trap 'popd &> /dev/null' EXIT
|
# For audible sudo prompts:
|
||||||
|
unset sudoFlags
|
||||||
|
if [[ -x /etc/audibleprompt.sh ]]; then
|
||||||
|
export SUDO_ASKPASS=/etc/audibleprompt.sh
|
||||||
|
export sudoFlags=("-A")
|
||||||
|
fi
|
||||||
|
|
||||||
export SUDO_ASKPASS=/etc/audibleprompt.sh
|
trap cleanup EXIT
|
||||||
if [[ ! -d /opt/configure-stormux ]]; then
|
cleanup() {
|
||||||
# Offer to switch fenrir layout.
|
popd &> /dev/null
|
||||||
echo "Would you like to switch Fenrir to laptop layout? (y/n)"
|
if ! [[ -x /opt/configure-stormux/configure-stormux.sh ]]; then
|
||||||
|
echo "Initial setup is not complete."
|
||||||
|
echo "To continue setup, please run:"
|
||||||
|
echo "sudo configure-stormux"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if [[ -x /opt/configure-stormux/configure-stormux.sh ]]; then
|
||||||
|
pushd /opt/configure-stormux
|
||||||
|
./configure-stormux.sh
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Volume calibration is now handled in stormux_first_boot.sh
|
||||||
|
|
||||||
|
export DIALOGOPTS='--insecure --no-lines --visit-items'
|
||||||
|
|
||||||
|
set_timezone() {
|
||||||
|
# Get the list of timezones
|
||||||
|
mapfile -t regions < <(timedatectl --no-pager list-timezones | cut -d '/' -f1 | sort -u)
|
||||||
|
|
||||||
|
# Use the same text twice here and just hide the tag field.
|
||||||
|
region=$(dialog --backtitle "Please select your Region" \
|
||||||
|
--no-tags \
|
||||||
|
--menu "Use up and down arrows or page-up and page-down to navigate the list, and press 'Enter' to make your selection." 0 0 0 \
|
||||||
|
$(for i in ${regions[@]} ; do echo "$i";echo "$i";done) --stdout)
|
||||||
|
|
||||||
|
|
||||||
|
mapfile -t cities < <(timedatectl --no-pager list-timezones | grep "$region" | cut -d '/' -f2 | sort -u)
|
||||||
|
|
||||||
|
# Use the same text twice here and just hide the tag field.
|
||||||
|
city=$(dialog --backtitle "Please select a city near you" \
|
||||||
|
--no-tags \
|
||||||
|
--menu "Use up and down arrow or page-up and page-down to navigate the list." 0 0 10 \
|
||||||
|
$(for i in ${cities[@]} ; do echo "$i";echo "$i";done) --stdout)
|
||||||
|
|
||||||
|
# Set the timezone
|
||||||
|
if [[ -f /etc/localtime ]]; then
|
||||||
|
rm /etc/localtime
|
||||||
|
fi
|
||||||
|
ln -sf /usr/share/zoneinfo/${region}/${city} /etc/localtime
|
||||||
|
timedatectl set-ntp true
|
||||||
|
}
|
||||||
|
# Offer to switch fenrir layout.
|
||||||
|
echo "Would you like to switch Fenrir to laptop layout?"
|
||||||
|
echo "Press y for yes or n for no followed by enter."
|
||||||
|
read -r continue
|
||||||
|
continue="${continue::1}"
|
||||||
|
if [[ "${continue,}" == "y" ]];then
|
||||||
|
sed -i 's/=desktop/=laptop/' /etc/fenrirscreenreader/settings/settings.conf
|
||||||
|
clear
|
||||||
|
systemctl restart fenrirscreenreader.service
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for possible resize
|
||||||
|
diskSource="$(df --output='source' / | tail -1)"
|
||||||
|
diskSize="$(df -h --output='size' / | tail -1 | tr -cd '[:digit:].')"
|
||||||
|
diskSize=${diskSize%.*}
|
||||||
|
if [[ $diskSize -le 7 ]]; then
|
||||||
|
echo "$diskSource is only $diskSize gigs, which means it probably needs to be resized. Would you like to do this now?"
|
||||||
|
echo "Press y for yes or n for no followed by enter."
|
||||||
read -r continue
|
read -r continue
|
||||||
continue="${continue::1}"
|
continue="${continue::1}"
|
||||||
if [[ "${continue,}" == "y" ]];then
|
if [[ "${continue,}" == "y" ]];then
|
||||||
sed -i 's/=desktop/=laptop/' /etc/fenrirscreenreader/settings/settings.conf
|
# Extract base device name (handles mmcblk0p2, nvme0n1p2, sda2, etc.)
|
||||||
systemctl restart fenrirscreenreader.service
|
if [[ "$diskSource" =~ (.*[0-9]+)p[0-9]+$ ]]; then
|
||||||
clear
|
# Handle mmcblk0p2, nvme0n1p2 style
|
||||||
|
diskDevice="${BASH_REMATCH[1]}"
|
||||||
|
else
|
||||||
|
# Handle sda2, sdb3 style
|
||||||
|
diskDevice="$(echo "$diskSource" | sed 's/[0-9]*$//')"
|
||||||
|
fi
|
||||||
|
echo "Yes" | sudo "${sudoFlags[@]}" parted ---pretend-input-tty "$diskDevice" resizepart 2 100%
|
||||||
|
sudo "${sudoFlags[@]}" resize2fs -f "$diskSource"
|
||||||
fi
|
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
|
fi
|
||||||
|
|
||||||
|
if ! ping -c1 stormux.org &> /dev/null ; then
|
||||||
|
echo "No internet connection detected. Press enter to open NetworkManager."
|
||||||
|
read -r continue
|
||||||
|
echo "setting set focus#highlight=True" | socat - UNIX-CLIENT:/tmp/fenrirscreenreader-deamon.sock
|
||||||
|
nmtui-connect
|
||||||
|
echo "setting set focus#highlight=False" | socat - UNIX-CLIENT:/tmp/fenrirscreenreader-deamon.sock
|
||||||
|
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"
|
||||||
|
echo "If your Pi does not have a CMOS battery and is powered off regularly, it may take a while for the time to be set correctly after boot."
|
||||||
|
echo "Stormux provides a service to sync the time after internet connection is established."
|
||||||
|
read -rp "Would you like the time to sync as soon as the Pi connects to the internet? " answer
|
||||||
|
answer="${answer:0:1}"
|
||||||
|
if [[ "${answer,,}" == "y" ]]; then
|
||||||
|
systemctl enable time_sync_at_boot.service
|
||||||
|
else
|
||||||
|
echo "Time sync at boot skipped."
|
||||||
|
echo "If you change your mind later, simply type:"
|
||||||
|
echo "sudo systemctl enable time_sync_at_boot.service"
|
||||||
|
fi
|
||||||
|
set_timezone
|
||||||
|
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
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "Initial setup is complete."
|
echo "Initial setup is complete."
|
||||||
echo
|
echo
|
||||||
echo "If you would like more options, run configure-stormux,"
|
echo "The default passwords are stormux for the stormux user"
|
||||||
|
echo "and root for the root user. It is highly recommended to change them."
|
||||||
|
echo "To change the password for stormux, run:"
|
||||||
|
echo "passwd"
|
||||||
|
echo "To change the password for root, run:"
|
||||||
|
echo "sudo passwd"
|
||||||
|
echo
|
||||||
|
echo "For more configuration options, run configure-stormux,"
|
||||||
echo "or you may configure your system manually."
|
echo "or you may configure your system manually."
|
||||||
echo
|
echo
|
||||||
echo "Thank you for choosing Stormux."
|
echo "Thank you for choosing Stormux."
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
Executable
+4
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
date_time=$(curl -s http://worldtimeapi.org/api/ip | grep -oP '(?<="datetime":")[^"]*')
|
||||||
|
date -s "$date_time"
|
||||||
Binary file not shown.
@@ -0,0 +1,15 @@
|
|||||||
|
# x86_64 ISO build artifacts
|
||||||
|
out/
|
||||||
|
work/
|
||||||
|
logs/
|
||||||
|
|
||||||
|
# Build outputs
|
||||||
|
*.iso
|
||||||
|
*.iso.sig
|
||||||
|
*.sha256
|
||||||
|
|
||||||
|
# Documentation (not tracked)
|
||||||
|
*.md
|
||||||
|
|
||||||
|
# User-specific
|
||||||
|
.claude/
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Fenrir console audio support
|
||||||
|
# Prevents bluetooth disconnection when switching TTY
|
||||||
|
|
||||||
|
monitor.bluez.properties = {
|
||||||
|
# Disable logind integration to prevent bluetooth device suspension on TTY switch
|
||||||
|
bluez5.enable-sbc-xq = true
|
||||||
|
bluez5.enable-msbc = true
|
||||||
|
bluez5.enable-hw-volume = true
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor.bluez.rules = [
|
||||||
|
{
|
||||||
|
matches = [
|
||||||
|
{
|
||||||
|
device.name = "~bluez_card.*"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
actions = {
|
||||||
|
update-props = {
|
||||||
|
session.suspend-timeout-seconds = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Fenrir console audio support
|
||||||
|
# Adds secondary socket for console applications like Fenrir
|
||||||
|
|
||||||
|
pulse.properties = {
|
||||||
|
# the addresses this server listens on
|
||||||
|
server.address = [
|
||||||
|
"unix:native"
|
||||||
|
"unix:/tmp/pulse.sock" # console access socket
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# client/stream specific properties
|
||||||
|
pulse.rules = [
|
||||||
|
{
|
||||||
|
# speech dispatcher asks for too small latency and then underruns.
|
||||||
|
matches = [ { application.name = "~speech-dispatcher*" } ]
|
||||||
|
actions = {
|
||||||
|
update-props = {
|
||||||
|
pulse.min.req = 1024/48000 # 21ms
|
||||||
|
pulse.min.quantum = 1024/48000 # 21ms
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# Fenrir console audio support
|
||||||
|
# Prevents audio device suspension when switching to TTY console
|
||||||
|
|
||||||
|
monitor.alsa.rules = [
|
||||||
|
{
|
||||||
|
matches = [
|
||||||
|
{
|
||||||
|
device.name = "~alsa_card.*"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
actions = {
|
||||||
|
update-props = {
|
||||||
|
api.alsa.use-acp = true
|
||||||
|
api.acp.auto-profile = false
|
||||||
|
api.acp.auto-port = false
|
||||||
|
session.suspend-timeout-seconds = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
matches = [
|
||||||
|
{
|
||||||
|
node.name = "~alsa_input.*"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
node.name = "~alsa_output.*"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
actions = {
|
||||||
|
update-props = {
|
||||||
|
session.suspend-timeout-seconds = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# Static information about the filesystems.
|
||||||
|
# See fstab(5) for details.
|
||||||
|
|
||||||
|
# <file system> <dir> <type> <options> <dump> <pass>
|
||||||
|
# Live ISO - root filesystem is handled by archiso, only tmpfs mounts needed
|
||||||
|
tmpfs /var/log tmpfs defaults,noatime,nosuid,nodev,noexec,mode=0755,size=128M 0 0
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
HOOKS=(base udev microcode modconf kms memdisk archiso archiso_loop_mnt archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs block filesystems keyboard)
|
||||||
|
COMPRESSION="xz"
|
||||||
|
COMPRESSION_OPTIONS=(-9e)
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# mkinitcpio preset file for the 'linux' package on archiso
|
||||||
|
|
||||||
|
PRESETS=('archiso')
|
||||||
|
|
||||||
|
ALL_kver='/boot/vmlinuz-linux'
|
||||||
|
archiso_config='/etc/mkinitcpio.conf.d/archiso.conf'
|
||||||
|
|
||||||
|
archiso_image="/boot/initramfs-linux.img"
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
#
|
||||||
|
# /etc/pacman.conf
|
||||||
|
#
|
||||||
|
# See the pacman.conf(5) manpage for option and repository directives
|
||||||
|
|
||||||
|
#
|
||||||
|
# GENERAL OPTIONS
|
||||||
|
#
|
||||||
|
[options]
|
||||||
|
# The following paths are commented out with their default values listed.
|
||||||
|
# If you wish to use different paths, uncomment and update the paths.
|
||||||
|
#RootDir = /
|
||||||
|
#DBPath = /var/lib/pacman/
|
||||||
|
#CacheDir = /var/cache/pacman/pkg/
|
||||||
|
#LogFile = /var/log/pacman.log
|
||||||
|
#GPGDir = /etc/pacman.d/gnupg/
|
||||||
|
#HookDir = /etc/pacman.d/hooks/
|
||||||
|
HoldPkg = pacman glibc
|
||||||
|
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
|
||||||
|
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
|
||||||
|
#CleanMethod = KeepInstalled
|
||||||
|
Architecture = auto
|
||||||
|
|
||||||
|
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
|
||||||
|
#IgnorePkg =
|
||||||
|
#IgnoreGroup =
|
||||||
|
|
||||||
|
#NoUpgrade =
|
||||||
|
#NoExtract =
|
||||||
|
|
||||||
|
# Misc options
|
||||||
|
#UseSyslog
|
||||||
|
#Color
|
||||||
|
#NoProgressBar
|
||||||
|
# We cannot check disk space from within a chroot environment
|
||||||
|
#CheckSpace
|
||||||
|
#VerbosePkgLists
|
||||||
|
ParallelDownloads = 5
|
||||||
|
#DownloadUser = alpm
|
||||||
|
#DisableSandbox
|
||||||
|
|
||||||
|
# By default, pacman accepts packages signed by keys that its local keyring
|
||||||
|
# trusts (see pacman-key and its man page), as well as unsigned packages.
|
||||||
|
SigLevel = Required DatabaseOptional
|
||||||
|
LocalFileSigLevel = Optional
|
||||||
|
#RemoteFileSigLevel = Required
|
||||||
|
|
||||||
|
# NOTE: You must run `pacman-key --init` before first using pacman; the local
|
||||||
|
# keyring can then be populated with the keys of all official Arch Linux
|
||||||
|
# packagers with `pacman-key --populate archlinux`.
|
||||||
|
|
||||||
|
#
|
||||||
|
# REPOSITORIES
|
||||||
|
# - can be defined here or included from another file
|
||||||
|
# - pacman will search repositories in the order defined here
|
||||||
|
# - local/custom mirrors can be added here or in separate files
|
||||||
|
# - repositories listed first will take precedence when packages
|
||||||
|
# have identical names, regardless of version number
|
||||||
|
# - URLs will have $repo replaced by the name of the current repo
|
||||||
|
# - URLs will have $arch replaced by the name of the architecture
|
||||||
|
#
|
||||||
|
# Repository entries are of the format:
|
||||||
|
# [repo-name]
|
||||||
|
# Server = ServerName
|
||||||
|
# Include = IncludePath
|
||||||
|
#
|
||||||
|
# The header [repo-name] is crucial - it must be present and
|
||||||
|
# uncommented to enable the repo.
|
||||||
|
#
|
||||||
|
|
||||||
|
# The testing repositories are disabled by default. To enable, uncomment the
|
||||||
|
# repo name header and Include lines. You can add preferred servers immediately
|
||||||
|
# after the header, and they will be used before the default mirrors.
|
||||||
|
|
||||||
|
#[core-testing]
|
||||||
|
#Include = /etc/pacman.d/mirrorlist
|
||||||
|
|
||||||
|
[stormux]
|
||||||
|
SigLevel = Required DatabaseOptional
|
||||||
|
Server = https://packages.stormux.org/$arch
|
||||||
|
|
||||||
|
[core]
|
||||||
|
Include = /etc/pacman.d/mirrorlist
|
||||||
|
|
||||||
|
#[extra-testing]
|
||||||
|
#Include = /etc/pacman.d/mirrorlist
|
||||||
|
|
||||||
|
[extra]
|
||||||
|
Include = /etc/pacman.d/mirrorlist
|
||||||
|
|
||||||
|
# If you want to run 32 bit applications on your x86_64 system,
|
||||||
|
# enable the multilib repositories as required here.
|
||||||
|
|
||||||
|
#[multilib-testing]
|
||||||
|
#Include = /etc/pacman.d/mirrorlist
|
||||||
|
|
||||||
|
#[multilib]
|
||||||
|
#Include = /etc/pacman.d/mirrorlist
|
||||||
|
|
||||||
|
# An example of a custom package repository. See the pacman manpage for
|
||||||
|
# tips on creating your own repositories.
|
||||||
|
#[custom]
|
||||||
|
#SigLevel = Optional TrustAll
|
||||||
|
#Server = file:///home/custompkgs
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[Trigger]
|
||||||
|
Operation = Install
|
||||||
|
Operation = Upgrade
|
||||||
|
Type = Package
|
||||||
|
Target = *
|
||||||
|
|
||||||
|
[Action]
|
||||||
|
Description = Adding Stormux repository key...
|
||||||
|
When = PreTransaction
|
||||||
|
Exec = /bin/sh -c 'if [ ! -f /etc/pacman.d/.stormux-key-added ]; then pacman-key --add /usr/share/stormux/stormux_repo.pub && pacman-key --lsign-key 52ADA49000F1FF0456F8AEEFB4CDE1CD56EF8E82 && touch /etc/pacman.d/.stormux-key-added; fi'
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# remove from airootfs!
|
||||||
|
# Stormux system setup hook - creates user, configures services
|
||||||
|
|
||||||
|
[Trigger]
|
||||||
|
Operation = Install
|
||||||
|
Operation = Upgrade
|
||||||
|
Type = Package
|
||||||
|
Target = filesystem
|
||||||
|
|
||||||
|
[Action]
|
||||||
|
Description = Setting up Stormux user and system configuration...
|
||||||
|
When = PostTransaction
|
||||||
|
Depends = shadow
|
||||||
|
Depends = systemd
|
||||||
|
Depends = sudo
|
||||||
|
Exec = /usr/local/bin/stormux-setup.sh
|
||||||
@@ -0,0 +1,961 @@
|
|||||||
|
##
|
||||||
|
## Arch Linux repository mirrorlist
|
||||||
|
## Generated on 2025-10-21
|
||||||
|
##
|
||||||
|
|
||||||
|
## Worldwide
|
||||||
|
Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch
|
||||||
|
Server = https://mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://fastly.mirror.pkgbuild.com/$repo/os/$arch
|
||||||
|
#Server = https://ftpmirror.infania.net/mirror/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Albania
|
||||||
|
#Server = https://al.arch.niranjan.co/$repo/os/$arch
|
||||||
|
|
||||||
|
## Armenia
|
||||||
|
#Server = http://mirrors.teamcloud.am/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.teamcloud.am/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Australia
|
||||||
|
#Server = https://mirror.aarnet.edu.au/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://au.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://au.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.mirror.digitalpacific.com.au/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.mirror.digitalpacific.com.au/$repo/os/$arch
|
||||||
|
#Server = http://gsl-syd.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://gsl-syd.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://sydney.mirror.pkgbuild.com/$repo/os/$arch
|
||||||
|
#Server = http://ftp.iinet.net.au/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.internode.on.net/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://au.arch.niranjan.co/$repo/os/$arch
|
||||||
|
#Server = http://syd.mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://syd.mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.swin.edu.au/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Austria
|
||||||
|
#Server = http://mirror.alwyzon.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.alwyzon.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://at.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://at.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.digitalnova.at/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.easyname.at/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://at.arch.mirror.kescher.at/$repo/os/$arch
|
||||||
|
#Server = https://at.arch.niranjan.co/$repo/os/$arch
|
||||||
|
#Server = https://at-vie.soulharsh007.dev/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Azerbaijan
|
||||||
|
#Server = http://mirror.ourhost.az/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.ourhost.az/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.yer.az/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.yer.az/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Bangladesh
|
||||||
|
#Server = http://mirror.limda.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.limda.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.xeonbd.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.xeonbd.com/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Belarus
|
||||||
|
#Server = http://ftp.byfly.by/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.datacenter.by/pub/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Belgium
|
||||||
|
#Server = http://mirror.1ago.be/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.1ago.be/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.jonas-prz.be/$repo/os/$arch
|
||||||
|
#Server = https://mirror.jonas-prz.be/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.mirror-services.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.tiguinet.net/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.tiguinet.net/arch/$repo/os/$arch
|
||||||
|
|
||||||
|
## Brazil
|
||||||
|
#Server = http://archlinux.c3sl.ufpr.br/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.c3sl.ufpr.br/$repo/os/$arch
|
||||||
|
#Server = http://br.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://br.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.ufscar.br/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.ufscar.br/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.ic.unicamp.br/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.ic.unicamp.br/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Bulgaria
|
||||||
|
#Server = http://mirror.host.ag/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.telepoint.bg/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.telepoint.bg/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.uni-plovdiv.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.uni-plovdiv.net/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
|
||||||
|
## Canada
|
||||||
|
#Server = http://mirror.0xem.ma/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.0xem.ma/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.acadielinux.ca/mirror/arch/$repo/os/$arch
|
||||||
|
#Server = https://arch.mirror.winslow.cloud/$repo/os/$arch
|
||||||
|
#Server = http://ca.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ca.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.cpsc.ucalgary.ca/mirror/archlinux.org/$repo/os/$arch
|
||||||
|
#Server = https://mirror.cpsc.ucalgary.ca/mirror/archlinux.org/$repo/os/$arch
|
||||||
|
#Server = http://mirror.csclub.uwaterloo.ca/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.csclub.uwaterloo.ca/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror2.evolution-host.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror2.evolution-host.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://stygian.failzero.net/mirror/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.franscorack.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.its.dal.ca/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.quantum5.ca/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.quantum5.ca/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://muug.ca/mirror/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://muug.ca/mirror/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.pablonara.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.pablonara.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://upstream-1.pablonara.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.mirror.rafal.ca/$repo/os/$arch
|
||||||
|
#Server = http://mirror.scd31.com/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.scd31.com/arch/$repo/os/$arch
|
||||||
|
#Server = http://mirror.xenyth.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.xenyth.net/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Chile
|
||||||
|
#Server = http://mirror.anquan.cl/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.anquan.cl/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://elmirror.cl/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://elmirror.cl/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.hnd.cl/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.hnd.cl/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## China
|
||||||
|
#Server = http://mirrors.163.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.aliyun.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.aliyun.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.bfsu.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.bfsu.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.cqu.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.cqu.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.hit.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.hit.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.hust.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.hust.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.jlu.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.jlu.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.jxust.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.jxust.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.lzu.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.neusoft.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.neusoft.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.nju.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.nju.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.nyist.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.nyist.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.sjtug.sjtu.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.wsyu.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.wsyu.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.xjtu.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.zju.edu.cn/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Colombia
|
||||||
|
#Server = http://mirrors.atlas.net.co/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.atlas.net.co/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://edgeuno-bog2.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://edgeuno-bog2.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.udenar.edu.co/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Croatia
|
||||||
|
#Server = http://archlinux.iskon.hr/$repo/os/$arch
|
||||||
|
|
||||||
|
## Czechia
|
||||||
|
#Server = http://mirror.dkm.cz/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.dkm.cz/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.fi.muni.cz/pub/linux/arch/$repo/os/$arch
|
||||||
|
#Server = http://ftp.linux.cz/pub/linux/arch/$repo/os/$arch
|
||||||
|
#Server = https://europe.mirror.pkgbuild.com/$repo/os/$arch
|
||||||
|
#Server = http://gluttony.sin.cvut.cz/arch/$repo/os/$arch
|
||||||
|
#Server = https://gluttony.sin.cvut.cz/arch/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.nic.cz/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.sh.cvut.cz/arch/$repo/os/$arch
|
||||||
|
#Server = https://ftp.sh.cvut.cz/arch/$repo/os/$arch
|
||||||
|
#Server = http://mirror.vpsfree.cz/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Denmark
|
||||||
|
#Server = http://mirrors.dotsrc.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.dotsrc.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.group.one/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.group.one/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.it-privat.dk/arch/$repo/os/$arch
|
||||||
|
|
||||||
|
## Ecuador
|
||||||
|
#Server = http://mirror.cedia.org.ec/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.linux.ec/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Estonia
|
||||||
|
#Server = http://mirror.cspacehostings.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.cspacehostings.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://repo.br.ee/arch/$repo/os/$arch
|
||||||
|
#Server = https://repo.br.ee/arch/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.xtom.ee/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.xtom.ee/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Finland
|
||||||
|
#Server = https://archlinux.doridian.net/$repo/os/$arch
|
||||||
|
#Server = http://cdnmirror.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://cdnmirror.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.mirror.far.fi/$repo/os/$arch
|
||||||
|
#Server = http://mirror.5i.fi/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.5i.fi/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://fi.arch.niranjan.co/$repo/os/$arch
|
||||||
|
#Server = https://mirror1.sl-chat.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.srv.fail/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.wuki.li/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.wuki.li/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.yhtez.xyz/$repo/os/$arch
|
||||||
|
#Server = https://arch.yhtez.xyz/$repo/os/$arch
|
||||||
|
|
||||||
|
## France
|
||||||
|
#Server = http://mirror.archlinux.ikoula.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://elda.asgardius.company/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.bakertelekom.fr/Arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.bakertelekom.fr/Arch/$repo/os/$arch
|
||||||
|
#Server = http://fr.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://fr.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.cyberbits.eu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.cyberbits.eu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.datagr.am/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.eric.ovh/arch/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.gandi.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.gandi.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archmirror.hogwarts.fr/$repo/os/$arch
|
||||||
|
#Server = https://archmirror.hogwarts.fr/$repo/os/$arch
|
||||||
|
#Server = http://mirror.its-tps.fr/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.its-tps.fr/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.jtremesay.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.lastmikoi.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.mailtunnel.eu/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.mailtunnel.eu/$repo/os/$arch
|
||||||
|
#Server = http://f.matthieul.dev/mirror/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://f.matthieul.dev/mirror/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mir.archlinux.fr/$repo/os/$arch
|
||||||
|
#Server = http://mirror.oldsql.cc/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.oldsql.cc/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.mirrors.ovh.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.mirrors.ovh.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.peeres-telecom.fr/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.peeres-telecom.fr/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.rznet.fr/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.rznet.fr/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.smayzy.ovh/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.syxpi.fr/arch/$repo/os/$arch
|
||||||
|
#Server = https://arch.syxpi.fr/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.thekinrar.fr/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.theo546.fr/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.theo546.fr/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.trap.moe/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.trap.moe/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.u-strasbg.fr/linux/distributions/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.wormhole.eu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.yourlabs.org/$repo/os/$arch
|
||||||
|
#Server = https://arch.yourlabs.org/$repo/os/$arch
|
||||||
|
|
||||||
|
## Georgia
|
||||||
|
#Server = http://archlinux.grena.ge/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.grena.ge/$repo/os/$arch
|
||||||
|
|
||||||
|
## Germany
|
||||||
|
#Server = http://mirror.23m.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.23m.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.agdsn.de/pub/mirrors/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.agdsn.de/pub/mirrors/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.aminvakil.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.aminvakil.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://artfiles.org/archlinux.org/$repo/os/$arch
|
||||||
|
#Server = https://mirror.bethselamin.de/$repo/os/$arch
|
||||||
|
#Server = https://de.repo.c48.uk/arch/$repo/os/$arch
|
||||||
|
#Server = http://de.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://de.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.clientvps.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.clientvps.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.cmt.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.cmt.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://os.codefionn.eu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://os.codefionn.eu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror-de-1.cutie.dating/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror-de-1.cutie.dating/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.dogado.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.fau.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.fau.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://pkg.fef.moe/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://dist-mirror.fem.tu-ilmenau.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://berlin.mirror.pkgbuild.com/$repo/os/$arch
|
||||||
|
#Server = http://ftp.gwdg.de/pub/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://files.hadiko.de/pub/dists/arch/$repo/os/$arch
|
||||||
|
#Server = http://ftp.hosteurope.de/mirror/ftp.archlinux.org/$repo/os/$arch
|
||||||
|
#Server = http://ftp-stud.hs-esslingen.de/pub/Mirrors/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.hugo-betrugo.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.hugo-betrugo.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.informatik.tu-freiberg.de/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.informatik.tu-freiberg.de/arch/$repo/os/$arch
|
||||||
|
#Server = http://mirror.as20647.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.ipb.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.as20647.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.ipb.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.mirror.iphh.net/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.janbruckner.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.janbruckner.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.jensgutermuth.de/$repo/os/$arch
|
||||||
|
#Server = https://arch.jensgutermuth.de/$repo/os/$arch
|
||||||
|
#Server = https://de.arch.mirror.kescher.at/$repo/os/$arch
|
||||||
|
#Server = http://mirror.kumi.systems/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.kumi.systems/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.fra10.de.leaseweb.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.fra10.de.leaseweb.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.metalgamer.eu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.metalgamer.eu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.lcarilla.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.lcarilla.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.moson.org/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.moson.org/arch/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.n-ix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.n-ix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.netcologne.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.netcologne.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://de.arch.niranjan.co/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.niyawe.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.niyawe.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://packages.oth-regensburg.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://packages.oth-regensburg.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.owochle.app/$repo/os/$arch
|
||||||
|
#Server = https://arch.owochle.app/$repo/os/$arch
|
||||||
|
#Server = http://mirror.pagenotfound.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.pagenotfound.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.phinau.de/$repo/os/$arch
|
||||||
|
#Server = https://arch.phinau.de/$repo/os/$arch
|
||||||
|
#Server = https://mirror.pseudoform.org/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.purring.online/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.purring.online/arch/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.richard-neumann.de/$repo/os/$arch
|
||||||
|
#Server = http://ftp.halifax.rwth-aachen.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.halifax.rwth-aachen.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://linux.rz.rub.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.selfnet.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.selfnet.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://de-nue.soulharsh007.dev/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.spline.inf.fu-berlin.de/mirrors/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.spline.inf.fu-berlin.de/mirrors/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.sunred.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.sunred.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.thaller.ws/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.thaller.ws/$repo/os/$arch
|
||||||
|
#Server = https://mirror.thereisno.page/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.tu-chemnitz.de/pub/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.ubrco.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.ubrco.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.uni-bayreuth.de/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.uni-hannover.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.uni-kl.de/pub/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://arch.unixpeople.org/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.xtom.de/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.xtom.de/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Greece
|
||||||
|
#Server = http://ftp.cc.uoc.gr/mirrors/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://repo.greeklug.gr/data/pub/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.otenet.gr/linux/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Hong Kong
|
||||||
|
#Server = https://hk.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror-hk.koddos.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://hkg.mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://hkg.mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://arch-mirror.wtako.net/$repo/os/$arch
|
||||||
|
#Server = http://mirror.xtom.com.hk/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.xtom.com.hk/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Hungary
|
||||||
|
#Server = https://ftp.ek-cer.hu/pub/mirrors/ftp.archlinux.org/$repo/os/$arch
|
||||||
|
#Server = http://nova.quantum-mirror.hu/mirrors/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://quantum-mirror.hu/mirrors/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://super.quantum-mirror.hu/mirrors/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://nova.quantum-mirror.hu/mirrors/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://quantum-mirror.hu/mirrors/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://super.quantum-mirror.hu/mirrors/pub/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Iceland
|
||||||
|
#Server = http://is.mirror.flokinet.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://is.mirror.flokinet.net/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## India
|
||||||
|
#Server = https://mirrors.abhy.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.del2.albony.in/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.maa.albony.in/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://in.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://in.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://in-mirror.garudalinux.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://in-mirror.garudalinux.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.kushwanthreddy.com/$repo/os/$arch
|
||||||
|
#Server = https://in.arch.niranjan.co/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.nxtgen.com/archlinux-mirror/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.nxtgen.com/archlinux-mirror/$repo/os/$arch
|
||||||
|
#Server = http://mirror.sahil.world/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.sahil.world/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.saswata.cc/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.saswata.cc/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Indonesia
|
||||||
|
#Server = http://mirror.citrahost.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.citrahost.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.gi.co.id/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.gi.co.id/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://kebo.pens.ac.id/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.ditatompel.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.ditatompel.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.papua.go.id/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.papua.go.id/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://kacabenggala.uny.ac.id/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Iran
|
||||||
|
#Server = http://mirror.arvancloud.ir/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.arvancloud.ir/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://repo.iut.ac.ir/repo/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.mobinhost.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.mobinhost.com/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Israel
|
||||||
|
#Server = http://archlinux.interhost.co.il/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.interhost.co.il/$repo/os/$arch
|
||||||
|
#Server = http://mirror.isoc.org.il/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.isoc.org.il/pub/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Italy
|
||||||
|
#Server = http://it.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://it.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.mirror.garr.it/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://arch.mirror.hyperbit.it/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.mirror.server24.net/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.mirror.server24.net/$repo/os/$arch
|
||||||
|
|
||||||
|
## Japan
|
||||||
|
#Server = http://mirrors.cat.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.cat.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://jp.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://jp.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.rain.ne.jp/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.rain.ne.jp/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Kazakhstan
|
||||||
|
#Server = http://mirror.ps.kz/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.ps.kz/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Kenya
|
||||||
|
#Server = http://archlinux.mirror.liquidtelecom.com/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.mirror.liquidtelecom.com/$repo/os/$arch
|
||||||
|
|
||||||
|
## Latvia
|
||||||
|
#Server = http://ftp.linux.edu.lv/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.linux.edu.lv/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.koyanet.lv/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.koyanet.lv/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Lithuania
|
||||||
|
#Server = http://mirrors.atviras.lt/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.atviras.lt/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.sinirlan.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.sinirlan.net/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Luxembourg
|
||||||
|
#Server = http://arch-lux.spirex.me/$repo/os/$arch
|
||||||
|
#Server = https://arch-lux.spirex.me/$repo/os/$arch
|
||||||
|
|
||||||
|
## Mauritius
|
||||||
|
#Server = http://archlinux-mirror.cloud.mu/$repo/os/$arch
|
||||||
|
#Server = https://archlinux-mirror.cloud.mu/$repo/os/$arch
|
||||||
|
|
||||||
|
## Mexico
|
||||||
|
#Server = http://lidsol.fi-b.unam.mx/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://lidsol.fi-b.unam.mx/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://arch.jsc.mx/$repo/os/$arch
|
||||||
|
|
||||||
|
## Moldova
|
||||||
|
#Server = http://mirror.hosthink.net/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.hosthink.net/arch/$repo/os/$arch
|
||||||
|
#Server = http://mirror.ihost.md/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.ihost.md/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.mangohost.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.mangohost.net/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Morocco
|
||||||
|
#Server = http://mirror.abderraziq.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.abderraziq.com/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
|
||||||
|
## Netherlands
|
||||||
|
#Server = http://ams.nl.mirrors.bjg.at/arch/$repo/os/$arch
|
||||||
|
#Server = https://ams.nl.mirrors.bjg.at/arch/$repo/os/$arch
|
||||||
|
#Server = http://mirror.bouwhuis.network/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.bouwhuis.network/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.nl.cdn-perfprod.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.nl.cdn-perfprod.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://nl.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://nl.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.cj2.nl/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.cj2.nl/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.evoluso.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://nl.mirror.flokinet.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://nl.mirror.flokinet.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.iusearchbtw.nl/$repo/os/$arch
|
||||||
|
#Server = http://mirror.koddos.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.mirrors.lavatech.top/$repo/os/$arch
|
||||||
|
#Server = https://arch.mirrors.lavatech.top/$repo/os/$arch
|
||||||
|
#Server = http://mirror.ams1.nl.leaseweb.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.ams1.nl.leaseweb.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.mirror.liteserver.nl/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.mirror.liteserver.nl/$repo/os/$arch
|
||||||
|
#Server = http://mirror.lyrahosting.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.lyrahosting.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.mijn.host/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.mijn.host/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.nluug.nl/os/Linux/distr/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.snt.utwente.nl/pub/os/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.mirror.wearetriple.com/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.mirror.wearetriple.com/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.xtom.nl/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.xtom.nl/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## New Caledonia
|
||||||
|
#Server = http://mirror.lagoon.nc/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.nautile.nc/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.nautile.nc/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## New Zealand
|
||||||
|
#Server = http://mirror.2degrees.nz/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.2degrees.nz/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.fsmg.org.nz/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.fsmg.org.nz/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://nz.arch.niranjan.co/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.ourhome.kiwi/$repo/os/$arch
|
||||||
|
|
||||||
|
## North Macedonia
|
||||||
|
#Server = http://arch.softver.org.mk/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.onevip.mk/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.t-home.mk/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.t-home.mk/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Norway
|
||||||
|
#Server = http://mirror.archlinux.no/$repo/os/$arch
|
||||||
|
#Server = https://mirror.archlinux.no/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.uib.no/$repo/os/$arch
|
||||||
|
#Server = http://mirror.neuf.no/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.neuf.no/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
|
||||||
|
## Poland
|
||||||
|
#Server = http://ftp.icm.edu.pl/pub/Linux/dist/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.icm.edu.pl/pub/Linux/dist/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.juniorjpdj.pl/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.juniorjpdj.pl/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.midov.pl/arch/$repo/os/$arch
|
||||||
|
#Server = https://arch.midov.pl/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.przekichane.pl/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.psnc.pl/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.psnc.pl/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.sakamoto.pl/$repo/os/$arch
|
||||||
|
#Server = https://arch.sakamoto.pl/$repo/os/$arch
|
||||||
|
|
||||||
|
## Portugal
|
||||||
|
#Server = http://mirror.barata.pt/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.barata.pt/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://glua.ua.pt/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://glua.ua.pt/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.up.pt/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.up.pt/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.rnl.tecnico.ulisboa.pt/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.rnl.tecnico.ulisboa.pt/pub/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Romania
|
||||||
|
#Server = http://mirror.ro.cdn-perfprod.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.ro.cdn-perfprod.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.chroot.ro/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.chroot.ro/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.efect.ro/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.efect.ro/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ro.mirror.flokinet.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ro.mirror.flokinet.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.hosterion.ro/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.hosterion.ro/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.hostico.ro/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.hostico.ro/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.mirrors.linux.ro/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.nav.ro/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ro.arch.niranjan.co/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.nxthost.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.nxthost.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.pidginhost.com/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.pidginhost.com/arch/$repo/os/$arch
|
||||||
|
|
||||||
|
## Russia
|
||||||
|
#Server = http://archlinux.gay/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.gay/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ru.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ru.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.kpfu.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.kpfu.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.nw-sys.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.nw-sys.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.powernet.com.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://repository.su/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://repository.su/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://web.sketserv.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://web.sketserv.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror2.sl-chat.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror3.sl-chat.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.truenetwork.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.truenetwork.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://vladivostokst.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://vladivostokst.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.yandex.ru/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.yandex.ru/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Réunion
|
||||||
|
#Server = http://arch.mithril.re/$repo/os/$arch
|
||||||
|
|
||||||
|
## Saudi Arabia
|
||||||
|
#Server = http://sa.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://sa.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.maeen.sa/arch-mirror/$repo/os/$arch
|
||||||
|
#Server = https://mirror.maeen.sa/arch-mirror/$repo/os/$arch
|
||||||
|
|
||||||
|
## Serbia
|
||||||
|
#Server = http://mirror.pmf.kg.ac.rs/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror1.sox.rs/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror1.sox.rs/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Singapore
|
||||||
|
#Server = http://mirror.aktkn.sg/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.aktkn.sg/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.sg.cdn-perfprod.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.sg.cdn-perfprod.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://sg.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://sg.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://download.nus.edu.sg/mirror/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://singapore.mirror.pkgbuild.com/$repo/os/$arch
|
||||||
|
#Server = http://mirror.guillaumea.fr/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.guillaumea.fr/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.jingk.ai/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.jingk.ai/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://sg.arch.niranjan.co/$repo/os/$arch
|
||||||
|
#Server = http://ossmirror.mycloud.services/os/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.sg.gs/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.sg.gs/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Slovakia
|
||||||
|
#Server = http://ftp.energotel.sk/pub/linux/arch/$repo/os/$arch
|
||||||
|
#Server = https://ftp.energotel.sk/pub/linux/arch/$repo/os/$arch
|
||||||
|
#Server = http://mirror.lnx.sk/pub/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.lnx.sk/pub/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://tux.rainside.sk/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Slovenia
|
||||||
|
#Server = https://mirror.archlinux.si/$repo/os/$arch
|
||||||
|
#Server = https://www.sooftware.com/mirrors/Arch-Linux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.tux.si/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.tux.si/arch/$repo/os/$arch
|
||||||
|
|
||||||
|
## South Africa
|
||||||
|
#Server = http://archlinux.za.mirror.allworldit.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.za.mirror.allworldit.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://za.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://za.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://johannesburg.mirror.pkgbuild.com/$repo/os/$arch
|
||||||
|
#Server = http://mirror.is.co.za/mirror/archlinux.org/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.urbanwave.co.za/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.urbanwave.co.za/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## South Korea
|
||||||
|
#Server = http://kr.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://kr.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.techlabs.co.kr/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.techlabs.co.kr/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.distly.kr/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.distly.kr/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.kaist.ac.kr/ArchLinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.hrts.kr/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.hrts.kr/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.keiminem.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror2.keiminem.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.keiminem.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror2.keiminem.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.krfoss.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.lanet.kr/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.lanet.kr/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.siwoo.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.siwoo.org/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Spain
|
||||||
|
#Server = http://mirror.es.cdn-perfprod.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.es.cdn-perfprod.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://es.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://es.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://nox.panibrez.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.raiolanetworks.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.raiolanetworks.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.rediris.es/mirror/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Sweden
|
||||||
|
#Server = http://mirror.accum.se/mirror/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.accum.se/mirror/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.braindrainlan.nu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftpmirror.infania.net/mirror/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.ludd.ltu.se/mirrors/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.ludd.ltu.se/mirrors/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.lysator.liu.se/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.lysator.liu.se/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.bahnhof.net/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.bahnhof.net/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ftp.myrveln.se/pub/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.myrveln.se/pub/linux/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.osbeck.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.retropc.se/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.retropc.se/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.tedwall.se/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.tedwall.se/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Switzerland
|
||||||
|
#Server = http://pkg.adfinis-on-exoscale.ch/archlinux-pkgbuild/$repo/os/$arch
|
||||||
|
#Server = http://pkg.adfinis-on-exoscale.ch/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://pkg.adfinis-on-exoscale.ch/archlinux-pkgbuild/$repo/os/$arch
|
||||||
|
#Server = https://pkg.adfinis-on-exoscale.ch/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.arch-linux.ch/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.arch-linux.ch/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.lan.brgn.ch/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ch.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ch.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.hb9hil.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.hb9hil.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.init7.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.init7.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.metanet.ch/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.metanet.ch/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.puzzle.ch/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.puzzle.ch/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://theswissbay.ch/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.ungleich.ch/mirror/packages/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.worldhotspot.org/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Taiwan
|
||||||
|
#Server = http://mirror.archlinux.tw/ArchLinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.archlinux.tw/ArchLinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.ccns.ncku.edu.tw/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.ccns.ncku.edu.tw/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://tw.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://tw.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://free.nchc.org.tw/arch/$repo/os/$arch
|
||||||
|
#Server = https://taipei.mirror.pkgbuild.com/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.cs.nycu.edu.tw/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.cs.nycu.edu.tw/$repo/os/$arch
|
||||||
|
#Server = http://mirror.twds.com.tw/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.twds.com.tw/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Thailand
|
||||||
|
#Server = https://mirror.cyberbits.asia/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.kku.ac.th/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.kku.ac.th/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Türkiye
|
||||||
|
#Server = http://ftp.linux.org.tr/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://tr.arch.niranjan.co/$repo/os/$arch
|
||||||
|
#Server = http://mirror.nucc.tr/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.nucc.tr/arch/$repo/os/$arch
|
||||||
|
#Server = http://mirror.timtal.com.tr/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.timtal.com.tr/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## Ukraine
|
||||||
|
#Server = http://distrohub.kyiv.ua/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://distrohub.kyiv.ua/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://repo.hyron.dev/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://repo.hyron.dev/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.hntr.pp.ua/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.hntr.pp.ua/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.hostiko.network/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.hostiko.network/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archlinux.ip-connect.vn.ua/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.ip-connect.vn.ua/$repo/os/$arch
|
||||||
|
#Server = http://mirror.mirohost.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.mirohost.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.reitarovskyi.com.ua/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.reitarovskyi.com.ua/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## United Arab Emirates
|
||||||
|
#Server = https://mirror.hafeezh.com/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## United Kingdom
|
||||||
|
#Server = http://archlinux.uk.mirror.allworldit.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://archlinux.uk.mirror.allworldit.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://repo.c48.uk/arch/$repo/os/$arch
|
||||||
|
#Server = https://uk.repo.c48.uk/arch/$repo/os/$arch
|
||||||
|
#Server = http://gb.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://gb.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://london.mirror.pkgbuild.com/$repo/os/$arch
|
||||||
|
#Server = http://mirror.marcusn.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.marcusn.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.melbourne.co.uk/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.melbourne.co.uk/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://www.mirrorservice.org/sites/ftp.archlinux.org/$repo/os/$arch
|
||||||
|
#Server = https://www.mirrorservice.org/sites/ftp.archlinux.org/$repo/os/$arch
|
||||||
|
#Server = http://mirror.netweaver.uk/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.netweaver.uk/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://lon.mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://lon.mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.server.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.server.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://repo.slithery.uk/$repo/os/$arch
|
||||||
|
#Server = https://mirror.st2projects.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.ukfast.co.uk/sites/archlinux.org/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.ukfast.co.uk/sites/archlinux.org/$repo/os/$arch
|
||||||
|
#Server = http://mirror.cov.ukservers.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.cov.ukservers.com/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
|
## United States
|
||||||
|
#Server = http://mirrors.acm.wpi.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.adectra.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.adectra.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.akane.network/archmirror/$repo/os/$arch
|
||||||
|
#Server = http://arlm.tyzoid.com/$repo/os/$arch
|
||||||
|
#Server = https://arlm.tyzoid.com/$repo/os/$arch
|
||||||
|
#Server = http://ny.us.mirrors.bjg.at/arch/$repo/os/$arch
|
||||||
|
#Server = https://ny.us.mirrors.bjg.at/arch/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.bloomu.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.bloomu.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://arch-mirror.brightlight.today/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.cat.pdx.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://us.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://us.mirrors.cicku.me/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.clarkson.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.clarkson.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.colonelhosting.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.colonelhosting.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.mirror.constant.com/$repo/os/$arch
|
||||||
|
#Server = https://arch.mirror.constant.com/$repo/os/$arch
|
||||||
|
#Server = http://mirror.cs.odu.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.cs.odu.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.cs.vt.edu/pub/ArchLinux/$repo/os/$arch
|
||||||
|
#Server = http://repo.customcomputercare.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://repo.customcomputercare.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://distro.ibiblio.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://codingflyboy.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://coresite.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://forksystems.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://irltoolkit.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mnvoip.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://nnenix.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://nocix.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ohioix.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://opencolo.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://southfront.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://volico.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ziply.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://codingflyboy.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://coresite.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://forksystems.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://irltoolkit.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mnvoip.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://nnenix.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://nocix.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ohioix.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://opencolo.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://southfront.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://volico.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ziply.mm.fcix.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://losangeles.mirror.pkgbuild.com/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.gigenet.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.givebytes.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://arch.goober.cloud/$repo/os/$arch
|
||||||
|
#Server = http://arch.hu.fo/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://arch.hu.fo/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.hugeblank.dev/$repo/os/$arch
|
||||||
|
#Server = https://arch.hugeblank.dev/$repo/os/$arch
|
||||||
|
#Server = http://repo.ialab.dsu.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://repo.ialab.dsu.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.iu13.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.iu13.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://arch.mirror.k0.ae/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.kernel.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.kernel.org/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.lahansons.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.sfo12.us.leaseweb.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.wdc1.us.leaseweb.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.sfo12.us.leaseweb.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.wdc1.us.leaseweb.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.liquidweb.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.lug.mtu.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.lug.mtu.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://m.lqy.me/arch/$repo/os/$arch
|
||||||
|
#Server = https://arch.mirror.marcusspencer.us:4443/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.math.princeton.edu/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.metrocast.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://arch.miningtcup.me/$repo/os/$arch
|
||||||
|
#Server = https://arch.miningtcup.me/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.shr.cx/arch/$repo/os/$arch
|
||||||
|
#Server = http://iad.mirrors.misaka.one/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://iad.mirrors.misaka.one/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://repo.miserver.it.umich.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.mit.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.mit.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.mra.sh/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.mra.sh/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://us.arch.niranjan.co/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.ocf.berkeley.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.ocf.berkeley.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://archmirror1.octyl.net/$repo/os/$arch
|
||||||
|
#Server = https://archmirror1.octyl.net/$repo/os/$arch
|
||||||
|
#Server = http://ftp.osuosl.org/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ftp.osuosl.org/pub/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.pilotfiber.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://dfw.mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://iad.mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://ord.mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://dfw.mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://iad.mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://ord.mirror.rackspace.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://plug-mirror.rcac.purdue.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://plug-mirror.rcac.purdue.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.rit.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.rit.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.siena.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.smeal.xyz/arch-linux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.smeal.xyz/arch-linux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.sonic.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.sonic.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://us-mnz.soulharsh007.dev/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.pit.teraswitch.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.pit.teraswitch.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.theash.xyz/arch/$repo/os/$arch
|
||||||
|
#Server = http://mirror.umd.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.umd.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.vectair.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.vectair.net/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirror.vtti.vt.edu/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://wcbmedia.io:8000/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.xmission.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = http://mirrors.xtom.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.xtom.com/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://yonderly.org/mirrors/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirror.zackmyers.io/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://zxcvfdsa.com/arch/$repo/os/$arch
|
||||||
|
|
||||||
|
## Uzbekistan
|
||||||
|
#Server = http://mirror.dc.uz/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.dc.uz/arch/$repo/os/$arch
|
||||||
|
|
||||||
|
## Vietnam
|
||||||
|
#Server = http://mirror.bizflycloud.vn/archlinux/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.huongnguyen.dev/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirror.meowsmp.net/arch/$repo/os/$arch
|
||||||
|
#Server = https://mirrors.nguyenhoang.cloud/archlinux/$repo/os/$arch
|
||||||
|
|
||||||
+63
@@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
if [[ "$(tty)" != "/dev/tty1" ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -x /opt/configure-stormux/configure-stormux.sh ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [[ -x /usr/local/bin/configure-stormux ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Volume calibration FIRST
|
||||||
|
echo "Setting up audio volume..."
|
||||||
|
volume=50
|
||||||
|
wait=0
|
||||||
|
|
||||||
|
# Wait for pipewire to become available
|
||||||
|
while [[ $wait -lt 30 ]]; do
|
||||||
|
if pgrep pipewire &> /dev/null ; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
sleep 1
|
||||||
|
((wait++))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Volume calibration - this should be the VERY FIRST interactive part
|
||||||
|
while [[ $volume -le 130 ]]; do
|
||||||
|
clear
|
||||||
|
pactl set-sink-volume @DEFAULT_SINK@ "${volume}%" 2>/dev/null
|
||||||
|
spd-say "If this is loud enough, press enter."
|
||||||
|
if read -t4 ; then
|
||||||
|
echo "Volume set to ${volume}%"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
((volume+=5))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# For audible sudo prompts:
|
||||||
|
unset sudoFlags
|
||||||
|
if [[ -x /etc/audibleprompt.sh ]]; then
|
||||||
|
export SUDO_ASKPASS=/etc/audibleprompt.sh
|
||||||
|
export sudoFlags=("-A")
|
||||||
|
fi
|
||||||
|
|
||||||
|
clear
|
||||||
|
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 "${sudoFlags[@]}" configure-stormux
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# Raspberry Pi Information
|
||||||
|
alias pi-temp='/usr/bin/vcgencmd measure_temp'
|
||||||
|
alias pi-version='cat /sys/firmware/devicetree/base/model;echo'
|
||||||
|
alias pi-ip='ip a | grep -v "127.0.0.1" | grep -E -o "([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}"'
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# SSH configuration for Stormux Live ISO
|
||||||
|
# This configuration allows root login for the live environment
|
||||||
|
# Users should change the root password and disable this after installation
|
||||||
|
|
||||||
|
PermitRootLogin yes
|
||||||
|
PasswordAuthentication yes
|
||||||
|
ChallengeResponseAuthentication no
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
%wheel ALL=(ALL:ALL) ALL
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[Journal]
|
||||||
|
Storage=volatile
|
||||||
|
SystemMaxUse=20M
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
[Unit]
|
||||||
|
# Ensure audio and speech-dispatcher are available before starting Fenrir
|
||||||
|
# Wait for user audio initialization to complete
|
||||||
|
After=sound.target stormux-audio-setup.service speech-dispatcherd.service user@1000.service
|
||||||
|
Wants=stormux-audio-setup.service speech-dispatcherd.service user@1000.service
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/systemd/system/fenrirscreenreader.service
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[Service]
|
||||||
|
ExecStart=
|
||||||
|
ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --autologin root - $TERM
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[Service]
|
||||||
|
ExecStart=
|
||||||
|
ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --autologin stormux - $TERM
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Setup RAM logging and restore logs from disk
|
||||||
|
DefaultDependencies=false
|
||||||
|
After=local-fs.target
|
||||||
|
Before=sysinit.target
|
||||||
|
RequiresMountsFor=/var
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStartPre=/bin/mkdir -p /var/log.hdd
|
||||||
|
ExecStartPre=/bin/sh -c 'if [ -d /var/log.hdd ] && [ "$(ls -A /var/log.hdd 2>/dev/null)" ]; then cp -au /var/log.hdd/* /var/log/ 2>/dev/null || true; fi'
|
||||||
|
ExecStart=/bin/true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=sysinit.target
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Sync logs to disk before shutdown
|
||||||
|
DefaultDependencies=false
|
||||||
|
Before=shutdown.target reboot.target halt.target
|
||||||
|
Conflicts=shutdown.target reboot.target halt.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=true
|
||||||
|
ExecStart=/bin/sh -c 'rsync -aXv --delete --exclude="*.hdd" /var/log/ /var/log.hdd/ 2>/dev/null || true'
|
||||||
|
TimeoutStopSec=30
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=shutdown.target reboot.target halt.target
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Sync logs from RAM to disk
|
||||||
|
After=local-fs.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStartPre=/bin/mkdir -p /var/log.hdd
|
||||||
|
ExecStart=/bin/sh -c 'rsync -aXv --delete --exclude="*.hdd" /var/log/ /var/log.hdd/ 2>/dev/null || true'
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Sync logs from RAM to disk every hour
|
||||||
|
Requires=log-to-ram-sync.service
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnBootSec=15min
|
||||||
|
OnUnitActiveSec=1h
|
||||||
|
Persistent=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/systemd/system/NetworkManager.service
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/systemd/system/brltty.path
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
../stormux-repo-init.service
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Setup Pipewire for Live Environment
|
||||||
|
After=sound.target
|
||||||
|
Before=fenrirscreenreader.service speech-dispatcherd.service
|
||||||
|
DefaultDependencies=no
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart=/usr/local/bin/setup-pipewire-live.sh
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/systemd/system/sshd.socket
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
../stormux-audio-setup.service
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Setup audio for Stormux live environment
|
||||||
|
# Wait for audio hardware to be ready
|
||||||
|
Wants=systemd-udev-settle.service
|
||||||
|
After=systemd-udev-settle.service sound.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
# Enable linger so pipewire can run without login
|
||||||
|
ExecStartPre=/bin/mkdir -p /var/lib/systemd/linger
|
||||||
|
ExecStartPre=/bin/touch /var/lib/systemd/linger/stormux
|
||||||
|
# Unmute and set volume
|
||||||
|
ExecStart=/usr/local/bin/livecd-sound
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=sound.target
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Initialize Stormux repository key
|
||||||
|
After=pacman-init.service
|
||||||
|
Requires=pacman-init.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart=/usr/bin/pacman-key --add /usr/share/stormux/stormux_repo.pub
|
||||||
|
ExecStart=/usr/bin/pacman-key --lsign-key 52ADA49000F1FF0456F8AEEFB4CDE1CD56EF8E82
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Stormux screen reader and speech service
|
||||||
|
After=stormux-audio-setup.service sound.target
|
||||||
|
Wants=stormux-audio-setup.service
|
||||||
|
Before=getty@tty1.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
# Give pipewire a moment to initialize
|
||||||
|
ExecStartPre=/bin/sleep 2
|
||||||
|
# Start Fenrir screen reader
|
||||||
|
ExecStart=/bin/systemctl start fenrirscreenreader.service
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/dev/null
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Update system time from worldtimeapi.org
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/local/bin/sync_time.sh
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# This is the fallback vconsole configuration provided by systemd.
|
||||||
|
|
||||||
|
KEYMAP=us_alt
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
-- Prioritize analog and USB audio devices over HDMI
|
||||||
|
-- This ensures real sound cards are selected by default
|
||||||
|
|
||||||
|
rule = {
|
||||||
|
matches = {
|
||||||
|
{
|
||||||
|
{ "device.form-factor", "equals", "internal" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ "device.form-factor", "equals", "speaker" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ "device.form-factor", "equals", "headphone" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ "device.bus", "equals", "usb" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ "node.name", "matches", "alsa_output.pci-*analog*" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ "node.name", "matches", "alsa_output.usb-*" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
apply_properties = {
|
||||||
|
["priority.driver"] = 1000,
|
||||||
|
["priority.session"] = 1000,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
table.insert(alsa_monitor.rules, rule)
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
-- Deprioritize HDMI audio devices
|
||||||
|
-- This ensures analog/USB audio devices are preferred over HDMI
|
||||||
|
|
||||||
|
rule = {
|
||||||
|
matches = {
|
||||||
|
{
|
||||||
|
{ "device.name", "matches", "hdmi*" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ "device.name", "matches", "HDMI*" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ "node.name", "matches", "alsa_output.pci-*hdmi*" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
apply_properties = {
|
||||||
|
["priority.driver"] = 100,
|
||||||
|
["priority.session"] = 100,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
table.insert(alsa_monitor.rules, rule)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# Raspberry Pi Information
|
||||||
|
alias pi-temp='/usr/bin/vcgencmd measure_temp'
|
||||||
|
alias pi-version='cat /sys/firmware/devicetree/base/model;echo'
|
||||||
|
alias pi-ip='ip a | grep -v "127.0.0.1" | grep -E -o "([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}"'
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
# Fenrir console audio support
|
||||||
|
# Adds secondary socket for console applications like Fenrir
|
||||||
|
|
||||||
|
pulse.properties = {
|
||||||
|
# the addresses this server listens on
|
||||||
|
server.address = [
|
||||||
|
"unix:native"
|
||||||
|
"unix:/tmp/pulse.sock" # console access socket
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# client/stream specific properties
|
||||||
|
pulse.rules = [
|
||||||
|
{
|
||||||
|
# speech dispatcher asks for too small latency and then underruns.
|
||||||
|
matches = [ { application.name = "~speech-dispatcher*" } ]
|
||||||
|
actions = {
|
||||||
|
update-props = {
|
||||||
|
pulse.min.req = 1024/48000 # 21ms
|
||||||
|
pulse.min.quantum = 1024/48000 # 21ms
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../pipewire-init-sound.service
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Initialize Pipewire Audio with Sound Test
|
||||||
|
After=pipewire.service pipewire-pulse.service wireplumber.service
|
||||||
|
Wants=pipewire.service pipewire-pulse.service wireplumber.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart=/usr/local/bin/init-pipewire-sound.sh
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
# Fenrir console audio support
|
||||||
|
# Prevents bluetooth disconnection when switching TTY
|
||||||
|
|
||||||
|
monitor.bluez.properties = {
|
||||||
|
# Disable logind integration to prevent bluetooth device suspension on TTY switch
|
||||||
|
bluez5.enable-sbc-xq = true
|
||||||
|
bluez5.enable-msbc = true
|
||||||
|
bluez5.enable-hw-volume = true
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor.bluez.rules = [
|
||||||
|
{
|
||||||
|
matches = [
|
||||||
|
{
|
||||||
|
device.name = "~bluez_card.*"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
actions = {
|
||||||
|
update-props = {
|
||||||
|
session.suspend-timeout-seconds = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
# Fenrir console audio support
|
||||||
|
# Prevents audio device suspension when switching to TTY console
|
||||||
|
|
||||||
|
monitor.alsa.rules = [
|
||||||
|
{
|
||||||
|
matches = [
|
||||||
|
{
|
||||||
|
device.name = "~alsa_card.*"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
actions = {
|
||||||
|
update-props = {
|
||||||
|
api.alsa.use-acp = true
|
||||||
|
api.acp.auto-profile = false
|
||||||
|
api.acp.auto-port = false
|
||||||
|
session.suspend-timeout-seconds = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
matches = [
|
||||||
|
{
|
||||||
|
node.name = "~alsa_input.*"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
node.name = "~alsa_output.*"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
actions = {
|
||||||
|
update-props = {
|
||||||
|
session.suspend-timeout-seconds = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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
|
||||||
@@ -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@
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# This file is part of PulseAudio.
|
||||||
|
#
|
||||||
|
# PulseAudio 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 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# PulseAudio 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 Lesser General Public License
|
||||||
|
# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
## Configuration file for PulseAudio clients. See pulse-client.conf(5) for
|
||||||
|
## more information. Default values are commented out. Use either ; or # for
|
||||||
|
## commenting.
|
||||||
|
|
||||||
|
; default-sink =
|
||||||
|
; default-source =
|
||||||
|
default-server = unix:/tmp/pulse.sock
|
||||||
|
; default-dbus-server =
|
||||||
|
|
||||||
|
autospawn = no
|
||||||
|
; autospawn = yes
|
||||||
|
; daemon-binary = /usr/bin/pulseaudio
|
||||||
|
; extra-arguments = --log-target=syslog
|
||||||
|
|
||||||
|
; cookie-file =
|
||||||
|
|
||||||
|
; enable-shm = yes
|
||||||
|
; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB
|
||||||
|
|
||||||
|
; auto-connect-localhost = no
|
||||||
|
; auto-connect-display = no
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Archiso airootfs customization script
|
||||||
|
# This runs in the airootfs chroot during ISO build
|
||||||
|
|
||||||
|
set -e -u
|
||||||
|
|
||||||
|
# Initialize pacman keyring
|
||||||
|
echo "Initializing pacman keyring..."
|
||||||
|
pacman-key --init
|
||||||
|
pacman-key --populate archlinux
|
||||||
|
|
||||||
|
# Add Stormux repository key
|
||||||
|
echo "Adding Stormux repository key..."
|
||||||
|
if [ -f /root/stormux_repo.pub ]; then
|
||||||
|
pacman-key --add /root/stormux_repo.pub
|
||||||
|
pacman-key --lsign-key 52ADA49000F1FF0456F8AEEFB4CDE1CD56EF8E82
|
||||||
|
echo "Stormux repository key added and locally signed"
|
||||||
|
rm /root/stormux_repo.pub
|
||||||
|
else
|
||||||
|
echo "Warning: Stormux repository key not found at /root/stormux_repo.pub"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set locale
|
||||||
|
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
|
||||||
|
locale-gen
|
||||||
|
|
||||||
|
# Enable system services
|
||||||
|
systemctl enable NetworkManager.service
|
||||||
|
systemctl enable fenrirscreenreader.service
|
||||||
|
systemctl enable brltty.path
|
||||||
|
|
||||||
|
# Enable user services globally for all users
|
||||||
|
systemctl --global enable pipewire.service pipewire-pulse.service
|
||||||
|
|
||||||
|
# Set permissions for stormux user home
|
||||||
|
if [ -d /home/stormux ]; then
|
||||||
|
chown -R 1000:1000 /home/stormux
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Airootfs customization complete"
|
||||||
Executable
+103
@@ -0,0 +1,103 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Renames a user
|
||||||
|
# Required arguments: old user name, new user name
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
question() {
|
||||||
|
echo
|
||||||
|
echo "$@"
|
||||||
|
read -r answer
|
||||||
|
answer="${answer:0:1}"
|
||||||
|
answer="${answer^}"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ $# -ne 2 ]]; then
|
||||||
|
echo "Usage: $0 old-user new-user"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
oldUser="$1"
|
||||||
|
newUser="$2"
|
||||||
|
|
||||||
|
# Make sure old user exists
|
||||||
|
if ! id "$oldUser" >/dev/null 2>&1; then
|
||||||
|
echo "The user $oldUser does not exist."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure old user is not logged in
|
||||||
|
if pgrep -u "$oldUser" >/dev/null; then
|
||||||
|
echo "The user $oldUser is currently logged in or has running processes. Cannot continue."
|
||||||
|
question "Would you like to forcibly log out $oldUser? (Y/N)"
|
||||||
|
if [[ "$answer" != "Y" ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
systemctl stop display-manager
|
||||||
|
loginctl terminate-user "$oldUser"
|
||||||
|
sleep 2
|
||||||
|
if pgrep -u "$oldUser" >/dev/null; then
|
||||||
|
echo "The user $oldUser still has running processes after termination. Cannot continue."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure new user does not exist
|
||||||
|
if id "$newUser" >/dev/null 2>&1; then
|
||||||
|
echo "The user name $newUser is already taken."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure the new name is acceptable
|
||||||
|
if ! [[ "$newUser" =~ ^[a-z_][a-z0-9_-]{0,31}$ ]]; then
|
||||||
|
echo "$newUser is not an acceptable user name."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Passed all safety checks, proceed with the rename
|
||||||
|
echo "Renaming $oldUser to $newUser..."
|
||||||
|
groups=$(id -nG "$oldUser")
|
||||||
|
groups="${groups// /,}"
|
||||||
|
usermod -G "$groups" -m -d "/home/$newUser" -l "$newUser" "$oldUser"
|
||||||
|
|
||||||
|
# Update nodm.conf if it exists
|
||||||
|
if [[ -e /etc/nodm.conf ]]; then
|
||||||
|
echo "Updating /etc/nodm.conf..."
|
||||||
|
sed -i -e "s#^NODM_USER=.*#NODM_USER='$newUser'#" -e "s#^NODM_XSESSION=.*#NODM_XSESSION='/home/$newUser/.xinitrc'#" /etc/nodm.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Copy over crontab if it exists
|
||||||
|
if crontab -u "$oldUser" -l >/tmp/${oldUser}_crontab.bak 2>/dev/null; then
|
||||||
|
echo "Copying over crontab..."
|
||||||
|
if crontab -u "$newUser" "/tmp/${oldUser}_crontab.bak"; then
|
||||||
|
rm "/tmp/${oldUser}_crontab.bak"
|
||||||
|
else
|
||||||
|
echo "Warning: failed to restore crontab for $newUser."
|
||||||
|
rm "/tmp/${oldUser}_crontab.bak"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update linger
|
||||||
|
if [[ -e "/var/lib/systemd/linger/$oldUser" ]]; then
|
||||||
|
echo "Enabling linger..."
|
||||||
|
mv "/var/lib/systemd/linger/$oldUser" "/var/lib/systemd/linger/$newUser"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Optionally update files in new home directory
|
||||||
|
echo
|
||||||
|
echo "Would you like to search for references to $oldUser and update them to $newUser in files located in /home/$newUser?"
|
||||||
|
question "This can take a while. (Y/N)"
|
||||||
|
if [[ "$answer" == "Y" ]]; then
|
||||||
|
echo "Updating files..."
|
||||||
|
find "/home/$newUser" -type f -exec grep -Iq . "{}" \; -and -exec sed -i "s|$oldUser|$newUser|g" "{}" \;
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Rename complete. The user, $newUser, is now available."
|
||||||
|
question "Would you like to reboot?"
|
||||||
|
if [[ "${answer}" == "Y" ]]; then
|
||||||
|
reboot
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
mQINBGhTtIcBEADTCqY/+das1n52HTTlp3Uf5+ER5r0fNA2HgJq4GzEeFBdqdgSF
|
||||||
|
y05P9B94d4JWtWvt0ckjsNfku19O9IquKiYP5x9/sYT8RGeRUrTlN9qlCrytTsdM
|
||||||
|
a8ij9esGQOXDeyRJQTs5igbFWQ26MrJpOkmO8xMXGmfD29yOppRLzVS8Jed0mokk
|
||||||
|
aEajui3QSWcefDnFMBYNaMF04iuWgVxv/7102adh3u3+V632+fQQhFtu+x92iosU
|
||||||
|
GtWlGGe3UkEhWJIb6wf/VCYIYQAjxTQBLul2WByXqwCXmobzc7DJbte3FSEPvPis
|
||||||
|
nJiUmT0fsIIC9c1UbTJt5Gqb6o/oI61tEJEeXieBViXFE7HwBI7FUxaIXoozgiYA
|
||||||
|
BxaLHQT0Qv9k1SXbBm82xNydjqFHIAolYSp5s1wRIhErlOaG9w3+Tb8zFSekPsbg
|
||||||
|
cgS/b3PpWmnigXBJQ94Ee+6KoPMVrwEKIu/IHexRUVAm+66Xs55ccgMY+MUupIjX
|
||||||
|
Bdn9jCYB8NwpC3UNWoSv2oQ7F2hVbXZYC/dx7gKmyvzfrw5MLOX7yEoSGlJJp2iK
|
||||||
|
fLLP8nw+x7LnDFEnAjPjtmeH7e+JANH1scP/7YMKDszO1THSK3hBAK1aeq0aEFs8
|
||||||
|
9AO++xZrNbCrF2MnqcGaXs/753k6kf8zyrW6t7A1opxjPHIz3WrQ8SbXXwARAQAB
|
||||||
|
tExTdG9ybXV4IChGb3Igc2lnbmluZyBzdG9ybXV4IHJlcG9zaXRvcnkgcGFja2Fn
|
||||||
|
ZXMpIDxzdG9ybV9kcmFnb25Ac3Rvcm11eC5vcmc+iQJOBBMBCgA4FiEEUq2kkADx
|
||||||
|
/wRW+K7vtM3hzVbvjoIFAmhTtIcCGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AA
|
||||||
|
CgkQtM3hzVbvjoLiLQ/9HJzlwr2JNGdR/LaM1Y6VuhASGDZsUsi5XLJ7qKUKN/eA
|
||||||
|
kq0LMO7TzHO++otsEolodMr8fTkthQTPqSnbLZsW9Y3wK9U2vajryblRSEBaY6VB
|
||||||
|
1ds0pAg5SXz7O2eI2Ne05dkYB176G72KcjrOiSanKjI9sqh6pdTHcQM3XbRxxEVn
|
||||||
|
or7fKbLs/eveFWRPW3EAwuVnWI1aw3Xw9BQ3TE1eEDPvBh2GVKZ6qskbzdwfZtUB
|
||||||
|
kxAa30M+ftlNDaV7d6mNfREefEJfZjYFrY2XiqTK3+w1Q1ZaugK0Bbd/YdAoGMdt
|
||||||
|
6gbd2h/IZtxduWW/HhvWX2wtKqn4fNxAyYcY3aWm8kuq0pXlyEZ96gZas6a2lu+f
|
||||||
|
+yLvIh3UtC1IimFMDMQnKCTbWgdhd0HMnG9ULnoOroXVGltnBQwlO0hrHSVD+qmy
|
||||||
|
NVPUxkzS3ZhqSmoW2G8hSvXpMjt/w5fhC0FJhFb/uM/7LqJWSl5aAkUHupN3t/nG
|
||||||
|
9o7chBQzzXwbpiS6DQuIt6ouyPpwNjeELFPNBjZDf0auVWj6ZZ5+B/bmyHXQ4wFS
|
||||||
|
bYKZdO9VeXhBxRUMfGpIKvIw/Lnc+1Toan1RTWoUoRH+HuK2D/LAuvsam36gtLrQ
|
||||||
|
XV3//7Mh4oQ0Zg4REG3SEfG9i3rav8wMtRmaJaSbwmMVpC6mT/uiEzCSgQhO/0c=
|
||||||
|
=HIM9
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../../../pi4/files/etc/skel
|
||||||
+141
@@ -0,0 +1,141 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# For audible sudo prompts:
|
||||||
|
unset sudoFlags
|
||||||
|
if [[ -x /etc/audibleprompt.sh ]]; then
|
||||||
|
export SUDO_ASKPASS=/etc/audibleprompt.sh
|
||||||
|
export sudoFlags=("-A")
|
||||||
|
fi
|
||||||
|
|
||||||
|
trap cleanup EXIT
|
||||||
|
cleanup() {
|
||||||
|
popd &> /dev/null
|
||||||
|
if ! [[ -x /opt/configure-stormux/configure-stormux.sh ]]; then
|
||||||
|
echo "Initial setup is not complete."
|
||||||
|
echo "To continue setup, please run:"
|
||||||
|
echo "sudo configure-stormux"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if [[ -x /opt/configure-stormux/configure-stormux.sh ]]; then
|
||||||
|
pushd /opt/configure-stormux
|
||||||
|
./configure-stormux.sh
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Volume calibration is now handled in stormux_first_boot.sh
|
||||||
|
|
||||||
|
export DIALOGOPTS='--insecure --no-lines --visit-items'
|
||||||
|
|
||||||
|
set_timezone() {
|
||||||
|
# Get the list of timezones
|
||||||
|
mapfile -t regions < <(timedatectl --no-pager list-timezones | cut -d '/' -f1 | sort -u)
|
||||||
|
|
||||||
|
# Use the same text twice here and just hide the tag field.
|
||||||
|
region=$(dialog --backtitle "Please select your Region" \
|
||||||
|
--no-tags \
|
||||||
|
--menu "Use up and down arrows or page-up and page-down to navigate the list, and press 'Enter' to make your selection." 0 0 0 \
|
||||||
|
$(for i in ${regions[@]} ; do echo "$i";echo "$i";done) --stdout)
|
||||||
|
|
||||||
|
|
||||||
|
mapfile -t cities < <(timedatectl --no-pager list-timezones | grep "$region" | cut -d '/' -f2 | sort -u)
|
||||||
|
|
||||||
|
# Use the same text twice here and just hide the tag field.
|
||||||
|
city=$(dialog --backtitle "Please select a city near you" \
|
||||||
|
--no-tags \
|
||||||
|
--menu "Use up and down arrow or page-up and page-down to navigate the list." 0 0 10 \
|
||||||
|
$(for i in ${cities[@]} ; do echo "$i";echo "$i";done) --stdout)
|
||||||
|
|
||||||
|
# Set the timezone
|
||||||
|
if [[ -f /etc/localtime ]]; then
|
||||||
|
rm /etc/localtime
|
||||||
|
fi
|
||||||
|
ln -sf /usr/share/zoneinfo/${region}/${city} /etc/localtime
|
||||||
|
timedatectl set-ntp true
|
||||||
|
}
|
||||||
|
# Offer to switch fenrir layout.
|
||||||
|
echo "Would you like to switch Fenrir to laptop layout?"
|
||||||
|
echo "Press y for yes or n for no followed by enter."
|
||||||
|
read -r continue
|
||||||
|
continue="${continue::1}"
|
||||||
|
if [[ "${continue,}" == "y" ]];then
|
||||||
|
sed -i 's/=desktop/=laptop/' /etc/fenrirscreenreader/settings/settings.conf
|
||||||
|
clear
|
||||||
|
systemctl restart fenrirscreenreader.service
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for possible resize
|
||||||
|
diskSource="$(df --output='source' / | tail -1)"
|
||||||
|
diskSize="$(df -h --output='size' / | tail -1 | tr -cd '[:digit:].')"
|
||||||
|
diskSize=${diskSize%.*}
|
||||||
|
if [[ $diskSize -le 7 ]]; then
|
||||||
|
echo "$diskSource is only $diskSize gigs, which means it probably needs to be resized. Would you like to do this now?"
|
||||||
|
echo "Press y for yes or n for no followed by enter."
|
||||||
|
read -r continue
|
||||||
|
continue="${continue::1}"
|
||||||
|
if [[ "${continue,}" == "y" ]];then
|
||||||
|
# Extract base device name (handles mmcblk0p2, nvme0n1p2, sda2, etc.)
|
||||||
|
if [[ "$diskSource" =~ (.*[0-9]+)p[0-9]+$ ]]; then
|
||||||
|
# Handle mmcblk0p2, nvme0n1p2 style
|
||||||
|
diskDevice="${BASH_REMATCH[1]}"
|
||||||
|
else
|
||||||
|
# Handle sda2, sdb3 style
|
||||||
|
diskDevice="$(echo "$diskSource" | sed 's/[0-9]*$//')"
|
||||||
|
fi
|
||||||
|
echo "Yes" | sudo "${sudoFlags[@]}" parted ---pretend-input-tty "$diskDevice" resizepart 2 100%
|
||||||
|
sudo "${sudoFlags[@]}" resize2fs -f "$diskSource"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! ping -c1 stormux.org &> /dev/null ; then
|
||||||
|
echo "No internet connection detected. Press enter to open NetworkManager."
|
||||||
|
read -r continue
|
||||||
|
echo "setting set focus#highlight=True" | socat - UNIX-CLIENT:/tmp/fenrirscreenreader-deamon.sock
|
||||||
|
nmtui-connect
|
||||||
|
echo "setting set focus#highlight=False" | socat - UNIX-CLIENT:/tmp/fenrirscreenreader-deamon.sock
|
||||||
|
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"
|
||||||
|
echo "If your Pi does not have a CMOS battery and is powered off regularly, it may take a while for the time to be set correctly after boot."
|
||||||
|
echo "Stormux provides a service to sync the time after internet connection is established."
|
||||||
|
read -rp "Would you like the time to sync as soon as the Pi connects to the internet? " answer
|
||||||
|
answer="${answer:0:1}"
|
||||||
|
if [[ "${answer,,}" == "y" ]]; then
|
||||||
|
systemctl enable time_sync_at_boot.service
|
||||||
|
else
|
||||||
|
echo "Time sync at boot skipped."
|
||||||
|
echo "If you change your mind later, simply type:"
|
||||||
|
echo "sudo systemctl enable time_sync_at_boot.service"
|
||||||
|
fi
|
||||||
|
set_timezone
|
||||||
|
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
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Initial setup is complete."
|
||||||
|
echo
|
||||||
|
echo "The default passwords are stormux for the stormux user"
|
||||||
|
echo "and root for the root user. It is highly recommended to change them."
|
||||||
|
echo "To change the password for stormux, run:"
|
||||||
|
echo "passwd"
|
||||||
|
echo "To change the password for root, run:"
|
||||||
|
echo "sudo passwd"
|
||||||
|
echo
|
||||||
|
echo "For more configuration options, run configure-stormux,"
|
||||||
|
echo "or you may configure your system manually."
|
||||||
|
echo
|
||||||
|
echo "Thank you for choosing Stormux."
|
||||||
|
|
||||||
|
|
||||||
|
exit 0
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Initialize pipewire audio by attempting to play sound until it succeeds
|
||||||
|
# This ensures pipewire is fully ready before fenrir starts
|
||||||
|
|
||||||
|
maxAttempts=30
|
||||||
|
attempt=0
|
||||||
|
|
||||||
|
while [[ $attempt -lt $maxAttempts ]]; do
|
||||||
|
# Try to play a silent sound using sox
|
||||||
|
if play -qnV0 synth .1 whi norm -100 2>/dev/null; then
|
||||||
|
# Success! Pipewire is working
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Wait a moment before trying again
|
||||||
|
sleep 1
|
||||||
|
((attempt++))
|
||||||
|
done
|
||||||
|
|
||||||
|
# Even if we failed, exit successfully so we don't block boot
|
||||||
|
exit 0
|
||||||
Executable
+24
@@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Configure audio for Stormux live environment
|
||||||
|
# Ensures pipewire is running and audio is properly configured
|
||||||
|
|
||||||
|
# Start pipewire for the stormux user if not already running
|
||||||
|
if id stormux &>/dev/null; then
|
||||||
|
# Enable linger for stormux user
|
||||||
|
loginctl enable-linger stormux 2>/dev/null || true
|
||||||
|
|
||||||
|
# Start pipewire user services
|
||||||
|
stormux_uid="$(id -u stormux)"
|
||||||
|
sudo -u stormux XDG_RUNTIME_DIR="/run/user/${stormux_uid}" systemctl --user enable --now pipewire.service pipewire-pulse.service wireplumber.service 2>/dev/null || true
|
||||||
|
|
||||||
|
# Wait for pipewire to initialize
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Unmute and set reasonable volumes
|
||||||
|
amixer -q set Master 70% unmute 2>/dev/null || true
|
||||||
|
amixer -q set PCM 70% unmute 2>/dev/null || true
|
||||||
|
amixer -q set Speaker 70% unmute 2>/dev/null || true
|
||||||
|
amixer -q set Headphone 70% unmute 2>/dev/null || true
|
||||||
|
|
||||||
|
exit 0
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Setup Pipewire for the live environment
|
||||||
|
# This ensures pipewire is running before Fenrir starts
|
||||||
|
|
||||||
|
# Note: Do not use set -e - we want this to succeed even if commands fail
|
||||||
|
|
||||||
|
# Enable user linger for the stormux user (allows user services to run without login)
|
||||||
|
if [ -d /var/lib/systemd/linger ]; then
|
||||||
|
touch /var/lib/systemd/linger/stormux
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start pipewire for the stormux user
|
||||||
|
if id stormux &>/dev/null; then
|
||||||
|
# Use machinectl to start user services in the user's session
|
||||||
|
machinectl shell stormux@ /usr/bin/systemctl --user enable pipewire.service pipewire-pulse.service wireplumber.service 2>/dev/null || true
|
||||||
|
machinectl shell stormux@ /usr/bin/systemctl --user start pipewire.service pipewire-pulse.service wireplumber.service 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Wait a moment for pipewire to initialize
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
exit 0
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Customize the airootfs after package installation
|
||||||
|
# This script runs in the chroot environment after packages are installed
|
||||||
|
|
||||||
|
set -e -u
|
||||||
|
|
||||||
|
# Copy custom skel files, overwriting package defaults
|
||||||
|
if [ -d /etc/skel.custom ]; then
|
||||||
|
echo "Installing custom skel files..."
|
||||||
|
cp -f /etc/skel.custom/.* /etc/skel/ 2>/dev/null || true
|
||||||
|
rm -rf /etc/skel.custom
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set the distribution name
|
||||||
|
echo 'Stormux \r (\l)' > /etc/issue
|
||||||
|
echo >> /etc/issue
|
||||||
|
|
||||||
|
# Create realtime group if it doesn't exist
|
||||||
|
if ! getent group realtime > /dev/null 2>&1; then
|
||||||
|
echo "Creating realtime group..."
|
||||||
|
groupadd -r realtime
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create stormux user with groups matching Pi build
|
||||||
|
echo "Creating stormux user..."
|
||||||
|
useradd -m -g users -G wheel,realtime,audio,video,network,brlapi -s /bin/bash stormux
|
||||||
|
|
||||||
|
# Set passwords
|
||||||
|
echo -e "root\nroot" | passwd "root"
|
||||||
|
echo -e "stormux\nstormux" | passwd "stormux"
|
||||||
|
|
||||||
|
# Configure git for stormux user
|
||||||
|
sudo -iu stormux bash -c 'git config --global init.defaultBranch master'
|
||||||
|
|
||||||
|
# Create user directories
|
||||||
|
sudo -iu stormux xdg-user-dirs-update
|
||||||
|
|
||||||
|
# Enable linger so that sound will start at login
|
||||||
|
mkdir -p /var/lib/systemd/linger
|
||||||
|
touch /var/lib/systemd/linger/stormux
|
||||||
|
|
||||||
|
# Enable pipewire globally
|
||||||
|
# Pipewire configuration for fenrir is pre-installed in airootfs
|
||||||
|
systemctl --global enable pipewire.service pipewire-pulse.service
|
||||||
|
|
||||||
|
# Configure sudo for wheel group
|
||||||
|
echo '%wheel ALL=(ALL) ALL' > /etc/sudoers.d/wheel
|
||||||
|
|
||||||
|
# Set hostname
|
||||||
|
echo stormux > /etc/hostname
|
||||||
|
|
||||||
|
# Disable systemd-networkd in favor of NetworkManager
|
||||||
|
systemctl disable systemd-networkd.service systemd-networkd.socket 2>/dev/null || true
|
||||||
|
|
||||||
|
# Enable services
|
||||||
|
services=(
|
||||||
|
brltty.path
|
||||||
|
fenrirscreenreader.service
|
||||||
|
NetworkManager.service
|
||||||
|
stormux-audio-setup.service
|
||||||
|
)
|
||||||
|
|
||||||
|
for service in "${services[@]}"; do
|
||||||
|
echo "Enabling $service..."
|
||||||
|
if systemctl enable "$service"; then
|
||||||
|
echo " $service: OK"
|
||||||
|
else
|
||||||
|
echo " $service: FAILED"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Airootfs customization complete"
|
||||||
Executable
+4
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
date_time=$(curl -s http://worldtimeapi.org/api/ip | grep -oP '(?<="datetime":")[^"]*')
|
||||||
|
date -s "$date_time"
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user