Tags: jetson jetpack-7.2 headless nomachine ubuntu-24.04 embedded-ai edge-ai
Overview
This guide walks through enabling fully headless operation on the NVIDIA Jetson AGX Orin Developer Kit running JetPack 7.2. After completing these steps, the device boots without any display, keyboard, or mouse — accessible entirely via SSH for terminal use and NoMachine for full GUI access.
Why NoMachine only?
JetPack 7.2 ships GNOME 46 on Ubuntu 24.04. GNOME 46 requires DRI3/GPU acceleration to render its compositor (Mutter). NoMachine's virtual display does not expose DRI3, causing gnome-shell to start but render nothing — only a black screen or bare wallpaper. XFCE4 has no compositor dependency, works perfectly in virtual displays, and is the stable choice for remote GUI access on this platform.
Tested Environment
| Component | Value |
|---|---|
| Hardware | NVIDIA Jetson AGX Orin Developer Kit 64GB |
| JetPack | 7.2-b187 |
| L4T | r39.2 (Jetson Linux 39.2) |
| OS | Ubuntu 24.04.4 LTS |
| Kernel | 6.8.12-tegra |
| CUDA | 13.2.1 |
| Python | 3.12.3 |
| NoMachine | 9.7.3 |
| Remote host | Windows 11 (same LAN via Ethernet) |
Prerequisites
- Jetson AGX Orin with JetPack 7.2 flashed and first-boot wizard completed
- Static IP assigned or known (this guide uses
192.168.1.100as example) - A monitor and keyboard connected for this setup session only — they will not be needed after
- OpenSSH client installed on the remote host (Windows: built-in; Linux/macOS: native)
- NoMachine client installed on the remote host:
CODEcd ~/Downloads
# Check the current version at the URL above and adjust the filename
wget "https://web9001.nomachine.com/download/9.7/Arm/nomachine_9.7.3_1_arm64.deb"
sudo dpkg -i nomachine_9.7.3_1_arm64.deb
sudo apt --fix-broken install -y
# The installation output will show warnings about CUPS (printer support)
# These are expected and harmless — NoMachine installs correctly
# Verify the server started
sudo /usr/NX/bin/nxserver --status
# Expected: Running server at port: 4000
Configure NoMachine for XFCE4
CODE# Find and edit node.cfg
sudo nano /usr/NX/etc/node.cfg
Search for
DefaultDesktopCommandandVirtualDesktopCommand— add or uncomment:
CODEDefaultDesktopCommand /usr/bin/startxfce4
VirtualDesktopCommand /usr/bin/startxfce4
DisplayGeometry 1920x1080
AllowDesktopResize 1
CODE# Restart NoMachine to apply changes
sudo /usr/NX/bin/nxserver --restart
sudo /usr/NX/bin/nxserver --status
Enable NoMachine Autostart
CODEsudo tee /etc/systemd/system/nomachine-headless.service << 'EOF'
[Unit]
Description=NoMachine Headless Server
After=network.target NetworkManager.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/NX/bin/nxserver --restart
ExecStop=/usr/NX/bin/nxserver --stop
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable nomachine-headless
sudo systemctl start nomachine-headless
Step 10 — Firewall
Note: UFW is not installed by default in JetPack 7.2 on Ubuntu 24.04.
CODEsudo apt install ufw -y
Fix for UFW + Kernel 6.8 (nftables conflict)
Ubuntu 24.04 with kernel 6.8 uses nftables as the backend, but UFW expects iptables-legacy. Without this fix,
sudo ufw enablewill produce errors likeRULE_APPEND failed (No such file or directory).
CODE# Switch to iptables-legacy
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
# Verify
sudo iptables --version
# Expected: iptables v1.8.x (legacy)
Apply Firewall Rules
CODEsudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment "SSH"
sudo ufw allow 4000/tcp comment "NoMachine NX"
# Add additional ports as needed for your stack:
# sudo ufw allow 3389/tcp comment "XRDP"
# sudo ufw allow 11434/tcp comment "Ollama"
# sudo ufw allow 8000/tcp comment "vLLM"
# sudo ufw allow 3000/tcp comment "Open WebUI"
# sudo ufw allow 8888/tcp comment "Jupyter"
sudo ufw enable
# Type 'y' when prompted
sudo ufw status numbered
Alternative: nftables (if UFW issues persist)
If UFW continues to fail even after the iptables-legacy fix, use nftables directly — it is the native firewall on Ubuntu 24.04:
CODEsudo apt install nftables -y
sudo tee /etc/nftables.conf << 'EOF'
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif "lo" accept
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
tcp dport 22 accept comment "SSH"
tcp dport 4000 accept comment "NoMachine"
# Add more ports here as needed
}
chain forward { type filter hook forward priority 0; policy accept; }
chain output { type filter hook output priority 0; policy accept; }
}
EOF
sudo systemctl enable nftables
sudo systemctl start nftables
sudo nft list ruleset
Step 11 — First Reboot Test
CODEsudo reboot
Disconnect the physical monitor and keyboard. After approximately 30 seconds, from the remote host:
CODE# Test 1: Network is up
ping 192.168.1.100
# Test 2: SSH is reachable
ssh jetson
# Test 3: NoMachine port is open
# Linux/macOS:
nc -zv 192.168.1.100 4000
# Windows PowerShell:
Test-NetConnection -ComputerName 192.168.1.100 -Port 4000
If all three pass, the Jetson is running fully headless.
Step 12 — Connect via NoMachine
- Open NoMachine on the remote host
- Click Add → Protocol: NX → Host:
192.168.1.100→ Port:4000
- Authentication: Password
- Click Connect → accept the host fingerprint
- Enter your Jetson username and password
- When prompted for the session type → select "Create a new virtual desktop"
- XFCE4 desktop loads with full mouse, keyboard, and 1920×1080 resolution
Step 13 — CUDA PATH Fix
In JetPack 7.2, the CUDA compiler (
nvcc) is installed but not in the default PATH. Add it:
CODE# Install CUDA development tools if not present
sudo apt install nvidia-cuda-dev -y
# Add CUDA to PATH permanently
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
# Verify
nvcc --version
# Expected: Cuda compilation tools, release 13.2, ...
Verification Checklist
Run this block after a clean reboot to confirm the headless setup is complete:
CODEecho "=== Headless Mode Verification ==="
echo -n "Network (static IP): "
hostname -I | grep -q "192.168.1.100" && echo "OK" || echo "FAIL"
echo -n "SSH server: "
systemctl is-active ssh
echo -n "Boot target (no GDM): "
systemctl get-default
echo -n "GDM status: "
systemctl is-active gdm 2>/dev/null || echo "inactive (correct)"
echo -n "NoMachine port 4000: "
sudo ss -tlnp | grep -q ":4000" && echo "listening" || echo "NOT listening"
echo -n "XFCE4 installed: "
which startxfce4 && echo "OK" || echo "NOT FOUND"
echo -n "~/.xsession → XFCE4: "
grep -q "startxfce4" ~/.xsession && echo "OK" || echo "NOT configured"
echo -n "Wayland disabled: "
grep -q "WaylandEnable=false" /etc/gdm3/custom.conf && echo "OK" || echo "NOT disabled"
echo -n "Xorg dummy driver: "
test -f /etc/X11/xorg.conf.d/30-tegra-headless.conf && echo "OK" || echo "NOT configured"
echo -n "CUDA PATH: "
nvcc --version 2>/dev/null | grep -o "release [0-9.]*" || echo "NOT in PATH — run: source ~/.bashrc"
echo "=== Done ==="
Expected output (all lines should show OK or the correct active status):
CODE=== Headless Mode Verification ===
Network (static IP): OK
SSH server: active
Boot target (no GDM): multi-user.target
GDM status: inactive (correct)
NoMachine port 4000: listening
XFCE4 installed: /usr/bin/startxfce4 OK
~/.xsession → XFCE4: OK
Wayland disabled: OK
Xorg dummy driver: OK
CUDA PATH: release 13.2,
=== Done ===
Troubleshooting
NoMachine connects but shows a black screen
This typically means gnome-shell was launched instead of XFCE4.
CODE# Check ~/.xsession
cat ~/.xsession
# Must contain: exec startxfce4
# Check node.cfg
grep -E "DefaultDesktop|VirtualDesktop" /usr/NX/etc/node.cfg
# Must point to /usr/bin/startxfce4
# Fix and restart
cat > ~/.xsession << 'EOF'
#!/bin/bash
unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR
exec startxfce4
EOF
chmod +x ~/.xsession
sudo /usr/NX/bin/nxserver --restart
Then disconnect and reconnect from the NoMachine client, choosing "Create a new virtual desktop".
SSH unreachable after reboot (but ping works)
The SSH port is open but the connection times out. SSH may be down, or UFW may be blocking it.
CODE# Via a physical connection or recovery
sudo systemctl status ssh
sudo systemctl start ssh
sudo ufw status
sudo ufw allow 22/tcp
Network not up after headless reboot
The Ethernet connection may require a user session to activate. Verify the
connection.permissionsfix:
CODEnmcli connection show "Wired connection 1" | grep permissions
# Must show: connection.permissions: (empty)
# If not empty, reapply
sudo nmcli connection modify "Wired connection 1" connection.permissions ""
sudo nmcli connection up "Wired connection 1"
UFW enable fails with RULE_APPEND errors (kernel 6.8)
CODEsudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo ufw disable
sudo ufw reset
sudo ufw enable
nvcc not found after installing nvidia-cuda-dev
CODE# The PATH change requires sourcing the profile
source ~/.bashrc
# Or specify the full path directly
/usr/local/cuda/bin/nvcc --version
# Verify the binary exists
ls /usr/local/cuda/bin/nvcc
Summary
Step
Action
Result
1–3
System update + packages + hostname
Base system ready
4
Static IP + connection.permissions=""
Network up without login
5
SSH + key auth
Secure remote terminal
6
Disable Wayland + dummy Xorg driver
X11 display at 1920×1080
7
multi-user.target(no GDM)
NoMachine owns the display
8
XFCE4 + ~/.xsession
Desktop environment ready
9
NoMachine server + node.cfg
Virtual GUI accessible
10
UFW + iptables-legacy fix
Firewall active
11
Reboot test without monitor
Fully headless
12
NoMachine client → virtual desktop
Full GUI via NX
13
CUDA PATH
nvccaccessible
After completing all steps, the Jetson AGX Orin operates entirely without a physical display. SSH provides terminal access and NoMachine provides full XFCE4 desktop access — both available immediately after any reboot, without any physical interaction with the device.
Platform: NVIDIA Jetson AGX Orin Developer Kit 64GB · JetPack 7.2 (L4T r39.2) · Ubuntu 24.04 LTS · NoMachine 9.7.3
↗ Original-Artikel auf dev.to lesenVollständiger Original-BerichtAusführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf dev.to.
SOCIAL SHARE CARD GENERATOR