Unattended openSUSE Tumbleweed deployments on bare metal are critical because they eliminate manual intervention, ensure configuration consistency, and drastically reduce provisioning time across physical infrastructure. While Tumbleweed is a rolling-release distribution - traditionally favored by developers and power users on personal machines - deploying it at scale on bare metal using unattended methods providing by Agama Installer serves several vital engineering and operational purposes:
• Elimination of Human Error: Manual OS installations introduce variances in disk partitioning, package selection, and initial network setups. Unattended installations use a version-controlled configuration file (like profile.json) to guarantee
that server is an exact clone of the intended specification.
• Declarative Infrastructure: Treating your bare-metal OS installation as code aligns your physical infrastructure with modern DevOps practices, making state drift easier to prevent and audit.
After booting via USB pen on target box,right after you see the first screen for selection of desired OS . You are supposed to press CTRL+ALT+F3 without any other input into the first page of Agama Web UI. You would see in terminal IP-TARGET of target host and root password. From another box launch your browser to https://IP-TARGET. This step will bring you to Agama WEB UI and prompt for root "password".
After entering WEB UI environment select OS (Tumbleweed for instance) manage as usual until creating root account. You should have SSH trusted pair already generated prior to configuring
root's credentials on target box. I've selected password and SSH public key.
Cut and paste SSH Public key into corresponding field on Agama
Configuration been created via Anaconda Web UI will be available via clicking small circle in right upper corner of the page. When you finished disk layout config, DE selection, packages selection, user's and root credentials along with ssh public key for root you may copy and paste your configuration into ~/Downloads/profile.json.
You may also download file system_name.json and copy to profile.json. Next step is just cut and paste ~/Downloads/profile.json into /tmp/profile.json inside Agama Live Instance via open by root ssh session with Live Instance on target box
CTRL+ALT+F3 has already created Live Agama instance on target host . Live Agama instance was created with sshd service already up and running. SSH to target host via known temp-password for root. After logging into Agama Live instance on target host you will appear on prompt agama~#
You are supposed to issue from agama:~# prompt following commands :
agama:~ # agama config load /tmp/profile.json
Ready to start the installation.
agama:~ # agama install
The expected result is running Tumbleweed deployment on target box, actually, in Agama Live instance environment. (*)
Speed of downloading 4894 packages would be pretty high except several packages like kernel-default and final one related to plasma setup on tumbleweed.
When done you should see a message in terminal
agama:~ # agama install
The installation finished successfully.
Next go ahead and reboot target box
agama:~ # systemctl reboot.
Broken SDDM login prompt may be fixed remotely via root login using injected ssh-public-key been written into profile.json
# systemctl disable sddm.service --force
# systemctl set-default multi-user.target
# mkdir -p /etc/systemd/system/getty@tty1.service.d
# nano /etc/systemd/system/getty@tty1.service.d/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin user1 --noclear %I $TERM
CTRL+O; CTRL+X
# su - user1
======================
$ nano ~/.bash_profile
======================
# Source the user1's primary bash configuration if it exists
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# Automatically launch KDE Plasma Wayland if logging in on TTY1
if [ -z "${DISPLAY}" ] && [ "${XDG_VTNR}" -eq 1 ]; then
exec /usr/bin/startplasma-wayland
fi
Final configuration on openSUSE Tumbleweed instance been installed on target box in unattended mode using profile.json been generated in Agama Web UI environment on remote workstation and injecting profile.json into Agama Live Instance created by pressing CTRL+ALT+F3 on target host almost silently with no additional information provided to you
boris@localhost:~> fastfetch
,..., boris@localhost
.,:lloooooc;. ---------------
,ool' oo,;oo: OS: openSUSE Tumbleweed x86_64
.lo' oo. oo: Kernel: Linux 7.3.1-1-default
.oo. oo. oo: Uptime: 1 hour, 50 mins
:ol oo. 'oo Packages: 2464 (rpm)
:oo .oo. .oo. Shell: bash 5.3.20
.oooooooooooooo. .oo. Display (E215A): 1920x1080 in 21", 60 Hz [External]
;oo. .oo. Desktop Environment: KDE Plasma 6.8.2
'oo, .oo. Window Manager: KWin (Wayland)
"ooc,',,,,,,,,,,:ooc,,,,,,,,,,, WM Theme: Breeze
':cooooooooooooooooooooooooool;. Theme: Breeze (Classic) [Qt], Breeze [GTK2/3]
.oo. .oo; Icons: breeze [Qt], breeze [GTK2/3/4]
.oo. .oo. Font: Noto Sans (12pt) [Qt], Noto Sans (12pt) [GTK2/3/4]
.oo. 'oooooooooo:ooo. Cursor: breeze (24px)
.oo. 'oo. col Terminal: konsole 26.8.3
.oo' 'oo col Terminal Font: Hack (17pt)
coo 'oo oo' CPU: Intel(R) Xeon(R) E5-2690 v3 (24) @ 3.50 GHz
coc 'oo .lo, GPU: AMD Radeon HD 6450/7450/8450 / R5 230 OEM
`oo, 'oo .:oo Memory: 2.71 GiB / 31.24 GiB (9%)
'ooooc,, ,:lol Swap: Disabled
`''"clc"' Disk (/): 7.01 GiB / 128.00 GiB (5%) - btrfs
Disk (/opt): 4.93 GiB / 255.88 GiB (2%) - xfs
Local IP (bridge0): 192.168.0.57/24
Locale: en_US.UTF-8
boris@localhost:~> df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 btrfs 128G 7.1G 120G 6% /
devtmpfs devtmpfs 16G 0 16G 0% /dev
tmpfs tmpfs 16G 0 16G 0% /dev/shm
efivarfs efivarfs 256K 111K 141K 44% /sys/firmware/efi/efivars
tmpfs tmpfs 6.3G 2.0M 6.3G 1% /run
none tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service
tmpfs tmpfs 16G 8.0K 16G 1% /tmp
/dev/sda3 btrfs 128G 7.1G 120G 6% /.snapshots
/dev/sda3 btrfs 128G 7.1G 120G 6% /usr/local
/dev/sda3 btrfs 128G 7.1G 120G 6% /srv
/dev/sda3 btrfs 128G 7.1G 120G 6% /var
/dev/sda3 btrfs 128G 7.1G 120G 6% /home
/dev/sda3 btrfs 128G 7.1G 120G 6% /root
/dev/sda4 xfs 256G 5.0G 251G 2% /opt
/dev/sda2 ext4 2.3G 107M 2.0G 5% /boot
/dev/sda1 vfat 953M 101M 852M 11% /boot/efi
none tmpfs 1.0M 0 1.0M 0% /run/credentials/getty@tty1.service
tmpfs tmpfs 3.2G 76K 3.2G 1% /run/user/1000
boris@localhost:~> lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1 vfat FAT32 B4E0-5428 851.4M 11% /boot/efi
├─sda2 ext4 1.0 f2aa55cd-cdcd-4dbc-a5bb-a5d30380c474 2G 5% /boot
├─sda3 btrfs 1c6c08f5-3d5c-4d00-b5d0-15779f5a5ea8 /etc/libvirt/qemu
│ /root
│ /home
│ /var
│ /srv
│ /usr/local
│ /.snapshots
│ /
└─sda4 xfs d81d8fb0-1d1e-429f-bdea-d5c72ebd3606 250.9G 2% /opt
boris@localhost:~> findmnt -t btrfs
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda3[/@/.snapshots/1/snapshot] btrfs rw,relatime,seclabel,space_cache=v2,subvolid=263,subvol=/@/.snapshots/1/
├─/home /dev/sda3[/@/home] btrfs rw,relatime,seclabel,space_cache=v2,subvolid=261,subvol=/@/home
├─/root /dev/sda3[/@/root] btrfs rw,relatime,seclabel,space_cache=v2,subvolid=260,subvol=/@/root
├─/.snapshots /dev/sda3[/@/.snapshots] btrfs rw,relatime,seclabel,space_cache=v2,subvolid=262,subvol=/@/.snapshots
├─/srv /dev/sda3[/@/srv] btrfs rw,relatime,seclabel,space_cache=v2,subvolid=259,subvol=/@/srv
├─/usr/local /dev/sda3[/@/usr/local] btrfs rw,relatime,seclabel,space_cache=v2,subvolid=258,subvol=/@/usr/local
├─/var /dev/sda3[/@/var] btrfs rw,relatime,seclabel,space_cache=v2,subvolid=257,subvol=/@/var
└─/etc/libvirt/qemu /dev/sda3[/@qemu] btrfs rw,relatime,seclabel,space_cache=v2,subvolid=270,subvol=/@qemu
boris@localhost:~> lsblk -d -o NAME,VENDOR,MODEL,SIZE,SERIAL|grep 596
sda ATA WDC WD6401AALS-00E3A0 596.2G WD-WCATR4549247
======================
Batch mode version (*)
======================
#!/bin/bash
# # openSUSE Tumbleweed Minimal Remote Provisioner
# Run from Workstation (192.168.0.17) targeting Host (192.168.0.88)
#
set -e
TARGET_IP="192.168.0.88"
TEMP_PASSWORD="p646kPZy"
LOCAL_PROFILE="/home/boris/Downloads/profile.json"
# Export password for sshpass to run hands-off
export SSHPASS=$TEMP_PASSWORD
echo "1. Flushing target host key signature..."
ssh-keygen -f "$HOME/.ssh/known_hosts" -R "$TARGET_IP" 2>/dev/null || true
echo "2. Copying profile.json to target RAM filesystem..."
sshpass -e scp -o StrictHostKeyChecking=no "$LOCAL_PROFILE" root@$TARGET_IP:/tmp/profile.json
echo "3. Ingesting profile and executing installation on target..."
sshpass -e ssh -o StrictHostKeyChecking=no root@$TARGET_IP bash << 'EOF'
set -e
agama config load /tmp/profile.json
agama install
systemctl reboot
EOF
echo "Deployment triggered successfully. Target box is rebooting."
REFERENCES
(*) Assisted by Google AI








