Switch VM setup from Arch Linux to Ubuntu 22.04

Arch ARM tooling has limited support on UTM/Apple Silicon.
Ubuntu 22.04 gallery image works out of the box.

- setup.sh: apt-get packages, Ubuntu paths (/sbin/agetty, .profile)
- README.md: UTM gallery workflow instead of manual ISO install
- Default repo URL: github.com/CloudNebulaProject/wayray
This commit is contained in:
Till Wegmueller 2026-04-07 13:41:22 +02:00
parent 0fa1f63c8a
commit 84c479eaca
2 changed files with 88 additions and 79 deletions

View file

@ -1,7 +1,7 @@
# WayRay VM Testing Setup # WayRay VM Testing Setup
Visual testing environment for the WayRay compositor using an Arch Linux Visual testing environment for the WayRay compositor using an Ubuntu
aarch64 VM on macOS Apple Silicon via UTM. 22.04 aarch64 VM on macOS Apple Silicon via UTM.
## Prerequisites ## Prerequisites
@ -10,60 +10,40 @@ aarch64 VM on macOS Apple Silicon via UTM.
## Create the VM ## Create the VM
### 1. Download the Arch Linux ARM ISO ### 1. Get the Ubuntu 22.04 image from the UTM Gallery
Go to <https://archlinux.org/download/> and download the latest aarch64 1. Open UTM
ISO image. 2. Click **+** to create a new VM
3. Select **Browse UTM Gallery...**
4. Find and download **Ubuntu 22.04**
5. The VM is pre-configured with reasonable defaults
### 2. Create a new VM in UTM ### 2. Adjust VM settings (optional)
1. Open UTM, click **Create a New Virtual Machine** The gallery image works out of the box, but for faster Rust compilation:
2. Select **Virtualize**
3. Select **Linux** 1. Select the VM in UTM, click the **settings icon**
4. Browse to the downloaded ISO 2. Under **System**:
5. Configure hardware: - **CPU:** 4 cores (or more)
- **CPU:** 4 cores
- **RAM:** 8192 MB (8 GB) - **RAM:** 8192 MB (8 GB)
6. Configure storage:
- **Disk size:** 30 GB
7. Give it a name (e.g., "WayRay Dev")
8. Click **Save**
The VM defaults to VirtIO display and shared networking, which is what ### 3. Boot and run the setup script
we need.
### 3. Install Arch Linux 1. Start the VM and log in (gallery image credentials are shown in UTM)
2. Open a terminal and run:
1. Boot the VM from the ISO
2. Run `archinstall`
3. Recommended settings:
- **Mirrors:** Select your region
- **Disk configuration:** Use entire disk, ext4
- **Bootloader:** systemd-boot
- **Profile:** Minimal
- **User:** Create a user with sudo privileges
- **Network:** NetworkManager
4. Complete the installation and reboot
5. Remove the ISO from the VM's CD drive in UTM settings
### 4. Run the setup script
Boot into the installed system and log in, then:
```bash ```bash
# Install git first (needed to clone the repo)
sudo pacman -S git --noconfirm
# Clone WayRay and run the setup script # Clone WayRay and run the setup script
git clone <your-wayray-repo-url> ~/wayray git clone https://github.com/CloudNebulaProject/wayray.git ~/wayray
bash ~/wayray/vm/setup.sh bash ~/wayray/vm/setup.sh
# Reboot to apply auto-login and start Sway # Reboot to apply auto-login and start Sway
sudo reboot sudo reboot
``` ```
Note: the script skips cloning if `~/wayray` already exists, so passing The setup script installs all dependencies (Wayland libs, Mesa, Sway,
the repo URL to `setup.sh` is only needed if you haven't cloned yet. Rust), builds WayRay, and configures auto-login into a minimal Sway
session.
## Testing the Compositor ## Testing the Compositor
@ -103,29 +83,40 @@ A foot terminal should appear inside the wrsrvd window. You can:
### Sway fails to start ### Sway fails to start
If Sway fails with a GPU error, the VirtIO GPU may not be working If Sway fails with a GPU or seat error:
with Apple Virtualization.framework. Try switching UTM to QEMU backend:
```bash
# Check seatd is running
systemctl status seatd
# Check group membership (need seat and video)
groups
# If missing, add and reboot
sudo usermod -aG seat,video $USER
sudo reboot
```
If the VirtIO GPU isn't working, try switching UTM to QEMU backend:
1. Shut down the VM 1. Shut down the VM
2. In UTM, edit the VM settings 2. Edit VM settings
3. Under **System**, uncheck "Use Apple Virtualization" 3. Under **System**, uncheck "Use Apple Virtualization"
4. Under **Display**, ensure VirtIO GPU is selected 4. Boot again
5. Boot again
### Black screen after reboot ### Black screen after reboot
The auto-login or Sway autostart may have failed. Switch to TTY2 with Switch to TTY2 with `Ctrl+Alt+F2`, log in, and check:
`Ctrl+Alt+F2`, log in, and check:
```bash ```bash
# Check if seatd is running
systemctl status seatd
# Check if user is in seat group
groups
# Try starting Sway manually # Try starting Sway manually
sway sway
# Check the auto-login override
cat /etc/systemd/system/getty@tty1.service.d/override.conf
# Check .profile for Sway launch
tail ~/.profile
``` ```
### Build fails ### Build fails
@ -140,3 +131,12 @@ rustc --version
# Retry # Retry
cargo build --workspace cargo build --workspace
``` ```
### Missing Wayland/EGL libraries
If `cargo build` fails with missing `-lwayland-client` or EGL errors:
```bash
# Reinstall dev packages
sudo apt-get install -y libwayland-dev libegl1-mesa-dev libgles2-mesa-dev libxkbcommon-dev
```

View file

@ -1,11 +1,11 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# WayRay VM Provisioning Script # WayRay VM Provisioning Script
# Run as a regular user inside a fresh Arch Linux aarch64 install. # Run as a regular user inside an Ubuntu 22.04 aarch64 VM (UTM gallery image).
# Idempotent — safe to run multiple times. # Idempotent — safe to run multiple times.
set -euo pipefail set -euo pipefail
REPO_URL="${1:-}" REPO_URL="${1:-https://github.com/CloudNebulaProject/wayray.git}"
WAYRAY_DIR="$HOME/wayray" WAYRAY_DIR="$HOME/wayray"
info() { printf '\033[1;34m==> %s\033[0m\n' "$*"; } info() { printf '\033[1;34m==> %s\033[0m\n' "$*"; }
@ -15,45 +15,58 @@ ok() { printf '\033[1;32m==> %s\033[0m\n' "$*"; }
# ── 1. System packages ─────────────────────────────────────────────── # ── 1. System packages ───────────────────────────────────────────────
info "Updating system packages..." info "Updating system packages..."
sudo pacman -Syu --noconfirm sudo apt-get update
sudo apt-get upgrade -y
PACKAGES=( PACKAGES=(
# Build tools # Build tools
base-devel build-essential
pkg-config
cmake
# Wayland # Wayland
wayland libwayland-dev
wayland-protocols wayland-protocols
libxkbcommon libxkbcommon-dev
# Graphics (Mesa provides EGL/OpenGL for Winit's GlesRenderer) # Graphics (Mesa provides EGL/OpenGL for Winit's GlesRenderer)
mesa libgles2-mesa-dev
libegl1-mesa-dev
libgbm-dev
libdrm-dev
# Session # Session
sway sway
seatd
foot foot
seatd
# Tools # Tools
git git
openssh curl
openssh-client
) )
info "Installing packages..." info "Installing packages..."
sudo pacman -S --needed --noconfirm "${PACKAGES[@]}" sudo apt-get install -y "${PACKAGES[@]}"
# ── 2. Services ────────────────────────────────────────────────────── # ── 2. Services ──────────────────────────────────────────────────────
info "Enabling seatd..." info "Enabling seatd..."
sudo systemctl enable --now seatd sudo systemctl enable --now seatd || true
# Add user to seat group if not already a member. # Add user to seat group if not already a member.
if ! groups | grep -q '\bseat\b'; then if getent group seat &>/dev/null && ! groups | grep -q '\bseat\b'; then
info "Adding $USER to seat group..." info "Adding $USER to seat group..."
sudo usermod -aG seat "$USER" sudo usermod -aG seat "$USER"
warn "Group change requires re-login. Re-run this script after reboot." warn "Group change requires re-login. Re-run this script after reboot."
fi fi
# Some Ubuntu setups need the user in video group for GPU access.
if ! groups | grep -q '\bvideo\b'; then
info "Adding $USER to video group..."
sudo usermod -aG video "$USER"
fi
# ── 3. Rust toolchain ──────────────────────────────────────────────── # ── 3. Rust toolchain ────────────────────────────────────────────────
if command -v cargo &>/dev/null; then if command -v cargo &>/dev/null; then
@ -65,11 +78,15 @@ else
source "$HOME/.cargo/env" source "$HOME/.cargo/env"
fi fi
# Make cargo available in this session if .cargo/env exists.
# shellcheck disable=SC1091
[ -f "$HOME/.cargo/env" ] && source "$HOME/.cargo/env"
# Verify edition 2024 support (Rust 1.85+). # Verify edition 2024 support (Rust 1.85+).
RUST_VERSION=$(rustc --version | grep -oP '\d+\.\d+') RUST_VERSION=$(rustc --version | sed -n 's/rustc \([0-9]*\.[0-9]*\).*/\1/p')
RUST_MAJOR=$(echo "$RUST_VERSION" | cut -d. -f1) RUST_MAJOR=$(echo "$RUST_VERSION" | cut -d. -f1)
RUST_MINOR=$(echo "$RUST_VERSION" | cut -d. -f2) RUST_MINOR=$(echo "$RUST_VERSION" | cut -d. -f2)
if (( RUST_MAJOR < 1 || (RUST_MAJOR == 1 && RUST_MINOR < 85) )); then if [ "$RUST_MAJOR" -lt 1 ] || { [ "$RUST_MAJOR" -eq 1 ] && [ "$RUST_MINOR" -lt 85 ]; }; then
warn "Rust $RUST_VERSION may not support edition 2024. Run: rustup update" warn "Rust $RUST_VERSION may not support edition 2024. Run: rustup update"
fi fi
@ -78,15 +95,7 @@ fi
if [ -d "$WAYRAY_DIR" ]; then if [ -d "$WAYRAY_DIR" ]; then
ok "WayRay repo already cloned at $WAYRAY_DIR" ok "WayRay repo already cloned at $WAYRAY_DIR"
else else
if [ -z "$REPO_URL" ]; then info "Cloning WayRay from $REPO_URL..."
echo ""
echo "WayRay repo URL not provided."
echo "Usage: $0 <git-repo-url>"
echo "Example: $0 https://github.com/user/wayray.git"
echo " $0 git@github.com:user/wayray.git"
exit 1
fi
info "Cloning WayRay..."
git clone "$REPO_URL" "$WAYRAY_DIR" git clone "$REPO_URL" "$WAYRAY_DIR"
fi fi
@ -106,13 +115,13 @@ else
sudo tee "$GETTY_OVERRIDE" > /dev/null <<EOF sudo tee "$GETTY_OVERRIDE" > /dev/null <<EOF
[Service] [Service]
ExecStart= ExecStart=
ExecStart=-/usr/bin/agetty --autologin $USER --noclear %I \$TERM ExecStart=-/sbin/agetty --autologin $USER --noclear %I \$TERM
EOF EOF
sudo systemctl daemon-reload sudo systemctl daemon-reload
fi fi
# Start Sway on TTY1 login (only if not already in a graphical session). # Start Sway on TTY1 login (only if not already in a graphical session).
PROFILE="$HOME/.bash_profile" PROFILE="$HOME/.profile"
SWAY_LAUNCH='[ "$(tty)" = "/dev/tty1" ] && exec sway' SWAY_LAUNCH='[ "$(tty)" = "/dev/tty1" ] && exec sway'
if ! grep -qF 'exec sway' "$PROFILE" 2>/dev/null; then if ! grep -qF 'exec sway' "$PROFILE" 2>/dev/null; then
info "Adding Sway auto-start to $PROFILE..." info "Adding Sway auto-start to $PROFILE..."