Compare commits
44 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f2dc0b492 | ||
|
|
aceda3f1f8 | ||
|
|
013b3d11ac | ||
|
|
dfd2609461 | ||
|
|
b4704295ec | ||
|
|
855be1afcd | ||
|
|
3df5017766 | ||
|
|
34f1e24e10 | ||
|
|
3176d951b6 | ||
|
|
370d351887 | ||
|
|
c31612ca51 | ||
|
|
1964121c8c | ||
|
|
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 |
96
pi4/build/README.md
Normal file
96
pi4/build/README.md
Normal file
@@ -0,0 +1,96 @@
|
||||
# Stormux Pi Image Builder
|
||||
|
||||
Stormux provides an Arch-based Raspberry Pi image that already includes Fenrir, Orca, and other screen-reader friendly defaults. This repository hosts the scripts maintained by the Stormux community (originally crafted by Storm) so anyone can rebuild the image, customize the overlay, and share accessible Pi spins.
|
||||
|
||||
## Purpose & Scope
|
||||
This repo captures the complete build pipeline for the Stormux Raspberry Pi images: downloading Arch Linux ARM, layering the accessible defaults, compiling Fenrir and helper tools, and producing a ready-to-flash `.img`. Running the script yourself lets you reproduce the same system the project ships for the Pi 4/400, tweak it, and publish new spins without reverse-engineering the original release.
|
||||
|
||||
## What You Need
|
||||
- A 64-bit Arch Linux host (bare metal or VM) with at least 20 GB free disk space.
|
||||
- Root access on that host. The builder partitions loopback devices and must run as root.
|
||||
- Required packages: `arch-install-scripts`, `dosfstools`, `parted`, `wget`, `qemu-user-static`, `qemu-user-static-binfmt`, plus standard developer tools that Arch already ships.
|
||||
- A Raspberry Pi 4/400 or similar board (a Pi 3 works with the `-v 32` option) and a microSD card (8 GB or larger recommended).
|
||||
|
||||
Install dependencies on the build host with:
|
||||
```bash
|
||||
sudo pacman -S arch-install-scripts dosfstools parted wget qemu-user-static qemu-user-static-binfmt
|
||||
```
|
||||
|
||||
## Getting the Source
|
||||
Clone the canonical repo (or your fork) someplace with plenty of space:
|
||||
```bash
|
||||
git clone https://git.stormux.org/storm/stormux.git
|
||||
cd stormux
|
||||
```
|
||||
All build logic lives in `pi4/`. The `pi4/files/` tree mirrors the root filesystem you want inside the image (configs in `etc`, helper scripts in `usr/local/bin`, and so on).
|
||||
|
||||
### Where to Run the Builder
|
||||
The script is designed for an x86_64 Arch host so it can emulate ARM binaries with QEMU while building. You can run it natively on an ARM board (including a Pi) running Arch or Stormux, but expect much longer build times and make sure the same packages are installed. Whatever the CPU, you **must** run as root and ensure `/mnt` is free so the loopback rootfs can mount safely.
|
||||
|
||||
## Building Your First Image
|
||||
1. Become root (`sudo -i`) so the script can create loop devices and mount them.
|
||||
2. From `/path/to/stormux`, run:
|
||||
```bash
|
||||
sudo ./pi4/build/build-stormux.sh -v 64 -l en_US -s 6
|
||||
```
|
||||
- `-v 64` builds the aarch64 image (use `-v 32` for the Pi 3/armv7h).
|
||||
- `-l en_US` selects the locale (use `es_ES`, `fr_FR`, etc.).
|
||||
- `-s 6` sets the image size in gigabytes.
|
||||
- Add `-n my-stormux.img` to override the default filename.
|
||||
3. Grab coffee. The script downloads the latest Arch Linux ARM tarball, provisions packages (Fenrir, Orca, NetworkManager, PipeWire, etc.), copies the overlay from `pi4/files/`, and cleans up.
|
||||
4. When the `build-stormux.sh` command returns, you should have an `.img` file in your working directory (for example `stormux-pi4-aarch64-YYYY-MM-DD.img`).
|
||||
|
||||
If the build is interrupted, run `sudo umount -R /mnt && sudo losetup -D` to be sure nothing is still mounted.
|
||||
|
||||
## Customizing the Image
|
||||
- **Overlay files**: Add or edit files in `pi4/files/` using the same paths they should have inside the Pi. Example: to add a custom MOTD, edit `pi4/files/etc/motd`.
|
||||
- **Packages**: Edit the package list inside `pi4/build/build-stormux.sh` (search for `pacman -Su --needed`). Add or remove entries as needed, then rebuild.
|
||||
- **AUR components**: The script already compiles Fenrir (`fenrir-git`), `growpartfs`, `log2ram`, and `yay`. To add more AUR packages, append them to the `aurPackages` array near the middle of the script.
|
||||
- **First-boot behavior**: Modify `pi4/files/usr/local/bin/configure-stormux` to change the guided setup that runs when the image boots the first time.
|
||||
|
||||
Remember to keep permissions sensible (`chmod 755` for scripts, `644` for configs) so rsync copies them correctly.
|
||||
|
||||
## Keeping Up with Upstream Updates
|
||||
Storm and other contributors actively improve these scripts. To sync your local clone with the latest changes:
|
||||
```bash
|
||||
cd /path/to/stormux
|
||||
git pull --ff-only
|
||||
```
|
||||
Rebuild after pulling so your custom image inherits any upstream fixes (new packages, service tweaks, security patches). If you maintain your own fork, merge or rebase onto the upstream `main` branch before publishing updated images.
|
||||
|
||||
## Flashing and Booting
|
||||
1. Verify the image:
|
||||
```bash
|
||||
ls -lh stormux-pi4-*.img
|
||||
```
|
||||
2. Write it to an SD card (replace `/dev/sdX` with your card, not a partition):
|
||||
```bash
|
||||
sudo dd if=stormux-pi4-aarch64-*.img of=/dev/sdX bs=4M status=progress conv=fsync
|
||||
```
|
||||
3. Insert the card into your Pi 4/400 and power it on. You should hear Fenrir start speaking once the user session loads.
|
||||
4. Log in using the default credentials (username `stormux`, password `stormux`). Root uses `root`/`root` until you change it.
|
||||
5. Run `sudo configure-stormux` (or follow the automatic prompt) to finish the guided setup: configure networking via `nmtui`, update the clock, optionally resize the SD card with `growpartfs`, and toggle Fenrir’s layout.
|
||||
|
||||
## Testing Without Hardware
|
||||
You can boot the image in a container to verify services before flashing:
|
||||
```bash
|
||||
sudo systemd-nspawn -i stormux-pi4-aarch64-*.img --boot
|
||||
```
|
||||
Use `machinectl` to connect to the console and ensure critical services start. For unit files you edit, run `systemd-analyze verify path/to/unit` inside the container or the Pi.
|
||||
|
||||
## Troubleshooting Tips
|
||||
- **Locale or package errors**: Ensure your host’s pacman keyring is up to date (`sudo pacman -Sy archlinux-keyring`).
|
||||
- **Loop device cleanup**: After failures run `sudo losetup -a` to find stray devices, then `sudo losetup -d /dev/loopX`.
|
||||
- **Disk too small**: Increase the `-s` argument or remove packages.
|
||||
- **Accessibility tweaks**: If Fenrir is too quiet or you prefer Orca, install the `orca` package inside the overlay and add it to the autostart configuration in `pi4/files/etc/xdg/autostart/`.
|
||||
|
||||
## Sharing Your Image
|
||||
When you are happy with your customizations:
|
||||
1. Rebuild so you have a clean `.img` file named clearly (for example, `stormux-pi4-a11y-v1.img`).
|
||||
2. Compress it (`xz -T0 -z stormux-pi4-a11y-v1.img`).
|
||||
3. Publish the image along with the exact commit you built from and any extra scripts you used. The README and `AGENTS.md` in this repo explain the layout so others can reproduce your work.
|
||||
|
||||
## Huge Thanks to Storm
|
||||
Storm did the heavy lifting—curating packages, wiring up Fenrir/Orca defaults, scripting the first-boot assistant, and sharing the whole build process so the community can remix it. This repo exists because accessibility was treated as a first-class feature from day one, and the documentation lets anyone extend that work. If the image improves your Pi experience, consider contributing improvements or telling Storm thanks.
|
||||
|
||||
With these steps you can take the same base image Storm released, tweak it to your needs, and ship a fully accessible Arch image for other Pi fans. Happy hacking!
|
||||
@@ -50,9 +50,8 @@ help() {
|
||||
declare -A command=(
|
||||
[h]="This help screen."
|
||||
[l:]="Language default is en_US."
|
||||
[n:]="Image name, default is stormux-pi<32|64>-<yyyy-mm-dd>.img"
|
||||
[s:]="image size in GB, default is 4."
|
||||
[v:]="Version of the Raspberry Pi for which you are building. (32|64) default is 64."
|
||||
[n:]="Image name, default is stormux-pi4-aarch64-<yyyy-mm-dd>.img"
|
||||
[s:]="image size in GB, default is 6."
|
||||
)
|
||||
|
||||
# Convert the keys of the associative array to a format usable by getopts
|
||||
@@ -75,14 +74,6 @@ while getopts "${args}" i ; do
|
||||
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
|
||||
;;
|
||||
@@ -90,11 +81,8 @@ while getopts "${args}" i ; do
|
||||
done
|
||||
|
||||
# make sure variables are set, or use defaults.
|
||||
export imageVersion="${imageVersion:-64}"
|
||||
export imageSize="${imageSize:-6G}"
|
||||
imageName="${imageName:-stormux-pi4-${imageVersion}-$(date '+%Y-%m-%d').img}"
|
||||
imageName="${imageName/-64-/-aarch64-}"
|
||||
imageName="${imageName/-32-/-armv7h-}"
|
||||
imageName="${imageName:-stormux-pi4-aarch64-$(date '+%Y-%m-%d').img}"
|
||||
export imageName
|
||||
export imageLanguage="${imageLanguage:-en_US.UTF-8}"
|
||||
|
||||
@@ -129,85 +117,142 @@ for i in arch-install-scripts dosfstools parted wget ; do
|
||||
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"
|
||||
# Url for the aarch64 image to be downloaded.
|
||||
imageUrl="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"
|
||||
mkfs.vfat -F32 -n STRMX_BOOT "${loopdev}p1"
|
||||
mkfs.ext4 -F -L STRMX_ROOT "${loopdev}p2"
|
||||
mount "${loopdev}p2" /mnt
|
||||
mkdir /mnt/boot
|
||||
mount "${loopdev}p1" /mnt/boot
|
||||
# Things are mounted now, so set mounted to 0 (bash true)
|
||||
mounted=0
|
||||
imageFileName=$(mktemp)
|
||||
wget "${url[$imageVersion]}" -O "${imageFileName}"
|
||||
if [[ $imageVersion -eq 32 ]]; then
|
||||
# Workaround for bsdtar errors when extracting 32 bit image.
|
||||
set +e
|
||||
fi
|
||||
wget "${imageUrl}" -O "${imageFileName}"
|
||||
bsdtar -xpf "${imageFileName}" -C /mnt
|
||||
# Set -e in case it got unset for 32 bit image
|
||||
set -e
|
||||
arch-chroot /mnt << EOF
|
||||
|
||||
# Copy override files into place before chroot (except skel to avoid conflicts)
|
||||
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
|
||||
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
|
||||
|
||||
# Add stormux repository
|
||||
echo "Downloading stormux repository key..."
|
||||
curl -s https://packages.stormux.org/stormux_repo.pub > /tmp/stormux_repo.pub
|
||||
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
|
||||
|
||||
# Install packages
|
||||
pacman -Su --needed --noconfirm \
|
||||
alsa-firmware \
|
||||
alsa-utils \
|
||||
base \
|
||||
base-devel \
|
||||
bash-completion \
|
||||
bluez \
|
||||
bluez-utils \
|
||||
brltty \
|
||||
cloud-utils \
|
||||
cronie \
|
||||
espeak-ng \
|
||||
fake-hwclock \
|
||||
firmware-raspberrypi \
|
||||
git \
|
||||
go \
|
||||
magic-wormhole \
|
||||
man \
|
||||
man-pages \
|
||||
networkmanager \
|
||||
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
|
||||
pacman -Syy
|
||||
# Change to the Pi kernel for aarch64
|
||||
pacman -R --noconfirm linux-aarch64 uboot-raspberrypi
|
||||
pacman -S --noconfirm linux-rpi
|
||||
|
||||
# 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
|
||||
sed -i "s/#$imageLanguage/$imageLanguage/" /etc/locale.gen
|
||||
echo "LANG=$imageLanguage" > /etc/locale.conf
|
||||
@@ -226,29 +271,14 @@ echo 'stormux ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/wheel
|
||||
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
|
||||
|
||||
# Change to the stormux user for user configuration
|
||||
sudo -iu stormux
|
||||
# suppress git spam about default branch name
|
||||
git config --global init.defaultBranch master
|
||||
# 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
|
||||
@@ -261,20 +291,33 @@ echo '%wheel ALL=(ALL) ALL' > /etc/sudoers.d/wheel
|
||||
echo stormux > /etc/hostname
|
||||
# Configure services
|
||||
systemctl disable systemd-networkd.service systemd-networkd.socket
|
||||
systemctl enable brltty.path cronie.service fake-hwclock.service fenrirscreenreader.service log2ram.service NetworkManager.service
|
||||
# Cleanup packages
|
||||
pacman -Sc --noconfirm
|
||||
pacman -R --noconfirm go
|
||||
# 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
|
||||
pacman -Runcds libx11 --noconfirm
|
||||
pacman -Sc --noconfirm
|
||||
|
||||
# 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
|
||||
# Copy skel files to stormux user home (after user rename in chroot)
|
||||
find ../files/etc/skel/ -mindepth 1 -exec cp -rv "{}" /mnt/home/stormux/ \;
|
||||
|
||||
# Exiting calls the cleanup function to unmount.
|
||||
|
||||
1
pi4/files/boot/cmdline.txt
Normal file
1
pi4/files/boot/cmdline.txt
Normal file
@@ -0,0 +1 @@
|
||||
root=LABEL=STRMX_ROOT rw rootwait console=serial0,115200 console=tty1 fsck.repair=yes
|
||||
@@ -1,32 +0,0 @@
|
||||
Section "ServerLayout"
|
||||
Identifier "Layout0"
|
||||
Screen 0 "Screen0"
|
||||
EndSection
|
||||
|
||||
Section "Monitor"
|
||||
Identifier "Monitor0"
|
||||
Option "DPMS" "true"
|
||||
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 "Card0"
|
||||
# Try standard driver
|
||||
Driver "modesetting"
|
||||
# Fallback to dummy
|
||||
Option "FallbackDriver" "dummy"
|
||||
VideoRam 256000
|
||||
EndSection
|
||||
|
||||
Section "Screen"
|
||||
Identifier "Screen0"
|
||||
Device "Card0"
|
||||
Monitor "Monitor0"
|
||||
DefaultDepth 24
|
||||
SubSection "Display"
|
||||
Depth 24
|
||||
Modes "1920x1080"
|
||||
EndSubSection
|
||||
EndSection
|
||||
7
pi4/files/etc/fstab
Normal file
7
pi4/files/etc/fstab
Normal file
@@ -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
|
||||
|
||||
1
pi4/files/etc/modprobe.d/brcmfmac.conf
Normal file
1
pi4/files/etc/modprobe.d/brcmfmac.conf
Normal file
@@ -0,0 +1 @@
|
||||
options brcmfmac feature_disable=0x82000
|
||||
@@ -6,5 +6,5 @@ Welcome to Stormux, powered by Arch Linux ARM
|
||||
Stormux IRC: #stormux on irc.stormux.org
|
||||
Arch Linux ARM IRC: #archlinuxarm on irc.libera.chat
|
||||
|
||||
Thank you Stormux supporters! https://ko-fi.com/stormux/leaderboard
|
||||
Thank you Stormux supporters! https://patreon.com/stormux
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -12,6 +12,34 @@ 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
|
||||
@@ -19,6 +47,7 @@ if [[ -x /etc/audibleprompt.sh ]]; then
|
||||
export sudoFlags=("-A")
|
||||
fi
|
||||
|
||||
clear
|
||||
cat << "EOF"
|
||||
Hello, and welcome to Stormux!
|
||||
|
||||
|
||||
@@ -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
|
||||
3
pi4/files/etc/systemd/journald.conf.d/99-ramlog.conf
Normal file
3
pi4/files/etc/systemd/journald.conf.d/99-ramlog.conf
Normal file
@@ -0,0 +1,3 @@
|
||||
[Journal]
|
||||
Storage=volatile
|
||||
SystemMaxUse=20M
|
||||
16
pi4/files/etc/systemd/system/log-to-ram-setup.service
Normal file
16
pi4/files/etc/systemd/system/log-to-ram-setup.service
Normal file
@@ -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
|
||||
14
pi4/files/etc/systemd/system/log-to-ram-shutdown.service
Normal file
14
pi4/files/etc/systemd/system/log-to-ram-shutdown.service
Normal file
@@ -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
|
||||
8
pi4/files/etc/systemd/system/log-to-ram-sync.service
Normal file
8
pi4/files/etc/systemd/system/log-to-ram-sync.service
Normal file
@@ -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'
|
||||
11
pi4/files/etc/systemd/system/log-to-ram-sync.timer
Normal file
11
pi4/files/etc/systemd/system/log-to-ram-sync.timer
Normal file
@@ -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
|
||||
3
pi4/files/etc/vconsole.conf
Normal file
3
pi4/files/etc/vconsole.conf
Normal file
@@ -0,0 +1,3 @@
|
||||
# This is the fallback vconsole configuration provided by systemd.
|
||||
|
||||
KEYMAP=us_alt
|
||||
103
pi4/files/root/rename-user.sh
Executable file
103
pi4/files/root/rename-user.sh
Executable file
@@ -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
|
||||
@@ -24,6 +24,8 @@ if [[ -x /opt/configure-stormux/configure-stormux.sh ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Volume calibration is now handled in stormux_first_boot.sh
|
||||
|
||||
export DIALOGOPTS='--insecure --no-lines --visit-items'
|
||||
|
||||
set_timezone() {
|
||||
@@ -52,8 +54,6 @@ set_timezone() {
|
||||
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."
|
||||
@@ -75,23 +75,25 @@ if [[ $diskSize -le 7 ]]; then
|
||||
read -r continue
|
||||
continue="${continue::1}"
|
||||
if [[ "${continue,}" == "y" ]];then
|
||||
sudo "${sudoFlags[@]}" growpartfs $diskSource
|
||||
# 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."
|
||||
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 "After connecting to the internet, remember to go back to cursor mode."
|
||||
echo "It is the same key used to switch to highlight mode."
|
||||
echo "Press enter to continue."
|
||||
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
|
||||
|
||||
BIN
pi4/files/usr/share/kbd/keymaps/i386/qwerty/us_alt.map.gz
Normal file
BIN
pi4/files/usr/share/kbd/keymaps/i386/qwerty/us_alt.map.gz
Normal file
Binary file not shown.
15
x86_64/.gitignore
vendored
Normal file
15
x86_64/.gitignore
vendored
Normal file
@@ -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/
|
||||
24
x86_64/50-fenrir-bluez.conf
Normal file
24
x86_64/50-fenrir-bluez.conf
Normal file
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
24
x86_64/50-fenrir-console.conf
Normal file
24
x86_64/50-fenrir-console.conf
Normal file
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
35
x86_64/50-fenrir-no-suspend.conf
Normal file
35
x86_64/50-fenrir-no-suspend.conf
Normal file
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
7
x86_64/airootfs/etc/audibleprompt.sh
Executable file
7
x86_64/airootfs/etc/audibleprompt.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
play -qnV0 synth 3 pluck D3 pluck A3 pluck D4 pluck F4 pluck A4 delay 0 .1 .2 .3 .4 remix - chorus 0.9 0.9 38 0.75 0.3 0.5 -t &
|
||||
read -rsp "$*"$'\n' password
|
||||
echo "$password"
|
||||
|
||||
exit 0
|
||||
12
x86_64/airootfs/etc/environment
Normal file
12
x86_64/airootfs/etc/environment
Normal file
@@ -0,0 +1,12 @@
|
||||
#
|
||||
# This file is parsed by pam_env module
|
||||
#
|
||||
# Syntax: simple "KEY=VAL" pairs on separate lines
|
||||
#
|
||||
# Accessibility variables
|
||||
export ACCESSIBILITY_ENABLED=1
|
||||
export GTK_MODULES=gail:atk-bridge
|
||||
export GNOME_ACCESSIBILITY=1
|
||||
export QT_ACCESSIBILITY=1
|
||||
export QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
|
||||
export SAL_USE_VCLPLUGIN=gtk3
|
||||
6
x86_64/airootfs/etc/fstab
Normal file
6
x86_64/airootfs/etc/fstab
Normal file
@@ -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
|
||||
1
x86_64/airootfs/etc/hostname
Normal file
1
x86_64/airootfs/etc/hostname
Normal file
@@ -0,0 +1 @@
|
||||
stormux
|
||||
5
x86_64/airootfs/etc/hosts
Normal file
5
x86_64/airootfs/etc/hosts
Normal file
@@ -0,0 +1,5 @@
|
||||
# Static table lookup for hostnames.
|
||||
# See hosts(5) for details.
|
||||
127.0.0.1 localhost
|
||||
::1 localhost
|
||||
127.0.1.1 stormux.localdomain stormux
|
||||
3
x86_64/airootfs/etc/mkinitcpio.conf.d/archiso.conf
Normal file
3
x86_64/airootfs/etc/mkinitcpio.conf.d/archiso.conf
Normal file
@@ -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)
|
||||
8
x86_64/airootfs/etc/mkinitcpio.d/linux.preset
Normal file
8
x86_64/airootfs/etc/mkinitcpio.d/linux.preset
Normal file
@@ -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"
|
||||
9
x86_64/airootfs/etc/motd
Normal file
9
x86_64/airootfs/etc/motd
Normal file
@@ -0,0 +1,9 @@
|
||||
Welcome to Stormux, powered by Arch Linux
|
||||
|
||||
Stormux Website: https://stormux.org
|
||||
Arch Linux: https://archlinux.org
|
||||
|
||||
Stormux IRC: #stormux on irc.stormux.org
|
||||
|
||||
Thank you Stormux supporters! https://patreon.com/stormux
|
||||
|
||||
105
x86_64/airootfs/etc/pacman.conf
Normal file
105
x86_64/airootfs/etc/pacman.conf
Normal file
@@ -0,0 +1,105 @@
|
||||
#
|
||||
# /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 =
|
||||
|
||||
# Protect Stormux custom skel files from being overwritten by package updates
|
||||
NoUpgrade = etc/skel/.bashrc etc/skel/.inputrc etc/skel/.screenrc etc/skel/.vimrc etc/skel/.vim/*
|
||||
#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
|
||||
10
x86_64/airootfs/etc/pacman.d/hooks/00-stormux-repo-key.hook
Normal file
10
x86_64/airootfs/etc/pacman.d/hooks/00-stormux-repo-key.hook
Normal file
@@ -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'
|
||||
16
x86_64/airootfs/etc/pacman.d/hooks/stormux-setup.hook
Normal file
16
x86_64/airootfs/etc/pacman.d/hooks/stormux-setup.hook
Normal file
@@ -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
|
||||
961
x86_64/airootfs/etc/pacman.d/mirrorlist
Normal file
961
x86_64/airootfs/etc/pacman.d/mirrorlist
Normal file
@@ -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
|
||||
|
||||
13
x86_64/airootfs/etc/profile.d/stormux-accessibility.sh
Executable file
13
x86_64/airootfs/etc/profile.d/stormux-accessibility.sh
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
# Stormux accessibility environment variables
|
||||
# Available to all users and sessions
|
||||
|
||||
# Accessibility support
|
||||
export ACCESSIBILITY_ENABLED=1
|
||||
export GTK_MODULES=gail:atk-bridge:canberra-gtk-module
|
||||
export GNOME_ACCESSIBILITY=1
|
||||
export QT_ACCESSIBILITY=1
|
||||
export QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
|
||||
|
||||
# Dialog accessibility options
|
||||
export DIALOGOPTS='--no-lines --visit-items'
|
||||
59
x86_64/airootfs/etc/profile.d/stormux_first_boot.sh
Executable file
59
x86_64/airootfs/etc/profile.d/stormux_first_boot.sh
Executable file
@@ -0,0 +1,59 @@
|
||||
#!/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.
|
||||
|
||||
Please press enter to continue.
|
||||
EOF
|
||||
read -r
|
||||
sudo "${sudoFlags[@]}" configure-stormux
|
||||
4
x86_64/airootfs/etc/skel.custom/.bash_aliases
Normal file
4
x86_64/airootfs/etc/skel.custom/.bash_aliases
Normal file
@@ -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}"'
|
||||
21
x86_64/airootfs/etc/skel.custom/.bash_functions
Normal file
21
x86_64/airootfs/etc/skel.custom/.bash_functions
Normal file
@@ -0,0 +1,21 @@
|
||||
memuse() {
|
||||
ps axo rss,comm,pid \
|
||||
| awk '{ proc_list[$2] += $1; } END \
|
||||
{ for (proc in proc_list) { printf("%d\t%s\n", proc_list[proc],proc); }}' \
|
||||
| sort -n | tail -n 10 | sort -rn \
|
||||
| awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}'
|
||||
}
|
||||
|
||||
|
||||
pdf()
|
||||
{
|
||||
if [[ $# -ne 1 ]]; then
|
||||
echo 'Usage: pdf <file>' >&2
|
||||
else
|
||||
local dir=$(mktemp -d -p /tmp pdf_conversion.XXXXXX)
|
||||
local outFile="${1##*/}"
|
||||
local outFile="${outFile%.*}"
|
||||
pdftohtml -noframes -i -s "$1" "${dir}/${outFile}.html"
|
||||
w3m -s "${dir}/${outFile}.html"
|
||||
fi
|
||||
}
|
||||
24
x86_64/airootfs/etc/skel.custom/.bashrc
Normal file
24
x86_64/airootfs/etc/skel.custom/.bashrc
Normal file
@@ -0,0 +1,24 @@
|
||||
#
|
||||
# ~/.bashrc
|
||||
#
|
||||
|
||||
# If not running interactively, don't do anything
|
||||
[[ $- != *i* ]] && return
|
||||
|
||||
#Change directories without using cd
|
||||
shopt -s autocd
|
||||
|
||||
# Keep bash history in screen
|
||||
export HISTFILE="${HISTFILE}${WINDOW:+.${WINDOW}}"
|
||||
|
||||
# load Aliases and functions
|
||||
[[ -f ".bash_aliases" ]] && source .bash_aliases
|
||||
[[ -f ".bash_functions" ]] && source .bash_functions
|
||||
#Invironment variables
|
||||
PS1='[\u@\h \W] \$ '
|
||||
export DIALOGOPTS='--no-lines --visit-items'
|
||||
GPG_TTY=$(tty)
|
||||
export GPG_TTY
|
||||
# Don't put commands prefixed with space, or duplicate commands in history
|
||||
export HISTCONTROL=ignoreboth
|
||||
|
||||
6
x86_64/airootfs/etc/skel.custom/.inputrc
Normal file
6
x86_64/airootfs/etc/skel.custom/.inputrc
Normal file
@@ -0,0 +1,6 @@
|
||||
# Reload changes with control+x followed by control+r
|
||||
set echo-control-characters off
|
||||
|
||||
# History searching with up and down arrows.
|
||||
"\e[A": history-search-backward
|
||||
"\e[B": history-search-forward
|
||||
18
x86_64/airootfs/etc/skel.custom/.screenrc
Normal file
18
x86_64/airootfs/etc/skel.custom/.screenrc
Normal file
@@ -0,0 +1,18 @@
|
||||
vbell off
|
||||
bell_msg ""
|
||||
hardstatus off
|
||||
startup_message off
|
||||
defscrollback 4096
|
||||
bind ! select 10
|
||||
bind @ select 11
|
||||
bind \# select 12
|
||||
bind $ select 13
|
||||
bind % select 14
|
||||
bind ^ select 15
|
||||
bind & select 16
|
||||
bind * select 17
|
||||
bind ( select 18
|
||||
bind ) select 19
|
||||
bind b eval "writebuf" 'exec !!! xclip -selection "clipboard" -i /tmp/screen-exchange'
|
||||
#termcapinfo xterm|xterms|xs|rxvt ti@:te@
|
||||
termcapinfo xterm* ti@:te@
|
||||
43
x86_64/airootfs/etc/skel.stormux/.bashrc
Normal file
43
x86_64/airootfs/etc/skel.stormux/.bashrc
Normal file
@@ -0,0 +1,43 @@
|
||||
#
|
||||
# ~/.bashrc
|
||||
#
|
||||
|
||||
# If not running interactively, don't do anything
|
||||
[[ $- != *i* ]] && return
|
||||
|
||||
# Change directories without using cd
|
||||
shopt -s autocd
|
||||
|
||||
# Load aliases and functions if they exist
|
||||
[[ -f "$HOME/.bash_aliases" ]] && . "$HOME/.bash_aliases"
|
||||
[[ -f "$HOME/.bash_functions" ]] && . "$HOME/.bash_functions"
|
||||
|
||||
# Environment variables
|
||||
export QT_ACCESSIBILITY=1
|
||||
export QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
|
||||
|
||||
# Set prompt
|
||||
PS1='[\u@\h \W] \$ '
|
||||
|
||||
# Dialog accessibility options
|
||||
export DIALOGOPTS='--no-lines --visit-items'
|
||||
|
||||
# Browser selection based on environment
|
||||
if [[ -z "$DISPLAY" ]]; then
|
||||
export BROWSER=w3m
|
||||
fi
|
||||
|
||||
# GPG TTY
|
||||
GPG_TTY=$(tty)
|
||||
export GPG_TTY
|
||||
|
||||
# Don't put commands prefixed with space, or duplicate commands in history
|
||||
export HISTCONTROL=ignoreboth
|
||||
|
||||
# Increase history size
|
||||
export HISTSIZE=10000
|
||||
export HISTFILESIZE=20000
|
||||
|
||||
# Add user's local bin directories to PATH
|
||||
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
|
||||
export PATH
|
||||
25
x86_64/airootfs/etc/skel.stormux/.inputrc
Normal file
25
x86_64/airootfs/etc/skel.stormux/.inputrc
Normal file
@@ -0,0 +1,25 @@
|
||||
# ~/.inputrc
|
||||
# Readline configuration for bash
|
||||
# Reload changes with control+x followed by control+r
|
||||
|
||||
# Don't echo control characters
|
||||
set echo-control-characters off
|
||||
|
||||
# History searching with up and down arrows
|
||||
"\e[A": history-search-backward
|
||||
"\e[B": history-search-forward
|
||||
|
||||
# Shift+Tab sequences for console (backward menu completion)
|
||||
"\e[Z": menu-complete-backward
|
||||
"\eZ": menu-complete-backward
|
||||
# Alt+comma as alternative
|
||||
"\e,": menu-complete-backward
|
||||
|
||||
# Music player keybindings (requires playerctl)
|
||||
"\eX": "\C-k \C-u playerctl play\C-M"
|
||||
"\eC": "\C-k \C-u playerctl play-pause\C-M"
|
||||
"\eV": "\C-k \C-u playerctl stop\C-M"
|
||||
"\eB": "\C-k \C-u playerctl next\C-M"
|
||||
"\eU": "\C-k \C-u playerctl metadata -f '{{artist}} - {{album}} - {{title}}'\C-M"
|
||||
"\e_": "\C-k \C-u playerctl volume 0.05-\C-M"
|
||||
"\e+": "\C-k \C-u playerctl volume 0.05+\C-M"
|
||||
33
x86_64/airootfs/etc/skel.stormux/.screenrc
Normal file
33
x86_64/airootfs/etc/skel.stormux/.screenrc
Normal file
@@ -0,0 +1,33 @@
|
||||
# ~/.screenrc
|
||||
# GNU Screen configuration
|
||||
|
||||
# Disable visual bell
|
||||
vbell off
|
||||
bell_msg ""
|
||||
|
||||
# Disable hardstatus
|
||||
hardstatus off
|
||||
|
||||
# Disable startup message
|
||||
startup_message off
|
||||
|
||||
# Set scrollback buffer size
|
||||
defscrollback 4096
|
||||
|
||||
# Extended window numbering (0-19 instead of 0-9)
|
||||
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
|
||||
|
||||
# Copy buffer to system clipboard (requires xclip)
|
||||
bind b eval "writebuf" 'exec !!! xclip -selection "clipboard" -i /tmp/screen-exchange'
|
||||
|
||||
# Disable alternate screen switching (allows scrollback in terminal)
|
||||
termcapinfo xterm* ti@:te@
|
||||
29
x86_64/airootfs/etc/skel.stormux/.vim/dates.vim
Normal file
29
x86_64/airootfs/etc/skel.stormux/.vim/dates.vim
Normal file
@@ -0,0 +1,29 @@
|
||||
" Date and time insertion functions
|
||||
|
||||
" Insert current date in format: Wednesday, January 15, 2025
|
||||
function! InsertDate()
|
||||
let date_string = strftime("%A, %B %d, %Y")
|
||||
execute "normal! a" . date_string
|
||||
endfunction
|
||||
|
||||
" Insert current time in format: 09:15PM
|
||||
function! InsertTime()
|
||||
let time_string = strftime("%I:%M%p")
|
||||
execute "normal! a" . time_string
|
||||
endfunction
|
||||
|
||||
" Insert current date and time in format: Wednesday, January 15, 2025, 09:15PM
|
||||
function! InsertDateTime()
|
||||
let datetime_string = strftime("%A, %B %d, %Y, %I:%M%p")
|
||||
execute "normal! a" . datetime_string
|
||||
endfunction
|
||||
|
||||
" Key mappings
|
||||
nnoremap <leader>date :call InsertDate()<CR>
|
||||
inoremap <leader>date <C-o>:call InsertDate()<CR>
|
||||
|
||||
nnoremap <leader>time :call InsertTime()<CR>
|
||||
inoremap <leader>time <C-o>:call InsertTime()<CR>
|
||||
|
||||
nnoremap <leader>datetime :call InsertDateTime()<CR>
|
||||
inoremap <leader>datetime <C-o>:call InsertDateTime()<CR>
|
||||
39
x86_64/airootfs/etc/skel.stormux/.vim/emoji.vim
Normal file
39
x86_64/airootfs/etc/skel.stormux/.vim/emoji.vim
Normal file
@@ -0,0 +1,39 @@
|
||||
" Emoji insertion mappings
|
||||
|
||||
" Basic expressions
|
||||
inoremap ,:) 😊
|
||||
inoremap ,:( 😢
|
||||
inoremap ,:D 😃
|
||||
inoremap ,;) 😉
|
||||
inoremap ,:P 😛
|
||||
inoremap ,:o 😮
|
||||
inoremap ,:\| 😐
|
||||
|
||||
" Hearts and love
|
||||
inoremap ,<3 ❤️
|
||||
inoremap ,heart ❤️
|
||||
inoremap ,love 💕
|
||||
inoremap ,kiss 😘
|
||||
|
||||
" Special expressions
|
||||
inoremap ,>:) 😈
|
||||
inoremap ,devil 😈
|
||||
inoremap ,:* 😘
|
||||
inoremap ,cool 😎
|
||||
inoremap ,nerd 🤓
|
||||
inoremap ,angry 😠
|
||||
|
||||
" Hands and gestures
|
||||
inoremap ,thumbs 👍
|
||||
inoremap ,clap 👏
|
||||
inoremap ,wave 👋
|
||||
inoremap ,peace ✌️
|
||||
inoremap ,pray 🙏
|
||||
|
||||
" Common symbols
|
||||
inoremap ,check ✅
|
||||
inoremap ,x ❌
|
||||
inoremap ,star ⭐
|
||||
inoremap ,fire 🔥
|
||||
inoremap ,rocket 🚀
|
||||
inoremap ,tada 🎉
|
||||
0
x86_64/airootfs/etc/skel.stormux/.vim/swap/.gitkeep
Normal file
0
x86_64/airootfs/etc/skel.stormux/.vim/swap/.gitkeep
Normal file
77
x86_64/airootfs/etc/skel.stormux/.vimrc
Normal file
77
x86_64/airootfs/etc/skel.stormux/.vimrc
Normal file
@@ -0,0 +1,77 @@
|
||||
" ~/.vimrc
|
||||
" Vim configuration for Stormux
|
||||
|
||||
" Ensure vim directory structure exists
|
||||
" mkdir -p ~/.vim/{backup,swap,views}
|
||||
|
||||
set nocompatible " Use Vim settings (not Vi compatible)
|
||||
filetype off " Required for some plugins
|
||||
|
||||
" Terminal and encoding
|
||||
set term=linux " Make arrow and other keys work
|
||||
scriptencoding utf-8
|
||||
|
||||
" History and undo
|
||||
set history=1000 " Store more history (default is 20)
|
||||
set undoreload=10000 " Maximum lines to save for undo on buffer reload
|
||||
|
||||
" Backup and swap file configuration
|
||||
set backup " Enable backups
|
||||
set backupdir=$HOME/.vim/backup//
|
||||
set directory=$HOME/.vim/swap//
|
||||
set viewdir=$HOME/.vim/views//
|
||||
|
||||
" Search settings
|
||||
set ignorecase " Case insensitive search
|
||||
set smartcase " Case sensitive when uppercase present
|
||||
set gdefault " /g flag on :s substitutions by default
|
||||
|
||||
" Spell checking
|
||||
set spell " Enable spell checking
|
||||
|
||||
" Display settings
|
||||
set wrap " Wrap long lines
|
||||
set linebreak " Break lines at word boundaries
|
||||
set noruler " Disable ruler (for accessibility)
|
||||
set laststatus=0 " Never show status line
|
||||
set noshowcmd " Don't show commands in status
|
||||
|
||||
" Indentation settings
|
||||
set shiftwidth=4 " Use indents of 4 spaces
|
||||
set expandtab " Tabs are spaces, not tabs
|
||||
set tabstop=4 " An indentation every four columns
|
||||
set softtabstop=4 " Let backspace delete indent
|
||||
|
||||
" Leader key
|
||||
let mapleader = ','
|
||||
|
||||
" Remap semicolon to colon for easier commands
|
||||
nnoremap ; :
|
||||
|
||||
" Yank from cursor to end of line (consistent with C and D)
|
||||
nnoremap Y y$
|
||||
|
||||
" Em-dash insertion
|
||||
inoremap ,- —
|
||||
|
||||
" Working directory shortcuts
|
||||
cmap cwd lcd %:p:h
|
||||
cmap cd. lcd %:p:h
|
||||
|
||||
" Write with sudo if you forgot to open with sudo
|
||||
cmap w!! w !sudo tee % >/dev/null
|
||||
|
||||
" Disable automatic comment continuation
|
||||
autocmd FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
|
||||
|
||||
" Load vim helper functions if they exist
|
||||
if filereadable(expand("~/.vim/dates.vim"))
|
||||
source ~/.vim/dates.vim
|
||||
endif
|
||||
|
||||
if filereadable(expand("~/.vim/emoji.vim"))
|
||||
source ~/.vim/emoji.vim
|
||||
endif
|
||||
|
||||
" Enable filetype detection and indenting
|
||||
filetype plugin indent on
|
||||
@@ -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
|
||||
1
x86_64/airootfs/etc/sudoers.d/wheel
Normal file
1
x86_64/airootfs/etc/sudoers.d/wheel
Normal file
@@ -0,0 +1 @@
|
||||
%wheel ALL=(ALL:ALL) ALL
|
||||
1
x86_64/airootfs/etc/sysctl.d/20-quiet-printk.conf
Normal file
1
x86_64/airootfs/etc/sysctl.d/20-quiet-printk.conf
Normal file
@@ -0,0 +1 @@
|
||||
kernel.printk = 3 3 3 3
|
||||
@@ -0,0 +1,3 @@
|
||||
[Journal]
|
||||
Storage=volatile
|
||||
SystemMaxUse=20M
|
||||
2
x86_64/airootfs/etc/systemd/resolved.conf.d/dnssec.conf
Normal file
2
x86_64/airootfs/etc/systemd/resolved.conf.d/dnssec.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
[Resolve]
|
||||
DNSSEC=no
|
||||
@@ -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
|
||||
@@ -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
|
||||
16
x86_64/airootfs/etc/systemd/system/log-to-ram-setup.service
Normal file
16
x86_64/airootfs/etc/systemd/system/log-to-ram-setup.service
Normal file
@@ -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'
|
||||
11
x86_64/airootfs/etc/systemd/system/log-to-ram-sync.timer
Normal file
11
x86_64/airootfs/etc/systemd/system/log-to-ram-sync.timer
Normal file
@@ -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 @@
|
||||
/usr/lib/systemd/system/NetworkManager.service
|
||||
@@ -0,0 +1 @@
|
||||
/usr/lib/systemd/system/brltty.path
|
||||
@@ -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
|
||||
@@ -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
|
||||
13
x86_64/airootfs/etc/systemd/system/stormux-repo-init.service
Normal file
13
x86_64/airootfs/etc/systemd/system/stormux-repo-init.service
Normal file
@@ -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
|
||||
16
x86_64/airootfs/etc/systemd/system/stormux-speech.service
Normal file
16
x86_64/airootfs/etc/systemd/system/stormux-speech.service
Normal file
@@ -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
|
||||
1
x86_64/airootfs/etc/systemd/system/systemd-firstboot.service
Symbolic link
1
x86_64/airootfs/etc/systemd/system/systemd-firstboot.service
Symbolic link
@@ -0,0 +1 @@
|
||||
/dev/null
|
||||
11
x86_64/airootfs/etc/systemd/system/time_sync_at_boot.service
Normal file
11
x86_64/airootfs/etc/systemd/system/time_sync_at_boot.service
Normal file
@@ -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
|
||||
3
x86_64/airootfs/etc/vconsole.conf
Normal file
3
x86_64/airootfs/etc/vconsole.conf
Normal file
@@ -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)
|
||||
4
x86_64/airootfs/home/stormux/.bash_aliases
Normal file
4
x86_64/airootfs/home/stormux/.bash_aliases
Normal file
@@ -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}"'
|
||||
21
x86_64/airootfs/home/stormux/.bash_functions
Normal file
21
x86_64/airootfs/home/stormux/.bash_functions
Normal file
@@ -0,0 +1,21 @@
|
||||
memuse() {
|
||||
ps axo rss,comm,pid \
|
||||
| awk '{ proc_list[$2] += $1; } END \
|
||||
{ for (proc in proc_list) { printf("%d\t%s\n", proc_list[proc],proc); }}' \
|
||||
| sort -n | tail -n 10 | sort -rn \
|
||||
| awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}'
|
||||
}
|
||||
|
||||
|
||||
pdf()
|
||||
{
|
||||
if [[ $# -ne 1 ]]; then
|
||||
echo 'Usage: pdf <file>' >&2
|
||||
else
|
||||
local dir=$(mktemp -d -p /tmp pdf_conversion.XXXXXX)
|
||||
local outFile="${1##*/}"
|
||||
local outFile="${outFile%.*}"
|
||||
pdftohtml -noframes -i -s "$1" "${dir}/${outFile}.html"
|
||||
w3m -s "${dir}/${outFile}.html"
|
||||
fi
|
||||
}
|
||||
24
x86_64/airootfs/home/stormux/.bashrc
Normal file
24
x86_64/airootfs/home/stormux/.bashrc
Normal file
@@ -0,0 +1,24 @@
|
||||
#
|
||||
# ~/.bashrc
|
||||
#
|
||||
|
||||
# If not running interactively, don't do anything
|
||||
[[ $- != *i* ]] && return
|
||||
|
||||
#Change directories without using cd
|
||||
shopt -s autocd
|
||||
|
||||
# Keep bash history in screen
|
||||
export HISTFILE="${HISTFILE}${WINDOW:+.${WINDOW}}"
|
||||
|
||||
# load Aliases and functions
|
||||
[[ -f ".bash_aliases" ]] && source .bash_aliases
|
||||
[[ -f ".bash_functions" ]] && source .bash_functions
|
||||
#Invironment variables
|
||||
PS1='[\u@\h \W] \$ '
|
||||
export DIALOGOPTS='--no-lines --visit-items'
|
||||
GPG_TTY=$(tty)
|
||||
export GPG_TTY
|
||||
# Don't put commands prefixed with space, or duplicate commands in history
|
||||
export HISTCONTROL=ignoreboth
|
||||
|
||||
@@ -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 @@
|
||||
../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
|
||||
@@ -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,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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
6
x86_64/airootfs/home/stormux/.inputrc
Normal file
6
x86_64/airootfs/home/stormux/.inputrc
Normal file
@@ -0,0 +1,6 @@
|
||||
# Reload changes with control+x followed by control+r
|
||||
set echo-control-characters off
|
||||
|
||||
# History searching with up and down arrows.
|
||||
"\e[A": history-search-backward
|
||||
"\e[B": history-search-forward
|
||||
18
x86_64/airootfs/home/stormux/.screenrc
Normal file
18
x86_64/airootfs/home/stormux/.screenrc
Normal file
@@ -0,0 +1,18 @@
|
||||
vbell off
|
||||
bell_msg ""
|
||||
hardstatus off
|
||||
startup_message off
|
||||
defscrollback 4096
|
||||
bind ! select 10
|
||||
bind @ select 11
|
||||
bind \# select 12
|
||||
bind $ select 13
|
||||
bind % select 14
|
||||
bind ^ select 15
|
||||
bind & select 16
|
||||
bind * select 17
|
||||
bind ( select 18
|
||||
bind ) select 19
|
||||
bind b eval "writebuf" 'exec !!! xclip -selection "clipboard" -i /tmp/screen-exchange'
|
||||
#termcapinfo xterm|xterms|xs|rxvt ti@:te@
|
||||
termcapinfo xterm* ti@:te@
|
||||
36
x86_64/airootfs/root/.config/pulse/client.conf
Normal file
36
x86_64/airootfs/root/.config/pulse/client.conf
Normal file
@@ -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
|
||||
51
x86_64/airootfs/root/customize_airootfs.sh
Normal file
51
x86_64/airootfs/root/customize_airootfs.sh
Normal file
@@ -0,0 +1,51 @@
|
||||
#!/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
|
||||
|
||||
# Copy Stormux custom skel files to /etc/skel
|
||||
# This is done after package installation to avoid conflicts with packages like screen
|
||||
echo "Copying Stormux custom skel files..."
|
||||
if [ -d /etc/skel.stormux ]; then
|
||||
cp -a /etc/skel.stormux/. /etc/skel/
|
||||
echo "Stormux skel files copied to /etc/skel"
|
||||
else
|
||||
echo "Warning: /etc/skel.stormux not found"
|
||||
fi
|
||||
|
||||
echo "Airootfs customization complete"
|
||||
103
x86_64/airootfs/root/rename-user.sh
Executable file
103
x86_64/airootfs/root/rename-user.sh
Executable file
@@ -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
|
||||
29
x86_64/airootfs/root/stormux_repo.pub
Normal file
29
x86_64/airootfs/root/stormux_repo.pub
Normal file
@@ -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-----
|
||||
1
x86_64/airootfs/skel
Symbolic link
1
x86_64/airootfs/skel
Symbolic link
@@ -0,0 +1 @@
|
||||
../../../pi4/files/etc/skel
|
||||
80
x86_64/airootfs/usr/local/bin/configure-stormux
Executable file
80
x86_64/airootfs/usr/local/bin/configure-stormux
Executable file
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
trap cleanup EXIT
|
||||
cleanup() {
|
||||
echo "Thank you for choosing Stormux!"
|
||||
}
|
||||
|
||||
# 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
|
||||
|
||||
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"
|
||||
set_timezone
|
||||
else
|
||||
echo "Please connect to the internet and run ${0##*/} again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo
|
||||
read -rp "Would you like to run the Stormux installer? [y/N]: " answer
|
||||
answer="${answer:0:1}"
|
||||
if [[ "${answer,,}" == "y" ]]; then
|
||||
install-stormux
|
||||
else
|
||||
echo
|
||||
echo "To run the Stormux installer, type install-stormux"
|
||||
echo
|
||||
exit 0
|
||||
fi
|
||||
21
x86_64/airootfs/usr/local/bin/init-pipewire-sound.sh
Executable file
21
x86_64/airootfs/usr/local/bin/init-pipewire-sound.sh
Executable file
@@ -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
|
||||
1638
x86_64/airootfs/usr/local/bin/install-stormux
Executable file
1638
x86_64/airootfs/usr/local/bin/install-stormux
Executable file
File diff suppressed because it is too large
Load Diff
24
x86_64/airootfs/usr/local/bin/livecd-sound
Executable file
24
x86_64/airootfs/usr/local/bin/livecd-sound
Executable file
@@ -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
x86_64/airootfs/usr/local/bin/setup-pipewire-live.sh
Executable file
22
x86_64/airootfs/usr/local/bin/setup-pipewire-live.sh
Executable file
@@ -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
x86_64/airootfs/usr/local/bin/stormux-setup.sh
Executable file
73
x86_64/airootfs/usr/local/bin/stormux-setup.sh
Executable file
@@ -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"
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user