Foundation Setup

Initial Headless Setup

  • Configure Network (Static IP recommended).
  • Crucial: Deselect all Desktops (keep it Headless).
  • Install OpenSSH Server.

List Users

cat /etc/passwd

Change Password

sudo passwd 

Create Admin User

adduser admin
usermod -aG sudo admin

Enable Password-less Sudo

echo "admin ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/admin
chmod 0440 /etc/sudoers.d/admin

APT Update

sudo apt update

APT Upgrade

sudo apt upgrade

Console Mode

Hide Kernal Messages

Clean fast boot.

sudo nano /etc/default/grub

GRUB_DEFAULT=0
GRUB_TIMEOUT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_DISABLE_OS_PROBER=true
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash loglevel=0 systemd.show_status=false console=tty3"

sudo grub-editenv /boot/grub/grubenv unset saved_entry
sudo update-grub
sudo reboot

Switch to Console Mode

If you have a desktop installed (Mint/Ubuntu), disable it to save resources.

sudo systemctl set-default multi-user.target

Switch to GUI Mode

If you have a desktop installed (Mint/Ubuntu).

sudo systemctl set-default graphical.target

GUI Mode Auto Login

Auto login to desktop.

sudo nano /etc/lightdm/lightdm.conf

[Seat:*]
autologin-user=your_username
autologin-session=xfce

sudo systemctl restart lightdm

Dependencies

Install Build Tools

sudo apt install build-essential git

Install Libraries

Required for Tkinter, SQLite, and SSL support.

sudo apt install libsqlite3-dev tk-dev tcl-dev libssl-dev zlib1g-dev libffi-dev libbz2-dev libreadline-dev libncursesw5-dev liblzma-dev uuid-dev libgdbm-dev libmpdec-dev

GUI Infrastructure

Full XFCE (Split Install)

Mint-style XFCE feel: LightDM + slick greeter, Whisker menu (search), Thunar media integration, good defaults.

Base GUI + Login

Xorg + XFCE + LightDM + slick greeter.

sudo apt install -y xserver-xorg xinit dbus-x11 xfce4 xfce4-goodies lightdm lightdm-gtk-greeter xfce4-screensaver xfce4-power-manager at-spi2-core

Menu + Panel niceness

Mint-like searchable start menu (Whisker).

sudo apt install -y xfce4-whiskermenu-plugin

Networking + GUI editor

NetworkManager with the GUI editor.

sudo apt install -y network-manager network-manager-gnome

PolicyKit prompts

Auth prompts for admin actions inside XFCE.

sudo apt install -y pkexec polkitd

Audio (PipeWire)

PipeWire + Pulse compatibility + mixer UI.

sudo apt install -y pipewire wireplumber pipewire-pulse pavucontrol xfce4-pulseaudio-plugin

Filesystem / Removable Media

Thunar volume management + GVFS + UDisks2.

sudo apt install -y thunar thunar-volman gvfs gvfs-backends udisks2 xdg-user-dirs

Core apps

Terminal, editor, archive support, image viewer.

sudo apt install -y xfce4-terminal mousepad file-roller thunar-archive-plugin tumbler ristretto blueman

Fonts + Theme

Clean fonts and a modern theme set.

sudo apt install -y fonts-noto fonts-noto-color-emoji fonts-liberation papirus-icon-theme arc-theme

Icons

Clean fonts and a modern icon set.

sudo apt install -y hicolor-icon-theme adwaita-icon-theme
sudo gtk-update-icon-cache /usr/share/icons/hicolor

Enable services

sudo systemctl enable --now NetworkManager lightdm

Install Minimal X11 Kiosk

Only needed if you are on a "Headless" or Server build.

sudo apt install xserver-xorg xinit xserver-xorg-legacy x11-xserver-utils xterm xserver-xorg-input-libinput fonts-dejavu-core

Fix Non-Root Permissions

echo -e "needs_root_rights=yes\nallowed_users=anybody" | sudo tee /etc/X11/Xwrapper.config
# Add your user to video/tty groups
sudo usermod -aG video,tty $USER

Optional VM Tools

Virtual machine tools. (Disbale Accelerate 3D graphics)

sudo apt install open-vm-tools open-vm-tools-desktop

Python Setup

Manual Custom Install

cd /tmp
wget https://www.python.org/ftp/python/3.14.3/Python-3.14.3.tar.xz
tar -xf Python-3.14.3.tar.xz
cd Python-3.14.3

Compile No Gil

./configure --disable-gil --enable-optimizations --with-lto --prefix=/opt/python/nogil
make -j$(nproc)
sudo make altinstall

Link Commands With Prefix

sudo ln -sf /opt/python/nogil/bin/python3.14t /usr/local/bin/pythont
sudo ln -sf /opt/python/nogil/bin/pip3.14 /usr/local/bin/pipt

Link Commands Without Prefix

sudo ln -sf /usr/local/bin/python3.14t /usr/local/bin/pythont
sudo ln -sf /usr/local/bin/pip3.14 /usr/local/bin/pipt

Compile Gil

./configure --enable-optimizations --with-lto --prefix=/opt/python/gil
make -j$(nproc)
sudo make altinstall

Link Commands With Prefix

sudo ln -sf /opt/python/gil/bin/python3.14 /usr/local/bin/python
sudo ln -sf /opt/python/gil/bin/pip3.14 /usr/local/bin/pip

Link Commands Without Prefix

sudo ln -sf /usr/local/bin/python3.14 /usr/local/bin/python
sudo ln -sf /usr/local/bin/pip3.14 /usr/local/bin/pip

Check Python Install

python -c "import sys, platform; print(f'{platform.python_implementation()} {platform.python_version()} ({platform.python_compiler()}) [{sys.version}]')"

Virtual Environment

python -m venv Test
source Test/bin/activate
deactivate

Run Thread Free

sudo python -X gil=0 File.py

RTOS Kernel

Check Architecture

uname -m
# x86_64 → AMD/Intel
# armv7l or aarch64 → ARM

Install RT Kernel

# AMD/Intel
sudo apt install linux-image-rt-amd64
sudo reboot

# ARM (Raspberry Pi / SBC)
sudo apt install linux-image-rt-arm64
sudo reboot

Verify Kernel

uname -a
# Look for PREEMPT_RT

Clean Old Kernels (Optional)

dpkg -l | grep linux-image
sudo apt remove linux-image-amd64 linux-image-6.*-amd64
sudo update-grub

Enable Threaded IRQs

sudo nano /etc/default/grub
# AMD/Intel example:
GRUB_CMDLINE_LINUX_DEFAULT="quiet threadirqs"
sudo update-grub
sudo reboot

# ARM example (optional):
GRUB_CMDLINE_LINUX_DEFAULT="quiet"

Set CPU Governor to Performance

sudo apt install cpufrequtils
sudo cpufreq-set -g performance
sudo cpupower frequency-set -g performance
# Make permanent:
echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils

Set Real-Time Limits

sudo nano /etc/security/limits.conf
@realtime   -  rtprio     99
@realtime   -  memlock    unlimited

sudo groupadd realtime
sudo usermod -aG realtime <your-user>
# Log out and log back in

Test Latency

sudo apt install rt-tests
sudo cyclictest -p99 -t1 -i1000

Run Python As Priority

sudo chrt -r 70 python Test.py

Python Real-Time Loop

import ctypes
import time

# Lock memory
libc = ctypes.CDLL("libc.so.6")
libc.mlockall(1 | 2)  # MCL_CURRENT | MCL_FUTURE

# Set real-time scheduling
SCHED_FIFO = 1
class sched_param(ctypes.Structure):
    _fields_ = [("sched_priority", ctypes.c_int)]

param = sched_param()
param.sched_priority = 90
libc.sched_setscheduler(0, SCHED_FIFO, ctypes.byref(param))

# Tight RT loop
while True:
    start = time.perf_counter_ns()
    # Your RT task here
    end = time.perf_counter_ns()
    print(f"Loop took {(end-start)/1000:.2f} µs")
    time.sleep(0.001)  # ~1 ms

Kiosk Configuration

Configure .xinitrc

Create ~/.xinitrc with this content:

#!/bin/sh
if [ "${1-}" = "kiosk" ]; then
  shift
  [ $# -gt 0 ] || set -- xterm
  xsetroot -cursor_name left_ptr &
  exec "$@"
fi
exit 1

Make it executable: chmod +x ~/.xinitrc

Configure .bashrc

Add to end of ~/.bashrc and run pythonk your_script.py:

# Custom start command for Kiosk mode
startx() {
  if [ "${1-}" = "kiosk" ]; then
    shift
    /usr/bin/startx "$HOME/.xinitrc" kiosk "$@"
  else
    sudo /usr/bin/systemctl start lightdm
  fi
}

alias cls="clear"
alias start="startx"
alias pythonk="start kiosk python"
alias pythontk="start kiosk pythont"

Run: source ~/.bashrc

Auto-start Tkinter Kiosk (Console Login)

1. Create kiosk user

sudo adduser kiosk

2. Boot to console (no display manager)

sudo systemctl set-default multi-user.target
sudo systemctl disable lightdm

3. Auto-login kiosk on tty1 (systemd getty override)

Overide tty service

sudo nano /etc/systemd/system/getty@tty1.service.d/override.conf

Content:

[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin kiosk --noclear %I $TERM

Post-process:

sudo systemctl daemon-reload
sudo systemctl restart getty@tty1.service

4. Auto-start X + Tkinter app after kiosk login

As user kiosk, create ~/.bash_profile:

nano ~/.bash_profile

Content:

#!/bin/sh
if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then
  exec startx "$HOME/.xinitrc"
fi
exec "$SHELL" -l

Post-process:

chmod +x ~/.bash_profile

5. X session that runs only your Tkinter app

As user kiosk, create ~/.xinitrc:

nano ~/.xinitrc

Content:

#!/bin/sh
exec python3 "$HOME/kiosk_app.py"

Post-process:

chmod +x ~/.xinitrc

6. Developer exit from inside Tkinter

In your Tkinter handler for the secret button/sequence, use:

import os; os._exit(0)

nVidia Drivers

nVidia Drivers / CUDA

Prepare system

sudo apt install pciutils build-essential dkms linux-headers-$(uname -r)

Check nVidia GPU

lspci | grep -i nvidia

Ensure your /etc/apt/sources.list includes contrib and non-free

deb [http://deb.debian.org/debian](http://deb.debian.org/debian) bookworm main contrib non-free
deb-src [http://deb.debian.org/debian](http://deb.debian.org/debian) bookworm main contrib non-free

Install nVidia driver + CUDA

sudo apt install nvidia-driver nvidia-settings nvidia-smi
sudo apt install nvidia-cuda-toolkit

GPU Persistence Mode

sudo nvidia-smi -pm 1
sudo apt install nvidia-persistenced
sudo systemctl enable --now nvidia-persistenced
sudo systemctl start nvidia-persistenced

Auto Persistence On

sudo nano /etc/systemd/system/nvidia-persistence.service

Content:

[Unit]
Description=Enable NVIDIA Persistence Mode on Boot
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/nvidia-smi -pm 1
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

Post-process:

sudo systemctl daemon-reload
sudo systemctl enable nvidia-persistence.service
sudo systemctl start nvidia-persistence.service

VM

Setup Virtual Machines

Install KVM hypervisor & GUI

sudo apt install qemu-system-x86 qemu-utils qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager spice-vdagent

VM user management

sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER

Cockpit web GUI

sudo apt install cockpit cockpit-machines
sudo systemctl enable --now cockpit

VM GUI

virt-manager

VM CLI View All Machines

virsh list --all

VM CLI Start Machine

virsh start myvm

VM CLI Shutdown Machine

virsh shutdown myvm

VM CLI Delete Machine

virsh destroy myvm

VM CLI Create Machine

virt-install --name myvm --ram 2048 --vcpus 2 --disk path=/var/lib/libvirt/images/myvm.img,size=20 --os-type linux --cdrom /path/to/iso --network network=default --graphics vnc

Tools

Prefered Tools

Micro Termianl Editor

sudo apt install micro

Z-RAM Compressor

sudo apt install zram-tools

RDP/VNC Client

sudo apt install remmina remmina-plugin-rdp

Notepad GUI Editor

sudo apt install notepadqq

VLC Video Player

sudo apt install vlc

Archives

sudo apt install unrar unzip zip p7zip-full

Calculator

sudo apt install galculator

Cockpit

sudo apt install cockpit

DNS Resolver

sudo apt install avahi-daemon libnss-mdns
sudo systemctl enable --now avahi-daemon
ping PC-Name.local

Fixes

Tweeks & Fixes

cv2 Fonts

mkdir -p ~/venv/lib/python3.14/site-packages/cv2/qt/fonts
cp /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf ~/venv/lib/python3.14/site-packages/cv2/qt/fonts/

Dummy Network

sudo ip link add dummy0 type dummy
sudo ip addr add 192.168.7.1/24 dev dummy0
sudo ip addr add 192.168.7.11/24 dev dummy0  
sudo ip addr add 192.168.7.21/24 dev dummy0
sudo ip link set dummy0 up
sudo ip link set dummy0 multicast on
sudo ip route replace 224.0.0.0/4 dev dummy0